pragma solidity 0.5.17; import "../universalSchemes/UniversalScheme.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; import "@daostack/infra/contracts/votingMachines/ProposalExecuteInterface.sol"; contract VotingMachineCallbacks is VotingMachineCallbacksInterface { struct ProposalInfo { uint256 blockNumber; // the proposal's block number Avatar avatar; // the proposal's avatar } modifier onlyVotingMachine(bytes32 _proposalId) { require(proposalsInfo[msg.sender][_proposalId].avatar != Avatar(address(0)), "only VotingMachine"); _; } modifier onlyRegisteredScheme(bytes32 _proposalId) { Avatar avatar = proposalsInfo[msg.sender][_proposalId].avatar; require(Controller(avatar.owner()).isSchemeRegistered(address(this), address(avatar)), "scheme is not registered" ); _; } // VotingMaching -> proposalId -> ProposalInfo mapping(address => mapping(bytes32 => ProposalInfo)) public proposalsInfo; function mintReputation(uint256 _amount, address _beneficiary, bytes32 _proposalId) external onlyVotingMachine(_proposalId) returns(bool) { Avatar avatar = proposalsInfo[msg.sender][_proposalId].avatar; if (avatar == Avatar(0)) { return false; } return Controller(avatar.owner()).mintReputation(_amount, _beneficiary, address(avatar)); } function burnReputation(uint256 _amount, address _beneficiary, bytes32 _proposalId) external onlyVotingMachine(_proposalId) returns(bool) { Avatar avatar = proposalsInfo[msg.sender][_proposalId].avatar; if (avatar == Avatar(0)) { return false; } return Controller(avatar.owner()).burnReputation(_amount, _beneficiary, address(avatar)); } function stakingTokenTransfer( IERC20 _stakingToken, address _beneficiary, uint256 _amount, bytes32 _proposalId) external onlyVotingMachine(_proposalId) returns(bool) { Avatar avatar = proposalsInfo[msg.sender][_proposalId].avatar; if (avatar == Avatar(0)) { return false; } return Controller(avatar.owner()).externalTokenTransfer(_stakingToken, _beneficiary, _amount, avatar); } function balanceOfStakingToken(IERC20 _stakingToken, bytes32 _proposalId) external view returns(uint256) { Avatar avatar = proposalsInfo[msg.sender][_proposalId].avatar; if (proposalsInfo[msg.sender][_proposalId].avatar == Avatar(0)) { return 0; } return _stakingToken.balanceOf(address(avatar)); } function getTotalReputationSupply(bytes32 _proposalId) external view onlyRegisteredScheme(_proposalId) returns(uint256) { ProposalInfo memory proposal = proposalsInfo[msg.sender][_proposalId]; if (proposal.avatar == Avatar(0)) { return 0; } return proposal.avatar.nativeReputation().totalSupplyAt(proposal.blockNumber); } function reputationOf(address _owner, bytes32 _proposalId) external view onlyRegisteredScheme(_proposalId) returns(uint256) { ProposalInfo memory proposal = proposalsInfo[msg.sender][_proposalId]; if (proposal.avatar == Avatar(0)) { return 0; } return proposal.avatar.nativeReputation().balanceOfAt(_owner, proposal.blockNumber); } }