chain-sdk 1.0.4 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b8ac599da94e7d0794f9bf0e81248a85bc36c31
4
- data.tar.gz: 661e47cb08a1f23f3754dc26ab3fcad0db72ce42
3
+ metadata.gz: 54f23f819a849083b45080882adef93353e12d3b
4
+ data.tar.gz: e88714cdcf76f624b38965d69edb32349aabce1d
5
5
  SHA512:
6
- metadata.gz: d85b62e5d945073c8b905e82a2e5ffaa2d41156d1edf272824363c0ce44407d51caa1084bbc1e383c7c08ae3c888f9474b1f32a2f0f78683ab9f1d9cee8e3b42
7
- data.tar.gz: 5be665c96c11b45be2b78282cec50550f12a539b007c14efd5d80a80cc987dd15ab81caaf5fa046974184cc21969b90a6eccaa0a709895be5c01d6e8cb7d3a38
6
+ metadata.gz: 16129701fb041747f5605831493653076ba29155c1879ebd0a504ea66b98db03053cacc5c8d62603aae60f7dd39756c6521c182c3124c19634a4ec4e9265a6ba
7
+ data.tar.gz: 4cff47a5f44808ae2592904e6b8a7d2a41032a92bf2a53ef7ec4e28123b889831175a926794d936d4d4c20250e44a3f3b740f2bd2bfa319f51ac2e3a2c71262f
data/README.md CHANGED
@@ -4,14 +4,12 @@
4
4
 
5
5
  ### Get the gem
6
6
 
7
- The Ruby SDK is available [via Rubygems](https://rubygems.org/gems/chain-sdk). Make sure to use the most recent version whose major and minor components (`major.minor.x`) match your version of Chain Core.
8
-
9
- Ruby 2.0 or greater is required. We strongly recommend upgrading to Ruby 2.1 or greater, as [Ruby 2.0 has reached end-of-life](https://www.ruby-lang.org/en/downloads/branches/) and will no longer receive security updates and bugfixes.
7
+ The Ruby SDK is available [via Rubygems](https://rubygems.org/gems/chain-sdk). Make sure to use the most recent version whose major and minor components (`major.minor.x`) match your version of Chain Core. Ruby 2.1 or greater is required.
10
8
 
11
9
  For most applications, you can simply add the following to your `Gemfile`:
12
10
 
13
11
  ```
14
- gem 'chain-sdk', '~> 1.0.3', require: 'chain'
12
+ gem 'chain-sdk', '~> 1.1.0', require: 'chain'
15
13
  ```
16
14
 
17
15
  ### In your code
@@ -23,22 +23,25 @@ module Chain
23
23
  # @!attribute [r] created_at
24
24
  # Timestamp of token creation.
25
25
  # @return [Time]
26
- attrib(:created_at) { |raw| Time.parse(raw) }
26
+ attrib :created_at, rfc3339_time: true
27
27
 
28
28
  class ClientModule < Chain::ClientModule
29
29
 
30
30
  # Create client/network access token.
31
31
  # @param [Hash] opts
32
- # @option params [String] :type Type specifiying the type of access token to be created.
32
+ # @option opts [String] :type Type specifiying the type of access token to be created.
33
33
  # You must specify either 'client' or 'network'.
34
- # @option params [String] :id ID specifying the ID of newly created access token.
34
+ # @option opts [String] :id ID specifying the ID of newly created access token.
35
35
  # You must specify a unique ID for access token.
36
36
  # @return [AccessToken]
37
37
  def create(opts = {})
38
38
  AccessToken.new(client.conn.request('create-access-token', opts))
39
39
  end
40
40
 
41
- # @param [Hash] opts
41
+ # Get all access tokens sorted by descending creation time,
42
+ # optionally filtered by type.
43
+ # @param [Hash] opts Filtering information
44
+ # @option opts [String] :type Type of access tokens to return; either 'client' or 'network'.
42
45
  # @return [Query]
43
46
  def query(opts = {})
44
47
  Query.new(client, opts)
@@ -2,6 +2,7 @@ require_relative './client_module'
2
2
  require_relative './control_program'
3
3
  require_relative './errors'
4
4
  require_relative './query'
5
+ require_relative './receiver'
5
6
  require_relative './response_object'
6
7
 
7
8
  module Chain
@@ -34,20 +35,25 @@ module Chain
34
35
  attrib :tags
35
36
 
36
37
  class ClientModule < Chain::ClientModule
37
- # @param [Hash] opts
38
+ # @param [Hash] opts Options hash specifiying account creation details.
39
+ # @option opts [String] alias User specified, unique identifier.
40
+ # @option opts [Array<String>] root_xpubs The list of keys used to create control programs under the account.
41
+ # @option opts [Integer] quorum The number of keys required to sign transactions for the account.
42
+ # @option opts [Hash] tags User-specified tag structure for the account.
38
43
  # @return [Account]
39
44
  def create(opts)
40
45
  opts = {client_token: SecureRandom.uuid}.merge(opts)
41
46
  client.conn.singleton_batch_request('create-account', [opts]) { |item| Account.new(item) }
42
47
  end
43
48
 
44
- # @param [Array<Hash>] opts
45
- # @return [Array<Account>]
49
+ # @param [Array<Hash>] opts An array of options hashes. See {#create} for a description of the hash structure.
50
+ # @return [BatchResponse<Account>]
46
51
  def create_batch(opts)
47
52
  opts = opts.map { |i| {client_token: SecureRandom.uuid}.merge(i) }
48
53
  client.conn.batch_request('create-account', opts) { |item| Account.new(item) }
49
54
  end
50
55
 
56
+ # @deprecated (as of version 1.1) Use {#create_receiver} instead.
51
57
  # @param [Hash] opts
52
58
  # @return [ControlProgram]
53
59
  def create_control_program(opts = {})
@@ -63,10 +69,31 @@ module Chain
63
69
  ) { |item| ControlProgram.new(item) }
64
70
  end
65
71
 
66
- # @param [Hash] query
72
+ # Creates a new receiver under the specified account.
73
+ #
74
+ # @param opts [Hash] Options hash
75
+ # @option opts [String] :account_alias Unique alias for an account. Either account_alias or account_id is required.
76
+ # @option opts [String] :account_id Unique ID for an account. Either account_alias or account_id is required.
77
+ # @option opts [String] :expires_at An RFC3339 timestamp indicating when the receiver will expire. Defaults to 30 days in the future.
78
+ # @return [Receiver]
79
+ def create_receiver(opts)
80
+ client.conn.singleton_batch_request('create-account-receiver', [opts]) { |item| Receiver.new(item) }
81
+ end
82
+
83
+ # Creates new receivers under the specified accounts.
84
+ #
85
+ # @param opts_list [Array<Hash>] Array of options hashes. See {#create_receiver} for a description of the hash structure.
86
+ # @return [BatchResponse<Receiver>]
87
+ def create_receiver_batch(opts_list)
88
+ client.conn.batch_request('create-account-receiver', opts_list) { |item| Receiver.new(item) }
89
+ end
90
+
91
+ # @param [Hash] opts Filtering information
92
+ # @option opts [String] filter Filter string, see {https://chain.com/docs/core/build-applications/queries}.
93
+ # @option opts [Array<String|Integer>] filter_params Parameter values for filter string (if needed).
67
94
  # @return [Query]
68
- def query(query = {})
69
- Query.new(client, query)
95
+ def query(opts = {})
96
+ Query.new(client, opts)
70
97
  end
71
98
  end
72
99
 
@@ -51,24 +51,31 @@ module Chain
51
51
  attrib :is_local
52
52
 
53
53
  class ClientModule < Chain::ClientModule
54
- # @param [Hash] opts
54
+ # @param [Hash] opts Options hash specifiying asset creation details.
55
+ # @option opts [String] alias User specified, unique identifier.
56
+ # @option opts [Array<String>] root_xpubs The list of keys used to create the issuance program for the asset.
57
+ # @option opts [Integer] quorum The number of keys required to issue units of the asset.
58
+ # @option opts [Hash] tags User-specified, arbitrary/unstructured data local to the asset's originating core.
59
+ # @option opts [Hash] definition User-specified, arbitrary/unstructured data visible across blockchain networks.
55
60
  # @return [Asset]
56
61
  def create(opts)
57
62
  opts = {client_token: SecureRandom.uuid}.merge(opts)
58
63
  client.conn.singleton_batch_request('create-asset', [opts]) { |item| Asset.new(item) }
59
64
  end
60
65
 
61
- # @param [Hash] opts
62
- # @return [Array<Asset>]
66
+ # @param [Array<Hash>] opts An array of options hashes. See {#create} for a description of the hash structure.
67
+ # @return [BatchResponse<Asset>]
63
68
  def create_batch(opts)
64
69
  opts = opts.map { |i| {client_token: SecureRandom.uuid}.merge(i) }
65
70
  client.conn.batch_request('create-asset', opts) { |item| Asset.new(item) }
66
71
  end
67
72
 
68
- # @param [Hash] query
73
+ # @param [Hash] opts Filtering information
74
+ # @option opts [String] filter Filter string, see {https://chain.com/docs/core/build-applications/queries}.
75
+ # @option opts [Array<String|Integer>] filter_params Parameter values for filter string (if needed).
69
76
  # @return [Query]
70
- def query(query = {})
71
- Query.new(client, query)
77
+ def query(opts = {})
78
+ Query.new(client, opts)
72
79
  end
73
80
  end
74
81
 
@@ -16,10 +16,14 @@ module Chain
16
16
  attrib :sum_by
17
17
 
18
18
  class ClientModule < Chain::ClientModule
19
- # @param [Hash] query
19
+ # @param [Hash] opts Filtering information
20
+ # @option opts [String] filter Filter string, see {https://chain.com/docs/core/build-applications/queries}.
21
+ # @option opts [Array<String|Integer>] filter_params Parameter values for filter string (if needed).
22
+ # @option opts [Array<String>] sum_by List of unspent output attributes to sum by.
23
+ # @option opts [Integer] timestamp A millisecond Unix timestamp. By using this parameter, you can perform queries that reflect the state of the blockchain at different points in time.
20
24
  # @return [Query]
21
- def query(query = {})
22
- Query.new(client, query)
25
+ def query(opts = {})
26
+ Query.new(client, opts)
23
27
  end
24
28
  end
25
29
 
@@ -18,4 +18,12 @@ module Chain
18
18
 
19
19
  attr_reader :successes, :errors, :response
20
20
  end
21
+
22
+ private
23
+
24
+ def ensure_key_sorting(h)
25
+ sorted = h.keys.sort
26
+ return h if sorted == h.keys
27
+ sorted.reduce({}) { |memo, k| memo[k] = h[k]; memo }
28
+ end
21
29
  end
@@ -33,7 +33,7 @@ module Chain
33
33
 
34
34
  # @!attribute [r] configured_at
35
35
  # @return [Time]
36
- attrib(:configured_at) { |raw| Time.parse(raw) }
36
+ attrib :configured_at, rfc3339_time: true
37
37
 
38
38
  # @!attribute [r] is_signer
39
39
  # @return [Boolean]
@@ -43,7 +43,7 @@ module Chain
43
43
  # @return [Boolean]
44
44
  attrib :is_generator
45
45
 
46
- # @!attribute [r] is_generator
46
+ # @!attribute [r] generator_url
47
47
  # @return [String]
48
48
  attrib :generator_url
49
49
 
@@ -65,7 +65,7 @@ module Chain
65
65
 
66
66
  # @!attribute [r] generator_block_height_fetched_at
67
67
  # @return [Time]
68
- attrib(:generator_block_height_fetched_at) { |raw| Time.parse(raw) }
68
+ attrib :generator_block_height_fetched_at, rfc3339_time: true
69
69
 
70
70
  # @!attribute [r] is_production
71
71
  # @return [Boolean]
@@ -105,16 +105,25 @@ module Chain
105
105
  end
106
106
 
107
107
  class ClientModule < Chain::ClientModule
108
+ # Reset specified Chain Core.
109
+ # @param [Boolean] everything If `true`, all objects including access tokens and MockHSM keys will be deleted. If `false`, then access tokens and MockHSM keys will be preserved.
108
110
  # @return [void]
109
111
  def reset(everything: false)
110
112
  client.conn.request('reset', {everything: everything})
111
113
  end
112
114
 
115
+ # Configure specified Chain Core.
116
+ # @param [Hash] opts Options for configuring Chain Core.
117
+ # @option opts [Boolean] is_generator Whether the local core will be a block generator for the blockchain; i.e., you are starting a new blockchain on the local core. `false` if you are connecting to a pre-existing blockchain.
118
+ # @option opts [String] generator_url A URL for the block generator. Required if `isGenerator` is false.
119
+ # @option opts [String] generator_access_token A network access token provided by administrators of the block generator. Required if `isGenerator` is false.
120
+ # @option opts [String] blockchain_id The unique ID of the generator's blockchain. Required if `isGenerator` is false.
113
121
  # @return [void]
114
122
  def configure(opts)
115
123
  client.conn.request('configure', opts)
116
124
  end
117
125
 
126
+ # Get info on specified Chain Core.
118
127
  # @return [Info]
119
128
  def info
120
129
  Info.new(client.conn.request('info'))
@@ -1,6 +1,7 @@
1
1
  require_relative './response_object'
2
2
 
3
3
  module Chain
4
+ # @deprecated (as of version 1.1) Use {Receiver} instead.
4
5
  class ControlProgram < ResponseObject
5
6
  # @!attribute [r] control_program
6
7
  # Hex-encoded string representation of the control program.
@@ -10,6 +10,9 @@ module Chain
10
10
  @xpubs_by_signer = {}
11
11
  end
12
12
 
13
+ # Add a new key/signer pair to the HSM signer.
14
+ # @param [MockHsm::Key || String] xpub_or_key An object with an xpub key, or an xpub as a string.
15
+ # @param [Connection] signer_conn Authenticated connection to a specific HSM instance.
13
16
  def add_key(xpub_or_key, signer_conn)
14
17
  xpub = xpub_or_key.is_a?(MockHSM::Key) ? xpub_or_key.xpub : xpub_or_key
15
18
  @xpubs_by_signer[signer_conn] ||= []
@@ -17,6 +20,8 @@ module Chain
17
20
  @xpubs_by_signer[signer_conn].uniq!
18
21
  end
19
22
 
23
+ # Sign a single transaction
24
+ # @param [Hash] tx_template A single transaction template.
20
25
  def sign(tx_template)
21
26
  return tx_template if @xpubs_by_signer.empty?
22
27
 
@@ -31,6 +36,8 @@ module Chain
31
36
  tx_template
32
37
  end
33
38
 
39
+ # Sign a batch of transactions
40
+ # @param [Array<Hash>] tx_templates Array of transaction templates.
34
41
  def sign_batch(tx_templates)
35
42
  if @xpubs_by_signer.empty?
36
43
  # Treat all templates as if signed successfully.
@@ -12,6 +12,7 @@ module Chain
12
12
  @keys_module ||= Key::ClientModule.new(client)
13
13
  end
14
14
 
15
+ # MockHSM signer connection.
15
16
  # @return [Connection]
16
17
  def signer_conn
17
18
  return @signer_conn if @signer_conn
@@ -37,16 +38,18 @@ module Chain
37
38
  class ClientModule < Chain::ClientModule
38
39
 
39
40
  # Creates a key object.
40
- # @param [Hash] opts
41
+ # @param [Hash] opts Parameters for MockHSM key creation.
42
+ # @option opts [String] alias User specified, unique identifier.
41
43
  # @return [Key]
42
44
  def create(opts = {})
43
45
  Key.new(client.conn.request('mockhsm/create-key', opts))
44
46
  end
45
47
 
46
- # @param [Hash] query
48
+ # @param [Hash] opts Filtering information
49
+ # @option opts [Array<String>] aliases Optional list of requested aliases, max 200.
47
50
  # @return [Query]
48
- def query(query = {})
49
- Query.new(client, query)
51
+ def query(opts = {})
52
+ Query.new(client, opts)
50
53
  end
51
54
  end
52
55
 
@@ -0,0 +1,15 @@
1
+ require_relative './response_object'
2
+
3
+ module Chain
4
+ class Receiver < ResponseObject
5
+ # @!attribute [r] control_program
6
+ # The underlying control program that will be used in transactions paying to this receiver.
7
+ # @return [String]
8
+ attrib :control_program
9
+
10
+ # @!attribute [r] expires_at
11
+ # A timestamp indicating when the receiver will expire.
12
+ # @return [Time]
13
+ attrib :expires_at, rfc3339_time: true
14
+ end
15
+ end
@@ -18,7 +18,12 @@ module Chain
18
18
  end
19
19
 
20
20
  def to_json(opts = nil)
21
- to_h.to_json(opts)
21
+ h = to_h.reduce({}) do |memo, (k, v)|
22
+ memo[k] = self.class.detranslate(k, v)
23
+ memo
24
+ end
25
+
26
+ h.to_json
22
27
  end
23
28
 
24
29
  def [](attrib_name)
@@ -41,8 +46,9 @@ module Chain
41
46
  end
42
47
 
43
48
  # @!visibility private
44
- def self.attrib(attrib_name, &translate)
45
- attrib_opts[attrib_name.to_sym] = {translate: translate}
49
+ def self.attrib(attrib_name, opts = {}, &translate)
50
+ opts[:translate] = translate
51
+ attrib_opts[attrib_name.to_sym] = opts
46
52
  attr_accessor attrib_name
47
53
  end
48
54
 
@@ -55,6 +61,8 @@ module Chain
55
61
  def self.translate(attrib_name, raw_value)
56
62
  attrib_name = attrib_name.to_sym
57
63
  opts = attrib_opts[attrib_name]
64
+
65
+ return Time.parse(raw_value) if opts[:rfc3339_time]
58
66
  return raw_value if opts[:translate].nil?
59
67
 
60
68
  begin
@@ -64,18 +72,45 @@ module Chain
64
72
  end
65
73
  end
66
74
 
75
+ # @!visibility private
76
+ def self.detranslate(attrib_name, raw_value)
77
+ opts = attrib_opts.fetch(attrib_name, {})
78
+
79
+ if opts[:rfc3339_time]
80
+ begin
81
+ return raw_value.to_datetime.rfc3339
82
+ rescue => e
83
+ raise DetranslateError.new(attrib_name, raw_value, e)
84
+ end
85
+ end
86
+
87
+ raw_value
88
+ end
89
+
67
90
  class TranslateError < StandardError
68
91
  attr_reader :attrib_name
69
92
  attr_reader :raw_value
70
93
  attr_reader :source
71
94
 
72
95
  def initialize(attrib_name, raw_value, source)
73
- super "Translation error for attrib #{attrib_name}: #{source}"
96
+ super "Error translating attrib #{attrib_name}: #{source}"
74
97
  @attrib_name = attrib_name
75
98
  @raw_value = raw_value
76
99
  @source = source
77
100
  end
78
101
  end
79
102
 
103
+ class DetranslateError < StandardError
104
+ attr_reader :attrib_name
105
+ attr_reader :raw_value
106
+ attr_reader :source
107
+
108
+ def initialize(attrib_name, raw_value, source)
109
+ super "Error de-translating attrib #{attrib_name}: #{source}"
110
+ @attrib_name = attrib_name
111
+ @raw_value = raw_value
112
+ @source = source
113
+ end
114
+ end
80
115
  end
81
116
  end
@@ -1,5 +1,4 @@
1
1
  require 'securerandom'
2
- require 'time'
3
2
 
4
3
  require_relative './client_module'
5
4
  require_relative './query'
@@ -16,7 +15,7 @@ module Chain
16
15
  # @!attribute [r] timestamp
17
16
  # Time of transaction.
18
17
  # @return [Time]
19
- attrib(:timestamp) { |raw| Time.parse(raw) }
18
+ attrib :timestamp, rfc3339_time: true
20
19
 
21
20
  # @!attribute [r] block_id
22
21
  # Unique identifier, or block hash, of the block containing a transaction.
@@ -54,9 +53,10 @@ module Chain
54
53
  attrib(:outputs) { |raw| raw.map { |v| Output.new(v) } }
55
54
 
56
55
  class ClientModule < Chain::ClientModule
57
- # @param [Builder] builder
58
- # @yield Block defining transaction actions.
59
- # @return [Template]
56
+ # Build an unsigned transaction from a set of actions.
57
+ # @param [Builder] builder Builder object with actions defined. If provided, overrides block parameter.
58
+ # @yield Block defining transaction actions. A {Builder} object is passed as the only parameter.
59
+ # @return [Template] Unsigned transaction template, or error.
60
60
  def build(builder = nil, &block)
61
61
  if builder.nil?
62
62
  builder = Builder.new(&block)
@@ -68,8 +68,9 @@ module Chain
68
68
  ) { |item| Template.new(item) }
69
69
  end
70
70
 
71
- # @param [Array<Builder>] builders
72
- # @return [Array<Template>]
71
+ # Build multiple unsigned transactions from multiple sets of actions.
72
+ # @param [Array<Builder>] builders Multiple builder objects with actions defined.
73
+ # @return [BatchResponse<Template>] Batch of unsigned transaction templates, or errors.
73
74
  def build_batch(builders)
74
75
  client.conn.batch_request(
75
76
  'build-transaction',
@@ -77,7 +78,8 @@ module Chain
77
78
  ) { |item| Template.new(item) }
78
79
  end
79
80
 
80
- # @param [Template] template
81
+ # Submit a signed transaction to the blockchain.
82
+ # @param [Template] template Signed transaction template.
81
83
  # @return [SubmitResponse]
82
84
  def submit(template)
83
85
  client.conn.singleton_batch_request(
@@ -86,8 +88,9 @@ module Chain
86
88
  ) { |item| SubmitResponse.new(item) }
87
89
  end
88
90
 
89
- # @param [Array<Template>] templates
90
- # @return [Array<SubmitResponse>]
91
+ # Submit multiple signed transactions to the blockchain.
92
+ # @param [Array<Template>] templates Array of signed transaction templates.
93
+ # @return [BatchResponse<SubmitResponse>]
91
94
  def submit_batch(templates)
92
95
  client.conn.batch_request(
93
96
  'submit-transaction',
@@ -95,10 +98,16 @@ module Chain
95
98
  ) { |item| SubmitResponse.new(item) }
96
99
  end
97
100
 
98
- # @param [Hash] query
101
+ # List all transactions, optionally filtered
102
+ # @param [Hash] opts Filtering information
103
+ # @option opts [String] filter Filter string, see {https://chain.com/docs/core/build-applications/queries}.
104
+ # @option opts [Array<String|Integer>] filter_params Parameter values for filter string (if needed).
105
+ # @option opts [Integer] start_time A Unix timestamp in milliseconds. When specified, only transactions with a block time greater than the start time will be returned.
106
+ # @option opts [Integer] end_time A Unix timestamp in milliseconds. When specified, only transactions with a block time less than the start time will be returned.
107
+ # @option opts [Integer] timeout A time in milliseconds after which a server timeout should occur. Defaults to 1000 (1 second).
99
108
  # @return [Query]
100
- def query(query = {})
101
- Query.new(client, query)
109
+ def query(opts = {})
110
+ Query.new(client, opts)
102
111
  end
103
112
  end
104
113
 
@@ -150,6 +159,12 @@ module Chain
150
159
  # @return [Integer]
151
160
  attrib :amount
152
161
 
162
+ # @!attribute [r] spent_output_id
163
+ # The id of the output consumed by this input. ID is nil if this is an issuance input.
164
+ # @return [String]
165
+ attrib :spent_output_id
166
+
167
+ # @deprecated (as of version 1.1) Use {#spent_output_id} instead.
153
168
  # @!attribute [r] spent_output
154
169
  # The output consumed by this input.
155
170
  # @return [SpentOutput]
@@ -172,6 +187,7 @@ module Chain
172
187
  # @return [String]
173
188
  attrib :account_tags
174
189
 
190
+ # @deprecated (as of version 1.1) Do not use this field.
175
191
  # @!attribute [r] input_witness
176
192
  # @return [String]
177
193
  attrib :input_witness
@@ -182,6 +198,7 @@ module Chain
182
198
  # @return [String]
183
199
  attrib :issuance_program
184
200
 
201
+ # @deprecated (as of version 1.1) Do not use this field.
185
202
  # @!attribute [r] control_program
186
203
  # @return [String]
187
204
  attrib :control_program
@@ -197,6 +214,7 @@ module Chain
197
214
  # @return [Boolean]
198
215
  attrib :is_local
199
216
 
217
+ # @deprecated (as of version 1.1)
200
218
  class SpentOutput < ResponseObject
201
219
  # @!attribute [r] transaction_id
202
220
  # Unique transaction identifier.
@@ -211,6 +229,11 @@ module Chain
211
229
  end
212
230
 
213
231
  class Output < ResponseObject
232
+ # @!attribute [r] id
233
+ # The id of the output.
234
+ # @return [String]
235
+ attrib :id
236
+
214
237
  # @!attribute [r] type
215
238
  # The type of the output.
216
239
  #
@@ -340,7 +363,7 @@ module Chain
340
363
  to_h.to_json(opts)
341
364
  end
342
365
 
343
- # Add an action to the tranasction builder
366
+ # Add an action to the transaction builder
344
367
  # @param [Hash] params Action parameters containing a type field and the
345
368
  # required parameters for that type
346
369
  # @return [Builder]
@@ -366,7 +389,7 @@ module Chain
366
389
 
367
390
  # Add an issuance action.
368
391
  # @param [Hash] params Action parameters
369
- # @option params [String] :asset_id Asset ID specifiying the asset to be issued.
392
+ # @option params [String] :asset_id Asset ID specifying the asset to be issued.
370
393
  # You must specify either an ID or an alias.
371
394
  # @option params [String] :asset_alias Asset alias specifying the asset to be issued.
372
395
  # You must specify either an ID or an alias.
@@ -378,11 +401,11 @@ module Chain
378
401
 
379
402
  # Add a spend action taken on a particular account.
380
403
  # @param [Hash] params Action parameters
381
- # @option params [String] :asset_id Asset ID specifiying the asset to be spent.
404
+ # @option params [String] :asset_id Asset ID specifying the asset to be spent.
382
405
  # You must specify either an ID or an alias.
383
406
  # @option params [String] :asset_alias Asset alias specifying the asset to be spent.
384
407
  # You must specify either an ID or an alias.
385
- # @option params [String] :account_id Account ID specifiying the account spending the asset.
408
+ # @option params [String] :account_id Account ID specifying the account spending the asset.
386
409
  # You must specify either an ID or an alias.
387
410
  # @option params [String] :account_alias Account alias specifying the account spending the asset.
388
411
  # You must specify either an ID or an alias.
@@ -394,8 +417,9 @@ module Chain
394
417
 
395
418
  # Add a spend action taken on a particular unspent output.
396
419
  # @param [Hash] params Action parameters
397
- # @option params [String] :transaction_id Transaction ID specifying the tranasction to select an output from.
398
- # @option params [Integer] :position Position of the output within the transaction to be spent.
420
+ # @option params [String] :output_id Output ID specifying the transaction output to spend.
421
+ # @option params [String] :transaction_id DEPRECATED (as of version 1.1) Transaction ID specifying the transaction to select an output from.
422
+ # @option params [Integer] :position DEPRECATED (as of version 1.1) Position of the output within the transaction to be spent.
399
423
  # @return [Builder]
400
424
  def spend_account_unspent_output(params)
401
425
  add_action(params.merge(type: :spend_account_unspent_output))
@@ -403,11 +427,11 @@ module Chain
403
427
 
404
428
  # Add a control action taken on a particular account.
405
429
  # @param [Hash] params Action parameters
406
- # @option params [String] :asset_id Asset ID specifiying the asset to be controlled.
430
+ # @option params [String] :asset_id Asset ID specifying the asset to be controlled.
407
431
  # You must specify either an ID or an alias.
408
432
  # @option params [String] :asset_alias Asset alias specifying the asset to be controlled.
409
433
  # You must specify either an ID or an alias.
410
- # @option params [String] :account_id Account ID specifiying the account controlling the asset.
434
+ # @option params [String] :account_id Account ID specifying the account controlling the asset.
411
435
  # You must specify either an ID or an alias.
412
436
  # @option params [String] :account_alias Account alias specifying the account controlling the asset.
413
437
  # You must specify either an ID or an alias.
@@ -417,9 +441,24 @@ module Chain
417
441
  add_action(params.merge(type: :control_account))
418
442
  end
419
443
 
444
+ # Sends assets to the specified receiver.
445
+ #
446
+ # @param [Hash] params Action parameters
447
+ # @option params [Receiver] :control_program the receiver object.
448
+ # @option params [String] :asset_id Asset ID specifying the asset to be controlled.
449
+ # You must specify either an ID or an alias.
450
+ # @option params [String] :asset_alias Asset alias specifying the asset to be controlled.
451
+ # You must specify either an ID or an alias.
452
+ # @option params [Integer] :amount amount of the asset to be controlled.
453
+ # @return [Builder]
454
+ def control_with_receiver(params)
455
+ add_action(params.merge(type: :control_receiver))
456
+ end
457
+
458
+ # @deprecated (as of version 1.1) Use {#control_with_receiver} instead.
420
459
  # Add a control action taken on a control program.
421
460
  # @param [Hash] params Action parameters
422
- # @option params [String] :asset_id Asset ID specifiying the asset to be controlled.
461
+ # @option params [String] :asset_id Asset ID specifying the asset to be controlled.
423
462
  # You must specify either an ID or an alias.
424
463
  # @option params [String] :asset_alias Asset alias specifying the asset to be controlled.
425
464
  # You must specify either an ID or an alias.
@@ -432,17 +471,14 @@ module Chain
432
471
 
433
472
  # Add a retire action.
434
473
  # @param [Hash] params Action parameters
435
- # @option params [String] :asset_id Asset ID specifiying the asset to be retired.
474
+ # @option params [String] :asset_id Asset ID specifying the asset to be retired.
436
475
  # You must specify either an ID or an alias.
437
476
  # @option params [String] :asset_alias Asset alias specifying the asset to be retired.
438
477
  # You must specify either an ID or an alias.
439
478
  # @option params [Integer] :amount Amount of the asset to be retired.
440
479
  # @return [Builder]
441
480
  def retire(params)
442
- add_action(params.merge(
443
- type: :control_program,
444
- control_program: '6a'
445
- ))
481
+ add_action(params.merge(type: :retire))
446
482
  end
447
483
  end
448
484
 
@@ -82,15 +82,20 @@ module Chain
82
82
 
83
83
  class ClientModule < Chain::ClientModule
84
84
 
85
- # @param [Hash] opts
86
- # @return [TransactionFeed]
85
+ # @param [Hash] opts Parameters for creating a Transaction Feed.
86
+ # @option opts [String] alias A unique alias for the transaction feed.
87
+ # @option opts [String] filter A valid filter string for the `/list-transactions` endpoint. The transaction feed will be composed of future transactions that match the filter.
88
+ # @return [TransactionFeed] Newly created transaction feed
87
89
  def create(opts)
88
90
  opts = {client_token: SecureRandom.uuid()}.merge(opts)
89
91
  TransactionFeed.new(client.conn.request('create-transaction-feed', opts), client.conn)
90
92
  end
91
93
 
92
- # @param [Hash] opts
93
- # @return [TransactionFeed]
94
+ # Get single transaction feed given an id/alias.
95
+ # @param [Hash] opts Parameters to get single Transaction Feed.
96
+ # @option opts [String] id The unique ID of a transaction feed. Either `id` or `alias` is required.
97
+ # @option opts [String] alias The unique alias of a transaction feed. Either `id` or `alias` is required.
98
+ # @return [TransactionFeed] Requested transaction feed object
94
99
  def get(opts)
95
100
  TransactionFeed.new(client.conn.request('get-transaction-feed', opts), client.conn)
96
101
  end
@@ -104,6 +109,7 @@ module Chain
104
109
  nil
105
110
  end
106
111
 
112
+ # List all transaction feeds
107
113
  # @return [Query]
108
114
  def query
109
115
  Query.new(client)
@@ -4,6 +4,9 @@ require_relative './query'
4
4
 
5
5
  module Chain
6
6
  class UnspentOutput < ResponseObject
7
+ # @!attribute [r] id
8
+ # @return [String]
9
+ attrib :id
7
10
 
8
11
  # @!attribute [r] type
9
12
  # @return [String]
@@ -70,10 +73,13 @@ module Chain
70
73
  attrib :is_local
71
74
 
72
75
  class ClientModule < Chain::ClientModule
73
- # @param [Hash] query
74
- # @return Query
75
- def query(query = {})
76
- Query.new(client, query)
76
+ # @param [Hash] opts Filtering information
77
+ # @option opts [String] filter Filter string, see {https://chain.com/docs/core/build-applications/queries}.
78
+ # @option opts [Array<String|Integer>] filter_params Parameter values for filter string (if needed).
79
+ # @option opts [Integer] timestamp A millisecond Unix timestamp. By using this parameter, you can perform queries that reflect the state of the blockchain at different points in time.
80
+ # @return [Query]
81
+ def query(opts = {})
82
+ Query.new(client, opts)
77
83
  end
78
84
  end
79
85
 
@@ -1,3 +1,3 @@
1
1
  module Chain
2
- VERSION = '1.0.4'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chain-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chain Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-25 00:00:00.000000000 Z
11
+ date: 2017-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -102,6 +102,7 @@ files:
102
102
  - lib/chain/hsm_signer.rb
103
103
  - lib/chain/mock_hsm.rb
104
104
  - lib/chain/query.rb
105
+ - lib/chain/receiver.rb
105
106
  - lib/chain/response_object.rb
106
107
  - lib/chain/transaction.rb
107
108
  - lib/chain/transaction_feed.rb
@@ -119,7 +120,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
120
  requirements:
120
121
  - - "~>"
121
122
  - !ruby/object:Gem::Version
122
- version: '2.0'
123
+ version: '2.1'
123
124
  required_rubygems_version: !ruby/object:Gem::Requirement
124
125
  requirements:
125
126
  - - ">="