sequence-sdk 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -7
- data/lib/sequence.rb +0 -0
- data/lib/sequence/account.rb +54 -22
- data/lib/sequence/action.rb +158 -0
- data/lib/sequence/asset.rb +52 -22
- data/lib/sequence/balance.rb +20 -9
- data/lib/sequence/client.rb +19 -9
- data/lib/sequence/client_module.rb +4 -2
- data/lib/sequence/contract.rb +30 -15
- data/lib/sequence/dev_utils.rb +1 -1
- data/lib/sequence/errors.rb +13 -13
- data/lib/sequence/http_wrapper.rb +57 -23
- data/lib/sequence/key.rb +14 -7
- data/lib/sequence/page.rb +1 -0
- data/lib/sequence/query.rb +9 -6
- data/lib/sequence/response_object.rb +0 -0
- data/lib/sequence/session.rb +17 -26
- data/lib/sequence/stats.rb +1 -2
- data/lib/sequence/transaction.rb +192 -87
- data/lib/sequence/validations.rb +30 -0
- data/lib/sequence/version.rb +1 -1
- metadata +7 -5
data/lib/sequence/key.rb
CHANGED
@@ -7,30 +7,37 @@ module Sequence
|
|
7
7
|
# Keys are used to sign transactions.
|
8
8
|
class Key < ResponseObject
|
9
9
|
# @!attribute [r] id
|
10
|
-
#
|
10
|
+
# Unique identifier of the key, based on the public key material itself.
|
11
11
|
# @return [String]
|
12
12
|
attrib :id
|
13
13
|
|
14
14
|
# @!attribute [r] alias
|
15
|
-
#
|
15
|
+
# Unique, user-specified identifier of the key.
|
16
16
|
# @return [String]
|
17
17
|
attrib :alias
|
18
18
|
|
19
19
|
class ClientModule < Sequence::ClientModule
|
20
|
-
|
21
20
|
# Creates a key.
|
22
|
-
# @param [Hash] opts
|
23
|
-
#
|
21
|
+
# @param [Hash] opts
|
22
|
+
# Options hash
|
23
|
+
# @option opts [String] alias
|
24
|
+
# Unique, user-specified identifier of the key.
|
24
25
|
# @return [Key]
|
25
26
|
def create(opts = {})
|
27
|
+
validate_inclusion_of!(opts, :alias)
|
26
28
|
Key.new(client.session.request('create-key', opts))
|
27
29
|
end
|
28
30
|
|
29
31
|
# Executes a query, returning an enumerable over individual keys.
|
30
|
-
# @param [Hash] opts
|
31
|
-
#
|
32
|
+
# @param [Hash] opts
|
33
|
+
# Options hash
|
34
|
+
# @option opts [Array<String>] aliases
|
35
|
+
# A list of aliases of keys to retrieve.
|
36
|
+
# @option opts [Integer>] page_size
|
37
|
+
# The number of items to return in the result set.
|
32
38
|
# @return [Query]
|
33
39
|
def query(opts = {})
|
40
|
+
validate_inclusion_of!(opts, :aliases, :page_size, :after)
|
34
41
|
Query.new(client, opts)
|
35
42
|
end
|
36
43
|
end
|
data/lib/sequence/page.rb
CHANGED
data/lib/sequence/query.rb
CHANGED
@@ -4,6 +4,7 @@ module Sequence
|
|
4
4
|
class Query
|
5
5
|
include ::Enumerable
|
6
6
|
|
7
|
+
# @private
|
7
8
|
# @return [Client]
|
8
9
|
attr_reader :client
|
9
10
|
|
@@ -29,23 +30,25 @@ module Sequence
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
-
PageQuery.new(client, query, method(:fetch), method(:translate))
|
34
|
-
end
|
35
|
-
|
36
|
-
# @abstract
|
33
|
+
# @private
|
37
34
|
def fetch(query)
|
38
35
|
raise NotImplementedError
|
39
36
|
end
|
40
37
|
|
41
38
|
# Overwrite to translate API response data to a different Ruby object.
|
42
|
-
# @
|
39
|
+
# @private
|
43
40
|
def translate(response_object)
|
44
41
|
raise NotImplementedError
|
45
42
|
end
|
46
43
|
|
47
44
|
alias_method :all, :to_a
|
48
45
|
|
46
|
+
# @private
|
47
|
+
def pages
|
48
|
+
PageQuery.new(client, query, method(:fetch), method(:translate))
|
49
|
+
end
|
50
|
+
|
51
|
+
# @private
|
49
52
|
class PageQuery
|
50
53
|
include ::Enumerable
|
51
54
|
|
File without changes
|
data/lib/sequence/session.rb
CHANGED
@@ -5,6 +5,7 @@ require_relative './errors'
|
|
5
5
|
require_relative './version'
|
6
6
|
|
7
7
|
module Sequence
|
8
|
+
# @private
|
8
9
|
class Session
|
9
10
|
def initialize(opts)
|
10
11
|
@opts = opts
|
@@ -41,33 +42,24 @@ module Sequence
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def request(path, body = {})
|
44
|
-
request_full_resp(path, body)[:parsed_body]
|
45
|
+
request_full_resp(nil, path, body)[:parsed_body]
|
45
46
|
end
|
46
47
|
|
47
|
-
def request_full_resp(path, body={})
|
48
|
-
refresh!
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
parsed_body = JSON.parse(response.body)
|
61
|
-
rescue JSON::JSONError
|
62
|
-
raise JSONError.new(req_id, response)
|
48
|
+
def request_full_resp(id, path, body = {})
|
49
|
+
refresh!(id)
|
50
|
+
id ||= SecureRandom.hex(10)
|
51
|
+
@ledger_api.post(id, ledger_url(path), body) do |response|
|
52
|
+
# require that the response contains the Chain-Request-ID
|
53
|
+
# http header. Since the Sequence API will always set this
|
54
|
+
# header, its absence indicates that the request stopped at
|
55
|
+
# some intermediary like a proxy on the local network or
|
56
|
+
# a Sequence load balancer. This error will be retried by
|
57
|
+
# HttpWrapper.post.
|
58
|
+
req_id = response['Chain-Request-ID']
|
59
|
+
unless req_id.is_a?(String) && req_id.size > 0
|
60
|
+
raise InvalidRequestIDError.new(response)
|
63
61
|
end
|
64
62
|
end
|
65
|
-
if status / 100 != 2
|
66
|
-
klass = status == 401 ? UnauthorizedError : APIError
|
67
|
-
raise klass.new(parsed_body, response)
|
68
|
-
end
|
69
|
-
|
70
|
-
{parsed_body: parsed_body, response: response}
|
71
63
|
end
|
72
64
|
|
73
65
|
private
|
@@ -77,14 +69,13 @@ module Sequence
|
|
77
69
|
"/#{@team_name}/#{@ledger}/#{path}"
|
78
70
|
end
|
79
71
|
|
80
|
-
def refresh!
|
72
|
+
def refresh!(id)
|
81
73
|
return if @refresh_at > Time.now.to_i
|
82
74
|
|
83
75
|
result = if @refresh_method
|
84
76
|
@refresh_method.call(@macaroon)
|
85
77
|
else
|
86
|
-
|
87
|
-
JSON.parse(r.body)
|
78
|
+
@session_api.post(id, '/sessions/validate', macaroon: @macaroon)[:parsed_body]
|
88
79
|
end
|
89
80
|
|
90
81
|
@team_name = result['team_name']
|
data/lib/sequence/stats.rb
CHANGED
@@ -4,8 +4,8 @@ require_relative './query'
|
|
4
4
|
|
5
5
|
module Sequence
|
6
6
|
# An object describing summary information about a ledger.
|
7
|
+
# @private
|
7
8
|
class Stats < ResponseObject
|
8
|
-
|
9
9
|
# @!attribute [r] asset_count
|
10
10
|
# The number of assets in the ledger.
|
11
11
|
# @return [Integer]
|
@@ -28,6 +28,5 @@ module Sequence
|
|
28
28
|
Stats.new(client.session.request('stats'))
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
31
|
end
|
33
32
|
end
|
data/lib/sequence/transaction.rb
CHANGED
@@ -3,47 +3,50 @@ require 'securerandom'
|
|
3
3
|
require_relative './client_module'
|
4
4
|
require_relative './query'
|
5
5
|
require_relative './response_object'
|
6
|
+
require_relative './validations'
|
6
7
|
|
7
8
|
module Sequence
|
8
9
|
# A transaction is an atomic update to the state of the ledger. Transactions
|
9
10
|
# can issue new asset units, transfer of asset units from one account to
|
10
11
|
# another, and/or the retire asset units from an account.
|
11
12
|
class Transaction < ResponseObject
|
12
|
-
|
13
13
|
# @!attribute [r] id
|
14
|
-
#
|
14
|
+
# A unique ID.
|
15
15
|
# @return [String]
|
16
16
|
attrib :id
|
17
17
|
|
18
18
|
# @!attribute [r] timestamp
|
19
|
-
#
|
19
|
+
# Time of transaction.
|
20
20
|
# @return [Time]
|
21
21
|
attrib :timestamp, rfc3339_time: true
|
22
22
|
|
23
23
|
# @!attribute [r] sequence_number
|
24
|
-
#
|
24
|
+
# Sequence number of the transaction.
|
25
25
|
# @return [Integer]
|
26
26
|
attrib :sequence_number
|
27
27
|
|
28
28
|
# @!attribute [r] reference_data
|
29
|
-
#
|
29
|
+
# User-specified key-value data embedded into the transaction.
|
30
30
|
# @return [Hash]
|
31
31
|
attrib :reference_data
|
32
32
|
|
33
33
|
# @!attribute [r] actions
|
34
|
-
#
|
34
|
+
# List of actions taken by the transaction.
|
35
35
|
# @return [Array<Action>]
|
36
36
|
attrib(:actions) { |raw| raw.map { |v| Action.new(v) } }
|
37
37
|
|
38
38
|
# @!attribute [r] contracts
|
39
|
-
#
|
39
|
+
# List of contracts created by the transaction.
|
40
40
|
# @return [Array<Contract>]
|
41
41
|
attrib(:contracts) { |raw| raw.map { |v| Contract.new(v) } }
|
42
42
|
|
43
43
|
class ClientModule < Sequence::ClientModule
|
44
44
|
# Builds, signs, and submits a transaction.
|
45
|
-
# @param [Builder] builder
|
46
|
-
#
|
45
|
+
# @param [Builder] builder
|
46
|
+
# Builder object with actions defined. If provided, overrides block
|
47
|
+
# parameter.
|
48
|
+
# @yield Block defining transaction actions. A {Builder} object is passed
|
49
|
+
# as the only parameter.
|
47
50
|
# @return Transaction
|
48
51
|
def transact(builder = nil, &block)
|
49
52
|
if builder.nil?
|
@@ -55,18 +58,25 @@ module Sequence
|
|
55
58
|
'/sign-transaction',
|
56
59
|
transaction: tpl,
|
57
60
|
)
|
58
|
-
Transaction.new(
|
59
|
-
'submit-transaction',
|
60
|
-
|
61
|
-
))
|
61
|
+
Transaction.new(
|
62
|
+
client.session.request('submit-transaction', transaction: tpl),
|
63
|
+
)
|
62
64
|
end
|
63
65
|
|
64
66
|
# Executes a query, returning an enumerable over individual transactions.
|
65
67
|
# @param [Hash] opts Options hash
|
66
|
-
# @option opts [String] filter
|
67
|
-
#
|
68
|
-
# @option opts [Integer]
|
69
|
-
#
|
68
|
+
# @option opts [String] filter
|
69
|
+
# A filter expression.
|
70
|
+
# @option opts [Array<String|Integer>] filter_params
|
71
|
+
# A list of values that will be interpolated into the filter expression.
|
72
|
+
# @option opts [Integer] start_time
|
73
|
+
# A Unix timestamp in milliseconds of the earliest transaction timestamp
|
74
|
+
# to include in the query results.
|
75
|
+
# @option opts [Integer] end_time
|
76
|
+
# A Unix timestamp in milliseconds of the most recent transaction
|
77
|
+
# timestamp to include in the query results.
|
78
|
+
# @option opts [Integer>] page_size
|
79
|
+
# The number of items to return in the result set.
|
70
80
|
# @return [Query]
|
71
81
|
def query(opts = {})
|
72
82
|
Query.new(client, opts)
|
@@ -86,72 +96,80 @@ module Sequence
|
|
86
96
|
# An action taken by a transaction.
|
87
97
|
class Action < ResponseObject
|
88
98
|
# @!attribute [r] type
|
89
|
-
#
|
99
|
+
# The type of the action. Possible values are "issue", "transfer" and
|
100
|
+
# "retire".
|
90
101
|
# @return [String]
|
91
102
|
attrib :type
|
92
103
|
|
93
104
|
# @!attribute [r] asset_id
|
94
|
-
#
|
105
|
+
# The id of the action's asset.
|
95
106
|
# @return [String]
|
96
107
|
attrib :asset_id
|
97
108
|
|
98
109
|
# @!attribute [r] asset_alias
|
99
|
-
#
|
110
|
+
# The alias of the action's asset.
|
100
111
|
# @return [String]
|
101
112
|
attrib :asset_alias
|
102
113
|
|
103
114
|
# @!attribute [r] asset_tags
|
104
|
-
#
|
115
|
+
# The tags of the action's asset.
|
105
116
|
# @return [Hash]
|
106
117
|
attrib :asset_tags
|
107
118
|
|
108
119
|
# @!attribute [r] amount
|
109
|
-
#
|
120
|
+
# The number of asset units issues, transferred, or retired.
|
110
121
|
# @return [Integer]
|
111
122
|
attrib :amount
|
112
123
|
|
113
124
|
# @!attribute [r] source_account_id
|
114
|
-
#
|
125
|
+
# The ID of the account serving as the source of asset units. Null for
|
126
|
+
# issuances.
|
115
127
|
# @return [String]
|
116
128
|
attrib :source_account_id
|
117
129
|
|
118
130
|
# @!attribute [r] source_account_alias
|
119
|
-
#
|
131
|
+
# The alias of the account serving as the source of asset units. Null
|
132
|
+
# for issuances.
|
120
133
|
# @return [String]
|
121
134
|
attrib :source_account_alias
|
122
135
|
|
123
136
|
# @!attribute [r] source_account_tags
|
124
|
-
#
|
137
|
+
# The tags of the account serving as the source of asset units. Null for
|
138
|
+
# issuances.
|
125
139
|
# @return [String]
|
126
140
|
attrib :source_account_tags
|
127
141
|
|
128
142
|
# @!attribute [r] destination_account_id
|
129
|
-
#
|
143
|
+
# The ID of the account receiving the asset units. Null for retirements.
|
130
144
|
# @return [String]
|
131
145
|
attrib :destination_account_id
|
132
146
|
|
133
147
|
# @!attribute [r] destination_account_alias
|
134
|
-
#
|
148
|
+
# The alias of the account receiving the asset units. Null for
|
149
|
+
# retirements.
|
135
150
|
# @return [String]
|
136
151
|
attrib :destination_account_alias
|
137
152
|
|
138
153
|
# @!attribute [r] destination_account_tags
|
139
|
-
#
|
154
|
+
# The tags of the account receiving the asset units. Null for
|
155
|
+
# retirements.
|
140
156
|
# @return [String]
|
141
157
|
attrib :destination_account_tags
|
142
158
|
|
143
159
|
# @!attribute [r] reference_data
|
144
|
-
#
|
160
|
+
# User-specified, key-value data embedded into the action.
|
145
161
|
# @return [Hash]
|
146
162
|
attrib :reference_data
|
147
163
|
end
|
148
164
|
|
149
165
|
# A configuration object for creating and submitting transactions.
|
150
166
|
class Builder
|
167
|
+
include Sequence::Validations
|
168
|
+
|
151
169
|
attr_accessor :reference_data
|
152
170
|
|
153
171
|
def initialize(&block)
|
154
|
-
|
172
|
+
yield(self) if block
|
155
173
|
end
|
156
174
|
|
157
175
|
def actions
|
@@ -170,78 +188,165 @@ module Sequence
|
|
170
188
|
end
|
171
189
|
|
172
190
|
# Adds an action to a transaction builder.
|
173
|
-
# @param [Hash]
|
191
|
+
# @param [Hash] opts
|
192
|
+
# Action parameters.
|
174
193
|
# @return [Builder]
|
175
|
-
def add_action(
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
actions <<
|
194
|
+
def add_action(opts = {})
|
195
|
+
if opts[:amount].nil?
|
196
|
+
raise ArgumentError, ':amount must be provided'
|
197
|
+
end
|
198
|
+
actions << opts
|
180
199
|
self
|
181
200
|
end
|
182
201
|
|
183
202
|
# Issues new units of an asset to a destination account.
|
184
203
|
#
|
185
|
-
# @param [Hash]
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
# @option
|
204
|
+
# @param [Hash] opts
|
205
|
+
# Options hash
|
206
|
+
# @option opts [Integer] :amount
|
207
|
+
# Amount of the asset to be issued.
|
208
|
+
# @option opts [String] :asset_id
|
209
|
+
# ID of the asset to be issued. You must specify either an ID or an
|
210
|
+
# alias.
|
211
|
+
# @option opts [String] :asset_alias
|
212
|
+
# Asset alias of the asset to be issued. You must specify either an ID
|
213
|
+
# or an alias.
|
214
|
+
# @option opts [String] :destination_account_id
|
215
|
+
# ID of the account receiving the asset units. You must specify a
|
216
|
+
# destination account ID or alias.
|
217
|
+
# @option opts [String] :destination_account_alias
|
218
|
+
# Alias of the account receiving the asset units. You must specify a
|
219
|
+
# destination account ID or alias.
|
220
|
+
# @option opts [Hash] :reference_data
|
221
|
+
# Reference data for the action.
|
196
222
|
# @return [Builder]
|
197
|
-
def issue(
|
198
|
-
|
223
|
+
def issue(opts = {})
|
224
|
+
validate_inclusion_of!(
|
225
|
+
opts,
|
226
|
+
:amount,
|
227
|
+
:asset_id,
|
228
|
+
:asset_alias,
|
229
|
+
:destination_account_id,
|
230
|
+
:destination_account_alias,
|
231
|
+
:reference_data,
|
232
|
+
)
|
233
|
+
validate_either!(opts, :asset_id, :asset_alias)
|
234
|
+
validate_either!(
|
235
|
+
opts,
|
236
|
+
:destination_account_id,
|
237
|
+
:destination_account_alias,
|
238
|
+
)
|
239
|
+
add_action(opts.merge(type: :issue))
|
199
240
|
end
|
200
241
|
|
201
|
-
# Moves units of an asset from a source (an account or contract) to a
|
242
|
+
# Moves units of an asset from a source (an account or contract) to a
|
243
|
+
# destination account.
|
202
244
|
#
|
203
|
-
# @param [Hash]
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
# @option
|
211
|
-
#
|
212
|
-
#
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
219
|
-
# @option
|
220
|
-
#
|
245
|
+
# @param [Hash] opts
|
246
|
+
# Options hash
|
247
|
+
# @option opts [Integer] :amount
|
248
|
+
# Amount of the asset to be transferred.
|
249
|
+
# @option opts [String] :asset_id
|
250
|
+
# ID of the asset to be transferred. You must specify either an ID or an
|
251
|
+
# alias.
|
252
|
+
# @option opts [String] :asset_alias
|
253
|
+
# Asset alias of the asset to be transferred. You must specify either an
|
254
|
+
# ID or an alias.
|
255
|
+
# @option opts [String] :source_account_id
|
256
|
+
# ID of the account serving as the source of asset units. You must
|
257
|
+
# specify a source account ID, account alias, or contract ID.
|
258
|
+
# @option opts [String] :source_account_alias
|
259
|
+
# Alias of the account serving as the source of asset units You must
|
260
|
+
# specify a source account ID, account alias, or contract ID.
|
261
|
+
# @option opts [String] :source_contract_id
|
262
|
+
# ID of the contract serving as the source of asset units. You must
|
263
|
+
# specify a source account ID, account alias, or contract ID.
|
264
|
+
# @option opts [String] :destination_account_id
|
265
|
+
# ID of the account receiving the asset units. You must specify a
|
266
|
+
# destination account ID or alias.
|
267
|
+
# @option opts [String] :destination_account_alias
|
268
|
+
# Alias of the account receiving the asset units. You must specify a
|
269
|
+
# destination account ID or alias.
|
270
|
+
# @option opts [Hash] :reference_data
|
271
|
+
# reference data for the action.
|
272
|
+
# @option opts [Hash] :change_reference_data
|
273
|
+
# reference data for the change contract.
|
221
274
|
# @return [Builder]
|
222
|
-
def transfer(
|
223
|
-
|
275
|
+
def transfer(opts = {})
|
276
|
+
validate_inclusion_of!(
|
277
|
+
opts,
|
278
|
+
:amount,
|
279
|
+
:asset_id,
|
280
|
+
:asset_alias,
|
281
|
+
:source_account_id,
|
282
|
+
:source_account_alias,
|
283
|
+
:source_contract_id,
|
284
|
+
:destination_account_id,
|
285
|
+
:destination_account_alias,
|
286
|
+
:reference_data,
|
287
|
+
:change_reference_data,
|
288
|
+
)
|
289
|
+
validate_either!(opts, :asset_id, :asset_alias)
|
290
|
+
validate_either!(
|
291
|
+
opts,
|
292
|
+
:source_account_id,
|
293
|
+
:source_account_alias,
|
294
|
+
:source_contract_id,
|
295
|
+
)
|
296
|
+
validate_either!(
|
297
|
+
opts,
|
298
|
+
:destination_account_id,
|
299
|
+
:destination_account_alias,
|
300
|
+
)
|
301
|
+
add_action(opts.merge(type: :transfer))
|
224
302
|
end
|
225
303
|
|
226
|
-
# Takes units of an asset from a source (an account or contract) and
|
304
|
+
# Takes units of an asset from a source (an account or contract) and
|
305
|
+
# retires them.
|
227
306
|
#
|
228
|
-
# @param [Hash]
|
229
|
-
# @option
|
230
|
-
#
|
231
|
-
# @option
|
232
|
-
#
|
233
|
-
#
|
234
|
-
#
|
235
|
-
#
|
236
|
-
#
|
237
|
-
# @option
|
238
|
-
#
|
239
|
-
#
|
240
|
-
# @option
|
241
|
-
#
|
307
|
+
# @param [Hash] opts Options hash
|
308
|
+
# @option opts [Integer] :amount
|
309
|
+
# Amount of the asset to be retired.
|
310
|
+
# @option opts [String] :asset_id
|
311
|
+
# ID of the asset to be retired. You must specify either an ID or an
|
312
|
+
# alias.
|
313
|
+
# @option opts [String] :asset_alias
|
314
|
+
# Asset alias of the asset to be retired. You must specify either an ID
|
315
|
+
# or an alias.
|
316
|
+
# @option opts [String] :source_account_id
|
317
|
+
# ID of the account serving as the source of asset units. You must
|
318
|
+
# specify a source account ID, account alias, or contract ID.
|
319
|
+
# @option opts [String] :source_account_alias
|
320
|
+
# Alias of the account serving as the source of asset units You must
|
321
|
+
# specify a source account ID, account alias, or contract ID.
|
322
|
+
# @option opts [String] :source_contract_id
|
323
|
+
# ID of the contract serving as the source of asset units. You must
|
324
|
+
# specify a source account ID, account alias, or contract ID.
|
325
|
+
# @option opts [Hash] :reference_data
|
326
|
+
# Reference data for the action.
|
327
|
+
# @option opts [Hash] :change_reference_data
|
328
|
+
# Reference data for the change contract.
|
242
329
|
# @return [Builder]
|
243
|
-
def retire(
|
244
|
-
|
330
|
+
def retire(opts = {})
|
331
|
+
validate_inclusion_of!(
|
332
|
+
opts,
|
333
|
+
:amount,
|
334
|
+
:asset_id,
|
335
|
+
:asset_alias,
|
336
|
+
:source_account_id,
|
337
|
+
:source_account_alias,
|
338
|
+
:source_contract_id,
|
339
|
+
:reference_data,
|
340
|
+
:change_reference_data,
|
341
|
+
)
|
342
|
+
validate_either!(opts, :asset_id, :asset_alias)
|
343
|
+
validate_either!(
|
344
|
+
opts,
|
345
|
+
:source_account_id,
|
346
|
+
:source_account_alias,
|
347
|
+
:source_contract_id,
|
348
|
+
)
|
349
|
+
add_action(opts.merge(type: :retire))
|
245
350
|
end
|
246
351
|
end
|
247
352
|
end
|