Skip to content

Instantly share code, notes, and snippets.

@dima91
Created June 1, 2018 21:03
Show Gist options
  • Save dima91/540588a80fd69c66130babe437a70c55 to your computer and use it in GitHub Desktop.
Save dima91/540588a80fd69c66130babe437a70c55 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.4.24+commit.e67f0147.js&optimize=true&gist=
pragma solidity ^0.4.24;
import "./sharedTypes.sol";
contract BaseContentManagementContract {
address private authorAddress; // Address of contract's author
address private catalogAddress; // Address of catalog to check if determined functions are called only by catalog
SharedTypes.contentType private typeOfContent; // Tpe of content which this contract contains
uint private numberOfViews; // Number of viwes about content of this contract
string private contentTitle; // Title which identifies this contract in catalog
constructor (SharedTypes.contentType conType, string conTitle, address catAddr) public {
typeOfContent = conType;
authorAddress= msg.sender;
numberOfViews= 0;
contentTitle= conTitle;
catalogAddress= catAddr;
}
// ***** ***** //
// ***** Modifiers ***** //
modifier onlyCatalog () {
require (msg.sender == catalogAddress);
_;
}
// Does it really need?
modifier onlyAuthor () {
require (msg.sender == authorAddress);
_;
}
// ***** ***** //
// ***** Helper private/internal functions ***** //
// ***** ***** //
// ***** Public functions ***** //
// Function used by catalog to check that has the same address of catalogAddress local variable
function getCatalogAddress () public view returns (address) {
return catalogAddress;
}
// Function to increase number of views of current content (callable only by catalog)
function increaseViewCount () public onlyCatalog () {
numberOfViews++;
}
function getViewsCount () public view returns (uint) {
return numberOfViews;
}
function getTitle () public view returns (string) {
return contentTitle;
}
function grantAccessToUser (address _userAddr) public onlyCatalog () {
// TODO
}
function retreiveContent () public onlyCatalog () returns (string);
}
pragma solidity ^0.4.24;
import "./sharedTypes.sol";
import "./ownable.sol";
import "./contentManagementContracts.sol";
contract CatalogSmartContract is Ownable {
// True if 'selfdestruct' function wasn't called --> is this necessary?
bool active= false;
// Mapping which contains a User struct for each user that hav published or have requeested a content
mapping (address => SharedTypes.User) usersMapping;
// Array containing addresses of users registered to system (for loop functions)
address [] usersArray;
// Number of user (also index of next user in the array)
uint usersCount;
// Mapping which contains an ExtendedContent struct for each content published on the platform (identified by a string)
mapping (string => SharedTypes.ExtendedContent) contentsMapping;
// Array containing addresses of contents published on the system (for loop functions)
string [] contentsArray;
// Number of contents (also index of next content in the array)
uint contentsCount;
constructor () public {
active= true;
usersCount=0;
contentsCount= 0;
}
// ***** ***** //
// ***** Modifiers ***** //
modifier isActive () {
require (active == true);
_;
}
modifier notPublished (string _contentTitle) {
require (alreadyPublished(_contentTitle) == false);
_;
}
// ***** ***** //
// ***** Helper private functions ***** //
// Function to check if a user exists or not in usersMapping
function userExists (address _addr) private view returns (bool){
return (usersMapping[_addr].exists == true);
}
// Function which returns wether a content is already published on the platform
function alreadyPublished (string conTitle) private view returns (bool) {
return (contentsMapping[conTitle].exists == true);
}
// Function to register an user to system
function addUser (address _addr) private {
usersCount++;
usersArray.push (_addr);
usersMapping[_addr].accType= SharedTypes.accountType.standard;
usersMapping[_addr].exists= true;
usersMapping[_addr].expirationTime= 0;
usersMapping[_addr].latestContent = "";
}
// Function to add new content with address 'contAddr' registered by user with address 'userAddr'
function addContent (string _conTitle, address _contAddr, address _userAddr, SharedTypes.contentType _ct) private {
contentsCount++;
contentsArray.push (_conTitle);
contentsMapping[_conTitle].exists= true;
contentsMapping[_conTitle].owner= _userAddr;
contentsMapping[_conTitle].contractAddress= _contAddr;
contentsMapping[_conTitle].cType= _ct;
}
// ***** ***** //
// ***** Public functions ***** //
function killMe () public onlyOwner() {
active= false;
selfdestruct (owner);
}
// Function to link a content with the system
function publishContent (string _contentTitle, address _contentAddr, SharedTypes.contentType _ct) public {
if (!userExists(msg.sender)) {
// Registering new user
addUser (msg.sender);
}
addContent (_contentTitle, _contentAddr, msg.sender, _ct);
}
/*
// Returns the number of views for each content
function getStatistics () public view returns (...) {
}
// Returns the list of contents without the number of views
function getContentList () public view returns (...) {
}
// Returns the list of x newest contents
function getNewContentList (uint n) public view returns (...) {
}
// Returns the most recent content with genre x
function getLatestByGenre (...) public view returns (...) {
}
// Returns the content with genre x, which has received the maximum number of views
function getMostPopularByGenre (...) public view returns (...) {
}
// Returns the most recent content of the author x
function getLatestByAuthor (...) public view returns (...) {
}
// Returns the content with most views of the author x
function getMostPopularByAuthor (...) public view returns (...) {
}
// Returns true if x holds a still valid premium account, false otherwise
function isPremium (...) public view returns (...) {
}
/* ********************************************* */
/* ********************************************* */
/* ********************************************* */
// Pays for access to content x
/*function getContent (...) public {
}
// Requests access to content x without paying, premium accounts only
function getContentPremium (...) public {
}
// Pays for granting access to content x to the user u
function giftContent (..., ...) public {
}
// Pays for granting a Premium Account to the user u
function giftPremium (...) public {
}
// Starts a new premium subscription
function buyPremium () public {
}
*/
}
pragma solidity ^0.4.24;
import "./baseContentManagementContract.sol";
contract SongManagementContract is BaseContentManagementContract {
string private content;
constructor (string _cnt, string _title, address _catAddr) BaseContentManagementContract(SharedTypes.contentType.song, _title, _catAddr) public {
content= _cnt;
}
function getContent () public returns (string) {
return "A SONG..";
}
}
/* ********************************************* */
/* ********************************************* */
/* ********************************************* */
contract VideoManagementContract is BaseContentManagementContract {
}
/* ********************************************* */
/* ********************************************* */
/* ********************************************* */
contract PhotoManagementContract is BaseContentManagementContract {
}
/* ********************************************* */
/* ********************************************* */
/* ********************************************* */
contract DocumentManagementContract is BaseContentManagementContract {
}
pragma solidity ^0.4.24;
import "./mortal.sol";
contract Crowdfund {
struct Funder {
address addr;
uint amount;
}
struct Project {
bool created;
bool opened;
string name;
address owner;
mapping (uint => Funder) funders;
uint fundersSize;
uint amount;
uint fundingGoal;
}
event ProjectCreated (string _name, uint _fundingGoal);
event FundTransferred (address _backer, string _project, uint _amount, uint _remainingAmount);
event fundingGoalReached (string project);
address private owner;
mapping (string => Project) private projects;
modifier ProjectNotExists (string _name) {
require (projects[_name].created == false);
_;
}
modifier ProjectExists (string _name) {
require (projects[_name].created == true);
_;
}
constructor () public {
owner= msg.sender;
}
function createProject (string _projectName, uint _amount) public ProjectNotExists (_projectName) {
projects[_projectName]= Project (true, true, _projectName, msg.sender, 0, 0, _amount);
emit ProjectCreated (_projectName, _amount);
}
function sendMoney (string _projectName, uint _sum) public ProjectExists (_projectName) {
Project storage p= projects[_projectName];
p.funders[p.fundersSize]= Funder (msg.sender, _sum);
p.fundersSize++;
p.amount += _sum;
uint remaining= p.fundingGoal - _sum;
emit FundTransferred (msg.sender, _projectName, _sum, remaining);
checkGoalReached (_projectName);
}
function checkGoalReached (string _projectName) private returns (bool) {
Project storage p= projects[_projectName];
if (p.fundingGoal <= p.amount) {
emit fundingGoalReached (_projectName);
p.opened= false;
return true;
}
return false;
}
function getProject (string _projectName) public view returns (bool, address, uint, uint, uint, bool) {
Project storage p= projects[_projectName];
return (p.opened, p.owner, p.fundersSize, p.amount, p.fundingGoal, p.opened);
}
}
pragma solidity ^0.4.24;
contract Mortal {
address owner;
constructor () public {
owner= msg.sender;
}
function kill () public {
if (msg.sender == owner)
selfdestruct (owner);
}
}
pragma solidity ^0.4.24;
contract Ownable {
address owner;
constructor () public {
owner = msg.sender;
}
modifier onlyOwner () {
require (msg.sender == owner);
_;
}
}
pragma solidity ^0.4.24;
library SharedTypes {
// Kind of content
enum contentType {song, video, photo, document}
// Kind of account
enum accountType {standard, premium}
// Type for registered users, both authors or customers. This struct is stored in the catalog
struct User {
bool exists; // To check if an user exists in the system
accountType accType; // Type of current account (default standard)
uint expirationTime; // Expiration time. Valid only for premium account
string latestContent; // Title of latest content published by current user
}
// Struct to hold togheter BasContentManagementContracts and list of users which payed to view these contents
// Title of content (a string) is the identifier of content
struct ExtendedContent {
bool exists; // To check if a content exists in the system
address contractAddress; // Contract's address associated to current content
address owner; // Address of owner of content
contentType cType; // Type of current content
// Others informations, about views and users which are granted to access to current content, are stored in BasContentManagementContracts
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment