148 lines
4.0 KiB
Solidity
148 lines
4.0 KiB
Solidity
|
/*
|
||
|
* @source: etherscan.io
|
||
|
* @author: -
|
||
|
* @vulnerable_at_lines: 55
|
||
|
*/
|
||
|
|
||
|
pragma solidity ^0.4.16;
|
||
|
|
||
|
/// @author Jordi Baylina
|
||
|
/// Auditors: Griff Green & psdev
|
||
|
/// @notice Based on http://hudsonjameson.com/ethereummarriage/
|
||
|
/// License: GNU-3
|
||
|
|
||
|
/// @dev `Owned` is a base level contract that assigns an `owner` that can be
|
||
|
/// later changed
|
||
|
contract Owned {
|
||
|
|
||
|
/// @dev `owner` is the only address that can call a function with this
|
||
|
/// modifier
|
||
|
modifier onlyOwner() {
|
||
|
require(msg.sender == owner);
|
||
|
_;
|
||
|
}
|
||
|
|
||
|
address public owner;
|
||
|
|
||
|
/// @notice The Constructor assigns the message sender to be `owner`
|
||
|
function Owned() {
|
||
|
owner = msg.sender;
|
||
|
}
|
||
|
|
||
|
address public newOwner;
|
||
|
|
||
|
/// @notice `owner` can step down and assign some other address to this role
|
||
|
/// @param _newOwner The address of the new owner
|
||
|
/// an unowned neutral vault, however that cannot be undone
|
||
|
function changeOwner(address _newOwner) onlyOwner {
|
||
|
newOwner = _newOwner;
|
||
|
}
|
||
|
/// @notice `newOwner` has to accept the ownership before it is transferred
|
||
|
/// Any account or any contract with the ability to call `acceptOwnership`
|
||
|
/// can be used to accept ownership of this contract, including a contract
|
||
|
/// with no other functions
|
||
|
function acceptOwnership() {
|
||
|
if (msg.sender == newOwner) {
|
||
|
owner = newOwner;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This is a general safty function that allows the owner to do a lot
|
||
|
// of things in the unlikely event that something goes wrong
|
||
|
// _dst is the contract being called making this like a 1/1 multisig
|
||
|
function execute(address _dst, uint _value, bytes _data) onlyOwner {
|
||
|
// <yes> <report> UNCHECKED_LL_CALLS
|
||
|
_dst.call.value(_value)(_data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
contract Marriage is Owned
|
||
|
{
|
||
|
// Marriage data variables
|
||
|
string public partner1;
|
||
|
string public partner2;
|
||
|
uint public marriageDate;
|
||
|
string public marriageStatus;
|
||
|
string public vows;
|
||
|
|
||
|
Event[] public majorEvents;
|
||
|
Message[] public messages;
|
||
|
|
||
|
struct Event {
|
||
|
uint date;
|
||
|
string name;
|
||
|
string description;
|
||
|
string url;
|
||
|
}
|
||
|
|
||
|
struct Message {
|
||
|
uint date;
|
||
|
string nameFrom;
|
||
|
string text;
|
||
|
string url;
|
||
|
uint value;
|
||
|
}
|
||
|
|
||
|
modifier areMarried {
|
||
|
require(sha3(marriageStatus) == sha3("Married"));
|
||
|
_;
|
||
|
}
|
||
|
|
||
|
//Set Owner
|
||
|
function Marriage(address _owner) {
|
||
|
owner = _owner;
|
||
|
}
|
||
|
|
||
|
function numberOfMajorEvents() constant public returns (uint) {
|
||
|
return majorEvents.length;
|
||
|
}
|
||
|
|
||
|
function numberOfMessages() constant public returns (uint) {
|
||
|
return messages.length;
|
||
|
}
|
||
|
|
||
|
// Create initial marriage contract
|
||
|
function createMarriage(
|
||
|
string _partner1,
|
||
|
string _partner2,
|
||
|
string _vows,
|
||
|
string url) onlyOwner
|
||
|
{
|
||
|
require(majorEvents.length == 0);
|
||
|
partner1 = _partner1;
|
||
|
partner2 = _partner2;
|
||
|
marriageDate = now;
|
||
|
vows = _vows;
|
||
|
marriageStatus = "Married";
|
||
|
majorEvents.push(Event(now, "Marriage", vows, url));
|
||
|
MajorEvent("Marrigage", vows, url);
|
||
|
}
|
||
|
|
||
|
// Set the marriage status if it changes
|
||
|
function setStatus(string status, string url) onlyOwner
|
||
|
{
|
||
|
marriageStatus = status;
|
||
|
setMajorEvent("Changed Status", status, url);
|
||
|
}
|
||
|
|
||
|
// Set the IPFS hash of the image of the couple
|
||
|
function setMajorEvent(string name, string description, string url) onlyOwner areMarried
|
||
|
{
|
||
|
majorEvents.push(Event(now, name, description, url));
|
||
|
MajorEvent(name, description, url);
|
||
|
}
|
||
|
|
||
|
function sendMessage(string nameFrom, string text, string url) payable areMarried {
|
||
|
if (msg.value > 0) {
|
||
|
owner.transfer(this.balance);
|
||
|
}
|
||
|
messages.push(Message(now, nameFrom, text, url, msg.value));
|
||
|
MessageSent(nameFrom, text, url, msg.value);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Declare event structure
|
||
|
event MajorEvent(string name, string description, string url);
|
||
|
event MessageSent(string name, string description, string url, uint value);
|
||
|
}
|