A decentralized video-sharing and monetization platform built on blockchain and DeFi principles — giving creators and users full control over content, earnings, and governance.
Moving away from centralized control toward decentralized, user-owned ecosystems with transparent monetization.
Revenue distributed directly to creators — zero intermediaries, zero unfair cuts.
Five fully automated on-chain revenue streams — no platform taking unfair cuts.
Transparency means acknowledging the real challenges of decentralized media platforms.
Open source • IPFS storage • DAO governance • BSC
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
// DeFi MyTube - Decentralized Video Platform Prototype
// IPFS/Arweave video references, creator monetization, Watch-to-earn, DAO
// WARNING: Educational only, not audited
interface IERC20 {
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function balanceOf(address user) external view returns (uint256);
}
contract DeFiMyTube {
uint256 public constant BPS = 10_000;
IERC20 public paymentToken;
IERC20 public rewardToken;
address public treasury;
constructor(IERC20 _pay, IERC20 _reward, address _treasury) {
paymentToken = _pay; rewardToken = _reward; treasury = _treasury;
}
struct Video {
address creator; string contentHash; // IPFS / Arweave CID
uint256 tipTotal; uint256 price; // 0 = free
bool active;
}
uint256 public videoCounter;
mapping(uint256 => Video) public videos;
struct Subscription {
uint256 monthlyFee;
mapping(address => uint256) expiry;
}
mapping(address => Subscription) internal subscriptions;
struct Proposal {
string description; uint256 votesFor; uint256 votesAgainst;
uint256 deadline; bool executed;
}
uint256 public proposalCounter;
mapping(uint256 => Proposal) public proposals;
mapping(uint256 => mapping(address => bool)) public voted;
mapping(address => uint256) public pendingRewards;
function uploadVideo(string calldata hash, uint256 price) external {
videos[++videoCounter] = Video({ creator: msg.sender, contentHash: hash,
tipTotal: 0, price: price, active: true });
}
function tipCreator(uint256 videoId, uint256 amount) external {
Video storage v = videos[videoId];
require(v.active, "Inactive");
paymentToken.transferFrom(msg.sender, address(this), amount);
uint256 creatorShare = (amount * 9500) / BPS; // 95% to creator
paymentToken.transfer(v.creator, creatorShare);
paymentToken.transfer(treasury, amount - creatorShare);
v.tipTotal += amount;
}
function purchaseVideo(uint256 videoId) external {
Video storage v = videos[videoId];
require(v.active && v.price > 0, "Invalid");
paymentToken.transferFrom(msg.sender, address(this), v.price);
paymentToken.transfer(v.creator, (v.price * 9000) / BPS);
paymentToken.transfer(treasury, v.price / 10);
pendingRewards[msg.sender] += v.price / 10;
}
function subscribe(address creator) external {
uint256 fee = subscriptions[creator].monthlyFee;
require(fee > 0, "No subscription set");
paymentToken.transferFrom(msg.sender, address(this), fee);
paymentToken.transfer(creator, (fee * 9000) / BPS);
paymentToken.transfer(treasury, fee / 10);
subscriptions[creator].expiry[msg.sender] = block.timestamp + 30 days;
}
function claimRewards() external {
uint256 amt = pendingRewards[msg.sender];
require(amt > 0, "No rewards");
pendingRewards[msg.sender] = 0;
rewardToken.transfer(msg.sender, amt);
}
function vote(uint256 proposalId, bool support) external {
Proposal storage p = proposals[proposalId];
require(block.timestamp < p.deadline, "Voting ended");
require(!voted[proposalId][msg.sender], "Already voted");
uint256 weight = rewardToken.balanceOf(msg.sender);
require(weight > 0, "No voting power");
voted[proposalId][msg.sender] = true;
if (support) p.votesFor += weight;
else p.votesAgainst += weight;
}
}Multi-layer protection for creator funds, viewer rewards, and DAO governance on-chain.