zold 0.0.3 → 0.0.4
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/.rubocop.yml +1 -0
- data/.simplecov +1 -1
- data/Gemfile +0 -2
- data/README.md +7 -9
- data/Rakefile +9 -3
- data/assets/wallet.xsd +71 -0
- data/bin/zold +63 -56
- data/features/step_definitions/steps.rb +0 -2
- data/features/support/env.rb +0 -2
- data/lib/zold.rb +0 -2
- data/lib/zold/amount.rb +64 -0
- data/lib/zold/commands/create.rb +47 -0
- data/lib/zold/commands/send.rb +2 -3
- data/lib/zold/{commands/init.rb → id.rb} +7 -15
- data/lib/zold/key.rb +2 -4
- data/lib/zold/log.rb +15 -2
- data/lib/zold/version.rb +1 -3
- data/lib/zold/wallet.rb +45 -26
- data/test/commands/{test_init.rb → test_create.rb} +10 -10
- data/test/commands/test_send.rb +7 -7
- data/test/test__helper.rb +0 -2
- data/test/test_amount.rb +45 -0
- data/test/test_id.rb +44 -0
- data/test/test_key.rb +0 -2
- data/test/test_wallet.rb +21 -5
- data/test/test_zold.rb +0 -2
- data/zold.gemspec +8 -9
- metadata +55 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d41d9a57531584dc4084646cd4d211fa55d5e7af
|
4
|
+
data.tar.gz: 50a0a58ed765f7efc239b9dddb870ee89efa6a86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d4576d6471e6c6bd4589ae2221b8f321291528f6e752d3cddf8ca70df135664d94499b7e5332c06053c87423fbbfdf3392e86c578305bb464b09b944db8b393
|
7
|
+
data.tar.gz: 043d5fdeb31a4afe610074c8426303b3378e8a239087c24ed496c0b40bcdd8bccf01ef3225393527404f1795953aed01099eecfab1d45c53e1e37e4725efa50b
|
data/.rubocop.yml
CHANGED
data/.simplecov
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -63,7 +63,7 @@ Or do one of the following:
|
|
63
63
|
* `zold send` creates a new transaction
|
64
64
|
* `zold push` pushes a wallet to the network
|
65
65
|
|
66
|
-
For more options just run:
|
66
|
+
For more options and commands just run:
|
67
67
|
|
68
68
|
```bash
|
69
69
|
$ zold --help
|
@@ -126,23 +126,21 @@ doesn't have the wallet, it tries to find it in the network.
|
|
126
126
|
Then, it calculates and prints the balance to the user.
|
127
127
|
|
128
128
|
**Commit**.
|
129
|
-
The user provides the amount and the destination wallet name.
|
130
|
-
|
131
|
-
|
132
|
-
a new XML element `<txn>` to both wallets.
|
129
|
+
The user provides the amount and the destination wallet name.
|
130
|
+
The client pulls the destination wallet and adds
|
131
|
+
a new XML element `<txn/>` to both wallets.
|
133
132
|
|
134
133
|
**Push**.
|
135
|
-
The client sends two wallets to
|
134
|
+
The client sends two wallets to a random closest node, which checks
|
136
135
|
the validity of the deduction and propagates
|
137
|
-
both wallets to other nodes in a [2PC](https://en.wikipedia.org/wiki/Two-phase_commit_protocol)
|
136
|
+
both wallets to _all_ other nodes in a [2PC](https://en.wikipedia.org/wiki/Two-phase_commit_protocol)
|
138
137
|
manner: acknowledgment first, commit next.
|
139
138
|
If a node receives a wallet that contains transactions that are younger
|
140
139
|
than transactions in its local copy, a merge operation is
|
141
140
|
performed. If the balance after the merge is negative, the push is rejected.
|
142
141
|
|
143
142
|
**Init**.
|
144
|
-
The client creates an empty wallet XML and
|
145
|
-
nodes to generate a new `id` for it.
|
143
|
+
The client creates an empty wallet XML and assigns a random `id` for it.
|
146
144
|
|
147
145
|
**Start**.
|
148
146
|
The node manifests itself to one of the backbone nodes, which
|
data/Rakefile
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -33,7 +31,7 @@ def version
|
|
33
31
|
Gem::Specification.load(Dir['*.gemspec'].first).version
|
34
32
|
end
|
35
33
|
|
36
|
-
task default: %i[clean test features rubocop copyright]
|
34
|
+
task default: %i[clean test features rubocop xcop copyright]
|
37
35
|
|
38
36
|
require 'rake/testtask'
|
39
37
|
desc 'Run all unit tests'
|
@@ -68,6 +66,14 @@ Cucumber::Rake::Task.new(:'features:html') do |t|
|
|
68
66
|
t.profile = 'html_report'
|
69
67
|
end
|
70
68
|
|
69
|
+
require 'xcop/rake_task'
|
70
|
+
desc 'Validate all XML/XSL/XSD/HTML files for formatting'
|
71
|
+
Xcop::RakeTask.new :xcop do |task|
|
72
|
+
task.license = 'LICENSE.txt'
|
73
|
+
task.includes = ['**/*.xml', '**/*.xsl', '**/*.xsd', '**/*.html']
|
74
|
+
task.excludes = ['target/**/*', 'coverage/**/*']
|
75
|
+
end
|
76
|
+
|
71
77
|
task :copyright do
|
72
78
|
sh "grep -q -r '#{Date.today.strftime('%Y')}' \
|
73
79
|
--include '*.rb' \
|
data/assets/wallet.xsd
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!--
|
3
|
+
(The MIT License)
|
4
|
+
|
5
|
+
Copyright (c) 2018 Zerocracy, Inc.
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
of this software and associated documentation files (the 'Software'), to deal
|
9
|
+
in the Software without restriction, including without limitation the rights
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
12
|
+
furnished to do so, subject to the following conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be included in all
|
15
|
+
copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
SOFTWARE.
|
24
|
+
-->
|
25
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
26
|
+
<xs:simpleType name="amount">
|
27
|
+
<xs:restriction base="xs:integer">
|
28
|
+
<xs:minInclusive value="-9223372036854775808"/>
|
29
|
+
<xs:maxInclusive value="9223372036854775807"/>
|
30
|
+
</xs:restriction>
|
31
|
+
</xs:simpleType>
|
32
|
+
<xs:simpleType name="wallet">
|
33
|
+
<xs:restriction base="xs:string">
|
34
|
+
<xs:pattern value="[0-9a-f]{16}"/>
|
35
|
+
</xs:restriction>
|
36
|
+
</xs:simpleType>
|
37
|
+
<xs:complexType name="txn">
|
38
|
+
<xs:all>
|
39
|
+
<xs:element name="beneficiary" type="wallet" minOccurs="1" maxOccurs="1"/>
|
40
|
+
<xs:element name="date" type="xs:dateTime" minOccurs="1" maxOccurs="1"/>
|
41
|
+
<xs:element name="sign" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
42
|
+
<xs:element name="amount" type="amount" minOccurs="1" maxOccurs="1"/>
|
43
|
+
</xs:all>
|
44
|
+
<xs:attribute name="id" use="required">
|
45
|
+
<xs:simpleType>
|
46
|
+
<xs:restriction base="xs:string">
|
47
|
+
<xs:pattern value="/?[0-9]+"/>
|
48
|
+
</xs:restriction>
|
49
|
+
</xs:simpleType>
|
50
|
+
</xs:attribute>
|
51
|
+
</xs:complexType>
|
52
|
+
<xs:complexType name="ledger">
|
53
|
+
<xs:sequence>
|
54
|
+
<xs:element name="txn" minOccurs="0" maxOccurs="unbounded"/>
|
55
|
+
</xs:sequence>
|
56
|
+
</xs:complexType>
|
57
|
+
<xs:element name="wallet">
|
58
|
+
<xs:complexType>
|
59
|
+
<xs:all>
|
60
|
+
<xs:element name="id" type="wallet" minOccurs="1" maxOccurs="1"/>
|
61
|
+
<xs:element name="pkey" type="xs:string" minOccurs="1" maxOccurs="1"/>
|
62
|
+
<xs:element name="ledger" type="ledger" minOccurs="1" maxOccurs="1">
|
63
|
+
<xs:unique name="txnUnique">
|
64
|
+
<xs:selector xpath="./txn"/>
|
65
|
+
<xs:field xpath="@id"/>
|
66
|
+
</xs:unique>
|
67
|
+
</xs:element>
|
68
|
+
</xs:all>
|
69
|
+
</xs:complexType>
|
70
|
+
</xs:element>
|
71
|
+
</xs:schema>
|
data/bin/zold
CHANGED
@@ -30,14 +30,21 @@ require_relative '../lib/zold/version'
|
|
30
30
|
require_relative '../lib/zold/wallet'
|
31
31
|
require_relative '../lib/zold/log'
|
32
32
|
require_relative '../lib/zold/key'
|
33
|
-
require_relative '../lib/zold/
|
33
|
+
require_relative '../lib/zold/amount'
|
34
|
+
require_relative '../lib/zold/commands/create'
|
34
35
|
require_relative '../lib/zold/commands/send'
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
Encoding.default_external = Encoding::UTF_8
|
38
|
+
Encoding.default_internal = Encoding::UTF_8
|
39
|
+
|
40
|
+
log = Zold::Log.new
|
41
|
+
|
42
|
+
begin
|
43
|
+
opts = Slop.parse(ARGV, strict: true, help: true) do |o|
|
44
|
+
o.banner = "Usage: zold [options] command [arguments]
|
38
45
|
Available commands:
|
39
|
-
#{Rainbow('
|
40
|
-
Creates a new wallet with
|
46
|
+
#{Rainbow('create').green}
|
47
|
+
Creates a new wallet with a random ID
|
41
48
|
#{Rainbow('pull').green} [id...]
|
42
49
|
Pulls all local wallets and new ones explicitly required
|
43
50
|
#{Rainbow('send').green} source target amount
|
@@ -45,61 +52,61 @@ Available commands:
|
|
45
52
|
#{Rainbow('push').green} [id...]
|
46
53
|
Push all local wallets or the ones required
|
47
54
|
Available options:"
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
o.string '-d', '--dir',
|
56
|
+
'The directory where wallets are stored (default: current directory)',
|
57
|
+
default: '.'
|
58
|
+
o.string '-p', '--private-key',
|
59
|
+
'The location of RSA private key (default: ~/.ssh/id_rsa)',
|
60
|
+
default: '~/.ssh/id_rsa'
|
61
|
+
o.string '-u', '--public-key',
|
62
|
+
'The location of RSA public key (default: ~/.ssh/id_rsa.pub)',
|
63
|
+
default: '~/.ssh/id_rsa.pub'
|
64
|
+
o.bool '-h', '--help', 'Show these instructions'
|
65
|
+
o.bool '--trace', 'Show full stack trace in case of a problem'
|
66
|
+
o.on '-v', '--version', 'Show current version' do
|
67
|
+
puts Zold::VERSION
|
68
|
+
exit
|
69
|
+
end
|
61
70
|
end
|
62
|
-
end
|
63
71
|
|
64
|
-
|
72
|
+
if opts.help?
|
73
|
+
log.info(opts.to_s)
|
74
|
+
exit
|
75
|
+
end
|
65
76
|
|
66
|
-
if opts.
|
67
|
-
log.info(opts.to_s)
|
68
|
-
exit
|
69
|
-
end
|
77
|
+
raise 'Command is required' if opts.arguments.empty?
|
70
78
|
|
71
|
-
|
72
|
-
Encoding.default_internal = Encoding::UTF_8
|
73
|
-
|
74
|
-
raise 'Command is required' if opts.arguments.empty?
|
79
|
+
command = opts.arguments[0]
|
75
80
|
|
76
|
-
command
|
81
|
+
case command
|
82
|
+
when 'create'
|
83
|
+
Zold::Create.new(
|
84
|
+
dir: opts['dir'],
|
85
|
+
pubkey: Zold::Key.new(opts['public-key']),
|
86
|
+
log: log
|
87
|
+
).run
|
88
|
+
when 'send'
|
89
|
+
Zold::Send.new(
|
90
|
+
payer: Zold::Wallet.new(
|
91
|
+
File.join(opts['dir'], "#{opts.arguments[1]}.xml")
|
92
|
+
),
|
93
|
+
receiver: Zold::Wallet.new(
|
94
|
+
File.join(opts['dir'], "#{opts.arguments[2]}.xml")
|
95
|
+
),
|
96
|
+
amount: Zold::Amount.new(zld: opts.arguments[3].to_f),
|
97
|
+
pvtkey: Zold::Key.new(opts['private-key']),
|
98
|
+
log: log
|
99
|
+
).run
|
100
|
+
when 'pull'
|
101
|
+
raise 'PULL is not implemented yet'
|
102
|
+
when 'push'
|
103
|
+
raise 'PUSH is not implemented yet'
|
104
|
+
else
|
105
|
+
raise "Command '#{command}' is not supported"
|
106
|
+
end
|
77
107
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
wallet: Zold::Wallet.new(File.join(opts['dir'], "#{id}.xml")),
|
83
|
-
id: id,
|
84
|
-
pubkey: Zold::Key.new(opts['public-key']),
|
85
|
-
log: log
|
86
|
-
).run
|
87
|
-
when 'send'
|
88
|
-
Zold::Send.new(
|
89
|
-
payer: Zold::Wallet.new(
|
90
|
-
File.join(opts['dir'], "#{opts.arguments[1]}.xml")
|
91
|
-
),
|
92
|
-
receiver: Zold::Wallet.new(
|
93
|
-
File.join(opts['dir'], "#{opts.arguments[2]}.xml")
|
94
|
-
),
|
95
|
-
amount: opts.arguments[3].to_f * 2 ** 24,
|
96
|
-
pvtkey: Zold::Key.new(opts['private-key']),
|
97
|
-
log: log
|
98
|
-
).run
|
99
|
-
when 'pull'
|
100
|
-
raise 'PULL is not implemented yet'
|
101
|
-
when 'push'
|
102
|
-
raise 'PUSH is not implemented yet'
|
103
|
-
else
|
104
|
-
raise "Command '#{command}' is not supported"
|
108
|
+
rescue StandardError => ex
|
109
|
+
log.error(ex.message)
|
110
|
+
puts ex.backtrace if opts['trace']
|
111
|
+
exit -1
|
105
112
|
end
|
data/features/support/env.rb
CHANGED
data/lib/zold.rb
CHANGED
data/lib/zold/amount.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Copyright (c) 2018 Zerocracy, Inc.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
# The amount.
|
22
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
23
|
+
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
24
|
+
# License:: MIT
|
25
|
+
module Zold
|
26
|
+
# Amount
|
27
|
+
class Amount
|
28
|
+
def initialize(coins: nil, zld: nil)
|
29
|
+
raise 'You can\'t specify both coints and zld' if !coins.nil? && !zld.nil?
|
30
|
+
@coins = coins unless coins.nil?
|
31
|
+
@coins = (zld * 2**24).to_i unless zld.nil?
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_i
|
35
|
+
@coins
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_zld
|
39
|
+
format('%0.2f', @coins.to_f / 2**24)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
"#{to_zld}ZLD"
|
44
|
+
end
|
45
|
+
|
46
|
+
def ==(other)
|
47
|
+
@coins == other.to_i
|
48
|
+
end
|
49
|
+
|
50
|
+
def zero?
|
51
|
+
@coins.zero?
|
52
|
+
end
|
53
|
+
|
54
|
+
def negative?
|
55
|
+
@coins < 0
|
56
|
+
end
|
57
|
+
|
58
|
+
def mul(m)
|
59
|
+
c = @coins * m
|
60
|
+
raise "Overflow, can't multiply #{@coins} by #{m}" if c > 2**63
|
61
|
+
Amount.new(coins: c)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Copyright (c) 2018 Zerocracy, Inc.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require_relative '../wallet.rb'
|
22
|
+
require_relative '../log.rb'
|
23
|
+
require_relative '../id.rb'
|
24
|
+
|
25
|
+
# CREATE command.
|
26
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
27
|
+
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
28
|
+
# License:: MIT
|
29
|
+
module Zold
|
30
|
+
# Create command
|
31
|
+
class Create
|
32
|
+
def initialize(dir:, pubkey:, log: Log::Quiet.new)
|
33
|
+
@dir = dir
|
34
|
+
@pubkey = pubkey
|
35
|
+
@log = log
|
36
|
+
end
|
37
|
+
|
38
|
+
def run
|
39
|
+
id = Id.new
|
40
|
+
file = File.join(@dir, "#{id}.xml")
|
41
|
+
wallet = Wallet.new(file)
|
42
|
+
wallet.init(id, @pubkey)
|
43
|
+
@log.info("#{wallet} created at #{file}")
|
44
|
+
wallet
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/zold/commands/send.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -29,7 +27,7 @@ require_relative '../log.rb'
|
|
29
27
|
module Zold
|
30
28
|
# Money sending command
|
31
29
|
class Send
|
32
|
-
def initialize(payer:, receiver:, amount:, pvtkey:, log: Log.new)
|
30
|
+
def initialize(payer:, receiver:, amount:, pvtkey:, log: Log::Quiet.new)
|
33
31
|
@payer = payer
|
34
32
|
@receiver = receiver
|
35
33
|
@amount = amount
|
@@ -38,6 +36,7 @@ module Zold
|
|
38
36
|
end
|
39
37
|
|
40
38
|
def run
|
39
|
+
raise "The amount can't be negative: #{@amount}" if @amount.negative?
|
41
40
|
@receiver.add(@payer.sub(@amount, @receiver.id, @pvtkey))
|
42
41
|
@log.info("#{@amount} sent from #{@payer} to #{@receiver}")
|
43
42
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -20,25 +18,19 @@
|
|
20
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
19
|
# SOFTWARE.
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
# INIT command.
|
21
|
+
# The ID of the wallet.
|
26
22
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
27
23
|
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
28
24
|
# License:: MIT
|
29
25
|
module Zold
|
30
|
-
#
|
31
|
-
class
|
32
|
-
def initialize
|
33
|
-
@
|
34
|
-
@id = id
|
35
|
-
@pubkey = pubkey
|
36
|
-
@log = log
|
26
|
+
# Id of the wallet
|
27
|
+
class Id
|
28
|
+
def initialize
|
29
|
+
@id = rand(2**32..2**64 - 1)
|
37
30
|
end
|
38
31
|
|
39
|
-
def
|
40
|
-
|
41
|
-
@log.info("#{@wallet} initialized as #{@id}")
|
32
|
+
def to_s
|
33
|
+
format('%016x', @id)
|
42
34
|
end
|
43
35
|
end
|
44
36
|
end
|
data/lib/zold/key.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -31,7 +29,7 @@ module Zold
|
|
31
29
|
# A key
|
32
30
|
class Key
|
33
31
|
def initialize(file)
|
34
|
-
@file = file
|
32
|
+
@file = File.expand_path(file)
|
35
33
|
end
|
36
34
|
|
37
35
|
def to_s
|
@@ -46,7 +44,7 @@ module Zold
|
|
46
44
|
|
47
45
|
def rsa
|
48
46
|
raise "Can't find RSA key at #{@file}" unless File.exist?(@file)
|
49
|
-
text = File.read(
|
47
|
+
text = File.read(@file).strip
|
50
48
|
unless text.start_with?('-----BEGIN')
|
51
49
|
text = OpenSSHKeyConverter.decode_pubkey(text.split[1])
|
52
50
|
end
|
data/lib/zold/log.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -32,5 +30,20 @@ module Zold
|
|
32
30
|
def info(msg)
|
33
31
|
puts msg
|
34
32
|
end
|
33
|
+
|
34
|
+
def error(msg)
|
35
|
+
puts "#{Rainbow('ERROR').red}: #{msg}"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Log that doesn't log anything
|
39
|
+
class Quiet
|
40
|
+
def info(msg)
|
41
|
+
# nothing to do here
|
42
|
+
end
|
43
|
+
|
44
|
+
def error(msg)
|
45
|
+
# nothing to do here
|
46
|
+
end
|
47
|
+
end
|
35
48
|
end
|
36
49
|
end
|
data/lib/zold/version.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -25,5 +23,5 @@
|
|
25
23
|
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
26
24
|
# License:: MIT
|
27
25
|
module Zold
|
28
|
-
VERSION = '0.0.
|
26
|
+
VERSION = '0.0.4'.freeze
|
29
27
|
end
|
data/lib/zold/wallet.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -35,63 +33,84 @@ module Zold
|
|
35
33
|
end
|
36
34
|
|
37
35
|
def to_s
|
38
|
-
|
36
|
+
id
|
39
37
|
end
|
40
38
|
|
41
39
|
def init(id, pubkey)
|
42
40
|
File.write(
|
43
41
|
@file,
|
44
|
-
|
45
|
-
|
46
|
-
xml.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
42
|
+
valid(
|
43
|
+
Nokogiri::XML::Builder.new do |xml|
|
44
|
+
xml.wallet do
|
45
|
+
xml.id_ id.to_s
|
46
|
+
xml.pkey pubkey.to_s
|
47
|
+
xml.ledger {}
|
48
|
+
end
|
49
|
+
end.doc
|
50
|
+
)
|
51
51
|
)
|
52
52
|
end
|
53
53
|
|
54
54
|
def id
|
55
|
-
|
55
|
+
load.xpath('/wallet/id/text()').to_s
|
56
56
|
end
|
57
57
|
|
58
58
|
def balance
|
59
|
-
|
60
|
-
.
|
61
|
-
|
62
|
-
|
59
|
+
Amount.new(
|
60
|
+
coins: load.xpath('/wallet/ledger/txn/amount/text()')
|
61
|
+
.map(&:to_s)
|
62
|
+
.map(&:to_i)
|
63
|
+
.inject(0) { |sum, n| sum + n }
|
64
|
+
)
|
63
65
|
end
|
64
66
|
|
65
67
|
def sub(amount, target, pvtkey)
|
66
68
|
txn = 1
|
67
69
|
date = Time.now.iso8601
|
68
|
-
|
69
|
-
t =
|
70
|
+
xml = load
|
71
|
+
t = xml.xpath('/wallet/ledger')[0].add_child('<txn/>')[0]
|
70
72
|
t['id'] = txn
|
71
73
|
t.add_child('<date/>')[0].content = date
|
72
|
-
t.add_child('<amount/>')[0].content = -amount
|
74
|
+
t.add_child('<amount/>')[0].content = -amount.to_i
|
73
75
|
t.add_child('<beneficiary/>')[0].content = target
|
74
76
|
t.add_child('<sign/>')[0].content = pvtkey.encrypt(
|
75
|
-
"#{date} #{amount} #{target}"
|
77
|
+
"#{id} #{date} #{amount.to_i} #{target}"
|
76
78
|
)
|
77
|
-
|
79
|
+
save(xml)
|
78
80
|
{ id: txn, date: date, amount: amount, beneficiary: id }
|
79
81
|
end
|
80
82
|
|
81
83
|
def add(txn)
|
82
|
-
|
83
|
-
t =
|
84
|
+
xml = load
|
85
|
+
t = xml.xpath('/wallet/ledger')[0].add_child('<txn/>')[0]
|
84
86
|
t['id'] = "/#{txn[:id]}"
|
85
87
|
t.add_child('<date/>')[0].content = txn[:date]
|
86
|
-
t.add_child('<amount/>')[0].content = txn[:amount]
|
88
|
+
t.add_child('<amount/>')[0].content = txn[:amount].to_i
|
87
89
|
t.add_child('<beneficiary/>')[0].content = txn[:beneficiary]
|
88
|
-
|
90
|
+
save(xml).to_s
|
89
91
|
end
|
90
92
|
|
91
93
|
private
|
92
94
|
|
93
|
-
def
|
94
|
-
Nokogiri::XML(File.read(@file))
|
95
|
+
def load
|
96
|
+
valid(Nokogiri::XML(File.read(@file)))
|
97
|
+
end
|
98
|
+
|
99
|
+
def save(xml)
|
100
|
+
File.write(@file, valid(xml).to_s)
|
101
|
+
end
|
102
|
+
|
103
|
+
def valid(xml)
|
104
|
+
xsd = Nokogiri::XML::Schema(File.open('assets/wallet.xsd'))
|
105
|
+
errors = xsd.validate(xml)
|
106
|
+
unless errors.empty?
|
107
|
+
errors.each do |error|
|
108
|
+
puts "#{p} #{error.line}: #{error.message}"
|
109
|
+
end
|
110
|
+
puts xml
|
111
|
+
raise 'XML is not valid'
|
112
|
+
end
|
113
|
+
xml
|
95
114
|
end
|
96
115
|
end
|
97
116
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -24,22 +22,24 @@ require 'minitest/autorun'
|
|
24
22
|
require 'tmpdir'
|
25
23
|
require_relative '../../lib/zold/wallet.rb'
|
26
24
|
require_relative '../../lib/zold/key.rb'
|
27
|
-
require_relative '../../lib/zold/commands/
|
25
|
+
require_relative '../../lib/zold/commands/create.rb'
|
28
26
|
|
29
|
-
#
|
27
|
+
# CREATE test.
|
30
28
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
31
29
|
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
32
30
|
# License:: MIT
|
33
|
-
class
|
34
|
-
def
|
31
|
+
class TestCreate < Minitest::Test
|
32
|
+
def test_creates_wallet
|
35
33
|
Dir.mktmpdir 'test' do |dir|
|
36
|
-
wallet = Zold::
|
37
|
-
|
38
|
-
wallet: wallet,
|
39
|
-
id: 1,
|
34
|
+
wallet = Zold::Create.new(
|
35
|
+
dir: dir,
|
40
36
|
pubkey: Zold::Key.new('fixtures/id_rsa.pub')
|
41
37
|
).run
|
42
38
|
assert wallet.balance.zero?
|
39
|
+
assert(
|
40
|
+
File.exist?(File.join(dir, "#{wallet.id}.xml")),
|
41
|
+
"Wallet file not found: #{wallet.id}.xml"
|
42
|
+
)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
data/test/commands/test_send.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -24,6 +22,7 @@ require 'minitest/autorun'
|
|
24
22
|
require 'tmpdir'
|
25
23
|
require_relative '../../lib/zold/wallet.rb'
|
26
24
|
require_relative '../../lib/zold/key.rb'
|
25
|
+
require_relative '../../lib/zold/id.rb'
|
27
26
|
require_relative '../../lib/zold/commands/send.rb'
|
28
27
|
|
29
28
|
# SEND test.
|
@@ -34,17 +33,18 @@ class TestSend < Minitest::Test
|
|
34
33
|
def test_sends_from_wallet_to_wallet
|
35
34
|
Dir.mktmpdir 'test' do |dir|
|
36
35
|
source = Zold::Wallet.new(File.join(dir, 'source.xml'))
|
37
|
-
source.init(
|
36
|
+
source.init(Zold::Id.new, Zold::Key.new('fixtures/id_rsa.pub'))
|
38
37
|
target = Zold::Wallet.new(File.join(dir, 'target.xml'))
|
39
|
-
target.init(
|
38
|
+
target.init(Zold::Id.new, Zold::Key.new('fixtures/id_rsa.pub'))
|
39
|
+
amount = Zold::Amount.new(zld: 14.95)
|
40
40
|
Zold::Send.new(
|
41
41
|
payer: source,
|
42
42
|
receiver: target,
|
43
|
-
amount:
|
43
|
+
amount: amount,
|
44
44
|
pvtkey: Zold::Key.new('fixtures/id_rsa')
|
45
45
|
).run
|
46
|
-
assert source.balance == -
|
47
|
-
assert target.balance ==
|
46
|
+
assert source.balance == amount.mul(-1)
|
47
|
+
assert target.balance == amount
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
data/test/test__helper.rb
CHANGED
data/test/test_amount.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# Copyright (c) 2018 Zerocracy, Inc.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'minitest/autorun'
|
22
|
+
require 'tmpdir'
|
23
|
+
require_relative '../lib/zold/amount.rb'
|
24
|
+
|
25
|
+
# Amount test.
|
26
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
27
|
+
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
28
|
+
# License:: MIT
|
29
|
+
class TestAmount < Minitest::Test
|
30
|
+
def test_parses_zld
|
31
|
+
amount = Zold::Amount.new(zld: 14.95)
|
32
|
+
assert(
|
33
|
+
amount.to_s == '14.95ZLD',
|
34
|
+
"#{amount} is not equal to '14.95ZLD'"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_parses_coins
|
39
|
+
amount = Zold::Amount.new(coins: 900_000_000)
|
40
|
+
assert(
|
41
|
+
amount.to_s == '53.64ZLD',
|
42
|
+
"#{amount} is not equal to '53.64ZLD'"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
data/test/test_id.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copyright (c) 2018 Zerocracy, Inc.
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
11
|
+
# copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
# SOFTWARE.
|
20
|
+
|
21
|
+
require 'minitest/autorun'
|
22
|
+
require 'tmpdir'
|
23
|
+
require_relative '../lib/zold/id.rb'
|
24
|
+
|
25
|
+
# ID test.
|
26
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
27
|
+
# Copyright:: Copyright (c) 2018 Zerocracy, Inc.
|
28
|
+
# License:: MIT
|
29
|
+
class TestId < Minitest::Test
|
30
|
+
def test_generates_new_id
|
31
|
+
50.times do
|
32
|
+
id = Zold::Id.new
|
33
|
+
assert id.to_s.length == 16
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_generates_id_only_once
|
38
|
+
id = Zold::Id.new
|
39
|
+
before = id.to_s
|
40
|
+
5.times do
|
41
|
+
assert id.to_s == before
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/test/test_key.rb
CHANGED
data/test/test_wallet.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -23,7 +21,9 @@
|
|
23
21
|
require 'minitest/autorun'
|
24
22
|
require 'tmpdir'
|
25
23
|
require_relative '../lib/zold/key.rb'
|
24
|
+
require_relative '../lib/zold/id.rb'
|
26
25
|
require_relative '../lib/zold/wallet.rb'
|
26
|
+
require_relative '../lib/zold/amount.rb'
|
27
27
|
|
28
28
|
# Wallet test.
|
29
29
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -34,10 +34,26 @@ class TestWallet < Minitest::Test
|
|
34
34
|
Dir.mktmpdir 'test' do |dir|
|
35
35
|
file = File.join(dir, 'source.xml')
|
36
36
|
wallet = Zold::Wallet.new(file)
|
37
|
-
wallet.init(
|
38
|
-
amount =
|
37
|
+
wallet.init(Zold::Id.new, Zold::Key.new('fixtures/id_rsa.pub'))
|
38
|
+
amount = Zold::Amount.new(zld: 39.99)
|
39
39
|
wallet.sub(amount, 100, Zold::Key.new('fixtures/id_rsa'))
|
40
|
-
assert
|
40
|
+
assert(
|
41
|
+
wallet.balance == amount.mul(-1),
|
42
|
+
"#{wallet.balance} is not equal to #{amount.mul(-1)}"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_initializes_it
|
48
|
+
Dir.mktmpdir 'test' do |dir|
|
49
|
+
file = File.join(dir, 'source.xml')
|
50
|
+
wallet = Zold::Wallet.new(file)
|
51
|
+
id = Zold::Id.new.to_s
|
52
|
+
wallet.init(id, Zold::Key.new('fixtures/id_rsa.pub'))
|
53
|
+
assert(
|
54
|
+
wallet.id == id,
|
55
|
+
"#{wallet.id} is not equal to #{id}"
|
56
|
+
)
|
41
57
|
end
|
42
58
|
end
|
43
59
|
end
|
data/test/test_zold.rb
CHANGED
data/zold.gemspec
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# Copyright (c) 2018 Zerocracy, Inc.
|
4
2
|
#
|
5
3
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -31,8 +29,8 @@ Gem::Specification.new do |s|
|
|
31
29
|
if s.respond_to? :required_rubygems_version=
|
32
30
|
s.required_rubygems_version = Gem::Requirement.new('>= 0')
|
33
31
|
end
|
34
|
-
s.rubygems_version = '2.2
|
35
|
-
s.required_ruby_version = '>=
|
32
|
+
s.rubygems_version = '2.2'
|
33
|
+
s.required_ruby_version = '>= 2.2'
|
36
34
|
s.name = 'zold'
|
37
35
|
s.version = Zold::VERSION
|
38
36
|
s.license = 'MIT'
|
@@ -47,14 +45,15 @@ Gem::Specification.new do |s|
|
|
47
45
|
s.rdoc_options = ['--charset=UTF-8']
|
48
46
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
49
47
|
s.add_runtime_dependency 'nokogiri', '~>1.8'
|
48
|
+
s.add_runtime_dependency 'rainbow', '~>3.0'
|
50
49
|
s.add_runtime_dependency 'slop', '~>4.4'
|
51
|
-
s.add_runtime_dependency 'rainbow', '~>2.2'
|
52
|
-
s.add_development_dependency 'rake', '12.0.0'
|
53
50
|
s.add_development_dependency 'codecov', '0.1.10'
|
54
|
-
s.add_development_dependency 'rdoc', '4.2.0'
|
55
51
|
s.add_development_dependency 'cucumber', '1.3.17'
|
56
52
|
s.add_development_dependency 'minitest', '5.5.0'
|
57
|
-
s.add_development_dependency '
|
58
|
-
s.add_development_dependency '
|
53
|
+
s.add_development_dependency 'rake', '12.0.0'
|
54
|
+
s.add_development_dependency 'rdoc', '4.2.0'
|
59
55
|
s.add_development_dependency 'rspec-rails', '3.1.0'
|
56
|
+
s.add_development_dependency 'rubocop', '~>0.52.0'
|
57
|
+
s.add_development_dependency 'rubocop-rspec', '1.5.1'
|
58
|
+
s.add_development_dependency 'xcop', '~>0.5'
|
60
59
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -25,117 +25,131 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.8'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rainbow
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: slop
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '4.4'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '4.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: codecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.1.10
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.1.10
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: cucumber
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 1.3.17
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 1.3.17
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: minitest
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 5.5.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 5.5.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - '='
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 12.0.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 12.0.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: rdoc
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - '='
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 4.2.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 4.2.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec-rails
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 3.1.0
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 3.1.0
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rubocop
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.
|
145
|
+
version: 0.52.0
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.
|
152
|
+
version: 0.52.0
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: rubocop-rspec
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,19 +165,19 @@ dependencies:
|
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: 1.5.1
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
168
|
+
name: xcop
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
|
-
- -
|
171
|
+
- - "~>"
|
158
172
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
173
|
+
version: '0.5'
|
160
174
|
type: :development
|
161
175
|
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
|
-
- -
|
178
|
+
- - "~>"
|
165
179
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
180
|
+
version: '0.5'
|
167
181
|
description: Non-blockchain cryptocurrency
|
168
182
|
email: yegor256@gmail.com
|
169
183
|
executables:
|
@@ -187,6 +201,7 @@ files:
|
|
187
201
|
- README.md
|
188
202
|
- Rakefile
|
189
203
|
- appveyor.yml
|
204
|
+
- assets/wallet.xsd
|
190
205
|
- bin/zold
|
191
206
|
- cucumber.yml
|
192
207
|
- features/cli.feature
|
@@ -196,15 +211,19 @@ files:
|
|
196
211
|
- fixtures/id_rsa
|
197
212
|
- fixtures/id_rsa.pub
|
198
213
|
- lib/zold.rb
|
199
|
-
- lib/zold/
|
214
|
+
- lib/zold/amount.rb
|
215
|
+
- lib/zold/commands/create.rb
|
200
216
|
- lib/zold/commands/send.rb
|
217
|
+
- lib/zold/id.rb
|
201
218
|
- lib/zold/key.rb
|
202
219
|
- lib/zold/log.rb
|
203
220
|
- lib/zold/version.rb
|
204
221
|
- lib/zold/wallet.rb
|
205
|
-
- test/commands/
|
222
|
+
- test/commands/test_create.rb
|
206
223
|
- test/commands/test_send.rb
|
207
224
|
- test/test__helper.rb
|
225
|
+
- test/test_amount.rb
|
226
|
+
- test/test_id.rb
|
208
227
|
- test/test_key.rb
|
209
228
|
- test/test_wallet.rb
|
210
229
|
- test/test_zold.rb
|
@@ -222,7 +241,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
222
241
|
requirements:
|
223
242
|
- - ">="
|
224
243
|
- !ruby/object:Gem::Version
|
225
|
-
version:
|
244
|
+
version: '2.2'
|
226
245
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
246
|
requirements:
|
228
247
|
- - ">="
|
@@ -239,9 +258,11 @@ test_files:
|
|
239
258
|
- features/gem_package.feature
|
240
259
|
- features/step_definitions/steps.rb
|
241
260
|
- features/support/env.rb
|
242
|
-
- test/commands/
|
261
|
+
- test/commands/test_create.rb
|
243
262
|
- test/commands/test_send.rb
|
244
263
|
- test/test__helper.rb
|
264
|
+
- test/test_amount.rb
|
265
|
+
- test/test_id.rb
|
245
266
|
- test/test_key.rb
|
246
267
|
- test/test_wallet.rb
|
247
268
|
- test/test_zold.rb
|