ethereum 0.4.42 → 0.4.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/contracts/AccountingLib.sol +112 -0
- data/contracts/Testing.sol +59 -0
- data/lib/ethereum.rb +2 -0
- data/lib/ethereum/contract.rb +6 -4
- data/lib/ethereum/contract_initializer.rb +39 -0
- data/lib/ethereum/project_initializer.rb +22 -0
- data/lib/ethereum/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce81f0ccd33fa2df00f5fba597d86078e2741ad9
|
4
|
+
data.tar.gz: 172e0bc070a39588a23e2eca4297f50bebc49cfc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63056e204033d1a0606a685ea5097200527fddb3529c592626e2cd2bf70c050d1cc4619c7cf55988783d8fe50d7dea97ff2b55d329eb6ea47c1f50decf6726f4
|
7
|
+
data.tar.gz: 77646073740221587848ba6ea950bb651c1a6c0f847bf3901a26e2548813e323a97093b7e2862403f27c21a00535c754177cbfde129c19c91f7ee6ecbd4dc35c
|
@@ -0,0 +1,112 @@
|
|
1
|
+
// Accounting v0.1
|
2
|
+
|
3
|
+
/// @title Accounting Lib - Accounting utilities
|
4
|
+
/// @author Piper Merriam - <pipermerriam@gmail.com>
|
5
|
+
library AccountingLib {
|
6
|
+
struct Bank {
|
7
|
+
mapping (address => uint) accountBalances;
|
8
|
+
}
|
9
|
+
|
10
|
+
/// @dev Low level method for adding funds to an account. Protects against overflow.
|
11
|
+
/// @param self The Bank instance to operate on.
|
12
|
+
/// @param accountAddress The address of the account the funds should be added to.
|
13
|
+
/// @param value The amount that should be added to the account.
|
14
|
+
function addFunds(Bank storage self, address accountAddress, uint value) public {
|
15
|
+
/*
|
16
|
+
* Helper function that should be used for any addition of
|
17
|
+
* account funds. It has error checking to prevent
|
18
|
+
* overflowing the account balance.
|
19
|
+
*/
|
20
|
+
if (self.accountBalances[accountAddress] + value < self.accountBalances[accountAddress]) {
|
21
|
+
// Prevent Overflow.
|
22
|
+
throw;
|
23
|
+
}
|
24
|
+
self.accountBalances[accountAddress] += value;
|
25
|
+
}
|
26
|
+
|
27
|
+
event _Deposit(address indexed _from, address indexed accountAddress, uint value);
|
28
|
+
|
29
|
+
/// @dev Function wrapper around the _Deposit event so that it can be used by contracts. Can be used to log a deposit to an account.
|
30
|
+
/// @param _from The address that deposited the funds.
|
31
|
+
/// @param accountAddress The address of the account the funds were added to.
|
32
|
+
/// @param value The amount that was added to the account.
|
33
|
+
function Deposit(address _from, address accountAddress, uint value) public {
|
34
|
+
_Deposit(_from, accountAddress, value);
|
35
|
+
}
|
36
|
+
|
37
|
+
/// @dev Safe function for depositing funds. Returns boolean for whether the deposit was successful
|
38
|
+
/// @param self The Bank instance to operate on.
|
39
|
+
/// @param accountAddress The address of the account the funds should be added to.
|
40
|
+
/// @param value The amount that should be added to the account.
|
41
|
+
function deposit(Bank storage self, address accountAddress, uint value) public returns (bool) {
|
42
|
+
/*
|
43
|
+
* Public API for depositing funds in a specified account.
|
44
|
+
*/
|
45
|
+
if (self.accountBalances[accountAddress] + value < self.accountBalances[accountAddress]) {
|
46
|
+
return false;
|
47
|
+
}
|
48
|
+
addFunds(self, accountAddress, value);
|
49
|
+
return true;
|
50
|
+
}
|
51
|
+
|
52
|
+
event _Withdrawal(address indexed accountAddress, uint value);
|
53
|
+
|
54
|
+
/// @dev Function wrapper around the _Withdrawal event so that it can be used by contracts. Can be used to log a withdrawl from an account.
|
55
|
+
/// @param accountAddress The address of the account the funds were withdrawn from.
|
56
|
+
/// @param value The amount that was withdrawn to the account.
|
57
|
+
function Withdrawal(address accountAddress, uint value) public {
|
58
|
+
_Withdrawal(accountAddress, value);
|
59
|
+
}
|
60
|
+
|
61
|
+
event _InsufficientFunds(address indexed accountAddress, uint value, uint balance);
|
62
|
+
|
63
|
+
/// @dev Function wrapper around the _InsufficientFunds event so that it can be used by contracts. Can be used to log a failed withdrawl from an account.
|
64
|
+
/// @param accountAddress The address of the account the funds were to be withdrawn from.
|
65
|
+
/// @param value The amount that was attempted to be withdrawn from the account.
|
66
|
+
/// @param balance The current balance of the account.
|
67
|
+
function InsufficientFunds(address accountAddress, uint value, uint balance) public {
|
68
|
+
_InsufficientFunds(accountAddress, value, balance);
|
69
|
+
}
|
70
|
+
|
71
|
+
/// @dev Low level method for removing funds from an account. Protects against underflow.
|
72
|
+
/// @param self The Bank instance to operate on.
|
73
|
+
/// @param accountAddress The address of the account the funds should be deducted from.
|
74
|
+
/// @param value The amount that should be deducted from the account.
|
75
|
+
function deductFunds(Bank storage self, address accountAddress, uint value) public {
|
76
|
+
/*
|
77
|
+
* Helper function that should be used for any reduction of
|
78
|
+
* account funds. It has error checking to prevent
|
79
|
+
* underflowing the account balance which would be REALLY bad.
|
80
|
+
*/
|
81
|
+
if (value > self.accountBalances[accountAddress]) {
|
82
|
+
// Prevent Underflow.
|
83
|
+
throw;
|
84
|
+
}
|
85
|
+
self.accountBalances[accountAddress] -= value;
|
86
|
+
}
|
87
|
+
|
88
|
+
/// @dev Safe function for withdrawing funds. Returns boolean for whether the deposit was successful as well as sending the amount in ether to the account address.
|
89
|
+
/// @param self The Bank instance to operate on.
|
90
|
+
/// @param accountAddress The address of the account the funds should be withdrawn from.
|
91
|
+
/// @param value The amount that should be withdrawn from the account.
|
92
|
+
function withdraw(Bank storage self, address accountAddress, uint value) public returns (bool) {
|
93
|
+
/*
|
94
|
+
* Public API for withdrawing funds.
|
95
|
+
*/
|
96
|
+
if (self.accountBalances[accountAddress] >= value) {
|
97
|
+
deductFunds(self, accountAddress, value);
|
98
|
+
if (!accountAddress.send(value)) {
|
99
|
+
// Potentially sending money to a contract that
|
100
|
+
// has a fallback function. So instead, try
|
101
|
+
// tranferring the funds with the call api.
|
102
|
+
if (!accountAddress.call.value(value)()) {
|
103
|
+
// Revert the entire transaction. No
|
104
|
+
// need to destroy the funds.
|
105
|
+
//throw;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
return true;
|
109
|
+
}
|
110
|
+
return false;
|
111
|
+
}
|
112
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import "contracts/AccountingLib.sol";
|
2
|
+
|
3
|
+
contract TestAccounting {
|
4
|
+
AccountingLib.Bank bank;
|
5
|
+
/*
|
6
|
+
* Account Management API
|
7
|
+
*/
|
8
|
+
function getAccountBalance(address accountAddress) constant public returns (uint) {
|
9
|
+
return bank.accountBalances[accountAddress];
|
10
|
+
}
|
11
|
+
|
12
|
+
function deposit() public {
|
13
|
+
deposit(msg.sender);
|
14
|
+
}
|
15
|
+
|
16
|
+
function deposit(address accountAddress) public {
|
17
|
+
/*
|
18
|
+
* Public API for depositing funds in a specified account.
|
19
|
+
*/
|
20
|
+
AccountingLib.deposit(bank, accountAddress, msg.value);
|
21
|
+
AccountingLib.Deposit(msg.sender, accountAddress, msg.value);
|
22
|
+
}
|
23
|
+
|
24
|
+
function addFunds(uint value) public {
|
25
|
+
addFunds(msg.sender, value);
|
26
|
+
}
|
27
|
+
|
28
|
+
function addFunds(address accountAddress, uint value) public {
|
29
|
+
AccountingLib.addFunds(bank, accountAddress, value);
|
30
|
+
}
|
31
|
+
|
32
|
+
function withdraw(uint value) public {
|
33
|
+
/*
|
34
|
+
* Public API for withdrawing funds.
|
35
|
+
*/
|
36
|
+
if (AccountingLib.withdraw(bank, msg.sender, value)) {
|
37
|
+
AccountingLib.Withdrawal(msg.sender, value);
|
38
|
+
}
|
39
|
+
else {
|
40
|
+
AccountingLib.InsufficientFunds(msg.sender, value, bank.accountBalances[msg.sender]);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
function deductFunds(uint value) public {
|
45
|
+
deductFunds(msg.sender, value);
|
46
|
+
}
|
47
|
+
|
48
|
+
function deductFunds(address accountAddress, uint value) public {
|
49
|
+
AccountingLib.deductFunds(bank, accountAddress, value);
|
50
|
+
}
|
51
|
+
|
52
|
+
function setAccountBalance(uint value) public {
|
53
|
+
setAccountBalance(msg.sender, value);
|
54
|
+
}
|
55
|
+
|
56
|
+
function setAccountBalance(address accountAddress, uint value) public {
|
57
|
+
bank.accountBalances[accountAddress] = value;
|
58
|
+
}
|
59
|
+
}
|
data/lib/ethereum.rb
CHANGED
data/lib/ethereum/contract.rb
CHANGED
@@ -30,11 +30,13 @@ module Ethereum
|
|
30
30
|
end
|
31
31
|
|
32
32
|
define_method :deploy do |*params|
|
33
|
-
raise "Missing constructor parameter" and return if params.length != constructor_inputs.length
|
34
33
|
formatter = Ethereum::Formatter.new
|
35
|
-
constructor_inputs.
|
36
|
-
|
37
|
-
|
34
|
+
if constructor_inputs.present?
|
35
|
+
raise "Missing constructor parameter" and return if params.length != constructor_inputs.length
|
36
|
+
constructor_inputs.each_index do |i|
|
37
|
+
args = [constructor_inputs[i]["type"], params[i]]
|
38
|
+
code << formatter.to_payload(args)
|
39
|
+
end
|
38
40
|
end
|
39
41
|
deploytx = connection.send_transaction({from: self.sender, gas: 2000000, gasPrice: 60000000000, data: code})["result"]
|
40
42
|
self.instance_variable_set("@deployment", Ethereum::Deployment.new(deploytx, connection))
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Ethereum
|
2
|
+
|
3
|
+
class ContractInitializer
|
4
|
+
|
5
|
+
attr_accessor :abi, :binary, :name, :libraries, :needs_linking
|
6
|
+
|
7
|
+
def initialize(contract_name, contract)
|
8
|
+
@abi = JSON.parse(contract["abi"]) unless contract.nil?
|
9
|
+
@binary = contract["bin"] unless contract.nil?
|
10
|
+
@name = contract_name
|
11
|
+
matchdata = /_+[a-zA-Z]+_+/.match(@binary)
|
12
|
+
@needs_linking = matchdata.present?
|
13
|
+
if @needs_linking
|
14
|
+
@libraries = matchdata.to_a.collect do |libname|
|
15
|
+
{name: libname.gsub(/_+/,''), sigil: libname}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def link_libraries
|
21
|
+
if @needs_linking
|
22
|
+
@libraries.each do |library|
|
23
|
+
ENV['ETHEREUM_DEPLOYER_WAIT_TIME'] ||= "120"
|
24
|
+
wait_time = ENV['ETHEREUM_DEPLOYER_WAIT_TIME'].to_i
|
25
|
+
library_instance = library[:name].constantize.new
|
26
|
+
library_instance.deploy_and_wait(wait_time)
|
27
|
+
@binary.gsub!(library[:sigil], library_instance.address.gsub(/^0x/,''))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def build(connection)
|
33
|
+
contract = Ethereum::Contract.new(@name, @binary, @abi)
|
34
|
+
contract.build(connection)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ethereum
|
2
|
+
|
3
|
+
class ProjectInitializer
|
4
|
+
|
5
|
+
attr_accessor :contract_names, :combined_output, :contracts
|
6
|
+
|
7
|
+
def initialize(location)
|
8
|
+
ENV['ETHEREUM_SOLIDITY_BINARY'] ||= "/usr/local/bin/solc"
|
9
|
+
solidity = ENV['ETHEREUM_SOLIDITY_BINARY']
|
10
|
+
contract_dir = location
|
11
|
+
compile_command = "#{solidity} --combined-json abi,bin #{contract_dir}"
|
12
|
+
raw_data = `#{compile_command}`
|
13
|
+
data = JSON.parse(raw_data)
|
14
|
+
@contract_names = data["contracts"].keys
|
15
|
+
@contracts = @contract_names.collect do |contract_name|
|
16
|
+
ContractInitializer.new(contract_name, data["contracts"][contract_name])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/ethereum/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ethereum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.45
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DigixGlobal Pte Ltd (https://dgx.io)
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,11 +114,14 @@ files:
|
|
114
114
|
- Rakefile
|
115
115
|
- bin/console
|
116
116
|
- bin/setup
|
117
|
+
- contracts/AccountingLib.sol
|
118
|
+
- contracts/Testing.sol
|
117
119
|
- ethereum.gemspec
|
118
120
|
- lib/ethereum.rb
|
119
121
|
- lib/ethereum/client.rb
|
120
122
|
- lib/ethereum/contract.rb
|
121
123
|
- lib/ethereum/contract_event.rb
|
124
|
+
- lib/ethereum/contract_initializer.rb
|
122
125
|
- lib/ethereum/deployment.rb
|
123
126
|
- lib/ethereum/formatter.rb
|
124
127
|
- lib/ethereum/function.rb
|
@@ -127,6 +130,7 @@ files:
|
|
127
130
|
- lib/ethereum/http_client.rb
|
128
131
|
- lib/ethereum/initializer.rb
|
129
132
|
- lib/ethereum/ipc_client.rb
|
133
|
+
- lib/ethereum/project_initializer.rb
|
130
134
|
- lib/ethereum/transaction.rb
|
131
135
|
- lib/ethereum/version.rb
|
132
136
|
homepage: https://github.com/DigixGlobal/ethereum-ruby
|