crea-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +55 -0
  3. data/CONTRIBUTING.md +79 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +22 -0
  6. data/README.md +234 -0
  7. data/Rakefile +332 -0
  8. data/crea-ruby.gemspec +39 -0
  9. data/gource.sh +6 -0
  10. data/lib/crea.rb +85 -0
  11. data/lib/crea/api.rb +208 -0
  12. data/lib/crea/base_error.rb +218 -0
  13. data/lib/crea/block_api.rb +78 -0
  14. data/lib/crea/broadcast.rb +1334 -0
  15. data/lib/crea/chain_config.rb +36 -0
  16. data/lib/crea/formatter.rb +14 -0
  17. data/lib/crea/jsonrpc.rb +108 -0
  18. data/lib/crea/marshal.rb +231 -0
  19. data/lib/crea/mixins/jsonable.rb +37 -0
  20. data/lib/crea/mixins/retriable.rb +58 -0
  21. data/lib/crea/mixins/serializable.rb +45 -0
  22. data/lib/crea/operation.rb +141 -0
  23. data/lib/crea/operation/account_create.rb +10 -0
  24. data/lib/crea/operation/account_create_with_delegation.rb +12 -0
  25. data/lib/crea/operation/account_update.rb +8 -0
  26. data/lib/crea/operation/account_witness_proxy.rb +4 -0
  27. data/lib/crea/operation/account_witness_vote.rb +5 -0
  28. data/lib/crea/operation/cancel_transfer_from_savings.rb +4 -0
  29. data/lib/crea/operation/challenge_authority.rb +5 -0
  30. data/lib/crea/operation/change_recovery_account.rb +5 -0
  31. data/lib/crea/operation/claim_account.rb +5 -0
  32. data/lib/crea/operation/claim_reward_balance.rb +6 -0
  33. data/lib/crea/operation/comment.rb +9 -0
  34. data/lib/crea/operation/comment_options.rb +10 -0
  35. data/lib/crea/operation/convert.rb +5 -0
  36. data/lib/crea/operation/create_claimed_account.rb +10 -0
  37. data/lib/crea/operation/custom.rb +5 -0
  38. data/lib/crea/operation/custom_binary.rb +8 -0
  39. data/lib/crea/operation/custom_json.rb +6 -0
  40. data/lib/crea/operation/decline_voting_rights.rb +4 -0
  41. data/lib/crea/operation/delegate_vesting_shares.rb +5 -0
  42. data/lib/crea/operation/delete_comment.rb +4 -0
  43. data/lib/crea/operation/escrow_approve.rb +8 -0
  44. data/lib/crea/operation/escrow_dispute.rb +7 -0
  45. data/lib/crea/operation/escrow_release.rb +10 -0
  46. data/lib/crea/operation/escrow_transfer.rb +12 -0
  47. data/lib/crea/operation/feed_publish.rb +4 -0
  48. data/lib/crea/operation/limit_order_cancel.rb +4 -0
  49. data/lib/crea/operation/limit_order_create.rb +8 -0
  50. data/lib/crea/operation/limit_order_create2.rb +8 -0
  51. data/lib/crea/operation/prove_authority.rb +4 -0
  52. data/lib/crea/operation/recover_account.rb +6 -0
  53. data/lib/crea/operation/report_over_production.rb +5 -0
  54. data/lib/crea/operation/request_account_recovery.rb +6 -0
  55. data/lib/crea/operation/reset_account.rb +5 -0
  56. data/lib/crea/operation/set_reset_account.rb +5 -0
  57. data/lib/crea/operation/set_withdraw_vesting_route.rb +6 -0
  58. data/lib/crea/operation/transfer.rb +6 -0
  59. data/lib/crea/operation/transfer_from_savings.rb +7 -0
  60. data/lib/crea/operation/transfer_to_savings.rb +6 -0
  61. data/lib/crea/operation/transfer_to_vesting.rb +5 -0
  62. data/lib/crea/operation/vote.rb +6 -0
  63. data/lib/crea/operation/withdraw_vesting.rb +4 -0
  64. data/lib/crea/operation/witness_set_properties.rb +5 -0
  65. data/lib/crea/operation/witness_update.rb +7 -0
  66. data/lib/crea/rpc/base_client.rb +179 -0
  67. data/lib/crea/rpc/http_client.rb +143 -0
  68. data/lib/crea/rpc/thread_safe_http_client.rb +35 -0
  69. data/lib/crea/stream.rb +385 -0
  70. data/lib/crea/transaction.rb +96 -0
  71. data/lib/crea/transaction_builder.rb +393 -0
  72. data/lib/crea/type/amount.rb +107 -0
  73. data/lib/crea/type/base_type.rb +10 -0
  74. data/lib/crea/utils.rb +17 -0
  75. data/lib/crea/version.rb +4 -0
  76. metadata +478 -0
data/crea-ruby.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'crea/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'crea-ruby'
8
+ spec.version = Crea::VERSION
9
+ spec.authors = ['Creativechain FDN']
10
+ spec.email = ['info@creativechain.com']
11
+
12
+ spec.summary = %q{Crea Ruby Client}
13
+ spec.description = %q{Client for accessing the Crea blockchain.}
14
+ spec.homepage = 'https://github.com/creativechain/crea-ruby'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
21
+ spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.0'
22
+ spec.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.3'
23
+ spec.add_development_dependency 'minitest-line', '~> 0.6', '>= 0.6.4'
24
+ spec.add_development_dependency 'minitest-proveit', '~> 1.0', '>= 1.0.0'
25
+ spec.add_development_dependency 'webmock', '~> 3.3', '>= 3.3.0'
26
+ spec.add_development_dependency 'simplecov', '~> 0.15', '>= 0.15.1'
27
+ spec.add_development_dependency 'vcr', '~> 4.0', '>= 4.0.0'
28
+ spec.add_development_dependency 'yard', '~> 0.9', '>= 0.9.12'
29
+ spec.add_development_dependency 'pry', '~> 0.11', '>= 0.11.3'
30
+ spec.add_development_dependency 'awesome_print', '~> 1.8', '>= 1.8.0'
31
+
32
+ spec.add_dependency 'json', '~> 2.1', '>= 2.1.0'
33
+ spec.add_dependency 'logging', '~> 2.2', '>= 2.2.0'
34
+ spec.add_dependency 'hashie', '~> 3.5', '>= 3.5.7'
35
+ spec.add_dependency 'bitcoin-ruby', '~> 0.0', '>= 0.0.18'
36
+ spec.add_dependency 'ffi', '~> 1.9', '>= 1.9.23'
37
+ spec.add_dependency 'bindata', '~> 2.4', '>= 2.4.4'
38
+ spec.add_dependency 'base58', '~> 0.2', '>= 0.2.3'
39
+ end
data/gource.sh ADDED
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+
3
+ gource ./ --user-image-dir images --hide usernames -s 0.5 -b 000000 \
4
+ -1280x720 --output-ppm-stream - |\
5
+ ffmpeg -y -r 28 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset slow \
6
+ -crf 28 -threads 0 output.mp4
data/lib/crea.rb ADDED
@@ -0,0 +1,85 @@
1
+ # encoding: UTF-8
2
+ require 'json' unless defined?(JSON)
3
+ require 'net/https'
4
+
5
+ require 'hashie'
6
+ require 'crea/version'
7
+ require 'crea/utils'
8
+ require 'crea/base_error'
9
+ require 'crea/mixins/serializable'
10
+ require 'crea/mixins/jsonable'
11
+ require 'crea/mixins/retriable'
12
+ require 'crea/chain_config'
13
+ require 'crea/type/base_type'
14
+ require 'crea/type/amount'
15
+ require 'crea/operation'
16
+ require 'crea/operation/account_create.rb'
17
+ require 'crea/operation/account_create_with_delegation.rb'
18
+ require 'crea/operation/account_update.rb'
19
+ require 'crea/operation/account_witness_proxy.rb'
20
+ require 'crea/operation/account_witness_vote.rb'
21
+ require 'crea/operation/cancel_transfer_from_savings.rb'
22
+ require 'crea/operation/challenge_authority.rb'
23
+ require 'crea/operation/change_recovery_account.rb'
24
+ require 'crea/operation/claim_account.rb'
25
+ require 'crea/operation/claim_reward_balance.rb'
26
+ require 'crea/operation/comment.rb'
27
+ require 'crea/operation/comment_options.rb'
28
+ require 'crea/operation/convert.rb'
29
+ require 'crea/operation/create_claimed_account.rb'
30
+ require 'crea/operation/custom.rb'
31
+ require 'crea/operation/custom_binary.rb'
32
+ require 'crea/operation/custom_json.rb'
33
+ require 'crea/operation/decline_voting_rights.rb'
34
+ require 'crea/operation/delegate_vesting_shares.rb'
35
+ require 'crea/operation/delete_comment.rb'
36
+ require 'crea/operation/escrow_approve.rb'
37
+ require 'crea/operation/escrow_dispute.rb'
38
+ require 'crea/operation/escrow_release.rb'
39
+ require 'crea/operation/escrow_transfer.rb'
40
+ require 'crea/operation/feed_publish.rb'
41
+ require 'crea/operation/limit_order_cancel.rb'
42
+ require 'crea/operation/limit_order_create.rb'
43
+ require 'crea/operation/limit_order_create2.rb'
44
+ require 'crea/operation/prove_authority.rb'
45
+ require 'crea/operation/recover_account.rb'
46
+ require 'crea/operation/report_over_production.rb'
47
+ require 'crea/operation/request_account_recovery.rb'
48
+ require 'crea/operation/reset_account.rb'
49
+ require 'crea/operation/set_reset_account.rb'
50
+ require 'crea/operation/set_withdraw_vesting_route.rb'
51
+ require 'crea/operation/transfer.rb'
52
+ require 'crea/operation/transfer_from_savings.rb'
53
+ require 'crea/operation/transfer_to_savings.rb'
54
+ require 'crea/operation/transfer_to_vesting.rb'
55
+ require 'crea/operation/vote.rb'
56
+ require 'crea/operation/withdraw_vesting.rb'
57
+ require 'crea/operation/witness_update.rb'
58
+ require 'crea/operation/witness_set_properties.rb'
59
+ require 'crea/marshal'
60
+ require 'crea/transaction'
61
+ require 'crea/transaction_builder'
62
+ require 'crea/rpc/base_client'
63
+ require 'crea/rpc/http_client'
64
+ require 'crea/rpc/thread_safe_http_client'
65
+ require 'crea/api'
66
+ require 'crea/jsonrpc'
67
+ require 'crea/block_api'
68
+ require 'crea/formatter'
69
+ require 'crea/broadcast'
70
+ require 'crea/stream'
71
+
72
+ module Crea
73
+ def self.api_classes
74
+ @api_classes ||= {}
75
+ end
76
+
77
+ def self.const_missing(api_name)
78
+ api = api_classes[api_name]
79
+ api ||= Api.clone(freeze: true) rescue Api.clone
80
+ api.api_name = api_name
81
+ api_classes[api_name] = api
82
+ end
83
+ end
84
+
85
+ Hashie.logger = Logger.new(ENV['HASHIE_LOGGER'])
data/lib/crea/api.rb ADDED
@@ -0,0 +1,208 @@
1
+ module Crea
2
+ # This ruby API works with
3
+ # {https://github.com/creary/crea/releases cread-0.19.10} and other AppBase
4
+ # compatible upstreams. To access different API namespaces, use the
5
+ # following:
6
+ #
7
+ # api = Crea::Api.new
8
+ # api.get_dynamic_global_properties
9
+ #
10
+ # The above example will make an instance that can access the
11
+ # {https://developers.crea.io/apidefinitions/condenser-api condenser_api}
12
+ # namespace. Alternatively, you may also create a direct instances with its
13
+ # full name, if you prefer:
14
+ #
15
+ # api = Crea::CondenserApi.new
16
+ # api.get_dynamic_global_properties
17
+ #
18
+ # If you know the name of another API that is supported by the remote node,
19
+ # you can create an instance to that instead, for example:
20
+ #
21
+ # api = Crea::MarketHistoryApi.new
22
+ # api.get_volume
23
+ #
24
+ # All known API by namespace:
25
+ #
26
+ # * {AccountByKeyApi}
27
+ # * {AccountHistoryApi}
28
+ # * {BlockApi}
29
+ # * {DatabaseApi}
30
+ # * {FollowApi}
31
+ # * {Jsonrpc}
32
+ # * {MarketHistoryApi}
33
+ # * {NetworkBroadcastApi}
34
+ # * {TagsApi}
35
+ # * {WitnessApi}
36
+ #
37
+ # Also see: {https://developers.crea.io/apidefinitions/ Complete API Definitions}
38
+ class Api
39
+ attr_accessor :chain, :methods, :rpc_client
40
+
41
+ # Use this for debugging naive thread handler.
42
+ # DEFAULT_RPC_CLIENT_CLASS = RPC::HttpClient
43
+ DEFAULT_RPC_CLIENT_CLASS = RPC::ThreadSafeHttpClient
44
+
45
+ def self.api_name=(api_name)
46
+ @api_name = api_name.to_s.
47
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
48
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
49
+ tr('-', '_').downcase.to_sym
50
+ end
51
+
52
+ def self.api_name
53
+ @api_name
54
+ end
55
+
56
+ def self.api_class_name
57
+ @api_name.to_s.split('_').map(&:capitalize).join
58
+ end
59
+
60
+ def self.jsonrpc=(jsonrpc, url = nil)
61
+ @jsonrpc ||= {}
62
+ @jsonrpc[url || jsonrpc.rpc_client.uri.to_s] = jsonrpc
63
+ end
64
+
65
+ def self.jsonrpc(url = nil)
66
+ if @jsonrpc.size < 2 && url.nil?
67
+ @jsonrpc.values.first
68
+ else
69
+ @jsonrpc[url]
70
+ end
71
+ end
72
+
73
+ # Override this if you want to just use your own client. Otherwise, inject
74
+ # the default using:
75
+ #
76
+ # Crea::Api.register default_rpc_client_class: MyClient
77
+ def self.default_rpc_client_class
78
+ if !!@injected_dependencies && !!@injected_dependencies[:default_rpc_client_class]
79
+ @injected_dependencies[:default_rpc_client_class]
80
+ else
81
+ DEFAULT_RPC_CLIENT_CLASS
82
+ end
83
+ end
84
+
85
+ # Used for dependency injection. Currently, the only key supported is:
86
+ #
87
+ # `default_rpc_client_class`
88
+ def self.register(register)
89
+ @injected_dependencies ||= {}
90
+ @injected_dependencies = @injected_dependencies.merge register
91
+ end
92
+
93
+ def initialize(options = {})
94
+ @chain = options[:chain] || :crea
95
+ @error_pipe = options[:error_pipe] || STDERR
96
+ @api_name = self.class.api_name ||= :condenser_api
97
+
98
+ @rpc_client = if !!options[:rpc_client]
99
+ options[:rpc_client]
100
+ else
101
+ rpc_client_class = self.class.default_rpc_client_class
102
+ rpc_client_class.new(options.merge(api_name: @api_name))
103
+ end
104
+
105
+ if @api_name == :jsonrpc
106
+ Api::jsonrpc = self
107
+ else
108
+ # Note, we have to wait until initialize to check this because we don't
109
+ # have access to instance options until now.
110
+
111
+ Api::jsonrpc = Jsonrpc.new(options)
112
+ @methods = Api::jsonrpc(rpc_client.uri.to_s).get_api_methods
113
+
114
+ unless !!@methods[@api_name]
115
+ raise UnknownApiError, "#{@api_name} (known APIs: #{@methods.keys.join(' ')})"
116
+ end
117
+
118
+ @methods = @methods[@api_name]
119
+ end
120
+
121
+ @try_count = 0
122
+ end
123
+
124
+ def inspect
125
+ properties = %w(chain methods).map do |prop|
126
+ if !!(v = instance_variable_get("@#{prop}"))
127
+ case v
128
+ when Array then "@#{prop}=<#{v.size} #{v.size == 1 ? 'element' : 'elements'}>"
129
+ else; "@#{prop}=#{v}"
130
+ end
131
+ end
132
+ end.compact.join(', ')
133
+
134
+ "#<#{self.class.api_class_name} [#{properties}]>"
135
+ end
136
+ private
137
+ # @private
138
+ def args_keys_to_s(rpc_method_name)
139
+ args = signature(rpc_method_name).args
140
+ args_keys = JSON[args.to_json]
141
+ end
142
+
143
+ # @private
144
+ def signature(rpc_method_name)
145
+ url = rpc_client.uri.to_s
146
+
147
+ @@signatures ||= {}
148
+ @@signatures[url] ||= {}
149
+ @@signatures[url][rpc_method_name] ||= Api::jsonrpc(url).get_signature(method: rpc_method_name).result
150
+ end
151
+
152
+ # @private
153
+ def respond_to_missing?(m, include_private = false)
154
+ methods.nil? ? false : methods.include?(m.to_sym)
155
+ end
156
+
157
+ # @private
158
+ def method_missing(m, *args, &block)
159
+ super unless respond_to_missing?(m)
160
+
161
+ rpc_method_name = "#{@api_name}.#{m}"
162
+ rpc_args = case @api_name
163
+ when :condenser_api then args
164
+ when :jsonrpc then args.first
165
+ else
166
+ expected_args = signature(rpc_method_name).args || []
167
+ expected_args_key_string = if expected_args.size > 0
168
+ " (#{args_keys_to_s(rpc_method_name)})"
169
+ end
170
+ expected_args_size = expected_args.size
171
+
172
+ begin
173
+ args = args.first.to_h
174
+ args_size = args.size
175
+
176
+ # Some argument are optional, but if the arguments passed are greater
177
+ # than the expected arguments size, we can warn.
178
+ if args_size > expected_args_size
179
+ @error_pipe.puts "Warning #{rpc_method_name} expects arguments: #{expected_args_size}, got: #{args_size}"
180
+ end
181
+ rescue NoMethodError => e
182
+ error = Crea::ArgumentError.new("#{rpc_method_name} expects arguments: #{expected_args_size}", e)
183
+ raise error
184
+ rescue => e
185
+ raise UnknownError.new("#{rpc_method_name} unknown error.", e)
186
+ end
187
+
188
+ args
189
+ end
190
+
191
+ response = rpc_client.rpc_execute(@api_name, m, rpc_args)
192
+
193
+ if !!block
194
+ case response
195
+ when Hashie::Mash then yield response.result, response.error, response.id
196
+ when Hashie::Array
197
+ response.each do |r|
198
+ r = Hashie::Mash.new(r)
199
+ yield r.result, r.error, r.id
200
+ end
201
+ else; yield response
202
+ end
203
+ else
204
+ return response
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,218 @@
1
+ module Crea
2
+ class BaseError < StandardError
3
+ def initialize(error = nil, cause = nil)
4
+ @error = error
5
+ @cause = cause
6
+ end
7
+
8
+ def to_s
9
+ detail = {}
10
+ detail[:error] = @error if !!@error
11
+ detail[:cause] = @cause if !!@cause
12
+
13
+ JSON[detail] rescue detail.to_s
14
+ end
15
+
16
+ def self.build_error(error, context)
17
+ if error.message == 'Unable to acquire database lock'
18
+ raise Crea::RemoteDatabaseLockError, error.message, build_backtrace(error)
19
+ end
20
+
21
+ if error.message.include? 'Internal Error'
22
+ raise Crea::RemoteNodeError, error.message, build_backtrace(error)
23
+ end
24
+
25
+ if error.message.include? 'Server error'
26
+ raise Crea::RemoteNodeError, error.message, build_backtrace(error)
27
+ end
28
+
29
+ if error.message.include? 'plugin not enabled'
30
+ raise Crea::PluginNotEnabledError, error.message, build_backtrace(error)
31
+ end
32
+
33
+ if error.message.include? 'argument'
34
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
35
+ end
36
+
37
+ if error.message.include? 'Invalid params'
38
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
39
+ end
40
+
41
+ if error.message.start_with? 'Bad Cast:'
42
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
43
+ end
44
+
45
+ if error.message.include? 'prefix_len'
46
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
47
+ end
48
+
49
+ if error.message.include? 'Parse Error'
50
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
51
+ end
52
+
53
+ if error.message.include? 'unknown key'
54
+ raise Crea::ArgumentError, "#{context}: #{error.message} (or content has been deleted)", build_backtrace(error)
55
+ end
56
+
57
+ if error.message.include? 'Comment is not in account\'s comments'
58
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
59
+ end
60
+
61
+ if error.message.include? 'Could not find comment'
62
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
63
+ end
64
+
65
+ if error.message.include? 'unable to convert ISO-formatted string to fc::time_point_sec'
66
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
67
+ end
68
+
69
+ if error.message.include? 'Input data have to treated as object.'
70
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
71
+ end
72
+
73
+ if error.message.include? 'base.amount > share_type(0)'
74
+ raise Crea::ArgumentError, "#{context}: #{error.message}", build_backtrace(error)
75
+ end
76
+
77
+ if error.message.include? 'blk->transactions.size() > itr->trx_in_block'
78
+ raise Crea::VirtualOperationsNotAllowedError, "#{context}: #{error.message}", build_backtrace(error)
79
+ end
80
+
81
+ if error.message.include? 'A transaction must have at least one operation'
82
+ raise Crea::EmptyTransactionError, "#{context}: #{error.message}", build_backtrace(error)
83
+ end
84
+
85
+ if error.message.include? 'transaction expiration exception'
86
+ raise Crea::TransactionExpiredError, "#{context}: #{error.message}", build_backtrace(error)
87
+ end
88
+
89
+ if error.message.include? 'Duplicate transaction check failed'
90
+ raise Crea::DuplicateTransactionError, "#{context}: #{error.message}", build_backtrace(error)
91
+ end
92
+
93
+ if error.message.include? 'signature is not canonical'
94
+ raise Crea::NonCanonicalSignatureError, "#{context}: #{error.message}", build_backtrace(error)
95
+ end
96
+
97
+ if error.message.include? 'attempting to push a block that is too old'
98
+ raise Crea::BlockTooOldError, "#{context}: #{error.message}", build_backtrace(error)
99
+ end
100
+
101
+ if error.message.include? 'irrelevant signature'
102
+ raise Crea::IrrelevantSignatureError, "#{context}: #{error.message}", build_backtrace(error)
103
+ end
104
+
105
+ if error.message.include? 'missing required posting authority'
106
+ raise Crea::MissingPostingAuthorityError, "#{context}: #{error.message}", build_backtrace(error)
107
+ end
108
+
109
+ if error.message.include? 'missing required active authority'
110
+ raise Crea::MissingActiveAuthorityError, "#{context}: #{error.message}", build_backtrace(error)
111
+ end
112
+
113
+ if error.message.include? 'missing required owner authority'
114
+ raise Crea::MissingOwnerAuthorityError, "#{context}: #{error.message}", build_backtrace(error)
115
+ end
116
+
117
+ if error.message.include? 'missing required other authority'
118
+ raise Crea::MissingOtherAuthorityError, "#{context}: #{error.message}", build_backtrace(error)
119
+ end
120
+
121
+ if error.message.include? 'Upstream response error'
122
+ raise Crea::UpstreamResponseError, "#{context}: #{error.message}", build_backtrace(error)
123
+ end
124
+
125
+ if error.message.include? 'Bad or missing upstream response'
126
+ raise Crea::BadOrMissingUpstreamResponseError, "#{context}: #{error.message}", build_backtrace(error)
127
+ end
128
+
129
+ if error.message.include? 'operator has disabled operation indexing by transaction_id'
130
+ raise Crea::TransactionIndexDisabledError, "#{context}: #{error.message}", build_backtrace(error)
131
+ end
132
+
133
+ if error.message.include? 'is_valid_account_name'
134
+ raise Crea::InvalidAccountError, "#{context}: #{error.message}", build_backtrace(error)
135
+ end
136
+
137
+ if error.message.include?('Method') && error.message.include?(' does not exist.')
138
+ raise Crea::UnknownMethodError, "#{context}: #{error.message}", build_backtrace(error)
139
+ end
140
+
141
+ if error.message.include? 'Invalid operation name'
142
+ raise Crea::UnknownOperationError, "#{context}: #{error.message}", build_backtrace(error)
143
+ end
144
+
145
+ if error.message =~ /Invalid object name: .+_operation/
146
+ raise Crea::UnknownOperationError, "#{context}: #{error.message}", build_backtrace(error)
147
+ end
148
+
149
+ if error.message.include? 'Author not found'
150
+ raise Crea::AuthorNotFoundError, "#{context}: #{error.message}", build_backtrace(error)
151
+ end
152
+
153
+ if error.message.include? ' != fc::time_point_sec::maximum()'
154
+ raise Crea::ReachedMaximumTimeError, "#{context}: #{error.message}", build_backtrace(error)
155
+ end
156
+
157
+ if error.message.include? 'Cannot transfer a negative amount (aka: stealing)'
158
+ raise Crea::TheftError, "#{context}: #{error.message}", build_backtrace(error)
159
+ end
160
+
161
+ if error.message.include? 'Must transfer a nonzero amount'
162
+ raise Crea::NonZeroRequiredError, "#{context}: #{error.message}", build_backtrace(error)
163
+ end
164
+
165
+ if error.message.include? 'is_asset_type'
166
+ raise Crea::UnexpectedAssetError, "#{context}: #{error.message}", build_backtrace(error)
167
+ end
168
+
169
+ puts JSON.pretty_generate(error) if ENV['DEBUG']
170
+ raise UnknownError, "#{context}: #{error.message}", build_backtrace(error)
171
+ end
172
+ private
173
+ def self.build_backtrace(error)
174
+ backtrace = Thread.current.backtrace.reject{ |line| line =~ /base_error/ }
175
+ JSON.pretty_generate(error) + "\n" + backtrace.join("\n")
176
+ end
177
+ end
178
+
179
+ class DeserializationError < BaseError; end
180
+ class SerializationMismatchError < BaseError; end
181
+ class UnsupportedChainError < BaseError; end
182
+ class ArgumentError < BaseError; end
183
+ class TypeError < BaseError; end
184
+ class EmptyTransactionError < ArgumentError; end
185
+ class InvalidAccountError < ArgumentError; end
186
+ class AuthorNotFoundError < ArgumentError; end
187
+ class ReachedMaximumTimeError < ArgumentError; end
188
+ class VirtualOperationsNotAllowedError < ArgumentError; end
189
+ class TheftError < ArgumentError; end
190
+ class NonZeroRequiredError < ArgumentError; end
191
+ class UnexpectedAssetError < ArgumentError; end
192
+ class TransactionExpiredError < BaseError; end
193
+ class DuplicateTransactionError < TransactionExpiredError; end
194
+ class NonCanonicalSignatureError < TransactionExpiredError; end
195
+ class BlockTooOldError < BaseError; end
196
+ class IrrelevantSignatureError < BaseError; end
197
+ class MissingAuthorityError < BaseError; end
198
+ class MissingPostingAuthorityError < MissingAuthorityError; end
199
+ class MissingActiveAuthorityError < MissingAuthorityError; end
200
+ class MissingOwnerAuthorityError < MissingAuthorityError; end
201
+ class MissingOtherAuthorityError < MissingAuthorityError; end
202
+ class IncorrectRequestIdError < BaseError; end
203
+ class IncorrectResponseIdError < BaseError; end
204
+ class RemoteNodeError < BaseError; end
205
+ class UpstreamResponseError < RemoteNodeError; end
206
+ class RemoteDatabaseLockError < UpstreamResponseError; end
207
+ class PluginNotEnabledError < UpstreamResponseError; end
208
+ class BadOrMissingUpstreamResponseError < UpstreamResponseError; end
209
+ class TransactionIndexDisabledError < BaseError; end
210
+ class NotAppBaseError < BaseError; end
211
+ class UnknownApiError < BaseError; end
212
+ class UnknownMethodError < BaseError; end
213
+ class UnknownOperationError < BaseError; end
214
+ class JsonRpcBatchMaximumSizeExceededError < BaseError; end
215
+ class TooManyTimeoutsError < BaseError; end
216
+ class TooManyRetriesError < BaseError; end
217
+ class UnknownError < BaseError; end
218
+ end