diff --git a/contracts/mainnet/connectors/INST/events.sol b/contracts/mainnet/connectors/INST/events.sol new file mode 100644 index 00000000..042c635a --- /dev/null +++ b/contracts/mainnet/connectors/INST/events.sol @@ -0,0 +1,6 @@ +pragma solidity ^0.7.0; + +contract Events { + event LogVoteCast(uint256 proposalId, uint256 support, string reason); + event LogDelegate(address delegatee); +} diff --git a/contracts/mainnet/connectors/INST/helpers.sol b/contracts/mainnet/connectors/INST/helpers.sol new file mode 100644 index 00000000..7bdab7a1 --- /dev/null +++ b/contracts/mainnet/connectors/INST/helpers.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import { DSMath } from "../../common/math.sol"; +import { Basic } from "../../common/basic.sol"; +import { InstaTokenInterface, InstaGovernorInterface } from "./interface.sol"; + +abstract contract Helpers is DSMath, Basic { + /** + * @dev InstaGovernorBravo + */ + InstaGovernorInterface internal constant instaGovernor = InstaGovernorInterface(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); + + /** + * @dev INST Token + */ + InstaTokenInterface internal constant instToken = InstaTokenInterface(0xc00e94Cb662C3520282E6f5717214004A7f26888); +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/INST/interface.sol b/contracts/mainnet/connectors/INST/interface.sol new file mode 100644 index 00000000..eacb53ae --- /dev/null +++ b/contracts/mainnet/connectors/INST/interface.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.0; + +interface InstaGovernorInterface { + function castVoteWithReason(uint proposalId, uint8 support, string calldata reason) external; +} + +interface InstaTokenInterface { + function delegate(address delegatee) external; + function delegates(address) external view returns(address); +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/INST/main.sol b/contracts/mainnet/connectors/INST/main.sol new file mode 100644 index 00000000..05329dee --- /dev/null +++ b/contracts/mainnet/connectors/INST/main.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Instadapp Governance. + * @dev Governance. + */ +import { TokenInterface } from "../../common/interfaces.sol"; +import { Stores } from "../../common/stores.sol"; +import { Helpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Resolver is Events, Helpers { + + /** + * @dev Delegate votes. + * @notice Delegating votes to delegatee. + * @param delegatee The address to delegate the votes. + */ + function delegate(address delegatee) external payable returns (string memory _eventName, bytes memory _eventParam) { + require(instToken.delegates(address(this)) != delegatee, "Already delegated to same delegatee."); + + instToken.delegate(delegatee); + + _eventName = "LogDelegate(address)"; + _eventParam = abi.encode(delegatee); + } + + + /** + * @dev Cast vote. + * @notice Casting vote for a proposal + * @param proposalId The id of the proposal to vote on + * @param support The support value for the vote. 0=against, 1=for, 2=abstain + */ + function voteCast(uint256 proposalId, uint256 support) external payable returns (string memory _eventName, bytes memory _eventParam) { + instaGovernor.castVoteWithReason(proposalId, uint8(support), ""); + + _eventName = "LogVoteCast(uint256,uint256,string)"; + _eventParam = abi.encode(proposalId, support, ""); + } + + /** + * @dev Cast vote with reason. + * @notice Casting vote for a proposal + * @param proposalId The id of the proposal to vote on + * @param support The support value for the vote. 0=against, 1=for, 2=abstain + * @param reason The reason given for the vote + */ + function voteCastWithReason(uint256 proposalId, uint256 support, string calldata reason) external payable returns (string memory _eventName, bytes memory _eventParam) { + instaGovernor.castVoteWithReason(proposalId, uint8(support), reason); + + _eventName = "LogVoteCast(uint256,uint256,string)"; + _eventParam = abi.encode(proposalId, support, reason); + } +} + +contract ConnectV2InstadappGovernanceBravo is Resolver { + string public constant name = "Instadapp-governance-bravo-v1"; +}