Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ coverage
dist
node_modules
typechain
out

packages/subgraph/imported
packages/subgraph/generated
Expand Down
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,12 @@
"typescript": "5.0.4"
},
"scripts": {
"build": "cd ./packages/contracts && yarn build && cd ../contracts-ethers && yarn build",
"test": "cd ./packages/contracts && yarn test",
"clean": "cd ./packages/contracts && yarn clean && cd ../contracts-ethers && yarn clean && yarn clean",
"forge:build": "cd ./packages/contracts && forge build",
"forge:test": "cd ./packages/contracts && forge test -vvv",
"forge:clean": "cd ./packages/contracts && forge clean",
"hardhat:build": "cd ./packages/contracts && yarn build && cd ../contracts-ethers && yarn build",
"hardhat:test": "cd ./packages/contracts && yarn test",
"hardhat:clean": "cd ./packages/contracts && yarn clean && cd ../contracts-ethers && yarn clean && yarn clean",
"prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"",
"prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\""
}
Expand Down
17 changes: 17 additions & 0 deletions packages/contracts/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
ARBITRUM_RPC=https://1rpc.io/arb
ARBITRUM_DEPLOYER_NAME=

GEO_TESTNET_RPC=https://rpc-geo-test-zc16z3tcvf.t.conduit.xyz
GEO_TESTNET_DEPLOYER_NAME=

# https://github.com/aragon/osx/blob/main/packages/artifacts/src/addresses.json
ARBITRUM_DAO_FACTORY_ADDRESS=0x49e04AB7af7A263b8ac802c1cAe22f5b4E4577Cd
ARBITRUM_PLUGIN_REPO_FACTORY_ADDRESS=0x7F5F2BB64efD9c542F26ABa34D59e1895FcDF69D
ARBITRUM_PLUGIN_SETUP_PROCESSOR_ADDRESS=0x308a1DC5020c4B5d992F5543a7236c465997fecB

# https://github.com/graphprotocol/grc-20-ts/blob/8cf3de5dc589a7c7a08e369a95e32bf27d2deb5c/contracts.ts#L23
GEO_TESTNET_DAO_FACTORY_ADDRESS=0xb138AE700C352BB1aC75688e8ceCB98CDDaa7F09
GEO_TESTNET_PLUGIN_REPO_FACTORY_ADDRESS=0xEb6F0ebCEF3073d8c890d174EE19eddd661C2308
GEO_TESTNET_PLUGIN_SETUP_PROCESSOR_ADDRESS=0x3C9be4b42B313318091344A261DCDCd02DCd5736

ETHERSCAN_API_KEY=
32 changes: 32 additions & 0 deletions packages/contracts/foundry.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[fmt]
line_length = 120
tab_width = 2
bracket_spacing = false
int_types = 'long'
quote_style = 'single'
number_underscore = 'thousands'
multiline_func_header = 'params_first_multi'
sort_imports = true

[profile.default]
solc_version = '0.8.17'
libs = ['node_modules', '../../node_modules', 'lib']
optimizer_runs = 10_000

[profile.optimized]
via_ir = true
out = 'out-via-ir'

[profile.test]
via_ir = true
out = 'out-via-ir'

[profile.docs]
src = 'src/interfaces/'

[fuzz]
runs = 1000

[rpc_endpoints]
arbitrum = "${ARBITRUM_RPC}"
geo_testnet = "${GEO_TESTNET_RPC}"
1 change: 1 addition & 0 deletions packages/contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@types/node": "18.11.9",
"chai": "4.3.7",
"ethers": "5.7.2",
"forge-std": "github:foundry-rs/forge-std#1.9.2",
"hardhat": "2.24.3",
"hardhat-deploy": "0.11.37",
"hardhat-gas-reporter": "1.0.9",
Expand Down
6 changes: 6 additions & 0 deletions packages/contracts/remappings.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
forge-std/=../../node_modules/forge-std/src
@aragon/osx/=../../node_modules/@aragon/osx
@aragon/osx-commons-contracts/=../../node_modules/@aragon/osx-commons-repo/contracts
@arbitrum/nitro-contracts/=../../node_modules/@arbitrum/nitro-contracts
@openzeppelin/contracts/=../../node_modules/@openzeppelin/contracts
@openzeppelin/contracts-upgradeable/=../../node_modules/@openzeppelin/contracts-upgradeable
151 changes: 151 additions & 0 deletions packages/contracts/scripts/DeployPersonalSpaceDAO.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import {Script} from "forge-std/Script.sol";
import {Vm} from "forge-std/Vm.sol";
import {console} from "forge-std/console.sol";

import {DAO} from "@aragon/osx/core/dao/DAO.sol";
import {DAOFactory} from "@aragon/osx/framework/dao/DAOFactory.sol";
import {PluginRepo} from "@aragon/osx/framework/plugin/repo/PluginRepo.sol";
import {PluginRepoFactory} from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol";
import {PluginSetupProcessor} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessor.sol";
import {PluginSetupRef} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessorHelpers.sol";

import {PersonalSpaceAdminPlugin} from "src/personal/PersonalSpaceAdminPlugin.sol";
import {PersonalSpaceAdminPluginSetup} from "src/personal/PersonalSpaceAdminPluginSetup.sol";

import {GovernancePluginsSetup} from "src/governance/GovernancePluginsSetup.sol";
import {MainVotingPlugin} from "src/governance/MainVotingPlugin.sol";
import {MemberAccessPlugin} from "src/governance/MemberAccessPlugin.sol";

import {SpacePlugin} from "src/space/SpacePlugin.sol";
import {SpacePluginSetup} from "src/space/SpacePluginSetup.sol";

contract DeployPersonalSpaceDAO is Script {
DAOFactory internal immutable _daoFactory =
DAOFactory(vm.envAddress("GEO_TESTNET_DAO_FACTORY_ADDRESS"));
PluginRepoFactory internal immutable _pluginRepoFactory =
PluginRepoFactory(vm.envAddress("GEO_TESTNET_PLUGIN_REPO_FACTORY_ADDRESS"));
PluginSetupProcessor internal immutable _pluginSetupProcessor =
PluginSetupProcessor(vm.envAddress("GEO_TESTNET_PLUGIN_SETUP_PROCESSOR_ADDRESS"));

string internal _firstBlockEditsContentUri;

bytes internal _firstBlockEditsMetadata;

address internal _initialMaintainer = 0x66703c058795B9Cb215fbcc7c6b07aee7D216F24;
address internal _initialEditor = 0x66703c058795B9Cb215fbcc7c6b07aee7D216F24;
address internal _paymentManager = 0x66703c058795B9Cb215fbcc7c6b07aee7D216F24;
address internal _predecessorAddress = address(0);
address internal _pluginUpgrader = 0x66703c058795B9Cb215fbcc7c6b07aee7D216F24;

PluginRepo internal _governancePluginRepo =
PluginRepo(0x94A8FB48258E1094aa71fBc9F33196B7A9fFfb4f);
PluginRepo internal _personalSpaceAdminPluginRepo =
PluginRepo(0xc368129A081aE3d3dbB0C6DeC408FbB097b73aE2);
PluginRepo internal _spacePluginRepo = PluginRepo(0xE6eE188B3CDfBCA60152B1cC99BAafCf83bE57BE);

GovernancePluginsSetup internal _governancePluginSetup =
GovernancePluginsSetup(0xfC1510224A18ebe565b4E9B97a1669F7C9D3c803);
PersonalSpaceAdminPluginSetup internal _personalSpaceAdminPluginSetup =
PersonalSpaceAdminPluginSetup(0xFF5aeF9308eb4e829F9Ea144ebc8eAA27450d6Aa);
SpacePluginSetup internal _spacePluginSetup =
SpacePluginSetup(0x354837F5F1c06029Dd0B3621F95fea77dF587fb7);

MainVotingPlugin internal _mainVotingPlugin;
MemberAccessPlugin internal _memberAccessPlugin;
PersonalSpaceAdminPlugin internal _personalSpaceAdminPlugin;
SpacePlugin internal _standardSpacePlugin;
SpacePlugin internal _personalSpacePlugin;

DAO internal _standardSpaceDAO;
DAO internal _personalSpaceDAO;

function run() public {
vm.startBroadcast();

(
_personalSpaceDAO,
_personalSpaceAdminPlugin,
_personalSpacePlugin
) = deployPersonalSpaceDAO();

console.log("_personalSpaceDAO: ", address(_personalSpaceDAO));
console.log("_personalSpaceAdminPlugin: ", address(_personalSpaceAdminPlugin));
console.log("_personalSpacePlugin: ", address(_personalSpacePlugin));

vm.stopBroadcast();
}

function deployPersonalSpaceDAO()
public
returns (DAO _dao, PersonalSpaceAdminPlugin _adminPlugin, SpacePlugin _spacePlugin)
{
// Basic DAO settings
DAOFactory.DAOSettings memory _daoSettings = DAOFactory.DAOSettings(
address(0),
"",
"geo-personal-space-100",
""
);
// Plugin settings
DAOFactory.PluginSettings[] memory _pluginSettings = new DAOFactory.PluginSettings[](2);
// Install from release 1, build 1
PluginRepo.Tag memory _tag = PluginRepo.Tag(1, 1);
// Personal Space Admin Plugin settings
bytes memory _personalSpaceAdminPluginData = _personalSpaceAdminPluginSetup
.encodeInstallationParams(_initialEditor);
// Space Plugin settings
bytes memory _spacePluginData = _spacePluginSetup.encodeInstallationParams(
_paymentManager,
_firstBlockEditsContentUri,
_firstBlockEditsMetadata,
_predecessorAddress,
_initialMaintainer
);
_pluginSettings[0] = DAOFactory.PluginSettings(
PluginSetupRef(_tag, _personalSpaceAdminPluginRepo),
_personalSpaceAdminPluginData
);
_pluginSettings[1] = DAOFactory.PluginSettings(
PluginSetupRef(_tag, _spacePluginRepo),
_spacePluginData
);
// Create DAO
vm.recordLogs();
_dao = _daoFactory.createDao(_daoSettings, _pluginSettings);
Vm.Log[] memory logs = vm.getRecordedLogs();
// Use logs to fetch the plugins deployed
(_adminPlugin, _spacePlugin) = getPersonalSpacePlugins(address(_dao), logs);
}

/// Log Fetching ///

function getPersonalSpacePlugins(
address _dao,
Vm.Log[] memory _logs
)
public
returns (PersonalSpaceAdminPlugin _personalSpaceAdminPlugin, SpacePlugin _spacePlugin)
{
Vm.Log memory log;
for (uint256 i = 0; i < _logs.length; i++) {
log = _logs[i];

// PersonalSpaceAdminPlugin creation event (dao, personalAdminPlugin, initialEditor)
if (
log.topics[0] == keccak256("GeoPersonalAdminPluginCreated(address,address,address)")
) {
(address dao, address plugin, ) = abi.decode(log.data, (address, address, address));
if (dao == _dao) _personalSpaceAdminPlugin = PersonalSpaceAdminPlugin(plugin);
}

// SpacePlugin creation event (dao, plugin)
if (log.topics[0] == keccak256("GeoSpacePluginCreated(address,address)")) {
(address dao, address plugin) = abi.decode(log.data, (address, address));
if (dao == _dao) _spacePlugin = SpacePlugin(plugin);
}
}
}
}
73 changes: 73 additions & 0 deletions packages/contracts/scripts/DeployPluginRepo.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import {Script} from "forge-std/Script.sol";
import {console} from "forge-std/console.sol";

import {DAO} from "@aragon/osx/core/dao/DAO.sol";
import {DAOFactory} from "@aragon/osx/framework/dao/DAOFactory.sol";
import {PluginRepo} from "@aragon/osx/framework/plugin/repo/PluginRepo.sol";
import {PluginRepoFactory} from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol";
import {PluginSetupProcessor} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessor.sol";

import {PersonalSpaceAdminPluginSetup} from "src/personal/PersonalSpaceAdminPluginSetup.sol";
import {GovernancePluginsSetup} from "src/governance/GovernancePluginsSetup.sol";
import {SpacePluginSetup} from "src/space/SpacePluginSetup.sol";

contract DeployPluginRepo is Script {
DAOFactory internal immutable _daoFactory =
DAOFactory(vm.envAddress("GEO_TESTNET_DAO_FACTORY_ADDRESS"));
PluginRepoFactory internal immutable _pluginRepoFactory =
PluginRepoFactory(vm.envAddress("GEO_TESTNET_PLUGIN_REPO_FACTORY_ADDRESS"));
PluginSetupProcessor internal immutable _pluginSetupProcessor =
PluginSetupProcessor(vm.envAddress("GEO_TESTNET_PLUGIN_SETUP_PROCESSOR_ADDRESS"));

address internal _initialMaintainer = 0x66703c058795B9Cb215fbcc7c6b07aee7D216F24;

PluginRepo internal _governancePluginRepo;
PluginRepo internal _personalSpaceAdminPluginRepo;
PluginRepo internal _spacePluginRepo;

GovernancePluginsSetup internal _governancePluginSetup;
PersonalSpaceAdminPluginSetup internal _personalSpaceAdminPluginSetup;
SpacePluginSetup internal _spacePluginSetup;

function run() public {
vm.startBroadcast();

/*
_spacePluginSetup = new SpacePluginSetup(_pluginSetupProcessor);
_spacePluginRepo = _pluginRepoFactory.createPluginRepoWithFirstVersion(
"geo-space-plugin-0",
address(_spacePluginSetup),
_initialMaintainer,
" ",
" "
);
*/

/*
_governancePluginSetup = new GovernancePluginsSetup(_pluginSetupProcessor);
_governancePluginRepo = _pluginRepoFactory.createPluginRepoWithFirstVersion(
"geo-governance-100",
address(_governancePluginSetup),
_initialMaintainer,
" ",
" "
);
*/

_personalSpaceAdminPluginSetup = new PersonalSpaceAdminPluginSetup();
_personalSpaceAdminPluginRepo = _pluginRepoFactory.createPluginRepoWithFirstVersion(
"geo-governance-101",
address(_personalSpaceAdminPluginSetup),
_initialMaintainer,
" ",
" "
);

console.log("Plugin Repo: ", address(_personalSpaceAdminPluginRepo));

vm.stopBroadcast();
}
}
Loading
Loading