Add SB Curated (copied from the smartbugs repository).
This commit is contained in:
124
dataset/denial_of_service/list_dos.sol
Normal file
124
dataset/denial_of_service/list_dos.sol
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* @source: https://etherscan.io/address/0xf45717552f12ef7cb65e95476f217ea008167ae3#code
|
||||
* @author: -
|
||||
* @vulnerable_at_lines: 46,48
|
||||
*/
|
||||
|
||||
//added pragma version
|
||||
pragma solidity ^0.4.0;
|
||||
|
||||
contract Government {
|
||||
|
||||
// Global Variables
|
||||
uint32 public lastCreditorPayedOut;
|
||||
uint public lastTimeOfNewCredit;
|
||||
uint public profitFromCrash;
|
||||
address[] public creditorAddresses;
|
||||
uint[] public creditorAmounts;
|
||||
address public corruptElite;
|
||||
mapping (address => uint) buddies;
|
||||
uint constant TWELVE_HOURS = 43200;
|
||||
uint8 public round;
|
||||
|
||||
function Government() {
|
||||
// The corrupt elite establishes a new government
|
||||
// this is the commitment of the corrupt Elite - everything that can not be saved from a crash
|
||||
profitFromCrash = msg.value;
|
||||
corruptElite = msg.sender;
|
||||
lastTimeOfNewCredit = block.timestamp;
|
||||
}
|
||||
|
||||
function lendGovernmentMoney(address buddy) returns (bool) {
|
||||
uint amount = msg.value;
|
||||
// check if the system already broke down. If for 12h no new creditor gives new credit to the system it will brake down.
|
||||
// 12h are on average = 60*60*12/12.5 = 3456
|
||||
if (lastTimeOfNewCredit + TWELVE_HOURS < block.timestamp) {
|
||||
// Return money to sender
|
||||
msg.sender.send(amount);
|
||||
// Sends all contract money to the last creditor
|
||||
creditorAddresses[creditorAddresses.length - 1].send(profitFromCrash);
|
||||
corruptElite.send(this.balance);
|
||||
// Reset contract state
|
||||
lastCreditorPayedOut = 0;
|
||||
lastTimeOfNewCredit = block.timestamp;
|
||||
profitFromCrash = 0;
|
||||
// <yes> <report> DENIAL_OF_SERVICE
|
||||
creditorAddresses = new address[](0);
|
||||
// <yes> <report> DENIAL_OF_SERVICE
|
||||
creditorAmounts = new uint[](0);
|
||||
round += 1;
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
// the system needs to collect at least 1% of the profit from a crash to stay alive
|
||||
if (amount >= 10 ** 18) {
|
||||
// the System has received fresh money, it will survive at leat 12h more
|
||||
lastTimeOfNewCredit = block.timestamp;
|
||||
// register the new creditor and his amount with 10% interest rate
|
||||
creditorAddresses.push(msg.sender);
|
||||
creditorAmounts.push(amount * 110 / 100);
|
||||
// now the money is distributed
|
||||
// first the corrupt elite grabs 5% - thieves!
|
||||
corruptElite.send(amount * 5/100);
|
||||
// 5% are going into the economy (they will increase the value for the person seeing the crash comming)
|
||||
if (profitFromCrash < 10000 * 10**18) {
|
||||
profitFromCrash += amount * 5/100;
|
||||
}
|
||||
// if you have a buddy in the government (and he is in the creditor list) he can get 5% of your credits.
|
||||
// Make a deal with him.
|
||||
if(buddies[buddy] >= amount) {
|
||||
buddy.send(amount * 5/100);
|
||||
}
|
||||
buddies[msg.sender] += amount * 110 / 100;
|
||||
// 90% of the money will be used to pay out old creditors
|
||||
if (creditorAmounts[lastCreditorPayedOut] <= address(this).balance - profitFromCrash) {
|
||||
creditorAddresses[lastCreditorPayedOut].send(creditorAmounts[lastCreditorPayedOut]);
|
||||
buddies[creditorAddresses[lastCreditorPayedOut]] -= creditorAmounts[lastCreditorPayedOut];
|
||||
lastCreditorPayedOut += 1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
msg.sender.send(amount);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fallback function
|
||||
function() {
|
||||
lendGovernmentMoney(0);
|
||||
}
|
||||
|
||||
function totalDebt() returns (uint debt) {
|
||||
for(uint i=lastCreditorPayedOut; i<creditorAmounts.length; i++){
|
||||
debt += creditorAmounts[i];
|
||||
}
|
||||
}
|
||||
|
||||
function totalPayedOut() returns (uint payout) {
|
||||
for(uint i=0; i<lastCreditorPayedOut; i++){
|
||||
payout += creditorAmounts[i];
|
||||
}
|
||||
}
|
||||
|
||||
// better don't do it (unless you are the corrupt elite and you want to establish trust in the system)
|
||||
function investInTheSystem() {
|
||||
profitFromCrash += msg.value;
|
||||
}
|
||||
|
||||
// From time to time the corrupt elite inherits it's power to the next generation
|
||||
function inheritToNextGeneration(address nextGeneration) {
|
||||
if (msg.sender == corruptElite) {
|
||||
corruptElite = nextGeneration;
|
||||
}
|
||||
}
|
||||
|
||||
function getCreditorAddresses() returns (address[]) {
|
||||
return creditorAddresses;
|
||||
}
|
||||
|
||||
function getCreditorAmounts() returns (uint[]) {
|
||||
return creditorAmounts;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user