From c944378c09137f6f4efc8d8f87107e03547bfaa7 Mon Sep 17 00:00:00 2001 From: "dmitry.shakhtarin" Date: Fri, 7 Sep 2018 17:34:12 +0300 Subject: [PATCH] random init --- .gitignore | 4 + build.sbt | 5 + project/build.properties | 1 + .../scala/fluence/solidity/ast/Tokens.scala | 181 ++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 build.sbt create mode 100644 project/build.properties create mode 100644 src/main/scala/fluence/solidity/ast/Tokens.scala diff --git a/.gitignore b/.gitignore index 9c07d4a..1e9c879 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ *.class *.log + +.idea + +target/ diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..316a9b1 --- /dev/null +++ b/build.sbt @@ -0,0 +1,5 @@ +name := "solidity-dsl" + +version := "0.1" + +scalaVersion := "2.12.6" \ No newline at end of file diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..8db5ca2 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.2.1 \ No newline at end of file diff --git a/src/main/scala/fluence/solidity/ast/Tokens.scala b/src/main/scala/fluence/solidity/ast/Tokens.scala new file mode 100644 index 0000000..b96b778 --- /dev/null +++ b/src/main/scala/fluence/solidity/ast/Tokens.scala @@ -0,0 +1,181 @@ +package fluence.solidity.ast + +sealed trait Token + +sealed trait ContractToken extends Token +sealed trait FunctionToken extends Token +sealed trait ValueToken extends Token + + +case class Pragma(lang: String, version: String) extends Token +case class Contract(name: String, values: List[ValueToken], functions: List[FunctionToken] /*...*/) extends Token + +sealed trait Type +case class BoolType(bool: Boolean) +case class UintType(uint: Int) + + +sealed trait Ops +sealed trait BoolOps extends Ops +case class !(b: BoolType) extends BoolOps +case class &&(b1: BoolType, b2: BoolType) extends BoolOps + + + + +/** +pragma solidity ^0.4.22; + +/// @title Voting with delegation. +contract Ballot { + // This declares a new complex type which will + // be used for variables later. + // It will represent a single voter. + struct Voter { + uint weight; // weight is accumulated by delegation + bool voted; // if true, that person already voted + address delegate; // person delegated to + uint vote; // index of the voted proposal + } + + // This is a type for a single proposal. + struct Proposal { + bytes32 name; // short name (up to 32 bytes) + uint voteCount; // number of accumulated votes + } + + address public chairperson; + + // This declares a state variable that + // stores a `Voter` struct for each possible address. + mapping(address => Voter) public voters; + + // A dynamically-sized array of `Proposal` structs. + Proposal[] public proposals; + + /// Create a new ballot to choose one of `proposalNames`. + constructor(bytes32[] proposalNames) public { + chairperson = msg.sender; + voters[chairperson].weight = 1; + + // For each of the provided proposal names, + // create a new proposal object and add it + // to the end of the array. + for (uint i = 0; i < proposalNames.length; i++) { + // `Proposal({...})` creates a temporary + // Proposal object and `proposals.push(...)` + // appends it to the end of `proposals`. + proposals.push(Proposal({ + name: proposalNames[i], + voteCount: 0 + })); + } + } + + // Give `voter` the right to vote on this ballot. + // May only be called by `chairperson`. + function giveRightToVote(address voter) public { + // If the first argument of `require` evaluates + // to `false`, execution terminates and all + // changes to the state and to Ether balances + // are reverted. + // This used to consume all gas in old EVM versions, but + // not anymore. + // It is often a good idea to use `require` to check if + // functions are called correctly. + // As a second argument, you can also provide an + // explanation about what went wrong. + require( + msg.sender == chairperson, + "Only chairperson can give right to vote." + ); + require( + !voters[voter].voted, + "The voter already voted." + ); + require(voters[voter].weight == 0); + voters[voter].weight = 1; + } + + /// Delegate your vote to the voter `to`. + function delegate(address to) public { + // assigns reference + Voter storage sender = voters[msg.sender]; + require(!sender.voted, "You already voted."); + + require(to != msg.sender, "Self-delegation is disallowed."); + + // Forward the delegation as long as + // `to` also delegated. + // In general, such loops are very dangerous, + // because if they run too long, they might + // need more gas than is available in a block. + // In this case, the delegation will not be executed, + // but in other situations, such loops might + // cause a contract to get "stuck" completely. + while (voters[to].delegate != address(0)) { + to = voters[to].delegate; + + // We found a loop in the delegation, not allowed. + require(to != msg.sender, "Found loop in delegation."); + } + + // Since `sender` is a reference, this + // modifies `voters[msg.sender].voted` + sender.voted = true; + sender.delegate = to; + Voter storage delegate_ = voters[to]; + if (delegate_.voted) { + // If the delegate already voted, + // directly add to the number of votes + proposals[delegate_.vote].voteCount += sender.weight; + } else { + // If the delegate did not vote yet, + // add to her weight. + delegate_.weight += sender.weight; + } + } + + /// Give your vote (including votes delegated to you) + /// to proposal `proposals[proposal].name`. + function vote(uint proposal) public { + Voter storage sender = voters[msg.sender]; + require(!sender.voted, "Already voted."); + sender.voted = true; + sender.vote = proposal; + + // If `proposal` is out of the range of the array, + // this will throw automatically and revert all + // changes. + proposals[proposal].voteCount += sender.weight; + } + + /// @dev Computes the winning proposal taking all + /// previous votes into account. + function winningProposal() public view + returns (uint winningProposal_) + { + uint winningVoteCount = 0; + for (uint p = 0; p < proposals.length; p++) { + if (proposals[p].voteCount > winningVoteCount) { + winningVoteCount = proposals[p].voteCount; + winningProposal_ = p; + } + } + } + + // Calls winningProposal() function to get the index + // of the winner contained in the proposals array and then + // returns the name of the winner + function winnerName() public view + returns (bytes32 winnerName_) + { + winnerName_ = proposals[winningProposal()].name; + } +} + */ + + + + +