Skip to content

Commit

Permalink
Merge pull request #15 from oasisprotocol/CedarMist/contracts
Browse files Browse the repository at this point in the history
initial import of contracts
  • Loading branch information
CedarMist authored Mar 8, 2024
2 parents 29792ab + e5a970d commit 58f408d
Show file tree
Hide file tree
Showing 14 changed files with 3,696 additions and 44 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/ci-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ jobs:
run: pnpm install --frozen-lockfile --ignore-scripts
- name: Build frontend app
run: pnpm --filter @oasisprotocol/dapp-voting-frontend build
- name: Run tests for backend app
run: pnpm --filter @oasisprotocol/dapp-voting-backend test
- name: Upload frontend build artifacts
# Upload build artifacts on push event.
if: github.event_name == 'push'
Expand Down
4 changes: 4 additions & 0 deletions backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
abis
artifacts
cache
src
52 changes: 52 additions & 0 deletions backend/contracts/AllowAllACL.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.0;

import { IPollACL } from "../interfaces/IPollACL.sol";
import { IPollManagerACL } from "../interfaces/IPollManagerACL.sol";

contract AllowAllACL is IPollACL, IPollManagerACL
{
function supportsInterface(bytes4 interfaceId)
public pure
returns(bool)
{
return interfaceId == type(IPollACL).interfaceId
|| interfaceId == type(IPollManagerACL).interfaceId;
}

function canCreatePoll(address, address)
external pure
returns(bool)
{
return true;
}

function onPollCreated(bytes32, address, bytes calldata)
external
{
// Do nothing
}

function onPollClosed(bytes32)
external
{
// Do nothing
}

function canManagePoll(address, bytes32, address)
external pure
returns(bool)
{
// Anyone can manage any poll
return true;
}

function canVoteOnPoll(address, bytes32, address, bytes calldata)
external pure
returns(uint)
{
// Anyone can vote on any poll
return 1;
}
}
94 changes: 94 additions & 0 deletions backend/contracts/NativeBalanceACL.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// SPDX-License-Identifier: Apache-2.0

pragma solidity ^0.8.0;

import { IPollACL } from "../interfaces/IPollACL.sol";
import { IPollManagerACL } from "../interfaces/IPollManagerACL.sol";

contract NativeBalanceACL is IPollACL, IPollManagerACL
{
struct ProposalOptions {
address owner;
uint256 minBalance;
}

mapping(bytes32 => ProposalOptions) private m_proposals;

function internal_id(bytes32 in_proposalId, address in_pm)
internal pure
returns (bytes32)
{
return keccak256(abi.encodePacked(in_proposalId, in_pm));
}

function internal_getProposal(bytes32 in_proposalId, address in_pm)
internal view
returns (ProposalOptions storage)
{
bytes32 id = internal_id(in_proposalId, in_pm);

ProposalOptions storage prop = m_proposals[id];

require( prop.owner != address(0), "404" );

return prop;
}

function supportsInterface(bytes4 interfaceId)
public pure
returns(bool)
{
return interfaceId == type(IPollACL).interfaceId
|| interfaceId == type(IPollManagerACL).interfaceId;
}

function canCreatePoll(address, address)
external pure
returns(bool)
{
return true;
}

function onPollCreated(bytes32 in_proposalId, address in_creator, bytes calldata in_data)
external
{
(uint256 minBalance) = abi.decode(in_data, (uint256));

bytes32 id = internal_id(in_proposalId, msg.sender);
require( m_proposals[id].owner == address(0), "404" );

m_proposals[id] = ProposalOptions(in_creator, minBalance);
}

function onPollClosed(bytes32 in_proposalId)
external
{
bytes32 id = internal_id(in_proposalId, msg.sender);

ProposalOptions storage prop = m_proposals[id];

require( prop.owner != address(0), "404" );

delete m_proposals[id];
}

function canManagePoll(address in_pm, bytes32 in_proposalId, address in_who)
external view
returns(bool)
{
ProposalOptions storage prop = internal_getProposal(in_proposalId, in_pm);

return prop.owner == in_who;
}

function canVoteOnPoll(address in_pm, bytes32 in_proposalId, address who, bytes calldata)
external view
returns(uint)
{
ProposalOptions storage prop = internal_getProposal(in_proposalId, in_pm);

require(who.balance > prop.minBalance);

return 1;
}
}
Loading

0 comments on commit 58f408d

Please sign in to comment.