remove build dir from repo & run build in npm prepublish
This commit is contained in:
parent
6d19fd0d57
commit
98fdd06aba
|
@ -1,7 +0,0 @@
|
|||
/* This is an autogenerated file. DO NOT EDIT MANUALLY */
|
||||
|
||||
exports.ILiquidPledgingPluginAbi = [{"constant":false,"inputs":[{"name":"pledgeManager","type":"uint64"},{"name":"pledgeFrom","type":"uint64"},{"name":"pledgeTo","type":"uint64"},{"name":"context","type":"uint64"},{"name":"amount","type":"uint256"}],"name":"afterTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"pledgeManager","type":"uint64"},{"name":"pledgeFrom","type":"uint64"},{"name":"pledgeTo","type":"uint64"},{"name":"context","type":"uint64"},{"name":"amount","type":"uint256"}],"name":"beforeTransfer","outputs":[{"name":"maxAllowed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
|
||||
exports.ILiquidPledgingPluginByteCode = "0x"
|
||||
exports.ILiquidPledgingPluginRuntimeByteCode = "0x"
|
||||
exports._solcVersion = "0.4.18+commit.9cf6e910.Emscripten.clang"
|
||||
exports._sha256 = "0xe5a08624c7acbeabf9625727855abbfade7e864b099c1402d6eb40ca15e4fc5f"
|
|
@ -1,82 +0,0 @@
|
|||
|
||||
//File: ./contracts/ILiquidPledgingPlugin.sol
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
/*
|
||||
Copyright 2017, Jordi Baylina
|
||||
Contributor: Adrià Massanet <adria@codecontext.io>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
/// @dev `ILiquidPledgingPlugin` is the basic interface for any
|
||||
/// liquid pledging plugin
|
||||
contract ILiquidPledgingPlugin {
|
||||
|
||||
/// @notice Plugins are used (much like web hooks) to initiate an action
|
||||
/// upon any donation, delegation, or transfer; this is an optional feature
|
||||
/// and allows for extreme customization of the contract. This function
|
||||
/// implements any action that should be initiated before a transfer.
|
||||
/// @param pledgeManager The admin or current manager of the pledge
|
||||
/// @param pledgeFrom This is the Id from which value will be transfered.
|
||||
/// @param pledgeTo This is the Id that value will be transfered to.
|
||||
/// @param context The situation that is triggering the plugin:
|
||||
/// 0 -> Plugin for the owner transferring pledge to another party
|
||||
/// 1 -> Plugin for the first delegate transferring pledge to another party
|
||||
/// 2 -> Plugin for the second delegate transferring pledge to another party
|
||||
/// ...
|
||||
/// 255 -> Plugin for the intendedProject transferring pledge to another party
|
||||
///
|
||||
/// 256 -> Plugin for the owner receiving pledge to another party
|
||||
/// 257 -> Plugin for the first delegate receiving pledge to another party
|
||||
/// 258 -> Plugin for the second delegate receiving pledge to another party
|
||||
/// ...
|
||||
/// 511 -> Plugin for the intendedProject receiving pledge to another party
|
||||
/// @param amount The amount of value that will be transfered.
|
||||
function beforeTransfer(
|
||||
uint64 pledgeManager,
|
||||
uint64 pledgeFrom,
|
||||
uint64 pledgeTo,
|
||||
uint64 context,
|
||||
uint amount ) returns (uint maxAllowed);
|
||||
|
||||
/// @notice Plugins are used (much like web hooks) to initiate an action
|
||||
/// upon any donation, delegation, or transfer; this is an optional feature
|
||||
/// and allows for extreme customization of the contract. This function
|
||||
/// implements any action that should be initiated after a transfer.
|
||||
/// @param pledgeManager The admin or current manager of the pledge
|
||||
/// @param pledgeFrom This is the Id from which value will be transfered.
|
||||
/// @param pledgeTo This is the Id that value will be transfered to.
|
||||
/// @param context The situation that is triggering the plugin:
|
||||
/// 0 -> Plugin for the owner transferring pledge to another party
|
||||
/// 1 -> Plugin for the first delegate transferring pledge to another party
|
||||
/// 2 -> Plugin for the second delegate transferring pledge to another party
|
||||
/// ...
|
||||
/// 255 -> Plugin for the intendedProject transferring pledge to another party
|
||||
///
|
||||
/// 256 -> Plugin for the owner receiving pledge to another party
|
||||
/// 257 -> Plugin for the first delegate receiving pledge to another party
|
||||
/// 258 -> Plugin for the second delegate receiving pledge to another party
|
||||
/// ...
|
||||
/// 511 -> Plugin for the intendedProject receiving pledge to another party
|
||||
/// @param amount The amount of value that will be transfered.
|
||||
function afterTransfer(
|
||||
uint64 pledgeManager,
|
||||
uint64 pledgeFrom,
|
||||
uint64 pledgeTo,
|
||||
uint64 context,
|
||||
uint amount
|
||||
);
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -1,224 +0,0 @@
|
|||
|
||||
//File: contracts/Owned.sol
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
|
||||
/// @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 account deploying the contract to be
|
||||
/// the `owner`
|
||||
function Owned() {
|
||||
owner = msg.sender;
|
||||
}
|
||||
|
||||
address public newOwner;
|
||||
|
||||
/// @notice `owner` can step down and assign some other address to this role
|
||||
/// but after this function is called the current owner still has ownership
|
||||
/// powers in this contract; change of ownership is a 2 step process
|
||||
/// @param _newOwner The address of the new owner. A simple contract with
|
||||
/// the ability to accept ownership but the inability to do anything else
|
||||
/// can be used to create an unowned contract to achieve decentralization
|
||||
function changeOwner(address _newOwner) onlyOwner {
|
||||
newOwner = _newOwner;
|
||||
}
|
||||
|
||||
/// @notice `newOwner` can accept ownership over this contract
|
||||
function acceptOwnership() {
|
||||
require(msg.sender == newOwner);
|
||||
owner = newOwner;
|
||||
}
|
||||
}
|
||||
|
||||
//File: ./contracts/LPVault.sol
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
/// @title LPVault
|
||||
/// @author Jordi Baylina
|
||||
/// @notice This contract holds ether securely for liquid pledging systems. For
|
||||
/// this iteration the funds will come straight from the Giveth Multisig as a
|
||||
/// safety precaution, but once fully tested and optimized this contract will
|
||||
/// be a safe place to store funds equipped with optional variable time delays
|
||||
/// to allow for an optional escape hatch to be implemented
|
||||
|
||||
|
||||
/// @dev `LiquidPledging` is a basic interface to allow the `LPVault` contract
|
||||
/// to confirm and cancel payments in the `LiquidPledging` contract.
|
||||
contract LiquidPledging {
|
||||
function confirmPayment(uint64 idNote, uint amount);
|
||||
function cancelPayment(uint64 idNote, uint amount);
|
||||
}
|
||||
|
||||
|
||||
/// @dev `LPVault` is a higher level contract built off of the `Owned`
|
||||
/// contract that holds funds for the liquid pledging system.
|
||||
contract LPVault is Owned {
|
||||
|
||||
LiquidPledging public liquidPledging; // liquidPledging contract's address
|
||||
bool public autoPay; // if false, payments will take 2 txs to be completed
|
||||
|
||||
enum PaymentStatus {
|
||||
Pending, // means the payment is awaiting confirmation
|
||||
Paid, // means the payment has been sent
|
||||
Canceled // means the payment will never be sent
|
||||
}
|
||||
/// @dev `Payment` is a public structure that describes the details of
|
||||
/// each payment the `ref` param makes it easy to track the movements of
|
||||
/// funds transparently by its connection to other `Payment` structs
|
||||
struct Payment {
|
||||
PaymentStatus state; //
|
||||
bytes32 ref; // an input that references details from other contracts
|
||||
address dest; // recipient of the ETH
|
||||
uint amount; // amount of ETH (in wei) to be sent
|
||||
}
|
||||
|
||||
// @dev An array that contains all the payments for this LPVault
|
||||
Payment[] public payments;
|
||||
|
||||
// @dev `liquidPledging` is the only address that can call a function with
|
||||
/// this modifier
|
||||
modifier onlyLiquidPledging() {
|
||||
require(msg.sender == address(liquidPledging));
|
||||
_;
|
||||
}
|
||||
/// @dev USED FOR TESTING???
|
||||
function VaultMock() {
|
||||
|
||||
}
|
||||
|
||||
function () payable {
|
||||
|
||||
}
|
||||
|
||||
/// @notice `setLiquidPledging` is used to attach a specific liquid pledging
|
||||
/// instance to this LPvault. Keep in mind this isn't a single pledge but
|
||||
/// instead an entire liquid pledging contract.
|
||||
/// @param _newLiquidPledging A full liquid pledging contract
|
||||
function setLiquidPledging(address _newLiquidPledging) onlyOwner {
|
||||
require(address(liquidPledging) == 0x0);
|
||||
liquidPledging = LiquidPledging(_newLiquidPledging);
|
||||
}
|
||||
|
||||
/// @notice `setAutopay` is used to toggle whether the LPvault will
|
||||
/// automatically confirm a payment after the payment has been authorized.
|
||||
/// @param _automatic If true payments will confirm automatically
|
||||
function setAutopay(bool _automatic) onlyOwner {
|
||||
autoPay = _automatic;
|
||||
}
|
||||
|
||||
/// @notice `authorizePayment` is used in order to approve a payment
|
||||
/// from the liquid pledging contract. Whenever a project or other address
|
||||
/// needs to receive a payment it needs to be authorized with this contract.
|
||||
/// @param _ref This parameter is used to reference details about the
|
||||
/// payment from another contract.
|
||||
/// @param _dest This is the address that payments will end up being sent to
|
||||
/// @param _amount This is the amount that the payment is being authorized
|
||||
/// for.
|
||||
function authorizePayment(
|
||||
bytes32 _ref,
|
||||
address _dest,
|
||||
uint _amount ) onlyLiquidPledging returns (uint) {
|
||||
uint idPayment = payments.length;
|
||||
payments.length ++;
|
||||
payments[idPayment].state = PaymentStatus.Pending;
|
||||
payments[idPayment].ref = _ref;
|
||||
payments[idPayment].dest = _dest;
|
||||
payments[idPayment].amount = _amount;
|
||||
|
||||
AuthorizePayment(idPayment, _ref, _dest, _amount);
|
||||
|
||||
if (autoPay) doConfirmPayment(idPayment);
|
||||
|
||||
return idPayment;
|
||||
}
|
||||
|
||||
/// @notice `confirmPayment` is a basic function used to allow the
|
||||
/// owner of the vault to initiate a payment confirmation. Since
|
||||
/// `authorizePayment` is the only pay to populate the `payments` array
|
||||
/// this is generally used when `autopay` is `false` after a payment has
|
||||
/// has been authorized.
|
||||
/// @param _idPayment Array lookup for the payment.
|
||||
function confirmPayment(uint _idPayment) onlyOwner {
|
||||
doConfirmPayment(_idPayment);
|
||||
}
|
||||
|
||||
/// @notice `doConfirmPayment` is used to actually initiate a payment
|
||||
/// to the final destination. All of the payment information should be
|
||||
/// set before calling this function.
|
||||
/// @param _idPayment Array lookup for the payment.
|
||||
function doConfirmPayment(uint _idPayment) internal {
|
||||
require(_idPayment < payments.length);
|
||||
Payment storage p = payments[_idPayment];
|
||||
require(p.state == PaymentStatus.Pending);
|
||||
|
||||
p.state = PaymentStatus.Paid;
|
||||
liquidPledging.confirmPayment(uint64(p.ref), p.amount);
|
||||
|
||||
p.dest.transfer(p.amount); // only ETH denominated in wei
|
||||
|
||||
ConfirmPayment(_idPayment);
|
||||
}
|
||||
|
||||
/// @notice `cancelPayment` is used when `autopay` is `false` in order
|
||||
/// to allow the owner to cancel a payment instead of confirming it.
|
||||
/// @param _idPayment Array lookup for the payment.
|
||||
function cancelPayment(uint _idPayment) onlyOwner {
|
||||
doCancelPayment(_idPayment);
|
||||
}
|
||||
|
||||
/// @notice `doCancelPayment` This carries out the task of actually
|
||||
/// canceling a payment instead of confirming it.
|
||||
/// @param _idPayment Array lookup for the payment.
|
||||
function doCancelPayment(uint _idPayment) internal {
|
||||
require(_idPayment < payments.length);
|
||||
Payment storage p = payments[_idPayment];
|
||||
require(p.state == PaymentStatus.Pending);
|
||||
|
||||
p.state = PaymentStatus.Canceled;
|
||||
|
||||
liquidPledging.cancelPayment(uint64(p.ref), p.amount);
|
||||
|
||||
CancelPayment(_idPayment);
|
||||
|
||||
}
|
||||
|
||||
/// @notice `multiConfirm` allows for more efficient confirmation of
|
||||
/// multiple payments.
|
||||
/// @param _idPayments An array of multiple payment ids
|
||||
function multiConfirm(uint[] _idPayments) onlyOwner {
|
||||
for (uint i=0; i < _idPayments.length; i++) {
|
||||
doConfirmPayment(_idPayments[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/// @notice `multiCancel` allows for more efficient cancellation of
|
||||
/// multiple payments.
|
||||
/// @param _idPayments An array of multiple payment ids
|
||||
function multiCancel(uint[] _idPayments) onlyOwner {
|
||||
for (uint i=0; i < _idPayments.length; i++) {
|
||||
doCancelPayment(_idPayments[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/// @notice `nPayments` Basic getter to return the number of payments
|
||||
/// currently held in the system. Since payments are not removed from
|
||||
/// the array this represents all payments over all time.
|
||||
function nPayments() constant returns (uint) {
|
||||
return payments.length;
|
||||
}
|
||||
|
||||
event ConfirmPayment(uint indexed idPayment);
|
||||
event CancelPayment(uint indexed idPayment);
|
||||
event AuthorizePayment(uint indexed idPayment, bytes32 indexed ref, address indexed dest, uint amount);
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,756 +0,0 @@
|
|||
|
||||
//File: contracts/ILiquidPledgingPlugin.sol
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
/*
|
||||
Copyright 2017, Jordi Baylina
|
||||
Contributor: Adrià Massanet <adria@codecontext.io>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
/// @dev `ILiquidPledgingPlugin` is the basic interface for any
|
||||
/// liquid pledging plugin
|
||||
contract ILiquidPledgingPlugin {
|
||||
|
||||
/// @notice Plugins are used (much like web hooks) to initiate an action
|
||||
/// upon any donation, delegation, or transfer; this is an optional feature
|
||||
/// and allows for extreme customization of the contract. This function
|
||||
/// implements any action that should be initiated before a transfer.
|
||||
/// @param pledgeManager The admin or current manager of the pledge
|
||||
/// @param pledgeFrom This is the Id from which value will be transfered.
|
||||
/// @param pledgeTo This is the Id that value will be transfered to.
|
||||
/// @param context The situation that is triggering the plugin:
|
||||
/// 0 -> Plugin for the owner transferring pledge to another party
|
||||
/// 1 -> Plugin for the first delegate transferring pledge to another party
|
||||
/// 2 -> Plugin for the second delegate transferring pledge to another party
|
||||
/// ...
|
||||
/// 255 -> Plugin for the intendedProject transferring pledge to another party
|
||||
///
|
||||
/// 256 -> Plugin for the owner receiving pledge to another party
|
||||
/// 257 -> Plugin for the first delegate receiving pledge to another party
|
||||
/// 258 -> Plugin for the second delegate receiving pledge to another party
|
||||
/// ...
|
||||
/// 511 -> Plugin for the intendedProject receiving pledge to another party
|
||||
/// @param amount The amount of value that will be transfered.
|
||||
function beforeTransfer(
|
||||
uint64 pledgeManager,
|
||||
uint64 pledgeFrom,
|
||||
uint64 pledgeTo,
|
||||
uint64 context,
|
||||
uint amount ) returns (uint maxAllowed);
|
||||
|
||||
/// @notice Plugins are used (much like web hooks) to initiate an action
|
||||
/// upon any donation, delegation, or transfer; this is an optional feature
|
||||
/// and allows for extreme customization of the contract. This function
|
||||
/// implements any action that should be initiated after a transfer.
|
||||
/// @param pledgeManager The admin or current manager of the pledge
|
||||
/// @param pledgeFrom This is the Id from which value will be transfered.
|
||||
/// @param pledgeTo This is the Id that value will be transfered to.
|
||||
/// @param context The situation that is triggering the plugin:
|
||||
/// 0 -> Plugin for the owner transferring pledge to another party
|
||||
/// 1 -> Plugin for the first delegate transferring pledge to another party
|
||||
/// 2 -> Plugin for the second delegate transferring pledge to another party
|
||||
/// ...
|
||||
/// 255 -> Plugin for the intendedProject transferring pledge to another party
|
||||
///
|
||||
/// 256 -> Plugin for the owner receiving pledge to another party
|
||||
/// 257 -> Plugin for the first delegate receiving pledge to another party
|
||||
/// 258 -> Plugin for the second delegate receiving pledge to another party
|
||||
/// ...
|
||||
/// 511 -> Plugin for the intendedProject receiving pledge to another party
|
||||
/// @param amount The amount of value that will be transfered.
|
||||
function afterTransfer(
|
||||
uint64 pledgeManager,
|
||||
uint64 pledgeFrom,
|
||||
uint64 pledgeTo,
|
||||
uint64 context,
|
||||
uint amount
|
||||
);
|
||||
}
|
||||
|
||||
//File: node_modules/giveth-common-contracts/contracts/Owned.sol
|
||||
pragma solidity ^0.4.15;
|
||||
|
||||
|
||||
/// @title Owned
|
||||
/// @author Adrià Massanet <adria@codecontext.io>
|
||||
/// @notice The Owned contract has an owner address, and provides basic
|
||||
/// authorization control functions, this simplifies & the implementation of
|
||||
/// user permissions; this contract has three work flows for a change in
|
||||
/// ownership, the first requires the new owner to validate that they have the
|
||||
/// ability to accept ownership, the second allows the ownership to be
|
||||
/// directly transfered without requiring acceptance, and the third allows for
|
||||
/// the ownership to be removed to allow for decentralization
|
||||
contract Owned {
|
||||
|
||||
address public owner;
|
||||
address public newOwnerCandidate;
|
||||
|
||||
event OwnershipRequested(address indexed by, address indexed to);
|
||||
event OwnershipTransferred(address indexed from, address indexed to);
|
||||
event OwnershipRemoved();
|
||||
|
||||
/// @dev The constructor sets the `msg.sender` as the`owner` of the contract
|
||||
function Owned() public {
|
||||
owner = msg.sender;
|
||||
}
|
||||
|
||||
/// @dev `owner` is the only address that can call a function with this
|
||||
/// modifier
|
||||
modifier onlyOwner() {
|
||||
require (msg.sender == owner);
|
||||
_;
|
||||
}
|
||||
|
||||
/// @dev In this 1st option for ownership transfer `proposeOwnership()` must
|
||||
/// be called first by the current `owner` then `acceptOwnership()` must be
|
||||
/// called by the `newOwnerCandidate`
|
||||
/// @notice `onlyOwner` Proposes to transfer control of the contract to a
|
||||
/// new owner
|
||||
/// @param _newOwnerCandidate The address being proposed as the new owner
|
||||
function proposeOwnership(address _newOwnerCandidate) public onlyOwner {
|
||||
newOwnerCandidate = _newOwnerCandidate;
|
||||
OwnershipRequested(msg.sender, newOwnerCandidate);
|
||||
}
|
||||
|
||||
/// @notice Can only be called by the `newOwnerCandidate`, accepts the
|
||||
/// transfer of ownership
|
||||
function acceptOwnership() public {
|
||||
require(msg.sender == newOwnerCandidate);
|
||||
|
||||
address oldOwner = owner;
|
||||
owner = newOwnerCandidate;
|
||||
newOwnerCandidate = 0x0;
|
||||
|
||||
OwnershipTransferred(oldOwner, owner);
|
||||
}
|
||||
|
||||
/// @dev In this 2nd option for ownership transfer `changeOwnership()` can
|
||||
/// be called and it will immediately assign ownership to the `newOwner`
|
||||
/// @notice `owner` can step down and assign some other address to this role
|
||||
/// @param _newOwner The address of the new owner
|
||||
function changeOwnership(address _newOwner) public onlyOwner {
|
||||
require(_newOwner != 0x0);
|
||||
|
||||
address oldOwner = owner;
|
||||
owner = _newOwner;
|
||||
newOwnerCandidate = 0x0;
|
||||
|
||||
OwnershipTransferred(oldOwner, owner);
|
||||
}
|
||||
|
||||
/// @dev In this 3rd option for ownership transfer `removeOwnership()` can
|
||||
/// be called and it will immediately assign ownership to the 0x0 address;
|
||||
/// it requires a 0xdece be input as a parameter to prevent accidental use
|
||||
/// @notice Decentralizes the contract, this operation cannot be undone
|
||||
/// @param _dac `0xdac` has to be entered for this function to work
|
||||
function removeOwnership(address _dac) public onlyOwner {
|
||||
require(_dac == 0xdac);
|
||||
owner = 0x0;
|
||||
newOwnerCandidate = 0x0;
|
||||
OwnershipRemoved();
|
||||
}
|
||||
}
|
||||
|
||||
//File: ./contracts/LiquidPledgingBase.sol
|
||||
pragma solidity ^0.4.11;
|
||||
/*
|
||||
Copyright 2017, Jordi Baylina
|
||||
Contributor: Adrià Massanet <adria@codecontext.io>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/// @dev `LPVault` serves as an interface to allow the `LiquidPledgingBase`
|
||||
/// contract to interface with a `LPVault` contract
|
||||
contract LPVault {
|
||||
function authorizePayment(bytes32 _ref, address _dest, uint _amount);
|
||||
function () payable;
|
||||
}
|
||||
|
||||
/// @dev `LiquidPledgingBase` is the base level contract used to carry out
|
||||
/// liquid pledging's most basic functions, mostly handling and searching the
|
||||
/// data structures
|
||||
contract LiquidPledgingBase is Owned {
|
||||
|
||||
// Limits inserted to prevent large loops that could prevent canceling
|
||||
uint constant MAX_DELEGATES = 20;
|
||||
uint constant MAX_SUBPROJECT_LEVEL = 20;
|
||||
uint constant MAX_INTERPROJECT_LEVEL = 20;
|
||||
|
||||
enum PledgeAdminType { Giver, Delegate, Project }
|
||||
enum PaymentState { Pledged, Paying, Paid }
|
||||
|
||||
/// @dev This struct defines the details of the `PledgeAdmin` which are
|
||||
/// Referenced by their id and can own pledges and act as delegates
|
||||
struct PledgeAdmin {
|
||||
PledgeAdminType adminType; // Giver, Delegate or Project
|
||||
address addr; // Account or contract address for admin
|
||||
string name;
|
||||
string url; // Can be IPFS hash
|
||||
uint64 commitTime; // In seconds, used for Givers' & Delegates' vetos
|
||||
uint64 parentProject; // Only for projects
|
||||
bool canceled; //Always false except for canceled projects
|
||||
|
||||
/// @dev if the plugin is 0x0 then nothing happens, if its an address
|
||||
// than that smart contract is called when appropriate
|
||||
ILiquidPledgingPlugin plugin;
|
||||
}
|
||||
|
||||
struct Pledge {
|
||||
uint amount;
|
||||
uint64 owner; // PledgeAdmin
|
||||
uint64[] delegationChain; // List of delegates in order of authority
|
||||
uint64 intendedProject; // Used when delegates are sending to projects
|
||||
uint64 commitTime; // When the intendedProject will become the owner
|
||||
uint64 oldPledge; // Points to the id that this Pledge was derived from
|
||||
PaymentState paymentState; // Pledged, Paying, Paid
|
||||
}
|
||||
|
||||
Pledge[] pledges;
|
||||
PledgeAdmin[] admins; //The list of pledgeAdmins 0 means there is no admin
|
||||
LPVault public vault;
|
||||
|
||||
/// @dev this mapping allows you to search for a specific pledge's
|
||||
/// index number by the hash of that pledge
|
||||
mapping (bytes32 => uint64) hPledge2idx;
|
||||
mapping (bytes32 => bool) pluginWhitelist;
|
||||
|
||||
bool public usePluginWhitelist = true;
|
||||
|
||||
/////////////
|
||||
// Modifiers
|
||||
/////////////
|
||||
|
||||
|
||||
/// @dev The `vault`is the only addresses that can call a function with this
|
||||
/// modifier
|
||||
modifier onlyVault() {
|
||||
require(msg.sender == address(vault));
|
||||
_;
|
||||
}
|
||||
|
||||
|
||||
///////////////
|
||||
// Constructor
|
||||
///////////////
|
||||
|
||||
/// @notice The Constructor creates `LiquidPledgingBase` on the blockchain
|
||||
/// @param _vault The vault where the ETH backing the pledges is stored
|
||||
function LiquidPledgingBase(address _vault) {
|
||||
admins.length = 1; // we reserve the 0 admin
|
||||
pledges.length = 1; // we reserve the 0 pledge
|
||||
vault = LPVault(_vault); // Assigns the specified vault
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////
|
||||
// PledgeAdmin functions
|
||||
/////////////////////////
|
||||
|
||||
/// @notice Creates a Giver Admin with the `msg.sender` as the Admin address
|
||||
/// @param name The name used to identify the Giver
|
||||
/// @param url The link to the Giver's profile often an IPFS hash
|
||||
/// @param commitTime The length of time in seconds the Giver has to
|
||||
/// veto when the Giver's delegates Pledge funds to a project
|
||||
/// @param plugin This is Giver's liquid pledge plugin allowing for
|
||||
/// extended functionality
|
||||
/// @return idGiver The id number used to reference this Admin
|
||||
function addGiver(
|
||||
string name,
|
||||
string url,
|
||||
uint64 commitTime,
|
||||
ILiquidPledgingPlugin plugin
|
||||
) returns (uint64 idGiver) {
|
||||
|
||||
require(isValidPlugin(plugin)); // Plugin check
|
||||
|
||||
idGiver = uint64(admins.length);
|
||||
|
||||
admins.push(PledgeAdmin(
|
||||
PledgeAdminType.Giver,
|
||||
msg.sender,
|
||||
name,
|
||||
url,
|
||||
commitTime,
|
||||
0,
|
||||
false,
|
||||
plugin));
|
||||
|
||||
GiverAdded(idGiver);
|
||||
}
|
||||
|
||||
event GiverAdded(uint64 indexed idGiver);
|
||||
|
||||
/// @notice Updates a Giver's info to change the address, name, url, or
|
||||
/// commitTime, it cannot be used to change a plugin, and it must be called
|
||||
/// by the current address of the Giver
|
||||
/// @param idGiver This is the Admin id number used to specify the Giver
|
||||
/// @param newAddr The new address that represents this Giver
|
||||
/// @param newName The new name used to identify the Giver
|
||||
/// @param newUrl The new link to the Giver's profile often an IPFS hash
|
||||
/// @param newCommitTime Sets the length of time in seconds the Giver has to
|
||||
/// veto when the Giver's delegates Pledge funds to a project
|
||||
function updateGiver(
|
||||
uint64 idGiver,
|
||||
address newAddr,
|
||||
string newName,
|
||||
string newUrl,
|
||||
uint64 newCommitTime)
|
||||
{
|
||||
PledgeAdmin storage giver = findAdmin(idGiver);
|
||||
require(giver.adminType == PledgeAdminType.Giver); // Must be a Giver
|
||||
require(giver.addr == msg.sender); // Current addr had to send this tx
|
||||
giver.addr = newAddr;
|
||||
giver.name = newName;
|
||||
giver.url = newUrl;
|
||||
giver.commitTime = newCommitTime;
|
||||
GiverUpdated(idGiver);
|
||||
}
|
||||
|
||||
event GiverUpdated(uint64 indexed idGiver);
|
||||
|
||||
/// @notice Creates a Delegate Admin with the `msg.sender` as the Admin addr
|
||||
/// @param name The name used to identify the Delegate
|
||||
/// @param url The link to the Delegate's profile often an IPFS hash
|
||||
/// @param commitTime Sets the length of time in seconds the Delegate has to
|
||||
/// veto when the Delegate delegates to another Delegate and they pledge
|
||||
/// those funds to a project
|
||||
/// @param plugin This is Delegate's liquid pledge plugin allowing for
|
||||
/// extended functionality
|
||||
/// @return idxDelegate The id number used to reference this Delegate within
|
||||
/// the admins array
|
||||
function addDelegate(
|
||||
string name,
|
||||
string url,
|
||||
uint64 commitTime,
|
||||
ILiquidPledgingPlugin plugin
|
||||
) returns (uint64 idxDelegate) {
|
||||
|
||||
require(isValidPlugin(plugin)); // Plugin check
|
||||
|
||||
idxDelegate = uint64(admins.length);
|
||||
|
||||
admins.push(PledgeAdmin(
|
||||
PledgeAdminType.Delegate,
|
||||
msg.sender,
|
||||
name,
|
||||
url,
|
||||
commitTime,
|
||||
0,
|
||||
false,
|
||||
plugin));
|
||||
|
||||
DelegateAdded(idxDelegate);
|
||||
}
|
||||
|
||||
event DelegateAdded(uint64 indexed idxDelegate);
|
||||
|
||||
/// @notice Updates a Delegate's info to change the address, name, url, or
|
||||
/// commitTime, it cannot be used to change a plugin, and it must be called
|
||||
/// by the current address of the Delegate
|
||||
/// @param idxDelegate The Admin id number used to specify the Delegate
|
||||
/// @param newAddr The new address that represents this Delegate
|
||||
/// @param newName The new name used to identify the Delegate
|
||||
/// @param newUrl The new link to the Delegate's profile often an IPFS hash
|
||||
/// @param newCommitTime Sets the length of time in seconds the Delegate has
|
||||
/// to veto when the Delegate delegates to a Delegate and they pledge those
|
||||
/// funds to a project
|
||||
function updateDelegate(
|
||||
uint64 idxDelegate,
|
||||
address newAddr,
|
||||
string newName,
|
||||
string newUrl,
|
||||
uint64 newCommitTime) {
|
||||
PledgeAdmin storage delegate = findAdmin(idxDelegate);
|
||||
require(delegate.adminType == PledgeAdminType.Delegate);
|
||||
require(delegate.addr == msg.sender);// Current addr had to send this tx
|
||||
delegate.addr = newAddr;
|
||||
delegate.name = newName;
|
||||
delegate.url = newUrl;
|
||||
delegate.commitTime = newCommitTime;
|
||||
DelegateUpdated(idxDelegate);
|
||||
}
|
||||
|
||||
event DelegateUpdated(uint64 indexed idxDelegate);
|
||||
|
||||
/// @notice Creates a Project Admin with the `msg.sender` as the Admin addr
|
||||
/// @param name The name used to identify the Project
|
||||
/// @param url The link to the Project's profile often an IPFS hash
|
||||
/// @param projectAdmin The address for the trusted project manager
|
||||
/// @param parentProject The Admin id number for the parent Campaign or 0 if
|
||||
/// there is no parentProject
|
||||
/// @param commitTime Sets the length of time in seconds the Project has to
|
||||
/// veto when the Project delegates to another Delegate and they pledge
|
||||
/// those funds to a project
|
||||
/// @param plugin This is Project's liquid pledge plugin allowing for
|
||||
/// extended functionality
|
||||
/// @return idProject The id number used to reference this Admin
|
||||
function addProject(
|
||||
string name,
|
||||
string url,
|
||||
address projectAdmin,
|
||||
uint64 parentProject,
|
||||
uint64 commitTime,
|
||||
ILiquidPledgingPlugin plugin
|
||||
) returns (uint64 idProject) {
|
||||
require(isValidPlugin(plugin));
|
||||
|
||||
if (parentProject != 0) {
|
||||
PledgeAdmin storage pa = findAdmin(parentProject);
|
||||
require(pa.adminType == PledgeAdminType.Project);
|
||||
require(getProjectLevel(pa) < MAX_SUBPROJECT_LEVEL);
|
||||
}
|
||||
|
||||
idProject = uint64(admins.length);
|
||||
|
||||
admins.push(PledgeAdmin(
|
||||
PledgeAdminType.Project,
|
||||
projectAdmin,
|
||||
name,
|
||||
url,
|
||||
commitTime,
|
||||
parentProject,
|
||||
false,
|
||||
plugin));
|
||||
|
||||
|
||||
ProjectAdded(idProject);
|
||||
}
|
||||
|
||||
event ProjectAdded(uint64 indexed idProject);
|
||||
|
||||
|
||||
/// @notice Updates a Project's info to change the address, name, url, or
|
||||
/// commitTime, it cannot be used to change a plugin or a parentProject,
|
||||
/// and it must be called by the current address of the Project
|
||||
/// @param idProject The Admin id number used to specify the Project
|
||||
/// @param newAddr The new address that represents this Project
|
||||
/// @param newName The new name used to identify the Project
|
||||
/// @param newUrl The new link to the Project's profile often an IPFS hash
|
||||
/// @param newCommitTime Sets the length of time in seconds the Project has
|
||||
/// to veto when the Project delegates to a Delegate and they pledge those
|
||||
/// funds to a project
|
||||
function updateProject(
|
||||
uint64 idProject,
|
||||
address newAddr,
|
||||
string newName,
|
||||
string newUrl,
|
||||
uint64 newCommitTime)
|
||||
{
|
||||
PledgeAdmin storage project = findAdmin(idProject);
|
||||
require(project.adminType == PledgeAdminType.Project);
|
||||
require(project.addr == msg.sender);
|
||||
project.addr = newAddr;
|
||||
project.name = newName;
|
||||
project.url = newUrl;
|
||||
project.commitTime = newCommitTime;
|
||||
ProjectUpdated(idProject);
|
||||
}
|
||||
|
||||
event ProjectUpdated(uint64 indexed idAdmin);
|
||||
|
||||
|
||||
//////////
|
||||
// Public constant functions
|
||||
//////////
|
||||
|
||||
/// @notice A constant getter that returns the total number of pledges
|
||||
/// @return The total number of Pledges in the system
|
||||
function numberOfPledges() constant returns (uint) {
|
||||
return pledges.length - 1;
|
||||
}
|
||||
|
||||
/// @notice A getter that returns the details of the specified pledge
|
||||
/// @param idPledge the id number of the pledge being queried
|
||||
/// @return the amount, owner, the number of delegates (but not the actual
|
||||
/// delegates, the intendedProject (if any), the current commit time and
|
||||
/// the previous pledge this pledge was derived from
|
||||
function getPledge(uint64 idPledge) constant returns(
|
||||
uint amount,
|
||||
uint64 owner,
|
||||
uint64 nDelegates,
|
||||
uint64 intendedProject,
|
||||
uint64 commitTime,
|
||||
uint64 oldPledge,
|
||||
PaymentState paymentState
|
||||
) {
|
||||
Pledge storage n = findPledge(idPledge);
|
||||
amount = n.amount;
|
||||
owner = n.owner;
|
||||
nDelegates = uint64(n.delegationChain.length);
|
||||
intendedProject = n.intendedProject;
|
||||
commitTime = n.commitTime;
|
||||
oldPledge = n.oldPledge;
|
||||
paymentState = n.paymentState;
|
||||
}
|
||||
|
||||
/// @notice Getter to find Delegate w/ the Pledge ID & the Delegate index
|
||||
/// @param idPledge The id number representing the pledge being queried
|
||||
/// @param idxDelegate The index number for the delegate in this Pledge
|
||||
function getPledgeDelegate(uint64 idPledge, uint idxDelegate) constant returns(
|
||||
uint64 idDelegate,
|
||||
address addr,
|
||||
string name
|
||||
) {
|
||||
Pledge storage n = findPledge(idPledge);
|
||||
idDelegate = n.delegationChain[idxDelegate - 1];
|
||||
PledgeAdmin storage delegate = findAdmin(idDelegate);
|
||||
addr = delegate.addr;
|
||||
name = delegate.name;
|
||||
}
|
||||
|
||||
/// @notice A constant getter used to check how many total Admins exist
|
||||
/// @return The total number of admins (Givers, Delegates and Projects) .
|
||||
function numberOfPledgeAdmins() constant returns(uint) {
|
||||
return admins.length - 1;
|
||||
}
|
||||
|
||||
/// @notice A constant getter to check the details of a specified Admin
|
||||
/// @return addr Account or contract address for admin
|
||||
/// @return name Name of the pledgeAdmin
|
||||
/// @return url The link to the Project's profile often an IPFS hash
|
||||
/// @return commitTime The length of time in seconds the Admin has to veto
|
||||
/// when the Admin delegates to a Delegate and that Delegate pledges those
|
||||
/// funds to a project
|
||||
/// @return parentProject The Admin id number for the parent Campaign or 0
|
||||
/// if there is no parentProject
|
||||
/// @return canceled 0 for Delegates & Givers, true if a Project has been
|
||||
/// canceled
|
||||
/// @return plugin This is Project's liquidPledging plugin allowing for
|
||||
/// extended functionality
|
||||
function getPledgeAdmin(uint64 idAdmin) constant returns (
|
||||
PledgeAdminType adminType,
|
||||
address addr,
|
||||
string name,
|
||||
string url,
|
||||
uint64 commitTime,
|
||||
uint64 parentProject,
|
||||
bool canceled,
|
||||
address plugin)
|
||||
{
|
||||
PledgeAdmin storage m = findAdmin(idAdmin);
|
||||
adminType = m.adminType;
|
||||
addr = m.addr;
|
||||
name = m.name;
|
||||
url = m.url;
|
||||
commitTime = m.commitTime;
|
||||
parentProject = m.parentProject;
|
||||
canceled = m.canceled;
|
||||
plugin = address(m.plugin);
|
||||
}
|
||||
|
||||
////////
|
||||
// Private methods
|
||||
///////
|
||||
|
||||
/// @notice This creates a Pledge with an initial amount of 0 if one is not
|
||||
/// created already; otherwise it finds the pledge with the specified
|
||||
/// attributes; all pledges technically exist, if the pledge hasn't been
|
||||
/// created in this system yet it simply isn't in the hash array
|
||||
/// hPledge2idx[] yet
|
||||
/// @param owner The owner of the pledge being looked up
|
||||
/// @param delegationChain The list of delegates in order of authority
|
||||
/// @param intendedProject The project this pledge will Fund after the
|
||||
/// commitTime has passed
|
||||
/// @param commitTime The length of time in seconds the Giver has to
|
||||
/// veto when the Giver's delegates Pledge funds to a project
|
||||
/// @param oldPledge This value is used to store the pledge the current
|
||||
/// pledge was came from, and in the case a Project is canceled, the Pledge
|
||||
/// will revert back to it's previous state
|
||||
/// @param paid The payment state: Pledged, Paying, or Paid
|
||||
/// @return The hPledge2idx index number
|
||||
function findOrCreatePledge(
|
||||
uint64 owner,
|
||||
uint64[] delegationChain,
|
||||
uint64 intendedProject,
|
||||
uint64 commitTime,
|
||||
uint64 oldPledge,
|
||||
PaymentState paid
|
||||
) internal returns (uint64)
|
||||
{
|
||||
bytes32 hPledge = sha3(
|
||||
owner, delegationChain, intendedProject, commitTime, oldPledge, paid);
|
||||
uint64 idx = hPledge2idx[hPledge];
|
||||
if (idx > 0) return idx;
|
||||
idx = uint64(pledges.length);
|
||||
hPledge2idx[hPledge] = idx;
|
||||
pledges.push(Pledge(
|
||||
0, owner, delegationChain, intendedProject, commitTime, oldPledge, paid));
|
||||
return idx;
|
||||
}
|
||||
|
||||
/// @notice A getter to look up a Admin's details
|
||||
/// @param idAdmin The id for the Admin to lookup
|
||||
/// @return The PledgeAdmin struct for the specified Admin
|
||||
function findAdmin(uint64 idAdmin) internal returns (PledgeAdmin storage) {
|
||||
require(idAdmin < admins.length);
|
||||
return admins[idAdmin];
|
||||
}
|
||||
|
||||
/// @notice A getter to look up a Pledge's details
|
||||
/// @param idPledge The id for the Pledge to lookup
|
||||
/// @return The PledgeA struct for the specified Pledge
|
||||
function findPledge(uint64 idPledge) internal returns (Pledge storage) {
|
||||
require(idPledge < pledges.length);
|
||||
return pledges[idPledge];
|
||||
}
|
||||
|
||||
// a constant for when a delegate is requested that is not in the system
|
||||
uint64 constant NOTFOUND = 0xFFFFFFFFFFFFFFFF;
|
||||
|
||||
/// @notice A getter that searches the delegationChain for the level of
|
||||
/// authority a specific delegate has within a Pledge
|
||||
/// @param n The Pledge that will be searched
|
||||
/// @param idxDelegate The specified delegate that's searched for
|
||||
/// @return How many Delegates have more authority than the specified
|
||||
/// delegate; if the delegate is not in the delegationChain it will return
|
||||
/// `0xFFFFFFFFFFFFFFFF`
|
||||
function getDelegateIdx(Pledge n, uint64 idxDelegate) internal returns(uint64) {
|
||||
for (uint i=0; i<n.delegationChain.length; i++) {
|
||||
if (n.delegationChain[i] == idxDelegate) return uint64(i);
|
||||
}
|
||||
return NOTFOUND;
|
||||
}
|
||||
|
||||
/// @notice A getter to find how many old "parent" pledges a specific Pledge
|
||||
/// had using a self-referential loop
|
||||
/// @param n The Pledge being queried
|
||||
/// @return The number of old "parent" pledges a specific Pledge had
|
||||
function getPledgeLevel(Pledge n) internal returns(uint) {
|
||||
if (n.oldPledge == 0) return 0;
|
||||
Pledge storage oldN = findPledge(n.oldPledge);
|
||||
return getPledgeLevel(oldN) + 1; // a loop lookup
|
||||
}
|
||||
|
||||
/// @notice A getter to find the longest commitTime out of the owner and all
|
||||
/// the delegates for a specified pledge
|
||||
/// @param n The Pledge being queried
|
||||
/// @return The maximum commitTime out of the owner and all the delegates
|
||||
function maxCommitTime(Pledge n) internal returns(uint commitTime) {
|
||||
PledgeAdmin storage m = findAdmin(n.owner);
|
||||
commitTime = m.commitTime; // start with the owner's commitTime
|
||||
|
||||
for (uint i=0; i<n.delegationChain.length; i++) {
|
||||
m = findAdmin(n.delegationChain[i]);
|
||||
|
||||
// If a delegate's commitTime is longer, make it the new commitTime
|
||||
if (m.commitTime > commitTime) commitTime = m.commitTime;
|
||||
}
|
||||
}
|
||||
|
||||
/// @notice A getter to find the level of authority a specific Project has
|
||||
/// using a self-referential loop
|
||||
/// @param m The Project being queried
|
||||
/// @return The level of authority a specific Project has
|
||||
function getProjectLevel(PledgeAdmin m) internal returns(uint) {
|
||||
assert(m.adminType == PledgeAdminType.Project);
|
||||
if (m.parentProject == 0) return(1);
|
||||
PledgeAdmin storage parentNM = findAdmin(m.parentProject);
|
||||
return getProjectLevel(parentNM);
|
||||
}
|
||||
|
||||
/// @notice A getter to find if a specified Project has been canceled
|
||||
/// @param projectId The Admin id number used to specify the Project
|
||||
/// @return True if the Project has been canceled
|
||||
function isProjectCanceled(uint64 projectId) constant returns (bool) {
|
||||
PledgeAdmin storage m = findAdmin(projectId);
|
||||
if (m.adminType == PledgeAdminType.Giver) return false;
|
||||
assert(m.adminType == PledgeAdminType.Project);
|
||||
if (m.canceled) return true;
|
||||
if (m.parentProject == 0) return false;
|
||||
return isProjectCanceled(m.parentProject);
|
||||
}
|
||||
|
||||
/// @notice A getter to find the oldest pledge that hasn't been canceled
|
||||
/// @param idPledge The starting place to lookup the pledges
|
||||
/// @return The oldest idPledge that hasn't been canceled (DUH!)
|
||||
function getOldestPledgeNotCanceled(uint64 idPledge
|
||||
) internal constant returns(uint64) {
|
||||
if (idPledge == 0) return 0;
|
||||
Pledge storage n = findPledge(idPledge);
|
||||
PledgeAdmin storage admin = findAdmin(n.owner);
|
||||
if (admin.adminType == PledgeAdminType.Giver) return idPledge;
|
||||
|
||||
assert(admin.adminType == PledgeAdminType.Project);
|
||||
|
||||
if (!isProjectCanceled(n.owner)) return idPledge;
|
||||
|
||||
return getOldestPledgeNotCanceled(n.oldPledge);
|
||||
}
|
||||
|
||||
/// @notice A check to see if the msg.sender is the owner or the
|
||||
/// plugin contract for a specific Admin
|
||||
/// @param m The Admin being checked
|
||||
function checkAdminOwner(PledgeAdmin m) internal constant {
|
||||
require((msg.sender == m.addr) || (msg.sender == address(m.plugin)));
|
||||
}
|
||||
///////////////////////////
|
||||
// Plugin Whitelist Methods
|
||||
///////////////////////////
|
||||
|
||||
function addValidPlugin(bytes32 contractHash) external onlyOwner {
|
||||
pluginWhitelist[contractHash] = true;
|
||||
}
|
||||
|
||||
function removeValidPlugin(bytes32 contractHash) external onlyOwner {
|
||||
pluginWhitelist[contractHash] = false;
|
||||
}
|
||||
|
||||
function useWhitelist(bool useWhitelist) external onlyOwner {
|
||||
usePluginWhitelist = useWhitelist;
|
||||
}
|
||||
|
||||
function isValidPlugin(address addr) public returns(bool) {
|
||||
if (!usePluginWhitelist || addr == 0x0) return true;
|
||||
|
||||
bytes32 contractHash = getCodeHash(addr);
|
||||
|
||||
return pluginWhitelist[contractHash];
|
||||
}
|
||||
|
||||
function getCodeHash(address addr) public returns(bytes32) {
|
||||
bytes memory o_code;
|
||||
assembly {
|
||||
// retrieve the size of the code, this needs assembly
|
||||
let size := extcodesize(addr)
|
||||
// allocate output byte array - this could also be done without assembly
|
||||
// by using o_code = new bytes(size)
|
||||
o_code := mload(0x40)
|
||||
// new "memory end" including padding
|
||||
mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
|
||||
// store length in memory
|
||||
mstore(o_code, size)
|
||||
// actually retrieve the code, this needs assembly
|
||||
extcodecopy(addr, add(o_code, 0x20), 0, size)
|
||||
}
|
||||
return keccak256(o_code);
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +0,0 @@
|
|||
/* This is an autogenerated file. DO NOT EDIT MANUALLY */
|
||||
|
||||
exports.OwnedAbi = [{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
|
||||
exports.OwnedByteCode = "0x6060604052341561000f57600080fd5b60008054600160a060020a033316600160a060020a03199091161790556101bc8061003b6000396000f3006060604052600436106100615763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166379ba509781146100665780638da5cb5b1461007b578063a6f9dae1146100aa578063d4ee1d90146100c9575b600080fd5b341561007157600080fd5b6100796100dc565b005b341561008657600080fd5b61008e610128565b604051600160a060020a03909116815260200160405180910390f35b34156100b557600080fd5b610079600160a060020a0360043516610137565b34156100d457600080fd5b61008e610181565b60015433600160a060020a039081169116146100f757600080fd5b6001546000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600054600160a060020a031681565b60005433600160a060020a0390811691161461015257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a0316815600a165627a7a7230582093915e2078cf23efe265b372c026c6cbc79ddd13f04e6e31d52efe53c70380790029"
|
||||
exports.OwnedRuntimeByteCode = "0x6060604052600436106100615763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166379ba509781146100665780638da5cb5b1461007b578063a6f9dae1146100aa578063d4ee1d90146100c9575b600080fd5b341561007157600080fd5b6100796100dc565b005b341561008657600080fd5b61008e610128565b604051600160a060020a03909116815260200160405180910390f35b34156100b557600080fd5b610079600160a060020a0360043516610137565b34156100d457600080fd5b61008e610181565b60015433600160a060020a039081169116146100f757600080fd5b6001546000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600054600160a060020a031681565b60005433600160a060020a0390811691161461015257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600160a060020a0316815600a165627a7a7230582093915e2078cf23efe265b372c026c6cbc79ddd13f04e6e31d52efe53c70380790029"
|
||||
exports._solcVersion = "0.4.18+commit.9cf6e910.Emscripten.clang"
|
||||
exports._sha256 = "0xf61824cbb7f4765beceba9899e284825b9c60abba4179558d6b40e6976076b6b"
|
|
@ -1,42 +0,0 @@
|
|||
|
||||
//File: ./contracts/Owned.sol
|
||||
pragma solidity ^0.4.11;
|
||||
|
||||
|
||||
/// @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 account deploying the contract to be
|
||||
/// the `owner`
|
||||
function Owned() {
|
||||
owner = msg.sender;
|
||||
}
|
||||
|
||||
address public newOwner;
|
||||
|
||||
/// @notice `owner` can step down and assign some other address to this role
|
||||
/// but after this function is called the current owner still has ownership
|
||||
/// powers in this contract; change of ownership is a 2 step process
|
||||
/// @param _newOwner The address of the new owner. A simple contract with
|
||||
/// the ability to accept ownership but the inability to do anything else
|
||||
/// can be used to create an unowned contract to achieve decentralization
|
||||
function changeOwner(address _newOwner) onlyOwner {
|
||||
newOwner = _newOwner;
|
||||
}
|
||||
|
||||
/// @notice `newOwner` can accept ownership over this contract
|
||||
function acceptOwnership() {
|
||||
require(msg.sender == newOwner);
|
||||
owner = newOwner;
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -12,7 +12,7 @@
|
|||
"sol-compile": "solcpiler -i './contracts/**/*.sol'",
|
||||
"js-compile": "babel -d lib/ js/",
|
||||
"build": "npm run sol-compile; npm run js-compile",
|
||||
"prepublish": "npm run js-compile"
|
||||
"prepublish": "npm run build"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
Loading…
Reference in New Issue