Skip to content

Commit

Permalink
feat(contract): add ERC721 vesting
Browse files Browse the repository at this point in the history
  • Loading branch information
Arnaud DN committed Oct 24, 2022
1 parent 4dc0784 commit bc0b4c0
Show file tree
Hide file tree
Showing 46 changed files with 2,050 additions and 469 deletions.
1 change: 0 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ jobs:
apt-get update
apt-get install dart -y
apt-get install lcov -y
- run:
#npm install
name: npm install
Expand Down
135 changes: 84 additions & 51 deletions src/contracts/.gas-snapshot

Large diffs are not rendered by default.

106 changes: 97 additions & 9 deletions src/contracts/contracts/FairnessDAOFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,89 @@

pragma solidity 0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {FairnessDAOFairVesting} from "./FairnessDAOFairVesting.sol";
import {FairnessDAOProposalRegistry} from "./FairnessDAOProposalRegistry.sol";
import {Counters} from "@openzeppelin/contracts/utils/Counters.sol";

/// @title FairnessDAOFactory
/// @dev First draft of FairnessDAO protocol.
/// @author Smart-Chain Team

contract FairnessDAOFactory {
contract FairnessDAOFactory is Ownable {
using Counters for Counters.Counter;

mapping(address => address) public
fairnessDAOProposalRegistryAddressToOwnerAddress;
mapping(uint256 => address) public indexToFairnessDAOProposalRegistryAddress;
mapping(uint256 => address) public indexToFairnessDAOVestingAddress;

Counters.Counter private fairnessDAOVestingId;
Counters.Counter private fairnessDAOProposalRegistryId;

address public vestingLibraryAddress;
address public proposalLibraryAddress;

event NewFairVesting(
address indexed instance, uint256 indexed fairnessDAOVestingId
);
event NewFairGovernance(
address indexed owner,
address indexed instance,
uint256 indexed fairnessDAOProposalRegistryId
);

/// @dev Update the base contract to clone
/// @param _vestingLibraryAddress - new vesting base contract address
/// @param _proposalLibraryAddress - new proposal registry base contract address
function setLibraryAddress(
address _vestingLibraryAddress,
address _proposalLibraryAddress
) external onlyOwner {
vestingLibraryAddress = _vestingLibraryAddress;
proposalLibraryAddress = _proposalLibraryAddress;
fairnessDAOVestingId.increment();
fairnessDAOProposalRegistryId.increment();
indexToFairnessDAOVestingAddress[fairnessDAOVestingId.current()] =
_vestingLibraryAddress;
indexToFairnessDAOProposalRegistryAddress[fairnessDAOProposalRegistryId
.current()] = _proposalLibraryAddress;
}

function deployFairGovernanceForERC20Token(
function deployFairVestingForERC20TokenClone(
string memory tokenName,
string memory tokenSymbol,
address initFairTokenTarget,
uint256 initZInflationDelta,
uint256 fairnessDAOFairProposalRegistryIndex
) external returns (address) {
FairnessDAOFairVesting fairnessDAOFairVesting =
FairnessDAOFairVesting(Clones.clone(vestingLibraryAddress));

fairnessDAOFairVesting.initialize(
tokenName,
tokenSymbol,
initFairTokenTarget,
initZInflationDelta,
indexToFairnessDAOProposalRegistryAddress[fairnessDAOFairProposalRegistryIndex]
);

fairnessDAOVestingId.increment();
uint256 _fairnessDAOVestingId = fairnessDAOVestingId.current();

indexToFairnessDAOVestingAddress[_fairnessDAOVestingId] =
address(fairnessDAOFairVesting);

emit NewFairVesting(
address(fairnessDAOFairVesting), _fairnessDAOVestingId
);
return address(fairnessDAOFairVesting);
}

function deployFairGovernanceForERC20TokenClone(
uint256 fairnessDAOFairVestingIndex,
uint256 initMinimumSupplyShareRequiredForSubmittingProposals,
uint256 initialVoteTimeLengthSoftProposal,
uint256 initialVoteTimeLengthHardProposal,
Expand All @@ -26,30 +93,51 @@ contract FairnessDAOFactory {
uint256 initialMinimumVoterShareRequiredForSoftProposal,
uint256 initialMinimumVoterShareRequiredForHardProposal,
uint256 initalBoostedRewardBonusValue
<<<<<<< HEAD
) external returns (address, address) {
FairnessDAOFairVesting fairnessDAOFairVesting =
new FairnessDAOFairVesting(tokenName,tokenSymbol,initFairTokenTarget,initZInflationDelta);
=======
) external returns (address) {
>>>>>>> 540695a (refacto(contract): factory optimization)
FairnessDAOProposalRegistry fairnessDAOProposalRegistry =
new FairnessDAOProposalRegistry(address(fairnessDAOFairVesting),initMinimumSupplyShareRequiredForSubmittingProposals,
FairnessDAOProposalRegistry(Clones.clone(proposalLibraryAddress));

fairnessDAOProposalRegistry.initialize(
indexToFairnessDAOVestingAddress[fairnessDAOFairVestingIndex],
initMinimumSupplyShareRequiredForSubmittingProposals,
initialVoteTimeLengthSoftProposal,
initialVoteTimeLengthHardProposal,
initialMinimumTotalSupplyShareRequiredForSoftProposal,
initialMinimumTotalSupplyShareRequiredForHardProposal,
initialMinimumVoterShareRequiredForSoftProposal,
initialMinimumVoterShareRequiredForHardProposal,
initalBoostedRewardBonusValue);

fairnessDAOFairVesting.whitelistProposalRegistryAddress(
address(fairnessDAOProposalRegistry)
initalBoostedRewardBonusValue
);

fairnessDAOProposalRegistryId.increment();
uint256 _fairnessDAOProposalRegistryId =
fairnessDAOProposalRegistryId.current();

indexToFairnessDAOProposalRegistryAddress[_fairnessDAOProposalRegistryId]
= address(fairnessDAOProposalRegistry);

fairnessDAOProposalRegistryAddressToOwnerAddress[address(
fairnessDAOProposalRegistry
)] = msg.sender;

emit NewFairGovernance(
msg.sender,
address(fairnessDAOProposalRegistry),
_fairnessDAOProposalRegistryId
);
return address(fairnessDAOProposalRegistry);
}

function getCountersId() external view returns (uint256, uint256) {
return (
address(fairnessDAOFairVesting),
address(fairnessDAOProposalRegistry)
fairnessDAOVestingId.current(),
fairnessDAOProposalRegistryId.current()
);
}
}
123 changes: 123 additions & 0 deletions src/contracts/contracts/FairnessDAOFactoryERC721.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {FairnessDAOFairERC721Vesting} from "./FairnessDAOFairERC721Vesting.sol";
import {FairnessDAOProposalRegistry} from "./FairnessDAOProposalRegistry.sol";
import {Counters} from "@openzeppelin/contracts/utils/Counters.sol";

/// @title FairnessDAOFactory
/// @dev First draft of FairnessDAO protocol.
/// @author Smart-Chain Team

contract FairnessDAOFactoryERC721 is Ownable {
using Counters for Counters.Counter;

mapping(address => address) public
fairnessDAOProposalRegistryAddressToOwnerAddress;
mapping(uint256 => address) public indexToFairnessDAOProposalRegistryAddress;
mapping(uint256 => address) public indexToFairnessDAOVestingAddress;

Counters.Counter public fairnessDAOVestingERC721Id;
Counters.Counter public fairnessDAOProposalRegistryId;

address vestingLibraryAddress;
address proposalLibraryAddress;

event NewFairVesting(
address indexed instance, uint256 indexed fairnessDAOVestingERC721Id
);
event NewFairGovernance(
address indexed owner,
address indexed instance,
uint256 indexed fairnessDAOProposalRegistryId
);

/// @dev Update the base contract to clone
/// @param _vestingLibraryAddress - new vesting base contract address
/// @param _proposalLibraryAddress - new proposal registry base contract address
function setLibraryAddress(
address _vestingLibraryAddress,
address _proposalLibraryAddress
) external onlyOwner {
vestingLibraryAddress = _vestingLibraryAddress;
proposalLibraryAddress = _proposalLibraryAddress;
}

function deployFairVestingForERC20TokenClone(
string memory tokenName,
string memory tokenSymbol,
address initFairTokenTarget,
uint256 initZInflationDelta,
uint256 fairnessDAOFairProposalRegistryIndex
) external returns (address, address) {
FairnessDAOFairERC721Vesting fairnessDAOFairERC721Vesting =
FairnessDAOFairERC721Vesting(Clones.clone(vestingLibraryAddress));

fairnessDAOFairERC721Vesting.initialize(
tokenName,
tokenSymbol,
initFairTokenTarget,
initZInflationDelta,
indexToFairnessDAOProposalRegistryAddress[fairnessDAOFairProposalRegistryIndex]
);

fairnessDAOVestingERC721Id.increment();
uint256 _fairnessDAOVestingERC721Id =
fairnessDAOVestingERC721Id.current();

indexToFairnessDAOVestingAddress[_fairnessDAOVestingERC721Id] =
address(fairnessDAOFairERC721Vesting);

emit NewFairVesting(
address(fairnessDAOFairERC721Vesting), _fairnessDAOVestingERC721Id
);
}

function deployFairGovernanceForERC721TokenClone(
uint256 fairnessDAOFairERC721VestingIndex,
uint256 initMinimumSupplyShareRequiredForSubmittingProposals,
uint256 initialVoteTimeLengthSoftProposal,
uint256 initialVoteTimeLengthHardProposal,
uint256 initialMinimumTotalSupplyShareRequiredForSoftProposal,
uint256 initialMinimumTotalSupplyShareRequiredForHardProposal,
uint256 initialMinimumVoterShareRequiredForSoftProposal,
uint256 initialMinimumVoterShareRequiredForHardProposal,
uint256 initalBoostedRewardBonusValue
) external returns (address, address) {
FairnessDAOProposalRegistry fairnessDAOProposalRegistry =
FairnessDAOProposalRegistry(Clones.clone(proposalLibraryAddress));

fairnessDAOProposalRegistry.initialize(
indexToFairnessDAOVestingAddress[fairnessDAOFairERC721VestingIndex],
initMinimumSupplyShareRequiredForSubmittingProposals,
initialVoteTimeLengthSoftProposal,
initialVoteTimeLengthHardProposal,
initialMinimumTotalSupplyShareRequiredForSoftProposal,
initialMinimumTotalSupplyShareRequiredForHardProposal,
initialMinimumVoterShareRequiredForSoftProposal,
initialMinimumVoterShareRequiredForHardProposal,
initalBoostedRewardBonusValue
);

fairnessDAOProposalRegistryId.increment();
uint256 _fairnessDAOProposalRegistryId =
fairnessDAOProposalRegistryId.current();

indexToFairnessDAOProposalRegistryAddress[_fairnessDAOProposalRegistryId]
= address(fairnessDAOProposalRegistry);

fairnessDAOProposalRegistryAddressToOwnerAddress[address(
fairnessDAOProposalRegistry
)] = msg.sender;

emit NewFairGovernance(
msg.sender,
address(fairnessDAOProposalRegistry),
_fairnessDAOProposalRegistryId
);
}
}
Loading

0 comments on commit bc0b4c0

Please sign in to comment.