mirror of
https://github.com/th30d4y/OpenLearnX.git
synced 2026-05-26 19:26:33 +00:00
Fix .gitignore: stop tracking ignored files
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.4;
|
||||
|
||||
import "../access/AccessControlCrossChain.sol";
|
||||
import "../crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol";
|
||||
|
||||
contract AccessControlCrossChainMock is AccessControlCrossChain, CrossChainEnabledArbitrumL2 {}
|
||||
@@ -0,0 +1,51 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Arrays.sol";
|
||||
|
||||
contract Uint256ArraysMock {
|
||||
using Arrays for uint256[];
|
||||
|
||||
uint256[] private _array;
|
||||
|
||||
constructor(uint256[] memory array) {
|
||||
_array = array;
|
||||
}
|
||||
|
||||
function findUpperBound(uint256 element) external view returns (uint256) {
|
||||
return _array.findUpperBound(element);
|
||||
}
|
||||
|
||||
function unsafeAccess(uint256 pos) external view returns (uint256) {
|
||||
return _array.unsafeAccess(pos).value;
|
||||
}
|
||||
}
|
||||
|
||||
contract AddressArraysMock {
|
||||
using Arrays for address[];
|
||||
|
||||
address[] private _array;
|
||||
|
||||
constructor(address[] memory array) {
|
||||
_array = array;
|
||||
}
|
||||
|
||||
function unsafeAccess(uint256 pos) external view returns (address) {
|
||||
return _array.unsafeAccess(pos).value;
|
||||
}
|
||||
}
|
||||
|
||||
contract Bytes32ArraysMock {
|
||||
using Arrays for bytes32[];
|
||||
|
||||
bytes32[] private _array;
|
||||
|
||||
constructor(bytes32[] memory array) {
|
||||
_array = array;
|
||||
}
|
||||
|
||||
function unsafeAccess(uint256 pos) external view returns (bytes32) {
|
||||
return _array.unsafeAccess(pos).value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract CallReceiverMock {
|
||||
event MockFunctionCalled();
|
||||
event MockFunctionCalledWithArgs(uint256 a, uint256 b);
|
||||
|
||||
uint256[] private _array;
|
||||
|
||||
function mockFunction() public payable returns (string memory) {
|
||||
emit MockFunctionCalled();
|
||||
|
||||
return "0x1234";
|
||||
}
|
||||
|
||||
function mockFunctionEmptyReturn() public payable {
|
||||
emit MockFunctionCalled();
|
||||
}
|
||||
|
||||
function mockFunctionWithArgs(uint256 a, uint256 b) public payable returns (string memory) {
|
||||
emit MockFunctionCalledWithArgs(a, b);
|
||||
|
||||
return "0x1234";
|
||||
}
|
||||
|
||||
function mockFunctionNonPayable() public returns (string memory) {
|
||||
emit MockFunctionCalled();
|
||||
|
||||
return "0x1234";
|
||||
}
|
||||
|
||||
function mockStaticFunction() public pure returns (string memory) {
|
||||
return "0x1234";
|
||||
}
|
||||
|
||||
function mockFunctionRevertsNoReason() public payable {
|
||||
revert();
|
||||
}
|
||||
|
||||
function mockFunctionRevertsReason() public payable {
|
||||
revert("CallReceiverMock: reverting");
|
||||
}
|
||||
|
||||
function mockFunctionThrows() public payable {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
function mockFunctionOutOfGas() public payable {
|
||||
for (uint256 i = 0; ; ++i) {
|
||||
_array.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
function mockFunctionWritesStorage(bytes32 slot, bytes32 value) public returns (string memory) {
|
||||
assembly {
|
||||
sstore(slot, value)
|
||||
}
|
||||
return "0x1234";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/escrow/ConditionalEscrow.sol";
|
||||
|
||||
// mock class using ConditionalEscrow
|
||||
contract ConditionalEscrowMock is ConditionalEscrow {
|
||||
mapping(address => bool) private _allowed;
|
||||
|
||||
function setAllowed(address payee, bool allowed) public {
|
||||
_allowed[payee] = allowed;
|
||||
}
|
||||
|
||||
function withdrawalAllowed(address payee) public view override returns (bool) {
|
||||
return _allowed[payee];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Context.sol";
|
||||
|
||||
contract ContextMock is Context {
|
||||
event Sender(address sender);
|
||||
|
||||
function msgSender() public {
|
||||
emit Sender(_msgSender());
|
||||
}
|
||||
|
||||
event Data(bytes data, uint256 integerValue, string stringValue);
|
||||
|
||||
function msgData(uint256 integerValue, string memory stringValue) public {
|
||||
emit Data(_msgData(), integerValue, stringValue);
|
||||
}
|
||||
}
|
||||
|
||||
contract ContextMockCaller {
|
||||
function callSender(ContextMock context) public {
|
||||
context.msgSender();
|
||||
}
|
||||
|
||||
function callData(ContextMock context, uint256 integerValue, string memory stringValue) public {
|
||||
context.msgData(integerValue, stringValue);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
abstract contract Impl {
|
||||
function version() public pure virtual returns (string memory);
|
||||
}
|
||||
|
||||
contract DummyImplementation {
|
||||
uint256 public value;
|
||||
string public text;
|
||||
uint256[] public values;
|
||||
|
||||
function initializeNonPayable() public {
|
||||
value = 10;
|
||||
}
|
||||
|
||||
function initializePayable() public payable {
|
||||
value = 100;
|
||||
}
|
||||
|
||||
function initializeNonPayableWithValue(uint256 _value) public {
|
||||
value = _value;
|
||||
}
|
||||
|
||||
function initializePayableWithValue(uint256 _value) public payable {
|
||||
value = _value;
|
||||
}
|
||||
|
||||
function initialize(uint256 _value, string memory _text, uint256[] memory _values) public {
|
||||
value = _value;
|
||||
text = _text;
|
||||
values = _values;
|
||||
}
|
||||
|
||||
function get() public pure returns (bool) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function version() public pure virtual returns (string memory) {
|
||||
return "V1";
|
||||
}
|
||||
|
||||
function reverts() public pure {
|
||||
require(false, "DummyImplementation reverted");
|
||||
}
|
||||
}
|
||||
|
||||
contract DummyImplementationV2 is DummyImplementation {
|
||||
function migrate(uint256 newVal) public payable {
|
||||
value = newVal;
|
||||
}
|
||||
|
||||
function version() public pure override returns (string memory) {
|
||||
return "V2";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/cryptography/ECDSA.sol";
|
||||
import "../utils/cryptography/EIP712.sol";
|
||||
|
||||
abstract contract EIP712Verifier is EIP712 {
|
||||
function verify(bytes memory signature, address signer, address mailTo, string memory mailContents) external view {
|
||||
bytes32 digest = _hashTypedDataV4(
|
||||
keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents))))
|
||||
);
|
||||
address recoveredSigner = ECDSA.recover(digest, signature);
|
||||
require(recoveredSigner == signer);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../access/Ownable.sol";
|
||||
import "../interfaces/IERC1271.sol";
|
||||
import "../utils/cryptography/ECDSA.sol";
|
||||
|
||||
contract ERC1271WalletMock is Ownable, IERC1271 {
|
||||
constructor(address originalOwner) {
|
||||
transferOwnership(originalOwner);
|
||||
}
|
||||
|
||||
function isValidSignature(bytes32 hash, bytes memory signature) public view override returns (bytes4 magicValue) {
|
||||
return ECDSA.recover(hash, signature) == owner() ? this.isValidSignature.selector : bytes4(0);
|
||||
}
|
||||
}
|
||||
|
||||
contract ERC1271MaliciousMock is IERC1271 {
|
||||
function isValidSignature(bytes32, bytes memory) public pure override returns (bytes4) {
|
||||
assembly {
|
||||
mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
|
||||
return(0, 32)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract ERC165MaliciousData {
|
||||
function supportsInterface(bytes4) public pure returns (bool) {
|
||||
assembly {
|
||||
mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
|
||||
return(0, 32)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract ERC165MissingData {
|
||||
function supportsInterface(bytes4 interfaceId) public view {} // missing return
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract ERC165NotSupported {}
|
||||
@@ -0,0 +1,18 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../utils/introspection/IERC165.sol";
|
||||
|
||||
contract ERC165ReturnBombMock is IERC165 {
|
||||
function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
|
||||
if (interfaceId == type(IERC165).interfaceId) {
|
||||
assembly {
|
||||
mstore(0, 1)
|
||||
}
|
||||
}
|
||||
assembly {
|
||||
return(0, 101500)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import {ERC20} from "../token/ERC20/ERC20.sol";
|
||||
|
||||
contract ERC20Mock is ERC20 {
|
||||
constructor() ERC20("ERC20Mock", "E20M") {}
|
||||
|
||||
function mint(address account, uint256 amount) external {
|
||||
_mint(account, amount);
|
||||
}
|
||||
|
||||
function burn(address account, uint256 amount) external {
|
||||
_burn(account, amount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../token/ERC20/ERC20.sol";
|
||||
import "../token/ERC20/extensions/ERC4626.sol";
|
||||
|
||||
contract ERC20Reentrant is ERC20("TEST", "TST") {
|
||||
enum Type {
|
||||
No,
|
||||
Before,
|
||||
After
|
||||
}
|
||||
|
||||
Type private _reenterType;
|
||||
address private _reenterTarget;
|
||||
bytes private _reenterData;
|
||||
|
||||
function scheduleReenter(Type when, address target, bytes calldata data) external {
|
||||
_reenterType = when;
|
||||
_reenterTarget = target;
|
||||
_reenterData = data;
|
||||
}
|
||||
|
||||
function functionCall(address target, bytes memory data) public returns (bytes memory) {
|
||||
return Address.functionCall(target, data);
|
||||
}
|
||||
|
||||
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
|
||||
if (_reenterType == Type.Before) {
|
||||
_reenterType = Type.No;
|
||||
functionCall(_reenterTarget, _reenterData);
|
||||
}
|
||||
super._beforeTokenTransfer(from, to, amount);
|
||||
}
|
||||
|
||||
function _afterTokenTransfer(address from, address to, uint256 amount) internal override {
|
||||
super._afterTokenTransfer(from, to, amount);
|
||||
if (_reenterType == Type.After) {
|
||||
_reenterType = Type.No;
|
||||
functionCall(_reenterTarget, _reenterData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.9;
|
||||
|
||||
import "./ContextMock.sol";
|
||||
import "../metatx/ERC2771Context.sol";
|
||||
|
||||
// By inheriting from ERC2771Context, Context's internal functions are overridden automatically
|
||||
contract ERC2771ContextMock is ContextMock, ERC2771Context {
|
||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
||||
constructor(address trustedForwarder) ERC2771Context(trustedForwarder) {
|
||||
emit Sender(_msgSender()); // _msgSender() should be accessible during construction
|
||||
}
|
||||
|
||||
function _msgSender() internal view override(Context, ERC2771Context) returns (address) {
|
||||
return ERC2771Context._msgSender();
|
||||
}
|
||||
|
||||
function _msgData() internal view override(Context, ERC2771Context) returns (bytes calldata) {
|
||||
return ERC2771Context._msgData();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../token/ERC20/IERC20.sol";
|
||||
import "../interfaces/IERC3156.sol";
|
||||
import "../utils/Address.sol";
|
||||
|
||||
/**
|
||||
* @dev WARNING: this IERC3156FlashBorrower mock implementation is for testing purposes ONLY.
|
||||
* Writing a secure flash lock borrower is not an easy task, and should be done with the utmost care.
|
||||
* This is not an example of how it should be done, and no pattern present in this mock should be considered secure.
|
||||
* Following best practices, always have your contract properly audited before using them to manipulate important funds on
|
||||
* live networks.
|
||||
*/
|
||||
contract ERC3156FlashBorrowerMock is IERC3156FlashBorrower {
|
||||
bytes32 internal constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan");
|
||||
|
||||
bool immutable _enableApprove;
|
||||
bool immutable _enableReturn;
|
||||
|
||||
event BalanceOf(address token, address account, uint256 value);
|
||||
event TotalSupply(address token, uint256 value);
|
||||
|
||||
constructor(bool enableReturn, bool enableApprove) {
|
||||
_enableApprove = enableApprove;
|
||||
_enableReturn = enableReturn;
|
||||
}
|
||||
|
||||
function onFlashLoan(
|
||||
address /*initiator*/,
|
||||
address token,
|
||||
uint256 amount,
|
||||
uint256 fee,
|
||||
bytes calldata data
|
||||
) public override returns (bytes32) {
|
||||
require(msg.sender == token);
|
||||
|
||||
emit BalanceOf(token, address(this), IERC20(token).balanceOf(address(this)));
|
||||
emit TotalSupply(token, IERC20(token).totalSupply());
|
||||
|
||||
if (data.length > 0) {
|
||||
// WARNING: This code is for testing purposes only! Do not use.
|
||||
Address.functionCall(token, data);
|
||||
}
|
||||
|
||||
if (_enableApprove) {
|
||||
IERC20(token).approve(token, amount + fee);
|
||||
}
|
||||
|
||||
return _enableReturn ? _RETURN_VALUE : bytes32(0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../token/ERC20/extensions/ERC4626.sol";
|
||||
|
||||
contract ERC4626Mock is ERC4626 {
|
||||
constructor(address underlying) ERC20("ERC4626Mock", "E4626M") ERC4626(IERC20(underlying)) {}
|
||||
|
||||
function mint(address account, uint256 amount) external {
|
||||
_mint(account, amount);
|
||||
}
|
||||
|
||||
function burn(address account, uint256 amount) external {
|
||||
_burn(account, amount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract EtherReceiverMock {
|
||||
bool private _acceptEther;
|
||||
|
||||
function setAcceptEther(bool acceptEther) public {
|
||||
_acceptEther = acceptEther;
|
||||
}
|
||||
|
||||
receive() external payable {
|
||||
if (!_acceptEther) {
|
||||
revert();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../proxy/utils/Initializable.sol";
|
||||
|
||||
/**
|
||||
* @title InitializableMock
|
||||
* @dev This contract is a mock to test initializable functionality
|
||||
*/
|
||||
contract InitializableMock is Initializable {
|
||||
bool public initializerRan;
|
||||
bool public onlyInitializingRan;
|
||||
uint256 public x;
|
||||
|
||||
function isInitializing() public view returns (bool) {
|
||||
return _isInitializing();
|
||||
}
|
||||
|
||||
function initialize() public initializer {
|
||||
initializerRan = true;
|
||||
}
|
||||
|
||||
function initializeOnlyInitializing() public onlyInitializing {
|
||||
onlyInitializingRan = true;
|
||||
}
|
||||
|
||||
function initializerNested() public initializer {
|
||||
initialize();
|
||||
}
|
||||
|
||||
function onlyInitializingNested() public initializer {
|
||||
initializeOnlyInitializing();
|
||||
}
|
||||
|
||||
function initializeWithX(uint256 _x) public payable initializer {
|
||||
x = _x;
|
||||
}
|
||||
|
||||
function nonInitializable(uint256 _x) public payable {
|
||||
x = _x;
|
||||
}
|
||||
|
||||
function fail() public pure {
|
||||
require(false, "InitializableMock forced failure");
|
||||
}
|
||||
}
|
||||
|
||||
contract ConstructorInitializableMock is Initializable {
|
||||
bool public initializerRan;
|
||||
bool public onlyInitializingRan;
|
||||
|
||||
constructor() initializer {
|
||||
initialize();
|
||||
initializeOnlyInitializing();
|
||||
}
|
||||
|
||||
function initialize() public initializer {
|
||||
initializerRan = true;
|
||||
}
|
||||
|
||||
function initializeOnlyInitializing() public onlyInitializing {
|
||||
onlyInitializingRan = true;
|
||||
}
|
||||
}
|
||||
|
||||
contract ChildConstructorInitializableMock is ConstructorInitializableMock {
|
||||
bool public childInitializerRan;
|
||||
|
||||
constructor() initializer {
|
||||
childInitialize();
|
||||
}
|
||||
|
||||
function childInitialize() public initializer {
|
||||
childInitializerRan = true;
|
||||
}
|
||||
}
|
||||
|
||||
contract ReinitializerMock is Initializable {
|
||||
uint256 public counter;
|
||||
|
||||
function getInitializedVersion() public view returns (uint8) {
|
||||
return _getInitializedVersion();
|
||||
}
|
||||
|
||||
function initialize() public initializer {
|
||||
doStuff();
|
||||
}
|
||||
|
||||
function reinitialize(uint8 i) public reinitializer(i) {
|
||||
doStuff();
|
||||
}
|
||||
|
||||
function nestedReinitialize(uint8 i, uint8 j) public reinitializer(i) {
|
||||
reinitialize(j);
|
||||
}
|
||||
|
||||
function chainReinitialize(uint8 i, uint8 j) public {
|
||||
reinitialize(i);
|
||||
reinitialize(j);
|
||||
}
|
||||
|
||||
function disableInitializers() public {
|
||||
_disableInitializers();
|
||||
}
|
||||
|
||||
function doStuff() public onlyInitializing {
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
|
||||
contract DisableNew is Initializable {
|
||||
constructor() {
|
||||
_disableInitializers();
|
||||
}
|
||||
}
|
||||
|
||||
contract DisableOld is Initializable {
|
||||
constructor() initializer {}
|
||||
}
|
||||
|
||||
contract DisableBad1 is DisableNew, DisableOld {}
|
||||
|
||||
contract DisableBad2 is Initializable {
|
||||
constructor() initializer {
|
||||
_disableInitializers();
|
||||
}
|
||||
}
|
||||
|
||||
contract DisableOk is DisableOld, DisableNew {}
|
||||
@@ -0,0 +1,23 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "./token/ERC20MulticallMock.sol";
|
||||
|
||||
contract MulticallTest {
|
||||
function checkReturnValues(
|
||||
ERC20MulticallMock multicallToken,
|
||||
address[] calldata recipients,
|
||||
uint256[] calldata amounts
|
||||
) external {
|
||||
bytes[] memory calls = new bytes[](recipients.length);
|
||||
for (uint256 i = 0; i < recipients.length; i++) {
|
||||
calls[i] = abi.encodeWithSignature("transfer(address,uint256)", recipients[i], amounts[i]);
|
||||
}
|
||||
|
||||
bytes[] memory results = multicallToken.multicall(calls);
|
||||
for (uint256 i = 0; i < results.length; i++) {
|
||||
require(abi.decode(results[i], (bool)));
|
||||
}
|
||||
}
|
||||
}
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../proxy/utils/Initializable.sol";
|
||||
|
||||
// Sample contracts showing upgradeability with multiple inheritance.
|
||||
// Child contract inherits from Father and Mother contracts, and Father extends from Gramps.
|
||||
//
|
||||
// Human
|
||||
// / \
|
||||
// | Gramps
|
||||
// | |
|
||||
// Mother Father
|
||||
// | |
|
||||
// -- Child --
|
||||
|
||||
/**
|
||||
* Sample base initializable contract that is a human
|
||||
*/
|
||||
contract SampleHuman is Initializable {
|
||||
bool public isHuman;
|
||||
|
||||
function initialize() public initializer {
|
||||
__SampleHuman_init();
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleHuman_init() internal onlyInitializing {
|
||||
__SampleHuman_init_unchained();
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleHuman_init_unchained() internal onlyInitializing {
|
||||
isHuman = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sample base initializable contract that defines a field mother
|
||||
*/
|
||||
contract SampleMother is Initializable, SampleHuman {
|
||||
uint256 public mother;
|
||||
|
||||
function initialize(uint256 value) public initializer {
|
||||
__SampleMother_init(value);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleMother_init(uint256 value) internal onlyInitializing {
|
||||
__SampleHuman_init();
|
||||
__SampleMother_init_unchained(value);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleMother_init_unchained(uint256 value) internal onlyInitializing {
|
||||
mother = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sample base initializable contract that defines a field gramps
|
||||
*/
|
||||
contract SampleGramps is Initializable, SampleHuman {
|
||||
string public gramps;
|
||||
|
||||
function initialize(string memory value) public initializer {
|
||||
__SampleGramps_init(value);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleGramps_init(string memory value) internal onlyInitializing {
|
||||
__SampleHuman_init();
|
||||
__SampleGramps_init_unchained(value);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleGramps_init_unchained(string memory value) internal onlyInitializing {
|
||||
gramps = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sample base initializable contract that defines a field father and extends from gramps
|
||||
*/
|
||||
contract SampleFather is Initializable, SampleGramps {
|
||||
uint256 public father;
|
||||
|
||||
function initialize(string memory _gramps, uint256 _father) public initializer {
|
||||
__SampleFather_init(_gramps, _father);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleFather_init(string memory _gramps, uint256 _father) internal onlyInitializing {
|
||||
__SampleGramps_init(_gramps);
|
||||
__SampleFather_init_unchained(_father);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleFather_init_unchained(uint256 _father) internal onlyInitializing {
|
||||
father = _father;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Child extends from mother, father (gramps)
|
||||
*/
|
||||
contract SampleChild is Initializable, SampleMother, SampleFather {
|
||||
uint256 public child;
|
||||
|
||||
function initialize(uint256 _mother, string memory _gramps, uint256 _father, uint256 _child) public initializer {
|
||||
__SampleChild_init(_mother, _gramps, _father, _child);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleChild_init(
|
||||
uint256 _mother,
|
||||
string memory _gramps,
|
||||
uint256 _father,
|
||||
uint256 _child
|
||||
) internal onlyInitializing {
|
||||
__SampleMother_init(_mother);
|
||||
__SampleFather_init(_gramps, _father);
|
||||
__SampleChild_init_unchained(_child);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function __SampleChild_init_unchained(uint256 _child) internal onlyInitializing {
|
||||
child = _child;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../security/Pausable.sol";
|
||||
|
||||
contract PausableMock is Pausable {
|
||||
bool public drasticMeasureTaken;
|
||||
uint256 public count;
|
||||
|
||||
constructor() {
|
||||
drasticMeasureTaken = false;
|
||||
count = 0;
|
||||
}
|
||||
|
||||
function normalProcess() external whenNotPaused {
|
||||
count++;
|
||||
}
|
||||
|
||||
function drasticMeasure() external whenPaused {
|
||||
drasticMeasureTaken = true;
|
||||
}
|
||||
|
||||
function pause() external {
|
||||
_pause();
|
||||
}
|
||||
|
||||
function unpause() external {
|
||||
_unpause();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../security/PullPayment.sol";
|
||||
|
||||
// mock class using PullPayment
|
||||
contract PullPaymentMock is PullPayment {
|
||||
constructor() payable {}
|
||||
|
||||
// test helper function to call asyncTransfer
|
||||
function callTransfer(address dest, uint256 amount) public {
|
||||
_asyncTransfer(dest, amount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Context.sol";
|
||||
|
||||
contract ReentrancyAttack is Context {
|
||||
function callSender(bytes4 data) public {
|
||||
(bool success, ) = _msgSender().call(abi.encodeWithSelector(data));
|
||||
require(success, "ReentrancyAttack: failed call");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../security/ReentrancyGuard.sol";
|
||||
import "./ReentrancyAttack.sol";
|
||||
|
||||
contract ReentrancyMock is ReentrancyGuard {
|
||||
uint256 public counter;
|
||||
|
||||
constructor() {
|
||||
counter = 0;
|
||||
}
|
||||
|
||||
function callback() external nonReentrant {
|
||||
_count();
|
||||
}
|
||||
|
||||
function countLocalRecursive(uint256 n) public nonReentrant {
|
||||
if (n > 0) {
|
||||
_count();
|
||||
countLocalRecursive(n - 1);
|
||||
}
|
||||
}
|
||||
|
||||
function countThisRecursive(uint256 n) public nonReentrant {
|
||||
if (n > 0) {
|
||||
_count();
|
||||
(bool success, ) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1));
|
||||
require(success, "ReentrancyMock: failed call");
|
||||
}
|
||||
}
|
||||
|
||||
function countAndCall(ReentrancyAttack attacker) public nonReentrant {
|
||||
_count();
|
||||
bytes4 func = bytes4(keccak256("callback()"));
|
||||
attacker.callSender(func);
|
||||
}
|
||||
|
||||
function _count() private {
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
function guardedCheckEntered() public nonReentrant {
|
||||
require(_reentrancyGuardEntered());
|
||||
}
|
||||
|
||||
function unguardedCheckNotEntered() public view {
|
||||
require(!_reentrancyGuardEntered());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../proxy/utils/Initializable.sol";
|
||||
|
||||
contract Implementation1 is Initializable {
|
||||
uint256 internal _value;
|
||||
|
||||
function initialize() public initializer {}
|
||||
|
||||
function setValue(uint256 _number) public {
|
||||
_value = _number;
|
||||
}
|
||||
}
|
||||
|
||||
contract Implementation2 is Initializable {
|
||||
uint256 internal _value;
|
||||
|
||||
function initialize() public initializer {}
|
||||
|
||||
function setValue(uint256 _number) public {
|
||||
_value = _number;
|
||||
}
|
||||
|
||||
function getValue() public view returns (uint256) {
|
||||
return _value;
|
||||
}
|
||||
}
|
||||
|
||||
contract Implementation3 is Initializable {
|
||||
uint256 internal _value;
|
||||
|
||||
function initialize() public initializer {}
|
||||
|
||||
function setValue(uint256 _number) public {
|
||||
_value = _number;
|
||||
}
|
||||
|
||||
function getValue(uint256 _number) public view returns (uint256) {
|
||||
return _value + _number;
|
||||
}
|
||||
}
|
||||
|
||||
contract Implementation4 is Initializable {
|
||||
uint256 internal _value;
|
||||
|
||||
function initialize() public initializer {}
|
||||
|
||||
function setValue(uint256 _number) public {
|
||||
_value = _number;
|
||||
}
|
||||
|
||||
function getValue() public view returns (uint256) {
|
||||
return _value;
|
||||
}
|
||||
|
||||
fallback() external {
|
||||
_value = 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/math/SafeMath.sol";
|
||||
|
||||
library SafeMathMemoryCheck {
|
||||
function addMemoryCheck() internal pure returns (uint256 mem) {
|
||||
uint256 length = 32;
|
||||
assembly {
|
||||
mem := mload(0x40)
|
||||
}
|
||||
for (uint256 i = 0; i < length; ++i) {
|
||||
SafeMath.add(1, 1);
|
||||
}
|
||||
assembly {
|
||||
mem := sub(mload(0x40), mem)
|
||||
}
|
||||
}
|
||||
|
||||
function subMemoryCheck() internal pure returns (uint256 mem) {
|
||||
uint256 length = 32;
|
||||
assembly {
|
||||
mem := mload(0x40)
|
||||
}
|
||||
for (uint256 i = 0; i < length; ++i) {
|
||||
SafeMath.sub(1, 1);
|
||||
}
|
||||
assembly {
|
||||
mem := sub(mload(0x40), mem)
|
||||
}
|
||||
}
|
||||
|
||||
function mulMemoryCheck() internal pure returns (uint256 mem) {
|
||||
uint256 length = 32;
|
||||
assembly {
|
||||
mem := mload(0x40)
|
||||
}
|
||||
for (uint256 i = 0; i < length; ++i) {
|
||||
SafeMath.mul(1, 1);
|
||||
}
|
||||
assembly {
|
||||
mem := sub(mload(0x40), mem)
|
||||
}
|
||||
}
|
||||
|
||||
function divMemoryCheck() internal pure returns (uint256 mem) {
|
||||
uint256 length = 32;
|
||||
assembly {
|
||||
mem := mload(0x40)
|
||||
}
|
||||
for (uint256 i = 0; i < length; ++i) {
|
||||
SafeMath.div(1, 1);
|
||||
}
|
||||
assembly {
|
||||
mem := sub(mload(0x40), mem)
|
||||
}
|
||||
}
|
||||
|
||||
function modMemoryCheck() internal pure returns (uint256 mem) {
|
||||
uint256 length = 32;
|
||||
assembly {
|
||||
mem := mload(0x40)
|
||||
}
|
||||
for (uint256 i = 0; i < length; ++i) {
|
||||
SafeMath.mod(1, 1);
|
||||
}
|
||||
assembly {
|
||||
mem := sub(mload(0x40), mem)
|
||||
}
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../proxy/utils/Initializable.sol";
|
||||
|
||||
/**
|
||||
* @title MigratableMockV1
|
||||
* @dev This contract is a mock to test initializable functionality through migrations
|
||||
*/
|
||||
contract MigratableMockV1 is Initializable {
|
||||
uint256 public x;
|
||||
|
||||
function initialize(uint256 value) public payable initializer {
|
||||
x = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @title MigratableMockV2
|
||||
* @dev This contract is a mock to test migratable functionality with params
|
||||
*/
|
||||
contract MigratableMockV2 is MigratableMockV1 {
|
||||
bool internal _migratedV2;
|
||||
uint256 public y;
|
||||
|
||||
function migrate(uint256 value, uint256 anotherValue) public payable {
|
||||
require(!_migratedV2);
|
||||
x = value;
|
||||
y = anotherValue;
|
||||
_migratedV2 = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @title MigratableMockV3
|
||||
* @dev This contract is a mock to test migratable functionality without params
|
||||
*/
|
||||
contract MigratableMockV3 is MigratableMockV2 {
|
||||
bool internal _migratedV3;
|
||||
|
||||
function migrate() public payable {
|
||||
require(!_migratedV3);
|
||||
uint256 oldX = x;
|
||||
x = y;
|
||||
y = oldX;
|
||||
_migratedV3 = true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/StorageSlot.sol";
|
||||
|
||||
contract StorageSlotMock {
|
||||
using StorageSlot for *;
|
||||
|
||||
function setBoolean(bytes32 slot, bool value) public {
|
||||
slot.getBooleanSlot().value = value;
|
||||
}
|
||||
|
||||
function setAddress(bytes32 slot, address value) public {
|
||||
slot.getAddressSlot().value = value;
|
||||
}
|
||||
|
||||
function setBytes32(bytes32 slot, bytes32 value) public {
|
||||
slot.getBytes32Slot().value = value;
|
||||
}
|
||||
|
||||
function setUint256(bytes32 slot, uint256 value) public {
|
||||
slot.getUint256Slot().value = value;
|
||||
}
|
||||
|
||||
function getBoolean(bytes32 slot) public view returns (bool) {
|
||||
return slot.getBooleanSlot().value;
|
||||
}
|
||||
|
||||
function getAddress(bytes32 slot) public view returns (address) {
|
||||
return slot.getAddressSlot().value;
|
||||
}
|
||||
|
||||
function getBytes32(bytes32 slot) public view returns (bytes32) {
|
||||
return slot.getBytes32Slot().value;
|
||||
}
|
||||
|
||||
function getUint256(bytes32 slot) public view returns (uint256) {
|
||||
return slot.getUint256Slot().value;
|
||||
}
|
||||
|
||||
mapping(uint256 => string) public stringMap;
|
||||
|
||||
function setString(bytes32 slot, string calldata value) public {
|
||||
slot.getStringSlot().value = value;
|
||||
}
|
||||
|
||||
function setStringStorage(uint256 key, string calldata value) public {
|
||||
stringMap[key].getStringSlot().value = value;
|
||||
}
|
||||
|
||||
function getString(bytes32 slot) public view returns (string memory) {
|
||||
return slot.getStringSlot().value;
|
||||
}
|
||||
|
||||
function getStringStorage(uint256 key) public view returns (string memory) {
|
||||
return stringMap[key].getStringSlot().value;
|
||||
}
|
||||
|
||||
mapping(uint256 => bytes) public bytesMap;
|
||||
|
||||
function setBytes(bytes32 slot, bytes calldata value) public {
|
||||
slot.getBytesSlot().value = value;
|
||||
}
|
||||
|
||||
function setBytesStorage(uint256 key, bytes calldata value) public {
|
||||
bytesMap[key].getBytesSlot().value = value;
|
||||
}
|
||||
|
||||
function getBytes(bytes32 slot) public view returns (bytes memory) {
|
||||
return slot.getBytesSlot().value;
|
||||
}
|
||||
|
||||
function getBytesStorage(uint256 key) public view returns (bytes memory) {
|
||||
return bytesMap[key].getBytesSlot().value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Address.sol";
|
||||
|
||||
contract TimelockReentrant {
|
||||
address private _reenterTarget;
|
||||
bytes private _reenterData;
|
||||
bool _reentered;
|
||||
|
||||
function disableReentrancy() external {
|
||||
_reentered = true;
|
||||
}
|
||||
|
||||
function enableRentrancy(address target, bytes calldata data) external {
|
||||
_reenterTarget = target;
|
||||
_reenterData = data;
|
||||
}
|
||||
|
||||
function reenter() external {
|
||||
if (!_reentered) {
|
||||
_reentered = true;
|
||||
Address.functionCall(_reenterTarget, _reenterData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Timers.sol";
|
||||
|
||||
contract TimersBlockNumberImpl {
|
||||
using Timers for Timers.BlockNumber;
|
||||
|
||||
Timers.BlockNumber private _timer;
|
||||
|
||||
function getDeadline() public view returns (uint64) {
|
||||
return _timer.getDeadline();
|
||||
}
|
||||
|
||||
function setDeadline(uint64 timestamp) public {
|
||||
_timer.setDeadline(timestamp);
|
||||
}
|
||||
|
||||
function reset() public {
|
||||
_timer.reset();
|
||||
}
|
||||
|
||||
function isUnset() public view returns (bool) {
|
||||
return _timer.isUnset();
|
||||
}
|
||||
|
||||
function isStarted() public view returns (bool) {
|
||||
return _timer.isStarted();
|
||||
}
|
||||
|
||||
function isPending() public view returns (bool) {
|
||||
return _timer.isPending();
|
||||
}
|
||||
|
||||
function isExpired() public view returns (bool) {
|
||||
return _timer.isExpired();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../utils/Timers.sol";
|
||||
|
||||
contract TimersTimestampImpl {
|
||||
using Timers for Timers.Timestamp;
|
||||
|
||||
Timers.Timestamp private _timer;
|
||||
|
||||
function getDeadline() public view returns (uint64) {
|
||||
return _timer.getDeadline();
|
||||
}
|
||||
|
||||
function setDeadline(uint64 timestamp) public {
|
||||
_timer.setDeadline(timestamp);
|
||||
}
|
||||
|
||||
function reset() public {
|
||||
_timer.reset();
|
||||
}
|
||||
|
||||
function isUnset() public view returns (bool) {
|
||||
return _timer.isUnset();
|
||||
}
|
||||
|
||||
function isStarted() public view returns (bool) {
|
||||
return _timer.isStarted();
|
||||
}
|
||||
|
||||
function isPending() public view returns (bool) {
|
||||
return _timer.isPending();
|
||||
}
|
||||
|
||||
function isExpired() public view returns (bool) {
|
||||
return _timer.isExpired();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../governance/utils/Votes.sol";
|
||||
|
||||
abstract contract VotesMock is Votes {
|
||||
mapping(address => uint256) private _balances;
|
||||
mapping(uint256 => address) private _owners;
|
||||
|
||||
function getTotalSupply() public view returns (uint256) {
|
||||
return _getTotalSupply();
|
||||
}
|
||||
|
||||
function delegate(address account, address newDelegation) public {
|
||||
return _delegate(account, newDelegation);
|
||||
}
|
||||
|
||||
function _getVotingUnits(address account) internal view override returns (uint256) {
|
||||
return _balances[account];
|
||||
}
|
||||
|
||||
function _mint(address account, uint256 voteId) internal {
|
||||
_balances[account] += 1;
|
||||
_owners[voteId] = account;
|
||||
_transferVotingUnits(address(0), account, 1);
|
||||
}
|
||||
|
||||
function _burn(uint256 voteId) internal {
|
||||
address owner = _owners[voteId];
|
||||
_balances[owner] -= 1;
|
||||
_transferVotingUnits(owner, address(0), 1);
|
||||
}
|
||||
}
|
||||
|
||||
abstract contract VotesTimestampMock is VotesMock {
|
||||
function clock() public view override returns (uint48) {
|
||||
return uint48(block.timestamp);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function CLOCK_MODE() public view virtual override returns (string memory) {
|
||||
return "mode=timestamp";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// solhint-disable private-vars-leading-underscore
|
||||
/**
|
||||
* Copyright 2020 Compound Labs, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
||||
* following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
||||
* following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract CompTimelock {
|
||||
event NewAdmin(address indexed newAdmin);
|
||||
event NewPendingAdmin(address indexed newPendingAdmin);
|
||||
event NewDelay(uint256 indexed newDelay);
|
||||
event CancelTransaction(
|
||||
bytes32 indexed txHash,
|
||||
address indexed target,
|
||||
uint256 value,
|
||||
string signature,
|
||||
bytes data,
|
||||
uint256 eta
|
||||
);
|
||||
event ExecuteTransaction(
|
||||
bytes32 indexed txHash,
|
||||
address indexed target,
|
||||
uint256 value,
|
||||
string signature,
|
||||
bytes data,
|
||||
uint256 eta
|
||||
);
|
||||
event QueueTransaction(
|
||||
bytes32 indexed txHash,
|
||||
address indexed target,
|
||||
uint256 value,
|
||||
string signature,
|
||||
bytes data,
|
||||
uint256 eta
|
||||
);
|
||||
|
||||
uint256 public constant GRACE_PERIOD = 14 days;
|
||||
uint256 public constant MINIMUM_DELAY = 2 days;
|
||||
uint256 public constant MAXIMUM_DELAY = 30 days;
|
||||
|
||||
address public admin;
|
||||
address public pendingAdmin;
|
||||
uint256 public delay;
|
||||
|
||||
mapping(bytes32 => bool) public queuedTransactions;
|
||||
|
||||
constructor(address admin_, uint256 delay_) {
|
||||
require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay.");
|
||||
require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");
|
||||
|
||||
admin = admin_;
|
||||
delay = delay_;
|
||||
}
|
||||
|
||||
receive() external payable {}
|
||||
|
||||
function setDelay(uint256 delay_) public {
|
||||
require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock.");
|
||||
require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay.");
|
||||
require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");
|
||||
delay = delay_;
|
||||
|
||||
emit NewDelay(delay);
|
||||
}
|
||||
|
||||
function acceptAdmin() public {
|
||||
require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin.");
|
||||
admin = msg.sender;
|
||||
pendingAdmin = address(0);
|
||||
|
||||
emit NewAdmin(admin);
|
||||
}
|
||||
|
||||
function setPendingAdmin(address pendingAdmin_) public {
|
||||
require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock.");
|
||||
pendingAdmin = pendingAdmin_;
|
||||
|
||||
emit NewPendingAdmin(pendingAdmin);
|
||||
}
|
||||
|
||||
function queueTransaction(
|
||||
address target,
|
||||
uint256 value,
|
||||
string memory signature,
|
||||
bytes memory data,
|
||||
uint256 eta
|
||||
) public returns (bytes32) {
|
||||
require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin.");
|
||||
require(
|
||||
eta >= getBlockTimestamp() + delay,
|
||||
"Timelock::queueTransaction: Estimated execution block must satisfy delay."
|
||||
);
|
||||
|
||||
bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
|
||||
queuedTransactions[txHash] = true;
|
||||
|
||||
emit QueueTransaction(txHash, target, value, signature, data, eta);
|
||||
return txHash;
|
||||
}
|
||||
|
||||
function cancelTransaction(
|
||||
address target,
|
||||
uint256 value,
|
||||
string memory signature,
|
||||
bytes memory data,
|
||||
uint256 eta
|
||||
) public {
|
||||
require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin.");
|
||||
|
||||
bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
|
||||
queuedTransactions[txHash] = false;
|
||||
|
||||
emit CancelTransaction(txHash, target, value, signature, data, eta);
|
||||
}
|
||||
|
||||
function executeTransaction(
|
||||
address target,
|
||||
uint256 value,
|
||||
string memory signature,
|
||||
bytes memory data,
|
||||
uint256 eta
|
||||
) public payable returns (bytes memory) {
|
||||
require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin.");
|
||||
|
||||
bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
|
||||
require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued.");
|
||||
require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock.");
|
||||
require(getBlockTimestamp() <= eta + GRACE_PERIOD, "Timelock::executeTransaction: Transaction is stale.");
|
||||
|
||||
queuedTransactions[txHash] = false;
|
||||
|
||||
bytes memory callData;
|
||||
|
||||
if (bytes(signature).length == 0) {
|
||||
callData = data;
|
||||
} else {
|
||||
callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
|
||||
}
|
||||
|
||||
// solium-disable-next-line security/no-call-value
|
||||
(bool success, bytes memory returnData) = target.call{value: value}(callData);
|
||||
require(success, "Timelock::executeTransaction: Transaction execution reverted.");
|
||||
|
||||
emit ExecuteTransaction(txHash, target, value, signature, data, eta);
|
||||
|
||||
return returnData;
|
||||
}
|
||||
|
||||
function getBlockTimestamp() internal view returns (uint256) {
|
||||
// solium-disable-next-line security/no-block-members
|
||||
return block.timestamp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../utils/Address.sol";
|
||||
import "../../vendor/polygon/IFxMessageProcessor.sol";
|
||||
|
||||
abstract contract BaseRelayMock {
|
||||
// needed to parse custom errors
|
||||
error NotCrossChainCall();
|
||||
error InvalidCrossChainSender(address sender, address expected);
|
||||
|
||||
address internal _currentSender;
|
||||
|
||||
function relayAs(address target, bytes calldata data, address sender) external virtual {
|
||||
address previousSender = _currentSender;
|
||||
|
||||
_currentSender = sender;
|
||||
|
||||
(bool success, bytes memory returndata) = target.call(data);
|
||||
Address.verifyCallResultFromTarget(target, success, returndata, "low-level call reverted");
|
||||
|
||||
_currentSender = previousSender;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* AMB
|
||||
*/
|
||||
contract BridgeAMBMock is BaseRelayMock {
|
||||
function messageSender() public view returns (address) {
|
||||
return _currentSender;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arbitrum
|
||||
*/
|
||||
contract BridgeArbitrumL1Mock is BaseRelayMock {
|
||||
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
|
||||
address public immutable inbox = address(new BridgeArbitrumL1Inbox());
|
||||
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
|
||||
address public immutable outbox = address(new BridgeArbitrumL1Outbox());
|
||||
|
||||
function activeOutbox() public view returns (address) {
|
||||
return outbox;
|
||||
}
|
||||
|
||||
function currentSender() public view returns (address) {
|
||||
return _currentSender;
|
||||
}
|
||||
}
|
||||
|
||||
contract BridgeArbitrumL1Inbox {
|
||||
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
|
||||
address public immutable bridge = msg.sender;
|
||||
}
|
||||
|
||||
contract BridgeArbitrumL1Outbox {
|
||||
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
|
||||
address public immutable bridge = msg.sender;
|
||||
|
||||
function l2ToL1Sender() public view returns (address) {
|
||||
return BridgeArbitrumL1Mock(bridge).currentSender();
|
||||
}
|
||||
}
|
||||
|
||||
contract BridgeArbitrumL2Mock is BaseRelayMock {
|
||||
function wasMyCallersAddressAliased() public view returns (bool) {
|
||||
return _currentSender != address(0);
|
||||
}
|
||||
|
||||
function myCallersAddressWithoutAliasing() public view returns (address) {
|
||||
return _currentSender;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Optimism
|
||||
*/
|
||||
contract BridgeOptimismMock is BaseRelayMock {
|
||||
function xDomainMessageSender() public view returns (address) {
|
||||
return _currentSender;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Polygon
|
||||
*/
|
||||
contract BridgePolygonChildMock is BaseRelayMock {
|
||||
function relayAs(address target, bytes calldata data, address sender) external override {
|
||||
IFxMessageProcessor(target).processMessageFromRoot(0, sender, data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.4;
|
||||
|
||||
import "../../access/Ownable.sol";
|
||||
import "../../crosschain/amb/CrossChainEnabledAMB.sol";
|
||||
import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol";
|
||||
import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol";
|
||||
import "../../crosschain/optimism/CrossChainEnabledOptimism.sol";
|
||||
import "../../crosschain/polygon/CrossChainEnabledPolygonChild.sol";
|
||||
|
||||
abstract contract Receiver is CrossChainEnabled {
|
||||
// we don't use Ownable because it messes up testing for the upgradeable contracts
|
||||
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
|
||||
address public immutable owner = msg.sender;
|
||||
|
||||
function crossChainRestricted() external onlyCrossChain {}
|
||||
|
||||
function crossChainOwnerRestricted() external onlyCrossChainSender(owner) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* AMB
|
||||
*/
|
||||
contract CrossChainEnabledAMBMock is Receiver, CrossChainEnabledAMB {
|
||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
||||
constructor(address bridge) CrossChainEnabledAMB(bridge) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arbitrum
|
||||
*/
|
||||
contract CrossChainEnabledArbitrumL1Mock is Receiver, CrossChainEnabledArbitrumL1 {
|
||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
||||
constructor(address bridge) CrossChainEnabledArbitrumL1(bridge) {}
|
||||
}
|
||||
|
||||
contract CrossChainEnabledArbitrumL2Mock is Receiver, CrossChainEnabledArbitrumL2 {}
|
||||
|
||||
/**
|
||||
* Optimism
|
||||
*/
|
||||
contract CrossChainEnabledOptimismMock is Receiver, CrossChainEnabledOptimism {
|
||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
||||
constructor(address bridge) CrossChainEnabledOptimism(bridge) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Polygon
|
||||
*/
|
||||
contract CrossChainEnabledPolygonChildMock is Receiver, CrossChainEnabledPolygonChild {
|
||||
/// @custom:oz-upgrades-unsafe-allow constructor
|
||||
constructor(address bridge) CrossChainEnabledPolygonChild(bridge) {}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/extensions/ERC4626.sol";
|
||||
|
||||
abstract contract ERC4626Fees is ERC4626 {
|
||||
using Math for uint256;
|
||||
|
||||
/** @dev See {IERC4626-previewDeposit}. */
|
||||
function previewDeposit(uint256 assets) public view virtual override returns (uint256) {
|
||||
uint256 fee = _feeOnTotal(assets, _entryFeeBasePoint());
|
||||
return super.previewDeposit(assets - fee);
|
||||
}
|
||||
|
||||
/** @dev See {IERC4626-previewMint}. */
|
||||
function previewMint(uint256 shares) public view virtual override returns (uint256) {
|
||||
uint256 assets = super.previewMint(shares);
|
||||
return assets + _feeOnRaw(assets, _entryFeeBasePoint());
|
||||
}
|
||||
|
||||
/** @dev See {IERC4626-previewWithdraw}. */
|
||||
function previewWithdraw(uint256 assets) public view virtual override returns (uint256) {
|
||||
uint256 fee = _feeOnRaw(assets, _exitFeeBasePoint());
|
||||
return super.previewWithdraw(assets + fee);
|
||||
}
|
||||
|
||||
/** @dev See {IERC4626-previewRedeem}. */
|
||||
function previewRedeem(uint256 shares) public view virtual override returns (uint256) {
|
||||
uint256 assets = super.previewRedeem(shares);
|
||||
return assets - _feeOnTotal(assets, _exitFeeBasePoint());
|
||||
}
|
||||
|
||||
/** @dev See {IERC4626-_deposit}. */
|
||||
function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual override {
|
||||
uint256 fee = _feeOnTotal(assets, _entryFeeBasePoint());
|
||||
address recipient = _entryFeeRecipient();
|
||||
|
||||
super._deposit(caller, receiver, assets, shares);
|
||||
|
||||
if (fee > 0 && recipient != address(this)) {
|
||||
SafeERC20.safeTransfer(IERC20(asset()), recipient, fee);
|
||||
}
|
||||
}
|
||||
|
||||
/** @dev See {IERC4626-_deposit}. */
|
||||
function _withdraw(
|
||||
address caller,
|
||||
address receiver,
|
||||
address owner,
|
||||
uint256 assets,
|
||||
uint256 shares
|
||||
) internal virtual override {
|
||||
uint256 fee = _feeOnRaw(assets, _exitFeeBasePoint());
|
||||
address recipient = _exitFeeRecipient();
|
||||
|
||||
super._withdraw(caller, receiver, owner, assets, shares);
|
||||
|
||||
if (fee > 0 && recipient != address(this)) {
|
||||
SafeERC20.safeTransfer(IERC20(asset()), recipient, fee);
|
||||
}
|
||||
}
|
||||
|
||||
function _entryFeeBasePoint() internal view virtual returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function _entryFeeRecipient() internal view virtual returns (address) {
|
||||
return address(0);
|
||||
}
|
||||
|
||||
function _exitFeeBasePoint() internal view virtual returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function _exitFeeRecipient() internal view virtual returns (address) {
|
||||
return address(0);
|
||||
}
|
||||
|
||||
function _feeOnRaw(uint256 assets, uint256 feeBasePoint) private pure returns (uint256) {
|
||||
return assets.mulDiv(feeBasePoint, 1e5, Math.Rounding.Up);
|
||||
}
|
||||
|
||||
function _feeOnTotal(uint256 assets, uint256 feeBasePoint) private pure returns (uint256) {
|
||||
return assets.mulDiv(feeBasePoint, feeBasePoint + 1e5, Math.Rounding.Up);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotesComp.sol";
|
||||
|
||||
abstract contract GovernorCompMock is GovernorVotesComp, GovernorCountingSimple {
|
||||
function quorum(uint256) public pure override returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 16;
|
||||
}
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/compatibility/GovernorCompatibilityBravo.sol";
|
||||
import "../../governance/extensions/GovernorTimelockCompound.sol";
|
||||
import "../../governance/extensions/GovernorSettings.sol";
|
||||
import "../../governance/extensions/GovernorVotesComp.sol";
|
||||
|
||||
abstract contract GovernorCompatibilityBravoMock is
|
||||
GovernorCompatibilityBravo,
|
||||
GovernorSettings,
|
||||
GovernorTimelockCompound,
|
||||
GovernorVotesComp
|
||||
{
|
||||
function quorum(uint256) public pure override returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(IERC165, Governor, GovernorTimelockCompound) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
|
||||
function state(
|
||||
uint256 proposalId
|
||||
) public view override(IGovernor, Governor, GovernorTimelockCompound) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function proposalEta(
|
||||
uint256 proposalId
|
||||
) public view override(IGovernorTimelock, GovernorTimelockCompound) returns (uint256) {
|
||||
return super.proposalEta(proposalId);
|
||||
}
|
||||
|
||||
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
|
||||
return super.proposalThreshold();
|
||||
}
|
||||
|
||||
function propose(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
string memory description
|
||||
) public override(IGovernor, Governor, GovernorCompatibilityBravo) returns (uint256) {
|
||||
return super.propose(targets, values, calldatas, description);
|
||||
}
|
||||
|
||||
function queue(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 salt
|
||||
) public override(IGovernorTimelock, GovernorTimelockCompound) returns (uint256) {
|
||||
return super.queue(targets, values, calldatas, salt);
|
||||
}
|
||||
|
||||
function execute(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 salt
|
||||
) public payable override(IGovernor, Governor) returns (uint256) {
|
||||
return super.execute(targets, values, calldatas, salt);
|
||||
}
|
||||
|
||||
function cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) {
|
||||
return super.cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockCompound) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 salt
|
||||
) internal override(Governor, GovernorTimelockCompound) returns (uint256 proposalId) {
|
||||
return super._cancel(targets, values, calldatas, salt);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockCompound) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorProposalThreshold.sol";
|
||||
import "../../governance/extensions/GovernorSettings.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
|
||||
abstract contract GovernorMock is
|
||||
GovernorProposalThreshold,
|
||||
GovernorSettings,
|
||||
GovernorVotesQuorumFraction,
|
||||
GovernorCountingSimple
|
||||
{
|
||||
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
|
||||
return super.proposalThreshold();
|
||||
}
|
||||
|
||||
function propose(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
string memory description
|
||||
) public override(Governor, GovernorProposalThreshold) returns (uint256) {
|
||||
return super.propose(targets, values, calldatas, description);
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorPreventLateQuorum.sol";
|
||||
import "../../governance/extensions/GovernorSettings.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
|
||||
abstract contract GovernorPreventLateQuorumMock is
|
||||
GovernorSettings,
|
||||
GovernorVotes,
|
||||
GovernorCountingSimple,
|
||||
GovernorPreventLateQuorum
|
||||
{
|
||||
uint256 private _quorum;
|
||||
|
||||
constructor(uint256 quorum_) {
|
||||
_quorum = quorum_;
|
||||
}
|
||||
|
||||
function quorum(uint256) public view override returns (uint256) {
|
||||
return _quorum;
|
||||
}
|
||||
|
||||
function proposalDeadline(
|
||||
uint256 proposalId
|
||||
) public view override(Governor, GovernorPreventLateQuorum) returns (uint256) {
|
||||
return super.proposalDeadline(proposalId);
|
||||
}
|
||||
|
||||
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
|
||||
return super.proposalThreshold();
|
||||
}
|
||||
|
||||
function _castVote(
|
||||
uint256 proposalId,
|
||||
address account,
|
||||
uint8 support,
|
||||
string memory reason,
|
||||
bytes memory params
|
||||
) internal override(Governor, GovernorPreventLateQuorum) returns (uint256) {
|
||||
return super._castVote(proposalId, account, support, reason, params);
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorTimelockCompound.sol";
|
||||
import "../../governance/extensions/GovernorSettings.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
|
||||
abstract contract GovernorTimelockCompoundMock is
|
||||
GovernorSettings,
|
||||
GovernorTimelockCompound,
|
||||
GovernorVotesQuorumFraction,
|
||||
GovernorCountingSimple
|
||||
{
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(Governor, GovernorTimelockCompound) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
|
||||
function quorum(
|
||||
uint256 blockNumber
|
||||
) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) {
|
||||
return super.quorum(blockNumber);
|
||||
}
|
||||
|
||||
function state(
|
||||
uint256 proposalId
|
||||
) public view override(Governor, GovernorTimelockCompound) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
|
||||
return super.proposalThreshold();
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockCompound) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 salt
|
||||
) internal override(Governor, GovernorTimelockCompound) returns (uint256 proposalId) {
|
||||
return super._cancel(targets, values, calldatas, salt);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockCompound) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorTimelockControl.sol";
|
||||
import "../../governance/extensions/GovernorSettings.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
|
||||
abstract contract GovernorTimelockControlMock is
|
||||
GovernorSettings,
|
||||
GovernorTimelockControl,
|
||||
GovernorVotesQuorumFraction,
|
||||
GovernorCountingSimple
|
||||
{
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(Governor, GovernorTimelockControl) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
|
||||
function quorum(
|
||||
uint256 blockNumber
|
||||
) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) {
|
||||
return super.quorum(blockNumber);
|
||||
}
|
||||
|
||||
function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) {
|
||||
return super.proposalThreshold();
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) returns (uint256 proposalId) {
|
||||
return super._cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
|
||||
function nonGovernanceFunction() external {}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
|
||||
abstract contract GovernorVoteMocks is GovernorVotes, GovernorCountingSimple {
|
||||
function quorum(uint256) public pure override returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 16;
|
||||
}
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
|
||||
abstract contract GovernorWithParamsMock is GovernorVotes, GovernorCountingSimple {
|
||||
event CountParams(uint256 uintParam, string strParam);
|
||||
|
||||
function quorum(uint256) public pure override returns (uint256) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 16;
|
||||
}
|
||||
|
||||
function _getVotes(
|
||||
address account,
|
||||
uint256 blockNumber,
|
||||
bytes memory params
|
||||
) internal view override(Governor, GovernorVotes) returns (uint256) {
|
||||
uint256 reduction = 0;
|
||||
// If the user provides parameters, we reduce the voting weight by the amount of the integer param
|
||||
if (params.length > 0) {
|
||||
(reduction, ) = abi.decode(params, (uint256, string));
|
||||
}
|
||||
// reverts on overflow
|
||||
return super._getVotes(account, blockNumber, params) - reduction;
|
||||
}
|
||||
|
||||
function _countVote(
|
||||
uint256 proposalId,
|
||||
address account,
|
||||
uint8 support,
|
||||
uint256 weight,
|
||||
bytes memory params
|
||||
) internal override(Governor, GovernorCountingSimple) {
|
||||
if (params.length > 0) {
|
||||
(uint256 _uintParam, string memory _strParam) = abi.decode(params, (uint256, string));
|
||||
emit CountParams(_uintParam, _strParam);
|
||||
}
|
||||
return super._countVote(proposalId, account, support, weight, params);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract BadBeaconNoImpl {}
|
||||
|
||||
contract BadBeaconNotContract {
|
||||
function implementation() external pure returns (address) {
|
||||
return address(0x1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
/**
|
||||
* @dev Implementation contract with a payable admin() function made to clash with TransparentUpgradeableProxy's to
|
||||
* test correct functioning of the Transparent Proxy feature.
|
||||
*/
|
||||
contract ClashingImplementation {
|
||||
function admin() external payable returns (address) {
|
||||
return 0x0000000000000000000000000000000011111142;
|
||||
}
|
||||
|
||||
function delegatedFunction() external pure returns (bool) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "./UUPSUpgradeableMock.sol";
|
||||
|
||||
// This contract implements the pre-4.5 UUPS upgrade function with a rollback test.
|
||||
// It's used to test that newer UUPS contracts are considered valid upgrades by older UUPS contracts.
|
||||
contract UUPSUpgradeableLegacyMock is UUPSUpgradeableMock {
|
||||
// Inlined from ERC1967Upgrade
|
||||
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
|
||||
|
||||
// ERC1967Upgrade._setImplementation is private so we reproduce it here.
|
||||
// An extra underscore prevents a name clash error.
|
||||
function __setImplementation(address newImplementation) private {
|
||||
require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
|
||||
StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
|
||||
}
|
||||
|
||||
function _upgradeToAndCallSecureLegacyV1(address newImplementation, bytes memory data, bool forceCall) internal {
|
||||
address oldImplementation = _getImplementation();
|
||||
|
||||
// Initial upgrade and setup call
|
||||
__setImplementation(newImplementation);
|
||||
if (data.length > 0 || forceCall) {
|
||||
Address.functionDelegateCall(newImplementation, data);
|
||||
}
|
||||
|
||||
// Perform rollback test if not already in progress
|
||||
StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT);
|
||||
if (!rollbackTesting.value) {
|
||||
// Trigger rollback using upgradeTo from the new implementation
|
||||
rollbackTesting.value = true;
|
||||
Address.functionDelegateCall(
|
||||
newImplementation,
|
||||
abi.encodeWithSignature("upgradeTo(address)", oldImplementation)
|
||||
);
|
||||
rollbackTesting.value = false;
|
||||
// Check rollback was effective
|
||||
require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades");
|
||||
// Finally reset to the new implementation and log the upgrade
|
||||
_upgradeTo(newImplementation);
|
||||
}
|
||||
}
|
||||
|
||||
// hooking into the old mechanism
|
||||
function upgradeTo(address newImplementation) public override {
|
||||
_upgradeToAndCallSecureLegacyV1(newImplementation, bytes(""), false);
|
||||
}
|
||||
|
||||
function upgradeToAndCall(address newImplementation, bytes memory data) public payable override {
|
||||
_upgradeToAndCallSecureLegacyV1(newImplementation, data, false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../proxy/utils/UUPSUpgradeable.sol";
|
||||
import "../../utils/Counters.sol";
|
||||
|
||||
contract NonUpgradeableMock {
|
||||
Counters.Counter internal _counter;
|
||||
|
||||
function current() external view returns (uint256) {
|
||||
return Counters.current(_counter);
|
||||
}
|
||||
|
||||
function increment() external {
|
||||
return Counters.increment(_counter);
|
||||
}
|
||||
}
|
||||
|
||||
contract UUPSUpgradeableMock is NonUpgradeableMock, UUPSUpgradeable {
|
||||
// Not having any checks in this function is dangerous! Do not do this outside tests!
|
||||
function _authorizeUpgrade(address) internal override {}
|
||||
}
|
||||
|
||||
contract UUPSUpgradeableUnsafeMock is UUPSUpgradeableMock {
|
||||
function upgradeTo(address newImplementation) public override {
|
||||
ERC1967Upgrade._upgradeToAndCall(newImplementation, bytes(""), false);
|
||||
}
|
||||
|
||||
function upgradeToAndCall(address newImplementation, bytes memory data) public payable override {
|
||||
ERC1967Upgrade._upgradeToAndCall(newImplementation, data, false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC1155/IERC1155Receiver.sol";
|
||||
import "../../utils/introspection/ERC165.sol";
|
||||
|
||||
contract ERC1155ReceiverMock is ERC165, IERC1155Receiver {
|
||||
bytes4 private _recRetval;
|
||||
bool private _recReverts;
|
||||
bytes4 private _batRetval;
|
||||
bool private _batReverts;
|
||||
|
||||
event Received(address operator, address from, uint256 id, uint256 value, bytes data, uint256 gas);
|
||||
event BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data, uint256 gas);
|
||||
|
||||
constructor(bytes4 recRetval, bool recReverts, bytes4 batRetval, bool batReverts) {
|
||||
_recRetval = recRetval;
|
||||
_recReverts = recReverts;
|
||||
_batRetval = batRetval;
|
||||
_batReverts = batReverts;
|
||||
}
|
||||
|
||||
function onERC1155Received(
|
||||
address operator,
|
||||
address from,
|
||||
uint256 id,
|
||||
uint256 value,
|
||||
bytes calldata data
|
||||
) external override returns (bytes4) {
|
||||
require(!_recReverts, "ERC1155ReceiverMock: reverting on receive");
|
||||
emit Received(operator, from, id, value, data, gasleft());
|
||||
return _recRetval;
|
||||
}
|
||||
|
||||
function onERC1155BatchReceived(
|
||||
address operator,
|
||||
address from,
|
||||
uint256[] calldata ids,
|
||||
uint256[] calldata values,
|
||||
bytes calldata data
|
||||
) external override returns (bytes4) {
|
||||
require(!_batReverts, "ERC1155ReceiverMock: reverting on batch receive");
|
||||
emit BatchReceived(operator, from, ids, values, data, gasleft());
|
||||
return _batRetval;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
|
||||
abstract contract ERC20DecimalsMock is ERC20 {
|
||||
uint8 private immutable _decimals;
|
||||
|
||||
constructor(uint8 decimals_) {
|
||||
_decimals = decimals_;
|
||||
}
|
||||
|
||||
function decimals() public view override returns (uint8) {
|
||||
return _decimals;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
contract ERC20ExcessDecimalsMock {
|
||||
function decimals() public pure returns (uint256) {
|
||||
return type(uint256).max;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/extensions/ERC20FlashMint.sol";
|
||||
|
||||
abstract contract ERC20FlashMintMock is ERC20FlashMint {
|
||||
uint256 _flashFeeAmount;
|
||||
address _flashFeeReceiverAddress;
|
||||
|
||||
function setFlashFee(uint256 amount) public {
|
||||
_flashFeeAmount = amount;
|
||||
}
|
||||
|
||||
function _flashFee(address, uint256) internal view override returns (uint256) {
|
||||
return _flashFeeAmount;
|
||||
}
|
||||
|
||||
function setFlashFeeReceiver(address receiver) public {
|
||||
_flashFeeReceiverAddress = receiver;
|
||||
}
|
||||
|
||||
function _flashFeeReceiver() internal view override returns (address) {
|
||||
return _flashFeeReceiverAddress;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
|
||||
// contract that replicate USDT (0xdac17f958d2ee523a2206206994597c13d831ec7) approval beavior
|
||||
abstract contract ERC20ForceApproveMock is ERC20 {
|
||||
function approve(address spender, uint256 amount) public virtual override returns (bool) {
|
||||
require(amount == 0 || allowance(msg.sender, spender) == 0, "USDT approval failure");
|
||||
return super.approve(spender, amount);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
import "../../utils/Multicall.sol";
|
||||
|
||||
abstract contract ERC20MulticallMock is ERC20, Multicall {}
|
||||
@@ -0,0 +1,28 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
|
||||
abstract contract ERC20NoReturnMock is ERC20 {
|
||||
function transfer(address to, uint256 amount) public override returns (bool) {
|
||||
super.transfer(to, amount);
|
||||
assembly {
|
||||
return(0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
|
||||
super.transferFrom(from, to, amount);
|
||||
assembly {
|
||||
return(0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
function approve(address spender, uint256 amount) public override returns (bool) {
|
||||
super.approve(spender, amount);
|
||||
assembly {
|
||||
return(0, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
import "../../token/ERC20/extensions/draft-ERC20Permit.sol";
|
||||
|
||||
abstract contract ERC20PermitNoRevertMock is ERC20Permit {
|
||||
function permitThatMayRevert(
|
||||
address owner,
|
||||
address spender,
|
||||
uint256 value,
|
||||
uint256 deadline,
|
||||
uint8 v,
|
||||
bytes32 r,
|
||||
bytes32 s
|
||||
) public virtual {
|
||||
super.permit(owner, spender, value, deadline, v, r, s);
|
||||
}
|
||||
|
||||
function permit(
|
||||
address owner,
|
||||
address spender,
|
||||
uint256 value,
|
||||
uint256 deadline,
|
||||
uint8 v,
|
||||
bytes32 r,
|
||||
bytes32 s
|
||||
) public virtual override {
|
||||
try this.permitThatMayRevert(owner, spender, value, deadline, v, r, s) {
|
||||
// do nothing
|
||||
} catch {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/ERC20.sol";
|
||||
|
||||
abstract contract ERC20ReturnFalseMock is ERC20 {
|
||||
function transfer(address, uint256) public pure override returns (bool) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function transferFrom(address, address, uint256) public pure override returns (bool) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function approve(address, uint256) public pure override returns (bool) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/extensions/ERC20Permit.sol";
|
||||
import "../../utils/math/Math.sol";
|
||||
import "../../governance/utils/IVotes.sol";
|
||||
import "../../utils/math/SafeCast.sol";
|
||||
import "../../utils/cryptography/ECDSA.sol";
|
||||
|
||||
/**
|
||||
* @dev Copied from the master branch at commit 86de1e8b6c3fa6b4efa4a5435869d2521be0f5f5
|
||||
*/
|
||||
abstract contract ERC20VotesLegacyMock is IVotes, ERC20Permit {
|
||||
struct Checkpoint {
|
||||
uint32 fromBlock;
|
||||
uint224 votes;
|
||||
}
|
||||
|
||||
bytes32 private constant _DELEGATION_TYPEHASH =
|
||||
keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
|
||||
|
||||
mapping(address => address) private _delegates;
|
||||
mapping(address => Checkpoint[]) private _checkpoints;
|
||||
Checkpoint[] private _totalSupplyCheckpoints;
|
||||
|
||||
/**
|
||||
* @dev Get the `pos`-th checkpoint for `account`.
|
||||
*/
|
||||
function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
|
||||
return _checkpoints[account][pos];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Get number of checkpoints for `account`.
|
||||
*/
|
||||
function numCheckpoints(address account) public view virtual returns (uint32) {
|
||||
return SafeCast.toUint32(_checkpoints[account].length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Get the address `account` is currently delegating to.
|
||||
*/
|
||||
function delegates(address account) public view virtual override returns (address) {
|
||||
return _delegates[account];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Gets the current votes balance for `account`
|
||||
*/
|
||||
function getVotes(address account) public view virtual override returns (uint256) {
|
||||
uint256 pos = _checkpoints[account].length;
|
||||
unchecked {
|
||||
return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Retrieve the number of votes for `account` at the end of `blockNumber`.
|
||||
*
|
||||
* Requirements:
|
||||
*
|
||||
* - `blockNumber` must have been already mined
|
||||
*/
|
||||
function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {
|
||||
require(blockNumber < block.number, "ERC20Votes: block not yet mined");
|
||||
return _checkpointsLookup(_checkpoints[account], blockNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
|
||||
* It is NOT the sum of all the delegated votes!
|
||||
*
|
||||
* Requirements:
|
||||
*
|
||||
* - `blockNumber` must have been already mined
|
||||
*/
|
||||
function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {
|
||||
require(blockNumber < block.number, "ERC20Votes: block not yet mined");
|
||||
return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Lookup a value in a list of (sorted) checkpoints.
|
||||
*/
|
||||
function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {
|
||||
// We run a binary search to look for the earliest checkpoint taken after `blockNumber`.
|
||||
//
|
||||
// Initially we check if the block is recent to narrow the search range.
|
||||
// During the loop, the index of the wanted checkpoint remains in the range [low-1, high).
|
||||
// With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.
|
||||
// - If the middle checkpoint is after `blockNumber`, we look in [low, mid)
|
||||
// - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)
|
||||
// Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not
|
||||
// out of bounds (in which case we're looking too far in the past and the result is 0).
|
||||
// Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is
|
||||
// past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out
|
||||
// the same.
|
||||
uint256 length = ckpts.length;
|
||||
|
||||
uint256 low = 0;
|
||||
uint256 high = length;
|
||||
|
||||
if (length > 5) {
|
||||
uint256 mid = length - Math.sqrt(length);
|
||||
if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) {
|
||||
high = mid;
|
||||
} else {
|
||||
low = mid + 1;
|
||||
}
|
||||
}
|
||||
|
||||
while (low < high) {
|
||||
uint256 mid = Math.average(low, high);
|
||||
if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) {
|
||||
high = mid;
|
||||
} else {
|
||||
low = mid + 1;
|
||||
}
|
||||
}
|
||||
|
||||
unchecked {
|
||||
return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Delegate votes from the sender to `delegatee`.
|
||||
*/
|
||||
function delegate(address delegatee) public virtual override {
|
||||
_delegate(_msgSender(), delegatee);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Delegates votes from signer to `delegatee`
|
||||
*/
|
||||
function delegateBySig(
|
||||
address delegatee,
|
||||
uint256 nonce,
|
||||
uint256 expiry,
|
||||
uint8 v,
|
||||
bytes32 r,
|
||||
bytes32 s
|
||||
) public virtual override {
|
||||
require(block.timestamp <= expiry, "ERC20Votes: signature expired");
|
||||
address signer = ECDSA.recover(
|
||||
_hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
|
||||
v,
|
||||
r,
|
||||
s
|
||||
);
|
||||
require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
|
||||
_delegate(signer, delegatee);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
|
||||
*/
|
||||
function _maxSupply() internal view virtual returns (uint224) {
|
||||
return type(uint224).max;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Snapshots the totalSupply after it has been increased.
|
||||
*/
|
||||
function _mint(address account, uint256 amount) internal virtual override {
|
||||
super._mint(account, amount);
|
||||
require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");
|
||||
|
||||
_writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Snapshots the totalSupply after it has been decreased.
|
||||
*/
|
||||
function _burn(address account, uint256 amount) internal virtual override {
|
||||
super._burn(account, amount);
|
||||
|
||||
_writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Move voting power when tokens are transferred.
|
||||
*
|
||||
* Emits a {IVotes-DelegateVotesChanged} event.
|
||||
*/
|
||||
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {
|
||||
super._afterTokenTransfer(from, to, amount);
|
||||
|
||||
_moveVotingPower(delegates(from), delegates(to), amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Change delegation for `delegator` to `delegatee`.
|
||||
*
|
||||
* Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
|
||||
*/
|
||||
function _delegate(address delegator, address delegatee) internal virtual {
|
||||
address currentDelegate = delegates(delegator);
|
||||
uint256 delegatorBalance = balanceOf(delegator);
|
||||
_delegates[delegator] = delegatee;
|
||||
|
||||
emit DelegateChanged(delegator, currentDelegate, delegatee);
|
||||
|
||||
_moveVotingPower(currentDelegate, delegatee, delegatorBalance);
|
||||
}
|
||||
|
||||
function _moveVotingPower(address src, address dst, uint256 amount) private {
|
||||
if (src != dst && amount > 0) {
|
||||
if (src != address(0)) {
|
||||
(uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
|
||||
emit DelegateVotesChanged(src, oldWeight, newWeight);
|
||||
}
|
||||
|
||||
if (dst != address(0)) {
|
||||
(uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
|
||||
emit DelegateVotesChanged(dst, oldWeight, newWeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _writeCheckpoint(
|
||||
Checkpoint[] storage ckpts,
|
||||
function(uint256, uint256) view returns (uint256) op,
|
||||
uint256 delta
|
||||
) private returns (uint256 oldWeight, uint256 newWeight) {
|
||||
uint256 pos = ckpts.length;
|
||||
|
||||
unchecked {
|
||||
Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);
|
||||
|
||||
oldWeight = oldCkpt.votes;
|
||||
newWeight = op(oldWeight, delta);
|
||||
|
||||
if (pos > 0 && oldCkpt.fromBlock == block.number) {
|
||||
_unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);
|
||||
} else {
|
||||
ckpts.push(
|
||||
Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _add(uint256 a, uint256 b) private pure returns (uint256) {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
|
||||
return a - b;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
|
||||
*/
|
||||
function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {
|
||||
assembly {
|
||||
mstore(0, ckpts.slot)
|
||||
result.slot := add(keccak256(0, 0x20), pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/extensions/ERC4626.sol";
|
||||
|
||||
abstract contract ERC4626OffsetMock is ERC4626 {
|
||||
uint8 private immutable _offset;
|
||||
|
||||
constructor(uint8 offset_) {
|
||||
_offset = offset_;
|
||||
}
|
||||
|
||||
function _decimalsOffset() internal view virtual override returns (uint8) {
|
||||
return _offset;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../docs/ERC4626Fees.sol";
|
||||
|
||||
abstract contract ERC4626FeesMock is ERC4626Fees {
|
||||
uint256 private immutable _entryFeeBasePointValue;
|
||||
address private immutable _entryFeeRecipientValue;
|
||||
uint256 private immutable _exitFeeBasePointValue;
|
||||
address private immutable _exitFeeRecipientValue;
|
||||
|
||||
constructor(
|
||||
uint256 entryFeeBasePoint,
|
||||
address entryFeeRecipient,
|
||||
uint256 exitFeeBasePoint,
|
||||
address exitFeeRecipient
|
||||
) {
|
||||
_entryFeeBasePointValue = entryFeeBasePoint;
|
||||
_entryFeeRecipientValue = entryFeeRecipient;
|
||||
_exitFeeBasePointValue = exitFeeBasePoint;
|
||||
_exitFeeRecipientValue = exitFeeRecipient;
|
||||
}
|
||||
|
||||
function _entryFeeBasePoint() internal view virtual override returns (uint256) {
|
||||
return _entryFeeBasePointValue;
|
||||
}
|
||||
|
||||
function _entryFeeRecipient() internal view virtual override returns (address) {
|
||||
return _entryFeeRecipientValue;
|
||||
}
|
||||
|
||||
function _exitFeeBasePoint() internal view virtual override returns (uint256) {
|
||||
return _exitFeeBasePointValue;
|
||||
}
|
||||
|
||||
function _exitFeeRecipient() internal view virtual override returns (address) {
|
||||
return _exitFeeRecipientValue;
|
||||
}
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC721/extensions/ERC721Consecutive.sol";
|
||||
import "../../token/ERC721/extensions/ERC721Enumerable.sol";
|
||||
|
||||
contract ERC721ConsecutiveEnumerableMock is ERC721Consecutive, ERC721Enumerable {
|
||||
constructor(
|
||||
string memory name,
|
||||
string memory symbol,
|
||||
address[] memory receivers,
|
||||
uint96[] memory amounts
|
||||
) ERC721(name, symbol) {
|
||||
for (uint256 i = 0; i < receivers.length; ++i) {
|
||||
_mintConsecutive(receivers[i], amounts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
|
||||
function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) {
|
||||
return super._ownerOf(tokenId);
|
||||
}
|
||||
|
||||
function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) {
|
||||
super._mint(to, tokenId);
|
||||
}
|
||||
|
||||
function _beforeTokenTransfer(
|
||||
address from,
|
||||
address to,
|
||||
uint256 firstTokenId,
|
||||
uint256 batchSize
|
||||
) internal virtual override(ERC721, ERC721Enumerable) {
|
||||
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
|
||||
}
|
||||
|
||||
function _afterTokenTransfer(
|
||||
address from,
|
||||
address to,
|
||||
uint256 firstTokenId,
|
||||
uint256 batchSize
|
||||
) internal virtual override(ERC721, ERC721Consecutive) {
|
||||
super._afterTokenTransfer(from, to, firstTokenId, batchSize);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC721/extensions/ERC721Consecutive.sol";
|
||||
import "../../token/ERC721/extensions/ERC721Enumerable.sol";
|
||||
import "../../token/ERC721/extensions/ERC721Pausable.sol";
|
||||
import "../../token/ERC721/extensions/draft-ERC721Votes.sol";
|
||||
|
||||
/**
|
||||
* @title ERC721ConsecutiveMock
|
||||
*/
|
||||
contract ERC721ConsecutiveMock is ERC721Consecutive, ERC721Pausable, ERC721Votes {
|
||||
constructor(
|
||||
string memory name,
|
||||
string memory symbol,
|
||||
address[] memory delegates,
|
||||
address[] memory receivers,
|
||||
uint96[] memory amounts
|
||||
) ERC721(name, symbol) EIP712(name, "1") {
|
||||
for (uint256 i = 0; i < delegates.length; ++i) {
|
||||
_delegate(delegates[i], delegates[i]);
|
||||
}
|
||||
|
||||
for (uint256 i = 0; i < receivers.length; ++i) {
|
||||
_mintConsecutive(receivers[i], amounts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function _ownerOf(uint256 tokenId) internal view virtual override(ERC721, ERC721Consecutive) returns (address) {
|
||||
return super._ownerOf(tokenId);
|
||||
}
|
||||
|
||||
function _mint(address to, uint256 tokenId) internal virtual override(ERC721, ERC721Consecutive) {
|
||||
super._mint(to, tokenId);
|
||||
}
|
||||
|
||||
function _beforeTokenTransfer(
|
||||
address from,
|
||||
address to,
|
||||
uint256 firstTokenId,
|
||||
uint256 batchSize
|
||||
) internal virtual override(ERC721, ERC721Pausable) {
|
||||
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
|
||||
}
|
||||
|
||||
function _afterTokenTransfer(
|
||||
address from,
|
||||
address to,
|
||||
uint256 firstTokenId,
|
||||
uint256 batchSize
|
||||
) internal virtual override(ERC721, ERC721Votes, ERC721Consecutive) {
|
||||
super._afterTokenTransfer(from, to, firstTokenId, batchSize);
|
||||
}
|
||||
}
|
||||
|
||||
contract ERC721ConsecutiveNoConstructorMintMock is ERC721Consecutive {
|
||||
constructor(string memory name, string memory symbol) ERC721(name, symbol) {
|
||||
_mint(msg.sender, 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC721/IERC721Receiver.sol";
|
||||
|
||||
contract ERC721ReceiverMock is IERC721Receiver {
|
||||
enum Error {
|
||||
None,
|
||||
RevertWithMessage,
|
||||
RevertWithoutMessage,
|
||||
Panic
|
||||
}
|
||||
|
||||
bytes4 private immutable _retval;
|
||||
Error private immutable _error;
|
||||
|
||||
event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas);
|
||||
|
||||
constructor(bytes4 retval, Error error) {
|
||||
_retval = retval;
|
||||
_error = error;
|
||||
}
|
||||
|
||||
function onERC721Received(
|
||||
address operator,
|
||||
address from,
|
||||
uint256 tokenId,
|
||||
bytes memory data
|
||||
) public override returns (bytes4) {
|
||||
if (_error == Error.RevertWithMessage) {
|
||||
revert("ERC721ReceiverMock: reverting");
|
||||
} else if (_error == Error.RevertWithoutMessage) {
|
||||
revert();
|
||||
} else if (_error == Error.Panic) {
|
||||
uint256 a = uint256(0) / uint256(0);
|
||||
a;
|
||||
}
|
||||
emit Received(operator, from, tokenId, data, gasleft());
|
||||
return _retval;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC721/extensions/ERC721URIStorage.sol";
|
||||
|
||||
abstract contract ERC721URIStorageMock is ERC721URIStorage {
|
||||
string private _baseTokenURI;
|
||||
|
||||
function _baseURI() internal view virtual override returns (string memory) {
|
||||
return _baseTokenURI;
|
||||
}
|
||||
|
||||
function setBaseURI(string calldata newBaseTokenURI) public {
|
||||
_baseTokenURI = newBaseTokenURI;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC777/ERC777.sol";
|
||||
|
||||
abstract contract ERC777Mock is ERC777 {
|
||||
event BeforeTokenTransfer();
|
||||
|
||||
function _beforeTokenTransfer(address, address, address, uint256) internal override {
|
||||
emit BeforeTokenTransfer();
|
||||
}
|
||||
}
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC777/IERC777.sol";
|
||||
import "../../token/ERC777/IERC777Sender.sol";
|
||||
import "../../token/ERC777/IERC777Recipient.sol";
|
||||
import "../../utils/Context.sol";
|
||||
import "../../utils/introspection/IERC1820Registry.sol";
|
||||
import "../../utils/introspection/ERC1820Implementer.sol";
|
||||
|
||||
contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient, ERC1820Implementer {
|
||||
event TokensToSendCalled(
|
||||
address operator,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount,
|
||||
bytes data,
|
||||
bytes operatorData,
|
||||
address token,
|
||||
uint256 fromBalance,
|
||||
uint256 toBalance
|
||||
);
|
||||
|
||||
event TokensReceivedCalled(
|
||||
address operator,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount,
|
||||
bytes data,
|
||||
bytes operatorData,
|
||||
address token,
|
||||
uint256 fromBalance,
|
||||
uint256 toBalance
|
||||
);
|
||||
|
||||
// Emitted in ERC777Mock. Here for easier decoding
|
||||
event BeforeTokenTransfer();
|
||||
|
||||
bool private _shouldRevertSend;
|
||||
bool private _shouldRevertReceive;
|
||||
|
||||
IERC1820Registry private _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
|
||||
|
||||
bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
|
||||
bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");
|
||||
|
||||
function tokensToSend(
|
||||
address operator,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount,
|
||||
bytes calldata userData,
|
||||
bytes calldata operatorData
|
||||
) external override {
|
||||
if (_shouldRevertSend) {
|
||||
revert();
|
||||
}
|
||||
|
||||
IERC777 token = IERC777(_msgSender());
|
||||
|
||||
uint256 fromBalance = token.balanceOf(from);
|
||||
// when called due to burn, to will be the zero address, which will have a balance of 0
|
||||
uint256 toBalance = token.balanceOf(to);
|
||||
|
||||
emit TokensToSendCalled(
|
||||
operator,
|
||||
from,
|
||||
to,
|
||||
amount,
|
||||
userData,
|
||||
operatorData,
|
||||
address(token),
|
||||
fromBalance,
|
||||
toBalance
|
||||
);
|
||||
}
|
||||
|
||||
function tokensReceived(
|
||||
address operator,
|
||||
address from,
|
||||
address to,
|
||||
uint256 amount,
|
||||
bytes calldata userData,
|
||||
bytes calldata operatorData
|
||||
) external override {
|
||||
if (_shouldRevertReceive) {
|
||||
revert();
|
||||
}
|
||||
|
||||
IERC777 token = IERC777(_msgSender());
|
||||
|
||||
uint256 fromBalance = token.balanceOf(from);
|
||||
// when called due to burn, to will be the zero address, which will have a balance of 0
|
||||
uint256 toBalance = token.balanceOf(to);
|
||||
|
||||
emit TokensReceivedCalled(
|
||||
operator,
|
||||
from,
|
||||
to,
|
||||
amount,
|
||||
userData,
|
||||
operatorData,
|
||||
address(token),
|
||||
fromBalance,
|
||||
toBalance
|
||||
);
|
||||
}
|
||||
|
||||
function senderFor(address account) public {
|
||||
_registerInterfaceForAddress(_TOKENS_SENDER_INTERFACE_HASH, account);
|
||||
|
||||
address self = address(this);
|
||||
if (account == self) {
|
||||
registerSender(self);
|
||||
}
|
||||
}
|
||||
|
||||
function registerSender(address sender) public {
|
||||
_erc1820.setInterfaceImplementer(address(this), _TOKENS_SENDER_INTERFACE_HASH, sender);
|
||||
}
|
||||
|
||||
function recipientFor(address account) public {
|
||||
_registerInterfaceForAddress(_TOKENS_RECIPIENT_INTERFACE_HASH, account);
|
||||
|
||||
address self = address(this);
|
||||
if (account == self) {
|
||||
registerRecipient(self);
|
||||
}
|
||||
}
|
||||
|
||||
function registerRecipient(address recipient) public {
|
||||
_erc1820.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, recipient);
|
||||
}
|
||||
|
||||
function setShouldRevertSend(bool shouldRevert) public {
|
||||
_shouldRevertSend = shouldRevert;
|
||||
}
|
||||
|
||||
function setShouldRevertReceive(bool shouldRevert) public {
|
||||
_shouldRevertReceive = shouldRevert;
|
||||
}
|
||||
|
||||
function send(IERC777 token, address to, uint256 amount, bytes memory data) public {
|
||||
// This is 777's send function, not the Solidity send function
|
||||
token.send(to, amount, data); // solhint-disable-line check-send-result
|
||||
}
|
||||
|
||||
function burn(IERC777 token, uint256 amount, bytes memory data) public {
|
||||
token.burn(amount, data);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.0;
|
||||
|
||||
import "../../token/ERC20/extensions/ERC20Votes.sol";
|
||||
import "../../token/ERC20/extensions/ERC20VotesComp.sol";
|
||||
import "../../token/ERC721/extensions/ERC721Votes.sol";
|
||||
|
||||
abstract contract ERC20VotesTimestampMock is ERC20Votes {
|
||||
function clock() public view virtual override returns (uint48) {
|
||||
return SafeCast.toUint48(block.timestamp);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function CLOCK_MODE() public view virtual override returns (string memory) {
|
||||
return "mode=timestamp";
|
||||
}
|
||||
}
|
||||
|
||||
abstract contract ERC20VotesCompTimestampMock is ERC20VotesComp {
|
||||
function clock() public view virtual override returns (uint48) {
|
||||
return SafeCast.toUint48(block.timestamp);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function CLOCK_MODE() public view virtual override returns (string memory) {
|
||||
return "mode=timestamp";
|
||||
}
|
||||
}
|
||||
|
||||
abstract contract ERC721VotesTimestampMock is ERC721Votes {
|
||||
function clock() public view virtual override returns (uint48) {
|
||||
return SafeCast.toUint48(block.timestamp);
|
||||
}
|
||||
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function CLOCK_MODE() public view virtual override returns (string memory) {
|
||||
return "mode=timestamp";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.2;
|
||||
|
||||
import "../../governance/Governor.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
import "../../governance/extensions/GovernorTimelockControl.sol";
|
||||
|
||||
contract MyGovernor1 is
|
||||
Governor,
|
||||
GovernorTimelockControl,
|
||||
GovernorVotes,
|
||||
GovernorVotesQuorumFraction,
|
||||
GovernorCountingSimple
|
||||
{
|
||||
constructor(
|
||||
IVotes _token,
|
||||
TimelockController _timelock
|
||||
) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 1; // 1 block
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 45818; // 1 week
|
||||
}
|
||||
|
||||
// The following functions are overrides required by Solidity.
|
||||
|
||||
function quorum(
|
||||
uint256 blockNumber
|
||||
) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) {
|
||||
return super.quorum(blockNumber);
|
||||
}
|
||||
|
||||
function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function propose(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
string memory description
|
||||
) public override(Governor, IGovernor) returns (uint256) {
|
||||
return super.propose(targets, values, calldatas, description);
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) returns (uint256) {
|
||||
return super._cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(Governor, GovernorTimelockControl) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.2;
|
||||
|
||||
import "../../governance/Governor.sol";
|
||||
import "../../governance/extensions/GovernorProposalThreshold.sol";
|
||||
import "../../governance/extensions/GovernorCountingSimple.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
import "../../governance/extensions/GovernorTimelockControl.sol";
|
||||
|
||||
contract MyGovernor2 is
|
||||
Governor,
|
||||
GovernorTimelockControl,
|
||||
GovernorProposalThreshold,
|
||||
GovernorVotes,
|
||||
GovernorVotesQuorumFraction,
|
||||
GovernorCountingSimple
|
||||
{
|
||||
constructor(
|
||||
IVotes _token,
|
||||
TimelockController _timelock
|
||||
) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 1; // 1 block
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 45818; // 1 week
|
||||
}
|
||||
|
||||
function proposalThreshold() public pure override returns (uint256) {
|
||||
return 1000e18;
|
||||
}
|
||||
|
||||
// The following functions are overrides required by Solidity.
|
||||
|
||||
function quorum(
|
||||
uint256 blockNumber
|
||||
) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) {
|
||||
return super.quorum(blockNumber);
|
||||
}
|
||||
|
||||
function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function propose(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
string memory description
|
||||
) public override(Governor, GovernorProposalThreshold, IGovernor) returns (uint256) {
|
||||
return super.propose(targets, values, calldatas, description);
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) returns (uint256) {
|
||||
return super._cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(Governor, GovernorTimelockControl) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
pragma solidity ^0.8.2;
|
||||
|
||||
import "../../governance/Governor.sol";
|
||||
import "../../governance/compatibility/GovernorCompatibilityBravo.sol";
|
||||
import "../../governance/extensions/GovernorVotes.sol";
|
||||
import "../../governance/extensions/GovernorVotesQuorumFraction.sol";
|
||||
import "../../governance/extensions/GovernorTimelockControl.sol";
|
||||
|
||||
contract MyGovernor is
|
||||
Governor,
|
||||
GovernorTimelockControl,
|
||||
GovernorCompatibilityBravo,
|
||||
GovernorVotes,
|
||||
GovernorVotesQuorumFraction
|
||||
{
|
||||
constructor(
|
||||
IVotes _token,
|
||||
TimelockController _timelock
|
||||
) Governor("MyGovernor") GovernorVotes(_token) GovernorVotesQuorumFraction(4) GovernorTimelockControl(_timelock) {}
|
||||
|
||||
function votingDelay() public pure override returns (uint256) {
|
||||
return 1; // 1 block
|
||||
}
|
||||
|
||||
function votingPeriod() public pure override returns (uint256) {
|
||||
return 45818; // 1 week
|
||||
}
|
||||
|
||||
function proposalThreshold() public pure override returns (uint256) {
|
||||
return 1000e18;
|
||||
}
|
||||
|
||||
// The following functions are overrides required by Solidity.
|
||||
|
||||
function quorum(
|
||||
uint256 blockNumber
|
||||
) public view override(IGovernor, GovernorVotesQuorumFraction) returns (uint256) {
|
||||
return super.quorum(blockNumber);
|
||||
}
|
||||
|
||||
function state(
|
||||
uint256 proposalId
|
||||
) public view override(Governor, IGovernor, GovernorTimelockControl) returns (ProposalState) {
|
||||
return super.state(proposalId);
|
||||
}
|
||||
|
||||
function propose(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
string memory description
|
||||
) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) {
|
||||
return super.propose(targets, values, calldatas, description);
|
||||
}
|
||||
|
||||
function cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) {
|
||||
return super.cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _execute(
|
||||
uint256 proposalId,
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) {
|
||||
super._execute(proposalId, targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _cancel(
|
||||
address[] memory targets,
|
||||
uint256[] memory values,
|
||||
bytes[] memory calldatas,
|
||||
bytes32 descriptionHash
|
||||
) internal override(Governor, GovernorTimelockControl) returns (uint256) {
|
||||
return super._cancel(targets, values, calldatas, descriptionHash);
|
||||
}
|
||||
|
||||
function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) {
|
||||
return super._executor();
|
||||
}
|
||||
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view override(Governor, IERC165, GovernorTimelockControl) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user