dropzone_ruby 0.1
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 +7 -0
- data/.gitignore +4 -0
- data/Drop Zone - An Anonymous Peer-To-Peer Local Contraband Marketplace.pdf +0 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +69 -0
- data/README.md +62 -0
- data/bin/dropzone +487 -0
- data/dropzone-screenshot.jpg +0 -0
- data/dropzone_ruby.gemspec +31 -0
- data/lib/blockrio_ext.rb +52 -0
- data/lib/dropzone/buyer.rb +21 -0
- data/lib/dropzone/command.rb +488 -0
- data/lib/dropzone/communication.rb +43 -0
- data/lib/dropzone/connection.rb +312 -0
- data/lib/dropzone/invoice.rb +23 -0
- data/lib/dropzone/item.rb +160 -0
- data/lib/dropzone/listing.rb +64 -0
- data/lib/dropzone/message_base.rb +178 -0
- data/lib/dropzone/payment.rb +36 -0
- data/lib/dropzone/profile.rb +86 -0
- data/lib/dropzone/record_base.rb +34 -0
- data/lib/dropzone/seller.rb +21 -0
- data/lib/dropzone/session.rb +161 -0
- data/lib/dropzone/state_accumulator.rb +39 -0
- data/lib/dropzone/version.rb +4 -0
- data/lib/dropzone_ruby.rb +14 -0
- data/lib/veto_checks.rb +74 -0
- data/spec/bitcoin_spec.rb +115 -0
- data/spec/buyer_profile_spec.rb +279 -0
- data/spec/buyer_spec.rb +109 -0
- data/spec/command_spec.rb +353 -0
- data/spec/config.yml +5 -0
- data/spec/invoice_spec.rb +129 -0
- data/spec/item_spec.rb +294 -0
- data/spec/lib/fake_connection.rb +97 -0
- data/spec/listing_spec.rb +150 -0
- data/spec/payment_spec.rb +152 -0
- data/spec/seller_profile_spec.rb +290 -0
- data/spec/seller_spec.rb +120 -0
- data/spec/session_spec.rb +303 -0
- data/spec/sham/buyer.rb +5 -0
- data/spec/sham/invoice.rb +5 -0
- data/spec/sham/item.rb +8 -0
- data/spec/sham/payment.rb +13 -0
- data/spec/sham/seller.rb +7 -0
- data/spec/spec_helper.rb +49 -0
- metadata +267 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7e3f8aa268cff7526cede2b919230f6ea0a3de4f
|
4
|
+
data.tar.gz: 3687b6814d9f88aec34dc63c685db73cee19e127
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1b21f9440eebd4f1eb5bea505f8765c8362f3e2c8a711deb338a7863c0d2ee89e7be720b58443aee3a52688fb0c56164e6c95dace905990df2f9b374a9590b31
|
7
|
+
data.tar.gz: 28c24e8a6c5902b084634c39659e3aa439d3a30a49567744851d3df6f50fab537871886ff59194722c4bf51a30e9c2a02141ce53dacc9f198f678e3741e91fd2
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
dropzone_ruby (0.1)
|
5
|
+
commander (~> 4.3)
|
6
|
+
counterparty_ruby (~> 1.2)
|
7
|
+
sequel (~> 4.21)
|
8
|
+
socksify (~> 1.7)
|
9
|
+
sqlite3 (~> 1.3)
|
10
|
+
veto (~> 1.0)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
bitcoin-ruby (0.0.7)
|
16
|
+
commander (4.3.4)
|
17
|
+
highline (~> 1.7.2)
|
18
|
+
counterparty_ruby (1.2.0)
|
19
|
+
bitcoin-ruby
|
20
|
+
ffi
|
21
|
+
rest-client
|
22
|
+
ruby-rc4
|
23
|
+
diff-lcs (1.2.5)
|
24
|
+
domain_name (0.5.24)
|
25
|
+
unf (>= 0.0.5, < 1.0.0)
|
26
|
+
ffi (1.9.10)
|
27
|
+
highline (1.7.2)
|
28
|
+
http-cookie (1.0.2)
|
29
|
+
domain_name (~> 0.5)
|
30
|
+
mime-types (2.6.1)
|
31
|
+
netrc (0.10.3)
|
32
|
+
rake (10.4.2)
|
33
|
+
rdoc (4.2.0)
|
34
|
+
rest-client (1.8.0)
|
35
|
+
http-cookie (>= 1.0.2, < 2.0)
|
36
|
+
mime-types (>= 1.16, < 3.0)
|
37
|
+
netrc (~> 0.7)
|
38
|
+
rspec (3.2.0)
|
39
|
+
rspec-core (~> 3.2.0)
|
40
|
+
rspec-expectations (~> 3.2.0)
|
41
|
+
rspec-mocks (~> 3.2.0)
|
42
|
+
rspec-core (3.2.3)
|
43
|
+
rspec-support (~> 3.2.0)
|
44
|
+
rspec-expectations (3.2.1)
|
45
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
+
rspec-support (~> 3.2.0)
|
47
|
+
rspec-mocks (3.2.1)
|
48
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
+
rspec-support (~> 3.2.0)
|
50
|
+
rspec-support (3.2.2)
|
51
|
+
ruby-rc4 (0.1.5)
|
52
|
+
sequel (4.21.0)
|
53
|
+
sham (1.1.0)
|
54
|
+
socksify (1.7.0)
|
55
|
+
sqlite3 (1.3.10)
|
56
|
+
unf (0.1.4)
|
57
|
+
unf_ext
|
58
|
+
unf_ext (0.0.7.1)
|
59
|
+
veto (1.0.1)
|
60
|
+
|
61
|
+
PLATFORMS
|
62
|
+
ruby
|
63
|
+
|
64
|
+
DEPENDENCIES
|
65
|
+
dropzone_ruby!
|
66
|
+
rake (~> 10.4)
|
67
|
+
rdoc (~> 4.2)
|
68
|
+
rspec (~> 3.2)
|
69
|
+
sham (~> 1.1)
|
data/README.md
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
Drop Zone [](http://badge.fury.io/rb/dropzone_ruby)
|
2
|
+
=================
|
3
|
+

|
4
|
+
|
5
|
+
To whom it may concern,
|
6
|
+
|
7
|
+
Markets are objects of censorship and always have been. There is a presumed
|
8
|
+
division, that renders commerce distinct from the notion of free speech. But I
|
9
|
+
will allege that the act of commerce is, itself, indistinct from speech. Where
|
10
|
+
or how one spends their value is a decision as personal and poignant as any
|
11
|
+
words ever spoken or letters ever written.
|
12
|
+
|
13
|
+
As a unfortunate consequence of freedom, bad actors will engage in repugnant
|
14
|
+
trade that impinges upon the rights and freedoms of others. It is the job of
|
15
|
+
humanity to cooperate and see to it that trade, such as this, becomes
|
16
|
+
unprofitable. Whether it is accomplished through technological achievement or
|
17
|
+
through the adjustment of social mores, or perhaps a simple appeal to the
|
18
|
+
underlying natural law, it is not the job of bad acting third parties to force
|
19
|
+
into hiding commerce that must be dealt with by means of an adjustment to the
|
20
|
+
global, social conscience.
|
21
|
+
|
22
|
+
Cooperation, in the manner I was just speaking about, has never been plausible
|
23
|
+
until the invention of The Blockchain. I will not foist upon Satoshi's humble
|
24
|
+
creation such impracticable possibilities as the achievement of world peace.
|
25
|
+
But in approaching Drop Zone, I am attempting to do nothing more than what is
|
26
|
+
possible and possibly more efficient than what exists. I wish for Drop Zone
|
27
|
+
to be nothing more than an appendage to The Blockchain. As such, it is every
|
28
|
+
bit as much Bitcoin as Bitcoin itself. Just as a fungible Bitcoin enables the
|
29
|
+
exchange of spaceless value with near impunity, Drop Zone removes the ability
|
30
|
+
of unwelcome parties from glancing over the shoulders of those in the act of an
|
31
|
+
exchange, whatever it entails. This technology disrupts the ability of buyers
|
32
|
+
to gain insight into the identities or movements of suppliers making supply
|
33
|
+
chains far less vulnerable to disruption. It is this innovation that separates
|
34
|
+
this project from all other decentralized market solutions.
|
35
|
+
|
36
|
+
Whereas Bitcoin forces us to consider the nature of money and value, Drop Zone
|
37
|
+
will do the same for commerce. At its root, Bitcoin is a message passing
|
38
|
+
system. Those messages that are passed, unlike any electronic message that's
|
39
|
+
come before it, articulate value. Commerce is, and has always been, similarly
|
40
|
+
inclined toward message passing. Whether in-person, over email, or through
|
41
|
+
large, online shopping carts, fundamentally, commerce is composed of messages
|
42
|
+
that are in service of the transaction wherein a final message of value is sent
|
43
|
+
to a recipient in exchange for a negotiated good or service. As such, Drop
|
44
|
+
Zone is a secure message passing protocol inasmuch as it is a platform for
|
45
|
+
commerce. And while the problem is far beyond the scope or capabilities of
|
46
|
+
the protocol in its most fundamental form, the observant might even see the
|
47
|
+
tenuous skeleton of a full-fledged reputation system. Such a project is, in
|
48
|
+
itself, as important and difficult as any facing this decentralized ecosystem.
|
49
|
+
|
50
|
+
I hope that Drop Zone lets us all dream of a day when no man will any longer be
|
51
|
+
made to suffer indignity for simply engaging in unpopular or stigmatized
|
52
|
+
commerce. May all commerce be created equal.
|
53
|
+
|
54
|
+
Today is a Beautiful day,
|
55
|
+
|
56
|
+
__Miracle Max__
|
57
|
+
__quia omnis qui se exaltat humiliabitur et qui se humiliat exaltabitur__
|
58
|
+
|
59
|
+
## Errata
|
60
|
+
* The white paper expressed 8 digits of precision for the listing radius. This implementation instead uses 6 digits. If additional precision is later deemed necessary, a field can be added to the listing to accomodate enhanced precision
|
61
|
+
* The white paper expressed pkeys (addresses) as being encoded ints. These are instead encoded as variable length strings.
|
62
|
+
* The white paper expressed transaction ids as being encoded ints. These are instead encoded as variable length strings.
|
data/bin/dropzone
ADDED
@@ -0,0 +1,487 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'commander/import'
|
5
|
+
require 'socksify'
|
6
|
+
|
7
|
+
$: << [File.dirname(__FILE__),'..','lib'].join('/')
|
8
|
+
require 'dropzone_ruby'
|
9
|
+
require 'dropzone/command'
|
10
|
+
|
11
|
+
# For the examples:
|
12
|
+
RANDOM_TXID = '0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098'
|
13
|
+
|
14
|
+
# Cleans up a multiline string, keeps this file readable.
|
15
|
+
def multi(string)
|
16
|
+
string.tr("\t\r\n",'').gsub(/[ ]{2,}/, ' ')
|
17
|
+
end
|
18
|
+
|
19
|
+
def command_show(type, &block)
|
20
|
+
command '%s show' % type do |c|
|
21
|
+
c.when_called DropZoneCommand, ('%s_show' % type).to_sym
|
22
|
+
|
23
|
+
c.syntax, c.summary, c.description =
|
24
|
+
'dropzone %s show <txid> [options]' % type,
|
25
|
+
'Show %s details' % type
|
26
|
+
multi(<<-eos) % type
|
27
|
+
Displays the information associated with the %s at the specified address.
|
28
|
+
eos
|
29
|
+
block.call c
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Defaults:
|
34
|
+
Dropzone::BitcoinConnection.cache = LocalConnectionCache.new
|
35
|
+
Bitcoin.network = :bitcoin
|
36
|
+
|
37
|
+
program :version, '0.0.1'
|
38
|
+
program :description, 'A marketplace built on The Blockchain.'
|
39
|
+
|
40
|
+
program :help, 'Author',
|
41
|
+
'Miracle Max (17Q4MX2hmktmpuUKHFuoRmS5MfB5XPbhod / mw8Ge8HDBStKyn8u4LTkUwueheFNhuo7Ch ) '
|
42
|
+
|
43
|
+
global_option('--debug', 'Display detailed data on program activity') do
|
44
|
+
Socksify::debug = true
|
45
|
+
RestClient.log = Logger.new STDOUT
|
46
|
+
end
|
47
|
+
|
48
|
+
global_option('--socks_server SERVER:PORT',
|
49
|
+
'Route all connections through the specified SOCKS server & port') do |server_spec|
|
50
|
+
server, port = $1, $2 if /\A([a-z\.\d]+)(?:\:([\d]+)|)\Z/i.match server_spec
|
51
|
+
|
52
|
+
raise OptionParser::InvalidArgument, "socks_server" unless server
|
53
|
+
|
54
|
+
TCPSocket::socks_server = server if server
|
55
|
+
TCPSocket::socks_port = (port) ? port : 9050
|
56
|
+
end
|
57
|
+
|
58
|
+
global_option('--force_testnet',
|
59
|
+
'Force transactions that would normally be on mainnet, onto testnet') do
|
60
|
+
Bitcoin.network = :testnet3
|
61
|
+
end
|
62
|
+
|
63
|
+
global_option('--tip SATOSHIS',
|
64
|
+
'Set the transaction tip amount. Defaults to 20000') do |satoshis|
|
65
|
+
satoshis_i = $1.to_i if /\A([\d]+)\Z/.match satoshis
|
66
|
+
|
67
|
+
raise OptionParser::InvalidArgument, "tip" unless satoshis_i
|
68
|
+
|
69
|
+
Dropzone::MessageBase.default_tip = satoshis_i
|
70
|
+
end
|
71
|
+
|
72
|
+
command 'balance' do |c|
|
73
|
+
c.when_called DropZoneCommand, :balance
|
74
|
+
|
75
|
+
c.syntax, c.summary, c.description =
|
76
|
+
'dropzone balance <addr>',
|
77
|
+
'Display the balance on the provided address, in Bitcoin',
|
78
|
+
multi(<<-eos)
|
79
|
+
Given the provided public key, display the Bitcoin balance remaining in
|
80
|
+
this account. Does not include unconfirmed transactions.
|
81
|
+
eos
|
82
|
+
|
83
|
+
c.example 'Show the balance of Miracle Max\'s Account',
|
84
|
+
'dropzone balance 17Q4MX2hmktmpuUKHFuoRmS5MfB5XPbhod'
|
85
|
+
end
|
86
|
+
|
87
|
+
command 'pay' do |c|
|
88
|
+
c.when_called DropZoneCommand, :send_value
|
89
|
+
|
90
|
+
c.syntax, c.summary, c.description =
|
91
|
+
'dropzone pay <private_key> <dest_addr> <amnt_btc> [options]',
|
92
|
+
'Send value to a recipient, in Bitcoin',
|
93
|
+
multi(<<-eos)
|
94
|
+
Given the provided <private_key>, send Bitcoin in units of BTC <amnt_btc>
|
95
|
+
to the recipient specified by <dest_addr>.
|
96
|
+
eos
|
97
|
+
c.example 'Send 1.2 Bitcoin from %s to %s' % [
|
98
|
+
'mi37WkBomHJpUghCn7Vgh3ah33h6L9Nkqw', 'mqVRfjepJTxxoDgDt892tCybhmjfKCFNyp'],
|
99
|
+
multi(<<-eos)
|
100
|
+
dropzone pay 92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
101
|
+
mqVRfjepJTxxoDgDt892tCybhmjfKCFNyp
|
102
|
+
1.2
|
103
|
+
eos
|
104
|
+
end
|
105
|
+
|
106
|
+
command 'listing find' do |c|
|
107
|
+
c.when_called DropZoneCommand, :listing_find
|
108
|
+
|
109
|
+
c.syntax, c.summary, c.description =
|
110
|
+
'dropzone listing find <block_depth>',
|
111
|
+
'Searches through The Blockchain for listings',
|
112
|
+
multi(<<-eos)
|
113
|
+
Search through The Blockchain, up until the provided <block_depth>,
|
114
|
+
for Drop Zone listings. Note that the returned listings may not be entirely
|
115
|
+
updated, or even valid. A subsequent 'listing show' command should be
|
116
|
+
specified to validate the details of the item you're interested in.
|
117
|
+
eos
|
118
|
+
|
119
|
+
c.example 'Find listings uploaded (approximately) in the last hour',
|
120
|
+
'dropzone listing find 6'
|
121
|
+
|
122
|
+
c.example 'Find listings uploaded Twenty Kilometers around Shijuku in the last day',
|
123
|
+
multi(<<-eos)
|
124
|
+
dropzone listing find 144
|
125
|
+
--latitude 35.689487
|
126
|
+
--longitude 139.691706
|
127
|
+
--radius 20000
|
128
|
+
eos
|
129
|
+
|
130
|
+
c.example 'Find listings between block 371813 and 371810 (inclusive)',
|
131
|
+
'dropzone listing find 3 --start_at 371813'
|
132
|
+
|
133
|
+
c.example 'Find listings in block 371812',
|
134
|
+
'dropzone listing find 0 --start_at 371812'
|
135
|
+
|
136
|
+
c.option '--latitude LAT ', Float,
|
137
|
+
'The approximate latitude of your location.'
|
138
|
+
c.option '--longitude LON ', Float,
|
139
|
+
'The approximate longitude of your location.'
|
140
|
+
c.option '--radius METERS ', Integer, multi(<<-eos)
|
141
|
+
The approximate diameter you wish to search around the provided
|
142
|
+
latitude and longitude. The expected unit of distance is in meters.
|
143
|
+
eos
|
144
|
+
|
145
|
+
c.option '--start_at BLOCKHEIGHT ', Integer, multi(<<-eos)
|
146
|
+
Start searching from the specified block height until <block_depth>
|
147
|
+
'blocks down'. The default behavior is to start at the current blockchain
|
148
|
+
height.
|
149
|
+
eos
|
150
|
+
end
|
151
|
+
|
152
|
+
command_show(:listing) do |c|
|
153
|
+
c.example "Display a seller's listing",
|
154
|
+
'dropzone listing show 6a9013b8684862e9ccfb527bf8f5ea5eb213e77e3970ff2cd8bbc22beb7cebfb'
|
155
|
+
end
|
156
|
+
|
157
|
+
def listing_create_update_options(cmd)
|
158
|
+
cmd.option '--description DESC', String, multi(<<-eos)
|
159
|
+
A detailed description of the item that's being listed. Hashtags are
|
160
|
+
encouraged as they will be easily searched and indexed, and take up a
|
161
|
+
small amount of space
|
162
|
+
eos
|
163
|
+
cmd.option '--price_currency ISOCODE', String, multi(<<-eos)
|
164
|
+
A three or four digit currency identifier. Common values would include
|
165
|
+
'BTC' or 'USD', though any identifier can be specified
|
166
|
+
eos
|
167
|
+
cmd.option '--price_in_units PRICE ', Integer,
|
168
|
+
'The price of the specified item denominated in cents, or satoshis, etc.'
|
169
|
+
cmd.option '--expiration_in NBLOCKS ', Integer, multi(<<-eos)
|
170
|
+
The expiration time of the item. "Times" are to be indicated in the number
|
171
|
+
of blocks that this listing is available for. Omitting this field indicates
|
172
|
+
no expiration. Note that clients will likely override the seller's
|
173
|
+
preference to list an item for a very long time by restricting the block
|
174
|
+
depth of users' searches.
|
175
|
+
eos
|
176
|
+
end
|
177
|
+
|
178
|
+
command 'listing update' do |c|
|
179
|
+
c.when_called DropZoneCommand, :listing_update
|
180
|
+
|
181
|
+
c.syntax, c.summary, c.description =
|
182
|
+
'dropzone listing update <private_key> <txid> [options]',
|
183
|
+
'Update your item listing',
|
184
|
+
multi(<<-eos)
|
185
|
+
Given the provided item transaction id <txid> on your account <private_key>,
|
186
|
+
update the specified item attributes. Note that some attributes such as
|
187
|
+
latitude, longitude, and radius cannot be updated.
|
188
|
+
eos
|
189
|
+
|
190
|
+
c.example 'Update existing item', multi(<<-eos) % RANDOM_TXID
|
191
|
+
dropzone listing update
|
192
|
+
--description "Second Description"
|
193
|
+
92thgQGx77ihBaA56W7B1Qm8nhYHRERo1UqrgT2p6P6QTqkRhRB
|
194
|
+
%s
|
195
|
+
eos
|
196
|
+
|
197
|
+
listing_create_update_options c
|
198
|
+
end
|
199
|
+
|
200
|
+
command 'listing create' do |c|
|
201
|
+
c.when_called DropZoneCommand, :listing_create
|
202
|
+
|
203
|
+
c.syntax, c.summary, c.description =
|
204
|
+
'dropzone listing create <private_key> [options]',
|
205
|
+
'Create an item listing as a seller',
|
206
|
+
multi(<<-eos)
|
207
|
+
Given the provided seller address <private_key>, create an item
|
208
|
+
which is pubilicly listed as available for purchase by other users
|
209
|
+
eos
|
210
|
+
|
211
|
+
c.example 'Create an Item', multi(<<-eos)
|
212
|
+
dropzone listing create
|
213
|
+
--latitude "51.500782"
|
214
|
+
--longitude "-0.124669"
|
215
|
+
--radius 1000
|
216
|
+
--price_currency 'USD'
|
217
|
+
--price_in_units 100
|
218
|
+
--description "Test Description"
|
219
|
+
92thgQGx77ihBaA56W7B1Qm8nhYHRERo1UqrgT2p6P6QTqkRhRB
|
220
|
+
eos
|
221
|
+
|
222
|
+
listing_create_update_options c
|
223
|
+
|
224
|
+
c.option '--latitude LAT ', Float,
|
225
|
+
"(Required) The approximate latitude your listing's location."
|
226
|
+
c.option '--longitude LON ', Float,
|
227
|
+
"(Required) The approximate longitude your listing's location."
|
228
|
+
c.option '--radius METERS ', Integer, multi(<<-eos)
|
229
|
+
(Required) The approximate diameter your item's location around the provided
|
230
|
+
latitude and longitude. The expected unit of distance is in meters.
|
231
|
+
eos
|
232
|
+
end
|
233
|
+
|
234
|
+
command 'profile seller show' do |c|
|
235
|
+
c.when_called DropZoneCommand, :profile_seller_show
|
236
|
+
|
237
|
+
c.syntax, c.summary, c.description =
|
238
|
+
'dropzone profile seller show <addr> [options]',
|
239
|
+
"Show a seller's profile",
|
240
|
+
'Displays the information associated with the seller at the given address.'
|
241
|
+
|
242
|
+
c.example "Look up a user's store profile",
|
243
|
+
'dropzone profile seller show "17Q4MX2hmktmpuUKHFuoRmS5MfB5XPbhod"'
|
244
|
+
end
|
245
|
+
|
246
|
+
command 'profile seller create' do |c|
|
247
|
+
c.when_called DropZoneCommand, :profile_seller_create
|
248
|
+
|
249
|
+
c.syntax, c.summary, c.description =
|
250
|
+
'dropzone profile seller create <private_key> [options]',
|
251
|
+
'Open for business, and/or update your existing store',
|
252
|
+
multi(<<-eos)
|
253
|
+
A seller profile is required to precede all item
|
254
|
+
declarations on a public key (Specified in <private_key>). This
|
255
|
+
declaration is expected to contain basic information about a seller, and
|
256
|
+
offers some provisions which facilitate identity transfers. This command
|
257
|
+
will create an identity if one does not exist at the specified address,
|
258
|
+
and/or will update any identity that already exists at the specified
|
259
|
+
address.
|
260
|
+
eos
|
261
|
+
|
262
|
+
c.example 'Declare a seller profile:', multi(<<-eos)
|
263
|
+
dropzone profile seller create --alias="Miracle Max"
|
264
|
+
--description="First Seller on DropZone"
|
265
|
+
--communications_pkey="mi37WkBomHJpUghCn7Vgh3ah33h6L9Nkqw"
|
266
|
+
"92thgQGx77ihBaA56W7B1Qm8nhYHRERo1UqrgT2p6P6QTqkRhRB"
|
267
|
+
eos
|
268
|
+
|
269
|
+
c.option '--description DESC', String, 'A description of yourself'
|
270
|
+
c.option '--alias ALIAS', String,
|
271
|
+
'A short name by which you would like to be identified'
|
272
|
+
c.option '--communications_pkey ADDR', String,
|
273
|
+
'Specifies which testnet address you wish to receive communications inquiries at.'
|
274
|
+
c.option '--transfer_pkey ADDR', String, multi(<<-eos)
|
275
|
+
Transfer this identity to the specified address. Note that this is a
|
276
|
+
one-way operation, and that you should be sure to control the destination
|
277
|
+
key. If you wish to deactivate your store entirely, a 0 can be passed
|
278
|
+
here.
|
279
|
+
eos
|
280
|
+
end
|
281
|
+
|
282
|
+
command 'profile buyer show' do |c|
|
283
|
+
c.when_called DropZoneCommand, :profile_buyer_show
|
284
|
+
|
285
|
+
c.syntax, c.summary, c.description =
|
286
|
+
'dropzone profile buyer show <addr> [options]',
|
287
|
+
"Show a buyer's profile",
|
288
|
+
'Displays the information associated with the buyer at the given address.'
|
289
|
+
|
290
|
+
c.example "Look up a user's buy profile",
|
291
|
+
'dropzone --force_testnet profile buyer show "mgDprFdTS61x1ejowYqJSmoWiqwpEiGrcy"'
|
292
|
+
end
|
293
|
+
|
294
|
+
command 'profile buyer create' do |c|
|
295
|
+
c.when_called DropZoneCommand, :profile_buyer_create
|
296
|
+
|
297
|
+
c.syntax, c.summary, c.description =
|
298
|
+
'dropzone profile buyer create <private_key> [options]',
|
299
|
+
'Create/Update your buyer profile (optional)',
|
300
|
+
multi(<<-eos)
|
301
|
+
A buyer profile is an optional declaration that can be
|
302
|
+
attached to an address (<private_key>) for the purpose of adding metadata
|
303
|
+
to your identity as a buyer. This command will create a profile on the
|
304
|
+
specified address, or update the existing profile on the specified address.
|
305
|
+
eos
|
306
|
+
|
307
|
+
c.example 'Declare a buyer profile:', multi(<<-eos)
|
308
|
+
dropzone profile buyer create --alias="Miracle Max"
|
309
|
+
--description="First Buyer on DropZone"
|
310
|
+
"92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw"
|
311
|
+
eos
|
312
|
+
c.option '--description DESC', String, 'A description of yourself'
|
313
|
+
c.option '--alias ALIAS', String,
|
314
|
+
'A short name by which you would like to be identified'
|
315
|
+
c.option '--transfer_pkey ADDR', String, multi(<<-eos)
|
316
|
+
Transfer this identity to the specified address. Note that this is a
|
317
|
+
one-way operation, and that you should be sure to control the destination
|
318
|
+
key. If you wish to deactivate your store entirely, a 0 can be passed
|
319
|
+
here.
|
320
|
+
eos
|
321
|
+
end
|
322
|
+
|
323
|
+
command_show(:invoice) do |c|
|
324
|
+
c.example "Display a seller's invoice",
|
325
|
+
'dropzone invoice show %s' % RANDOM_TXID
|
326
|
+
end
|
327
|
+
|
328
|
+
command 'invoice create' do |c|
|
329
|
+
c.when_called DropZoneCommand, :invoice_create
|
330
|
+
|
331
|
+
c.syntax, c.summary, c.description =
|
332
|
+
'dropzone invoice create <private_key> <recipient_addr> [options]',
|
333
|
+
'Create an invoice to a potential buyer',
|
334
|
+
multi(<<-eos)
|
335
|
+
An invoice is needed to lock in currency exchange rates for the purposes
|
336
|
+
of a sale, and for the purpose of allowing the network to identify a
|
337
|
+
successful sale on your profile <private_key>. Satisfied invoices build
|
338
|
+
reputation. This command will generate an invoice to the buyer at the
|
339
|
+
specified address <recipient_addr>.
|
340
|
+
eos
|
341
|
+
|
342
|
+
c.example 'Create an invoice:', multi(<<-eos)
|
343
|
+
dropzone invoice create
|
344
|
+
--amount_due 50000000
|
345
|
+
--expiration_in 6
|
346
|
+
92thgQGx77ihBaA56W7B1Qm8nhYHRERo1UqrgT2p6P6QTqkRhRB
|
347
|
+
mi37WkBomHJpUghCn7Vgh3ah33h6L9Nkqw
|
348
|
+
eos
|
349
|
+
|
350
|
+
c.option '--amount_due BTC', String,
|
351
|
+
'Amount due, denominated in Bitcoin (ie "0.5")'
|
352
|
+
c.option '--expiration_in NBLOCKS ', Integer, multi(<<-eos)
|
353
|
+
The expiration time of the invoice. "Times" are to be indicated in the number
|
354
|
+
of blocks that this listing is available for. Omitting this field indicates
|
355
|
+
no expiration. Specifying an expiration is useful for locking in an exchange
|
356
|
+
rate when closing a sale.
|
357
|
+
eos
|
358
|
+
end
|
359
|
+
|
360
|
+
command_show(:review) do |c|
|
361
|
+
c.example "Display a buyer's review",
|
362
|
+
'dropzone review show %s' % RANDOM_TXID
|
363
|
+
end
|
364
|
+
|
365
|
+
command 'review create' do |c|
|
366
|
+
c.when_called DropZoneCommand, :review_create
|
367
|
+
|
368
|
+
c.syntax, c.summary, c.description =
|
369
|
+
'dropzone review create <private_key> <txid> [options]',
|
370
|
+
'Leave a review on a generated invoice',
|
371
|
+
multi(<<-eos)
|
372
|
+
A review is primarily designed for the purposes of establishing
|
373
|
+
feedback and reputations amongst buyers and sellers. After an invoice
|
374
|
+
is generated, and value is sent, a review indicates to the network
|
375
|
+
the nature of the transaction, and a buyer's <privkey> experience with
|
376
|
+
the seller. Reviews are left in response to a specific invoice at the
|
377
|
+
provided
|
378
|
+
<txid>.
|
379
|
+
eos
|
380
|
+
|
381
|
+
c.example 'Review a purchase:', multi(<<-eos) % [RANDOM_TXID]
|
382
|
+
dropzone review create
|
383
|
+
--description: 'Fair exchange"
|
384
|
+
--delivery_quality 8,
|
385
|
+
--product_quality 8
|
386
|
+
--communications_quality 4
|
387
|
+
92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
388
|
+
%s
|
389
|
+
eos
|
390
|
+
c.option '--description DESC', String,
|
391
|
+
'A description of the transaction and/or a review of the product.'
|
392
|
+
|
393
|
+
c.option '--delivery_quality N', Integer,
|
394
|
+
'The quality of the delivery itself. Between 0 (worst) to 8 (best)'
|
395
|
+
|
396
|
+
c.option '--product_quality N', Integer,
|
397
|
+
'The quality of the product. Between 0 (worst) to 8 (best)'
|
398
|
+
|
399
|
+
c.option '--communications_quality N', Integer,
|
400
|
+
"The seller's communications skill. Between 0 (worst) to 8 (best)"
|
401
|
+
end
|
402
|
+
|
403
|
+
command 'communication list' do |c|
|
404
|
+
c.when_called DropZoneCommand, :communication_list
|
405
|
+
|
406
|
+
c.syntax, c.summary, c.description =
|
407
|
+
'dropzone communication list <private_key>',
|
408
|
+
'Show all the available communication channels for the given testnet address',
|
409
|
+
multi(<<-eos)
|
410
|
+
This command lists all the conversations that have been initiated and/or
|
411
|
+
authenticated on the testnet address correlated with the specified
|
412
|
+
<private_key>.
|
413
|
+
eos
|
414
|
+
|
415
|
+
c.example 'List all communication sessions for a testnet address:',
|
416
|
+
multi(<<-eos)
|
417
|
+
dropzone communication list
|
418
|
+
92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
419
|
+
eos
|
420
|
+
end
|
421
|
+
|
422
|
+
command 'communication show' do |c|
|
423
|
+
c.when_called DropZoneCommand, :communication_show
|
424
|
+
|
425
|
+
c.syntax, c.summary, c.description =
|
426
|
+
'dropzone communication show <private_key> <tx_id>',
|
427
|
+
'Show all the available communication channels for the given testnet address',
|
428
|
+
multi(<<-eos)
|
429
|
+
Output a full conversation, start to finish, between the testnet
|
430
|
+
<private_key> starting with the initiation at <tx_id>.
|
431
|
+
eos
|
432
|
+
|
433
|
+
c.example 'Show the conversation:',
|
434
|
+
multi(<<-eos) % RANDOM_TXID
|
435
|
+
dropzone communication show
|
436
|
+
92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
437
|
+
%s
|
438
|
+
eos
|
439
|
+
end
|
440
|
+
|
441
|
+
command 'communication say' do |c|
|
442
|
+
c.when_called DropZoneCommand, :communication_say
|
443
|
+
|
444
|
+
c.syntax, c.summary, c.description =
|
445
|
+
'dropzone communication say <private_key> <tx_id> <message>',
|
446
|
+
'Communicate to another party in a private/encrypted conversation over testnet.',
|
447
|
+
multi(<<-eos)
|
448
|
+
Append to the conversation <tx_id> at your testnet address <private> key
|
449
|
+
say the provided <message> to a receiving party.
|
450
|
+
eos
|
451
|
+
|
452
|
+
c.example 'Converse with another user over testnet:',
|
453
|
+
multi(<<-eos) % RANDOM_TXID
|
454
|
+
dropzone communication say
|
455
|
+
92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
456
|
+
%s
|
457
|
+
"Thank you for your Inquiry"
|
458
|
+
eos
|
459
|
+
end
|
460
|
+
|
461
|
+
command 'communication new' do |c|
|
462
|
+
c.when_called DropZoneCommand, :communication_new
|
463
|
+
|
464
|
+
c.syntax, c.summary, c.description =
|
465
|
+
'dropzone communication new <private_key> <addr>',
|
466
|
+
'Start a new conversation with the person at a given testnet address',
|
467
|
+
multi(<<-eos)
|
468
|
+
Start a conversation between your tesnet <private_key> and the user at
|
469
|
+
the specified testnet address <addr>. An initiation request needs only
|
470
|
+
to be issued by one user, a recipient must reply to that request using
|
471
|
+
the "communication say" command, in order to authenticate the initiator's
|
472
|
+
request and perform key exchange. Thereafter, a channel between the two
|
473
|
+
addresses is established, and communications will remain open.
|
474
|
+
|
475
|
+
NOTE: A communications secret is generated by Drop Zone for each recipient
|
476
|
+
that a connection has been established with, and these secrets are stored
|
477
|
+
in the ~/.dropzone/dropzone.db file. When the user responds to this request
|
478
|
+
a secret is automatically generated on their computer as well.
|
479
|
+
eos
|
480
|
+
|
481
|
+
c.example 'Start a conversation:',
|
482
|
+
multi(<<-eos)
|
483
|
+
dropzone communication new
|
484
|
+
92UvdTpmxA6cvD6YeJZSiHW8ff8DsZXL2PHZu9Mg7JY3zbaETJw
|
485
|
+
mqVRfjepJTxxoDgDt892tCybhmjfKCFNyp
|
486
|
+
eos
|
487
|
+
end
|