sequence-sdk 1.5.2 → 2.pre.rc.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 +5 -5
- data/README.md +2 -2
- data/lib/sequence/account.rb +31 -104
- data/lib/sequence/action.rb +15 -80
- data/lib/sequence/client.rb +24 -34
- data/lib/sequence/client_module.rb +0 -4
- data/lib/sequence/errors.rb +0 -4
- data/lib/sequence/feed.rb +28 -31
- data/lib/sequence/flavor.rb +29 -55
- data/lib/sequence/http_wrapper.rb +10 -13
- data/lib/sequence/key.rb +6 -36
- data/lib/sequence/page.rb +0 -6
- data/lib/sequence/query.rb +7 -20
- data/lib/sequence/session.rb +6 -45
- data/lib/sequence/stats.rb +9 -10
- data/lib/sequence/token.rb +24 -23
- data/lib/sequence/transaction.rb +84 -230
- data/lib/sequence/version.rb +1 -1
- metadata +131 -11
- data/lib/sequence/asset.rb +0 -119
- data/lib/sequence/balance.rb +0 -59
- data/lib/sequence/contract.rb +0 -104
- data/lib/sequence/validations.rb +0 -32
data/lib/sequence/errors.rb
CHANGED
@@ -45,12 +45,8 @@ module Sequence
|
|
45
45
|
:seq_code,
|
46
46
|
:temporary,
|
47
47
|
)
|
48
|
-
# Use {#seq_code} instead.
|
49
|
-
# @deprecated
|
50
|
-
attr_accessor :code
|
51
48
|
|
52
49
|
def initialize(body, response)
|
53
|
-
self.code = body['code']
|
54
50
|
self.chain_message = body['message']
|
55
51
|
self.detail = body['detail']
|
56
52
|
self.retriable = body['retriable']
|
data/lib/sequence/feed.rb
CHANGED
@@ -82,49 +82,46 @@ module Sequence
|
|
82
82
|
end
|
83
83
|
|
84
84
|
class ClientModule < Sequence::ClientModule
|
85
|
-
#
|
86
|
-
# @
|
87
|
-
# @
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
# will be interpolated into the filter expression.
|
85
|
+
# Create a feed.
|
86
|
+
# @param type [String] The type of the feed: "action" or "transaction".
|
87
|
+
# @param id [String] A unique id for the feed.
|
88
|
+
# @param filter [String] A valid filter string. The feed will be composed
|
89
|
+
# of items that match the filter.
|
90
|
+
# @param filter_params [Array<String|Integer>] A list of values that will
|
91
|
+
# be interpolated into the filter expression.
|
93
92
|
# @return [Feed] Newly created feed.
|
94
|
-
def create(
|
95
|
-
|
96
|
-
opts,
|
97
|
-
:id,
|
98
|
-
:type,
|
99
|
-
:filter,
|
100
|
-
:filter_params,
|
101
|
-
)
|
102
|
-
validate_required!(opts, :type)
|
103
|
-
if opts[:type] != 'action' && opts[:type] != 'transaction'
|
93
|
+
def create(type:, id: nil, filter: nil, filter_params: nil)
|
94
|
+
if type != 'action' && type != 'transaction'
|
104
95
|
raise ArgumentError, ':type must equal action or transaction'
|
105
96
|
end
|
106
|
-
Feed.new(
|
97
|
+
Feed.new(
|
98
|
+
client.session.request(
|
99
|
+
'create-feed',
|
100
|
+
id: id,
|
101
|
+
type: type,
|
102
|
+
filter: filter,
|
103
|
+
filter_params: filter_params,
|
104
|
+
),
|
105
|
+
client.session,
|
106
|
+
)
|
107
107
|
end
|
108
108
|
|
109
|
-
# Get
|
110
|
-
# @param [
|
111
|
-
# @option opts [String] id The unique ID of a feed.
|
109
|
+
# Get feed by id.
|
110
|
+
# @param id [String] The unique ID of a feed.
|
112
111
|
# @return [Feed] Requested feed object.
|
113
|
-
def get(
|
114
|
-
|
115
|
-
Feed.new(client.session.request('get-feed', opts), client.session)
|
112
|
+
def get(id:)
|
113
|
+
Feed.new(client.session.request('get-feed', id: id), client.session)
|
116
114
|
end
|
117
115
|
|
118
|
-
#
|
119
|
-
# @option
|
116
|
+
# Delete feed by id.
|
117
|
+
# @option id [String] The unique ID of a feed.
|
120
118
|
# @return [void]
|
121
|
-
def delete(
|
122
|
-
|
123
|
-
client.session.request('delete-feed', opts)
|
119
|
+
def delete(id:)
|
120
|
+
client.session.request('delete-feed', id: id)
|
124
121
|
nil
|
125
122
|
end
|
126
123
|
|
127
|
-
#
|
124
|
+
# Execute a query, returning an enumerable over individual feeds.
|
128
125
|
# @return [Query]
|
129
126
|
def list
|
130
127
|
Query.new(client)
|
data/lib/sequence/flavor.rb
CHANGED
@@ -11,7 +11,7 @@ module Sequence
|
|
11
11
|
# A type or class of value that can be tracked on a ledger.
|
12
12
|
class Flavor < ResponseObject
|
13
13
|
# @!attribute [r] id
|
14
|
-
# Unique
|
14
|
+
# Unique identifier of the flavor.
|
15
15
|
# @return [String]
|
16
16
|
attrib :id
|
17
17
|
|
@@ -21,13 +21,6 @@ module Sequence
|
|
21
21
|
# @return [Array<String>]
|
22
22
|
attrib(:key_ids)
|
23
23
|
|
24
|
-
# @!attribute [r] keys
|
25
|
-
# Deprecated. Use {#key_ids} instead.
|
26
|
-
# The set of keys used to sign transactions that issue tokens of the
|
27
|
-
# flavor.
|
28
|
-
# @return [Array<Key>]
|
29
|
-
attrib(:keys) { |raw| raw.map { |k| Key.new(k) } }
|
30
|
-
|
31
24
|
# @!attribute [r] quorum
|
32
25
|
# The number of keys required to sign transactions that issue tokens of
|
33
26
|
# the flavor.
|
@@ -39,74 +32,55 @@ module Sequence
|
|
39
32
|
# @return [Hash]
|
40
33
|
attrib :tags
|
41
34
|
|
42
|
-
# @deprecated Use {#key_ids} instead.
|
43
35
|
class Key < ResponseObject
|
44
36
|
attrib :id
|
45
37
|
end
|
46
38
|
|
47
39
|
class ClientModule < Sequence::ClientModule
|
48
|
-
#
|
49
|
-
# @param [
|
50
|
-
# Options hash
|
51
|
-
# @option opts [String] id
|
52
|
-
# Unique, user-specified identifier.
|
53
|
-
# @option opts [Array<String>] key_ids
|
40
|
+
# Create a new flavor in the ledger.
|
41
|
+
# @param key_ids [Array<String>]
|
54
42
|
# The set of key IDs used for signing transactions that issue tokens of
|
55
43
|
# the flavor.
|
56
|
-
# @
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# flavor. A key can be either a key object, or a hash containing an
|
60
|
-
# `id` field.
|
61
|
-
# @option opts [Integer] quorum
|
44
|
+
# @param id [String]
|
45
|
+
# Unique identifier. Auto-generated if not specified.
|
46
|
+
# @param quorum [Integer]
|
62
47
|
# The number of keys required to sign transactions that issue tokens of
|
63
48
|
# the flavor. Defaults to the number of keys provided.
|
64
|
-
# @
|
49
|
+
# @param tags [Hash]
|
65
50
|
# User-specified key-value data describing the flavor.
|
66
51
|
# @return [Flavor]
|
67
|
-
def create(
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
52
|
+
def create(key_ids:, id: nil, quorum: nil, tags: nil)
|
53
|
+
raise ArgumentError, ':key_ids cannot be empty' if key_ids == []
|
54
|
+
Flavor.new(
|
55
|
+
client.session.request(
|
56
|
+
'create-flavor',
|
57
|
+
id: id,
|
58
|
+
key_ids: key_ids,
|
59
|
+
quorum: quorum,
|
60
|
+
tags: tags,
|
61
|
+
),
|
62
|
+
)
|
77
63
|
end
|
78
64
|
|
79
|
-
#
|
80
|
-
# @param [
|
81
|
-
# Options hash
|
82
|
-
# @option opts [String] id
|
65
|
+
# Update a flavor's tags.
|
66
|
+
# @param id [String]
|
83
67
|
# The ID of the flavor.
|
84
|
-
# @
|
68
|
+
# @param tags [Hash]
|
85
69
|
# A new set of tags, which will replace the existing tags.
|
86
70
|
# @return [void]
|
87
|
-
def update_tags(
|
88
|
-
|
89
|
-
|
90
|
-
raise ArgumentError, ':id must be provided'
|
91
|
-
end
|
92
|
-
client.session.request('update-flavor-tags', opts)
|
71
|
+
def update_tags(id:, tags: nil)
|
72
|
+
raise ArgumentError, ':id cannot be blank' if id == ''
|
73
|
+
client.session.request('update-flavor-tags', id: id, tags: tags)
|
93
74
|
end
|
94
75
|
|
95
|
-
#
|
96
|
-
# @param [
|
97
|
-
# Options hash
|
98
|
-
# @option opts [String] filter
|
76
|
+
# Execute a query, returning an enumerable over individual flavors.
|
77
|
+
# @param filter [String]
|
99
78
|
# A filter expression.
|
100
|
-
# @
|
79
|
+
# @param filter_params [Array<String|Integer>]
|
101
80
|
# A list of values that will be interpolated into the filter expression.
|
102
81
|
# @return [Query]
|
103
|
-
def list(
|
104
|
-
|
105
|
-
opts,
|
106
|
-
:filter,
|
107
|
-
:filter_params,
|
108
|
-
)
|
109
|
-
Query.new(client, opts)
|
82
|
+
def list(filter: nil, filter_params: nil)
|
83
|
+
Query.new(client, filter: filter, filter_params: filter_params)
|
110
84
|
end
|
111
85
|
end
|
112
86
|
|
@@ -26,13 +26,10 @@ module Sequence
|
|
26
26
|
Errno::ECONNREFUSED,
|
27
27
|
].freeze
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
def initialize(base_url, macaroon, opts = {})
|
29
|
+
def initialize(base_url, credential, opts = {})
|
32
30
|
@mutex = Mutex.new
|
33
31
|
@base_url = URI(base_url)
|
34
|
-
@
|
35
|
-
@dis_macaroon = nil
|
32
|
+
@credential = credential
|
36
33
|
@opts = opts
|
37
34
|
@connection = setup_connection
|
38
35
|
end
|
@@ -57,10 +54,7 @@ module Sequence
|
|
57
54
|
req['Idempotency-Key'] = idempotency_key
|
58
55
|
req['Name-Set'] = 'snake'
|
59
56
|
req['User-Agent'] = 'chain-sdk-ruby/' + Sequence::VERSION
|
60
|
-
|
61
|
-
req['Macaroon'] = @macaroon
|
62
|
-
req['Discharge-Macaroon'] = @dis_macaroon
|
63
|
-
end
|
57
|
+
req['Credential'] = @credential
|
64
58
|
if !@opts[:user].nil? && !@opts[:pass].nil?
|
65
59
|
req.basic_auth(@opts[:user], @opts[:pass])
|
66
60
|
end
|
@@ -132,10 +126,13 @@ module Sequence
|
|
132
126
|
|
133
127
|
# TLS configuration
|
134
128
|
connection.use_ssl = true
|
135
|
-
connection.verify_mode =
|
136
|
-
[
|
137
|
-
|
138
|
-
|
129
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
130
|
+
if ENV['SEQTLSVERIFYNONE']
|
131
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
132
|
+
end
|
133
|
+
if ENV['SEQTLSCA']
|
134
|
+
puts "setting ca_file #{ENV['SEQTLSCA']}"
|
135
|
+
connection.ca_file = ENV['SEQTLSCA']
|
139
136
|
end
|
140
137
|
|
141
138
|
# Timeout configuration
|
data/lib/sequence/key.rb
CHANGED
@@ -13,46 +13,16 @@ module Sequence
|
|
13
13
|
# @return [String]
|
14
14
|
attrib :id
|
15
15
|
|
16
|
-
# @!attribute [r] alias
|
17
|
-
# Deprecated. Use {#id} instead.
|
18
|
-
# Unique, user-specified identifier of the key.
|
19
|
-
# @return [String]
|
20
|
-
attrib :alias
|
21
|
-
|
22
16
|
class ClientModule < Sequence::ClientModule
|
23
|
-
#
|
24
|
-
# @param [
|
25
|
-
#
|
26
|
-
# @option opts [String] id
|
27
|
-
# Unique, user-specified identifier of the key.
|
28
|
-
# @option opts [String] alias
|
29
|
-
# Deprecated. Use :id instead.
|
30
|
-
# Unique, user-specified identifier of the key.
|
17
|
+
# Create a key.
|
18
|
+
# @param id [String]
|
19
|
+
# Unique identifier. Auto-generated if not specified.
|
31
20
|
# @return [Key]
|
32
|
-
def create(
|
33
|
-
|
34
|
-
Key.new(client.session.request('create-key', opts))
|
35
|
-
end
|
36
|
-
|
37
|
-
# @deprecated Use list instead.
|
38
|
-
# Executes a query, returning an enumerable over individual keys.
|
39
|
-
# @param [Hash] opts
|
40
|
-
# Options hash
|
41
|
-
# @option opts [Array<String>] aliases
|
42
|
-
# Deprecated. Use :ids instead.
|
43
|
-
# A list of aliases of keys to retrieve.
|
44
|
-
# @option opts [Array<String>] ids
|
45
|
-
# A list of ids of keys to retrieve.
|
46
|
-
# @option opts [Integer>] page_size
|
47
|
-
# Deprecated. Use list.page(size: size) instead.
|
48
|
-
# The number of items to return in the result set.
|
49
|
-
# @return [Query]
|
50
|
-
def query(opts = {})
|
51
|
-
validate_inclusion_of!(opts, :aliases, :ids, :page_size, :after)
|
52
|
-
Query.new(client, opts)
|
21
|
+
def create(id: nil)
|
22
|
+
Key.new(client.session.request('create-key', id: id))
|
53
23
|
end
|
54
24
|
|
55
|
-
#
|
25
|
+
# List all keys.
|
56
26
|
# Executes a query, returning an enumerable over individual keys.
|
57
27
|
# @return [Query]
|
58
28
|
def list
|
data/lib/sequence/page.rb
CHANGED
@@ -12,12 +12,6 @@ module Sequence
|
|
12
12
|
# @return [Array]
|
13
13
|
attrib :items
|
14
14
|
|
15
|
-
# @!attribute [r] next
|
16
|
-
# Deprecated. Use {#cursor} instead.
|
17
|
-
# Query object to request next page of items.
|
18
|
-
# @return [Hash]
|
19
|
-
attrib :next
|
20
|
-
|
21
15
|
# @!attribute [r] cursor
|
22
16
|
# String encoding the query object to request the next page of items.
|
23
17
|
# @return [String]
|
data/lib/sequence/query.rb
CHANGED
@@ -5,8 +5,6 @@ require_relative './page'
|
|
5
5
|
module Sequence
|
6
6
|
class Query
|
7
7
|
include ::Enumerable
|
8
|
-
include Sequence::Validations
|
9
|
-
|
10
8
|
# @private
|
11
9
|
# @return [Client]
|
12
10
|
attr_reader :client
|
@@ -44,24 +42,17 @@ module Sequence
|
|
44
42
|
raise NotImplementedError
|
45
43
|
end
|
46
44
|
|
47
|
-
|
48
|
-
# Deprecated: use
|
49
|
-
# {https://ruby-doc.org/core-2.5.0/Enumerable.html Enumerable}
|
50
|
-
# methods such as to_a instead.
|
51
|
-
# @deprecated
|
52
|
-
def all
|
53
|
-
to_a
|
54
|
-
end
|
45
|
+
alias all to_a
|
55
46
|
|
56
47
|
# @private
|
57
48
|
def pages
|
58
49
|
PageQuery.new(client, query, method(:fetch), method(:translate))
|
59
50
|
end
|
60
51
|
|
61
|
-
def page(
|
62
|
-
|
63
|
-
unless
|
64
|
-
opts[:page_size] =
|
52
|
+
def page(size: nil, cursor: nil)
|
53
|
+
opts = { size: size, cursor: cursor }
|
54
|
+
unless size.nil? || size.zero?
|
55
|
+
opts[:page_size] = size
|
65
56
|
end
|
66
57
|
@query = @query.merge(opts)
|
67
58
|
pages.page
|
@@ -83,8 +74,7 @@ module Sequence
|
|
83
74
|
|
84
75
|
loop do
|
85
76
|
page = Page.new(@fetch.call(@query), @translate)
|
86
|
-
@query = page.
|
87
|
-
|
77
|
+
@query = { cursor: page.cursor }
|
88
78
|
yield page
|
89
79
|
|
90
80
|
break if page.last_page
|
@@ -99,10 +89,7 @@ module Sequence
|
|
99
89
|
Page.new(@fetch.call(@query), @translate)
|
100
90
|
end
|
101
91
|
|
102
|
-
|
103
|
-
def all
|
104
|
-
to_a
|
105
|
-
end
|
92
|
+
alias all to_a
|
106
93
|
end
|
107
94
|
end
|
108
95
|
end
|
data/lib/sequence/session.rb
CHANGED
@@ -15,35 +15,15 @@ module Sequence
|
|
15
15
|
ArgumentError,
|
16
16
|
'missing ledger_name',
|
17
17
|
)
|
18
|
-
@
|
18
|
+
@credential = @opts[:credential] || raise(
|
19
19
|
ArgumentError,
|
20
20
|
'missing credential',
|
21
21
|
)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
@team_name = nil
|
28
|
-
|
29
|
-
# This can be used to avoid making an http request to get a
|
30
|
-
# new discharge macaroon.
|
31
|
-
@refresh_method = @opts[:refresh_method]
|
32
|
-
if @refresh_method
|
33
|
-
unless @refresh_method.respond_to?(:call)
|
34
|
-
raise ArgumentError, 'refresh_method is not a lambda'
|
35
|
-
end
|
36
|
-
if @refresh_method.arity != 1
|
37
|
-
raise(
|
38
|
-
ArgumentError,
|
39
|
-
'refresh_method must take 1 argument. (the macaroon)',
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
addr = ENV['SEQADDR'] || 'api.seq.com'
|
45
|
-
@session_api = HttpWrapper.new('https://session-' + addr, nil)
|
46
|
-
@ledger_api = HttpWrapper.new('https://' + addr, @macaroon, @opts)
|
22
|
+
@team_name = @opts[:team_name] || raise(
|
23
|
+
ArgumentError,
|
24
|
+
'missing team_name',
|
25
|
+
)
|
26
|
+
@ledger_api = HttpWrapper.new('https://' + @opts[:addr], @credential, @opts)
|
47
27
|
end
|
48
28
|
|
49
29
|
def dup
|
@@ -55,7 +35,6 @@ module Sequence
|
|
55
35
|
end
|
56
36
|
|
57
37
|
def request_full_resp(id, path, body = {})
|
58
|
-
refresh!(id)
|
59
38
|
id ||= SecureRandom.hex(10)
|
60
39
|
@ledger_api.post(id, ledger_url(path), body) do |response|
|
61
40
|
# require that the response contains the Chain-Request-ID
|
@@ -77,23 +56,5 @@ module Sequence
|
|
77
56
|
path = path[1..-1] if path.start_with?('/')
|
78
57
|
"/#{@team_name}/#{@ledger}/#{path}"
|
79
58
|
end
|
80
|
-
|
81
|
-
def refresh!(id)
|
82
|
-
return if @refresh_at > Time.now.to_i
|
83
|
-
|
84
|
-
if @refresh_method
|
85
|
-
result = @refresh_method.call(@macaroon)
|
86
|
-
else
|
87
|
-
result = @session_api.post(
|
88
|
-
id,
|
89
|
-
'/sessions/validate',
|
90
|
-
macaroon: @macaroon,
|
91
|
-
)[:parsed_body]
|
92
|
-
end
|
93
|
-
|
94
|
-
@team_name = result['team_name']
|
95
|
-
@refresh_at = Integer(result['refresh_at'])
|
96
|
-
@ledger_api.dis_macaroon = result['refresh_token']
|
97
|
-
end
|
98
59
|
end
|
99
60
|
end
|