init
Signed-off-by: AlienTornadosaurusHex <>
This commit is contained in:
parent
98d3fd52b0
commit
ef76a65a93
34
.github/workflows/test.yml
vendored
34
.github/workflows/test.yml
vendored
@ -1,34 +0,0 @@
|
||||
name: test
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
env:
|
||||
FOUNDRY_PROFILE: ci
|
||||
|
||||
jobs:
|
||||
check:
|
||||
strategy:
|
||||
fail-fast: true
|
||||
|
||||
name: Foundry project
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Foundry
|
||||
uses: foundry-rs/foundry-toolchain@v1
|
||||
with:
|
||||
version: nightly
|
||||
|
||||
- name: Run Forge build
|
||||
run: |
|
||||
forge --version
|
||||
forge build --sizes
|
||||
id: build
|
||||
|
||||
- name: Run Forge tests
|
||||
run: |
|
||||
forge test -vvv
|
||||
id: test
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -12,3 +12,6 @@ docs/
|
||||
|
||||
# Dotenv file
|
||||
.env
|
||||
|
||||
# Node modules
|
||||
node_modules
|
12
foundry.toml
12
foundry.toml
@ -1,6 +1,8 @@
|
||||
[profile.default]
|
||||
src = "src"
|
||||
out = "out"
|
||||
libs = ["lib"]
|
||||
|
||||
# See more config options https://github.com/foundry-rs/foundry/tree/master/config
|
||||
solc-version = "0.8.20"
|
||||
src = 'src'
|
||||
out = 'out'
|
||||
libs = ["node_modules", "lib"]
|
||||
chain_id = 1
|
||||
optimizer = true
|
||||
optimizer-runs = 10_000_000
|
8
package.json
Normal file
8
package.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "governance-proposal-template",
|
||||
"version": "1.0.0",
|
||||
"repository": "https://git.tornado.ws/AlienTornadosaurusHex/governance-proposal-template",
|
||||
"author": "AlienTornadosaurusHex",
|
||||
"license": "MIT",
|
||||
"private": false
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
// SPDX-License-Identifier: UNLICENSED
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
import "forge-std/Script.sol";
|
||||
|
||||
contract CounterScript is Script {
|
||||
function setUp() public {}
|
||||
|
||||
function run() public {
|
||||
vm.broadcast();
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
// SPDX-License-Identifier: UNLICENSED
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
contract Counter {
|
||||
uint256 public number;
|
||||
|
||||
function setNumber(uint256 newNumber) public {
|
||||
number = newNumber;
|
||||
}
|
||||
|
||||
function increment() public {
|
||||
number++;
|
||||
}
|
||||
}
|
24
src/common/BaseProposal.sol
Normal file
24
src/common/BaseProposal.sol
Normal file
@ -0,0 +1,24 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
|
||||
import { LoopbackProxy } from "../v1/LoopbackProxy.sol";
|
||||
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
||||
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
|
||||
|
||||
import { GovernancePatchUpgrade } from "./GovernancePatchUpgrade.sol";
|
||||
import { TornadoStakingRewards } from "./TornadoStakingRewards.sol";
|
||||
import { RelayerRegistry } from "./RelayerRegistry.sol";
|
||||
|
||||
contract BaseProposal {
|
||||
function getGovernanceProxyAddress() internal pure returns (address memory) {
|
||||
return "0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce";
|
||||
}
|
||||
function getStakingProxyAddress() internal pure returns (address memory) {
|
||||
return "0x2FC93484614a34f26F7970CBB94615bA109BB4bf";
|
||||
}
|
||||
function getRegistryProxyAddress() internal pure returns (address memory) {
|
||||
return "0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2";
|
||||
}
|
||||
}
|
11
src/common/interfaces/IERC20.sol
Normal file
11
src/common/interfaces/IERC20.sol
Normal file
@ -0,0 +1,11 @@
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
interface IERC20 {
|
||||
function transfer(address to, uint256 amount) external returns (bool);
|
||||
|
||||
function transferFrom(address from, address to, uint256 amount) external returns (bool);
|
||||
|
||||
function balanceOf(address owner) external returns (uint256);
|
||||
|
||||
function approve(address spender, uint256 amount) external;
|
||||
}
|
49
src/common/interfaces/IGovernance.sol
Normal file
49
src/common/interfaces/IGovernance.sol
Normal file
@ -0,0 +1,49 @@
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
struct Proposal {
|
||||
// Creator of the proposal
|
||||
address proposer;
|
||||
// target addresses for the call to be made
|
||||
address target;
|
||||
// The block at which voting begins
|
||||
uint256 startTime;
|
||||
// The block at which voting ends: votes must be cast prior to this block
|
||||
uint256 endTime;
|
||||
// Current number of votes in favor of this proposal
|
||||
uint256 forVotes;
|
||||
// Current number of votes in opposition to this proposal
|
||||
uint256 againstVotes;
|
||||
// Flag marking whether the proposal has been executed
|
||||
bool executed;
|
||||
// Flag marking whether the proposal voting time has been extended
|
||||
// Voting time can be extended once, if the proposal outcome has changed during CLOSING_PERIOD
|
||||
bool extended;
|
||||
}
|
||||
|
||||
interface IGovernance {
|
||||
function initialized() external view returns (bool);
|
||||
function initializing() external view returns (bool);
|
||||
|
||||
function EXECUTION_DELAY() external view returns (uint256);
|
||||
function EXECUTION_EXPIRATION() external view returns (uint256);
|
||||
function QUORUM_VOTES() external view returns (uint256);
|
||||
function PROPOSAL_THRESHOLD() external view returns (uint256);
|
||||
function VOTING_DELAY() external view returns (uint256);
|
||||
function VOTING_PERIOD() external view returns (uint256);
|
||||
function CLOSING_PERIOD() external view returns (uint256);
|
||||
function VOTE_EXTEND_TIME() external view returns (uint256);
|
||||
|
||||
function torn() external view returns (address);
|
||||
|
||||
function proposals(uint256 index) external view returns (Proposal memory);
|
||||
|
||||
function lockedBalance(address account) external view returns (uint256);
|
||||
|
||||
function propose(address target, string memory description) external returns (uint256);
|
||||
|
||||
function castVote(uint256 proposalId, bool support) external;
|
||||
|
||||
function lock(address owner, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
|
||||
|
||||
function execute(uint256 proposalId) external payable;
|
||||
}
|
34
src/common/test/Common.sol
Normal file
34
src/common/test/Common.sol
Normal file
@ -0,0 +1,34 @@
|
||||
pragma solidity ^0.8.20;
|
||||
|
||||
contract Common {
|
||||
uint256 constant TEST_PRIVATE_KEY_ONE = 0x66ddbd7cbe4a566df405f6ded0b908c669f88cdb1656380c050e3a457bd21df0;
|
||||
uint256 constant TEST_PRIVATE_KEY_TWO = 0xa4c8c98120e77741a87a116074a2df4ddb20d1149069290fd4a3d7ee65c55064;
|
||||
address constant TEST_ADDRESS_ONE = 0x118251976c65AFAf291f5255450ddb5b6A4d8B88;
|
||||
address constant TEST_ADDRESS_TWO = 0x63aE7d90Eb37ca39FC62dD9991DbEfeE70673a20;
|
||||
|
||||
address constant ADDRESS_TO_STAKE = 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045;
|
||||
uint256 constant STAKE_AMOUNT = 100_000 ether;
|
||||
|
||||
uint256 constant PROPOSAL_DURATION = 7 days;
|
||||
uint256 constant PROPOSAL_THRESHOLD = 25000 ether;
|
||||
string constant PROPOSAL_DESCRIPTION =
|
||||
"{title:'Proposal #22: Test clone of 21 proposal: change locked stake balance directly',description:''}";
|
||||
|
||||
address constant VERIFIER_ADDRESS = 0x77777FeDdddFfC19Ff86DB637967013e6C6A116C;
|
||||
|
||||
bytes32 constant PERMIT_TYPEHASH =
|
||||
keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
|
||||
|
||||
bytes32 constant EIP712_DOMAIN = keccak256(
|
||||
abi.encode(
|
||||
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
|
||||
keccak256(bytes("TornadoCash")),
|
||||
keccak256(bytes("1")),
|
||||
1,
|
||||
VERIFIER_ADDRESS
|
||||
)
|
||||
);
|
||||
|
||||
uint16 constant PERMIT_FUNC_SELECTOR = uint16(0x1901);
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
// SPDX-License-Identifier: UNLICENSED
|
||||
pragma solidity ^0.8.13;
|
||||
|
||||
import "forge-std/Test.sol";
|
||||
import "../src/Counter.sol";
|
||||
|
||||
contract CounterTest is Test {
|
||||
Counter public counter;
|
||||
|
||||
function setUp() public {
|
||||
counter = new Counter();
|
||||
counter.setNumber(0);
|
||||
}
|
||||
|
||||
function testIncrement() public {
|
||||
counter.increment();
|
||||
assertEq(counter.number(), 1);
|
||||
}
|
||||
|
||||
function testSetNumber(uint256 x) public {
|
||||
counter.setNumber(x);
|
||||
assertEq(counter.number(), x);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user