steem-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,151 @@
1
+ module Steem
2
+ class BaseError < StandardError
3
+ def initialize(error, cause = nil)
4
+ @error = error
5
+ @cause = cause
6
+ end
7
+
8
+ def to_s
9
+ if !!@cause
10
+ JSON[error: @error, cause: @cause] rescue {error: @error, cause: @cause}.to_s
11
+ else
12
+ JSON[@error] rescue @error.to_s
13
+ end
14
+ end
15
+
16
+ def self.build_error(error, context)
17
+ if error.message == 'Unable to acquire database lock'
18
+ raise Steem::RemoteNodeError, error.message, JSON.pretty_generate(error)
19
+ end
20
+
21
+ if error.message.include? 'Internal Error'
22
+ raise Steem::RemoteNodeError.new, error.message, JSON.pretty_generate(error)
23
+ end
24
+
25
+ if error.message.include? 'plugin not enabled'
26
+ raise Steem::RemoteNodeError, error.message, JSON.pretty_generate(error)
27
+ end
28
+
29
+ if error.message.include? 'argument'
30
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
31
+ end
32
+
33
+ if error.message.start_with? 'Bad Cast:'
34
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
35
+ end
36
+
37
+ if error.message.include? 'prefix_len'
38
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
39
+ end
40
+
41
+ if error.message.include? 'Parse Error'
42
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
43
+ end
44
+
45
+ if error.message.include? 'unknown key'
46
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
47
+ end
48
+
49
+ if error.message.include? 'A transaction must have at least one operation'
50
+ raise Steem::EmptyTransactionError, "#{context}: #{error.message}", JSON.pretty_generate(error)
51
+ end
52
+
53
+ if error.message.include? 'transaction expiration exception'
54
+ raise Steem::TransactionExpiredError, "#{context}: #{error.message}", JSON.pretty_generate(error)
55
+ end
56
+
57
+ if error.message.include? 'Duplicate transaction check failed'
58
+ raise Steem::DuplicateTransactionError, "#{context}: #{error.message}", JSON.pretty_generate(error)
59
+ end
60
+
61
+ if error.message.include? 'signature is not canonical'
62
+ raise Steem::NonCanonicalSignatureError, "#{context}: #{error.message}", JSON.pretty_generate(error)
63
+ end
64
+
65
+ if error.message.include? 'attempting to push a block that is too old'
66
+ raise Steem::BlockTooOldError, "#{context}: #{error.message}", JSON.pretty_generate(error)
67
+ end
68
+
69
+ if error.message.include? 'irrelevant signature'
70
+ raise Steem::IrrelevantSignatureError, "#{context}: #{error.message}", JSON.pretty_generate(error)
71
+ end
72
+
73
+ if error.message.include? 'missing required posting authority'
74
+ raise Steem::MissingPostingAuthorityError, "#{context}: #{error.message}", JSON.pretty_generate(error)
75
+ end
76
+
77
+ if error.message.include? 'missing required active authority'
78
+ raise Steem::MissingActiveAuthorityError, "#{context}: #{error.message}", JSON.pretty_generate(error)
79
+ end
80
+
81
+ if error.message.include? 'missing required owner authority'
82
+ raise Steem::MissingOwnerAuthorityError, "#{context}: #{error.message}", JSON.pretty_generate(error)
83
+ end
84
+
85
+ if error.message.include? 'missing required other authority'
86
+ raise Steem::MissingOtherAuthorityError, "#{context}: #{error.message}", JSON.pretty_generate(error)
87
+ end
88
+
89
+ if error.message.include? 'is_valid_account_name'
90
+ raise Steem::InvalidAccountError, "#{context}: #{error.message}", JSON.pretty_generate(error)
91
+ end
92
+
93
+ if error.message.include? 'Invalid operation name'
94
+ raise Steem::UnknownOperationError, "#{context}: #{error.message}", JSON.pretty_generate(error)
95
+ end
96
+
97
+ if error.message.include? 'Author not found'
98
+ raise Steem::AuthorNotFoundError, "#{context}: #{error.message}", JSON.pretty_generate(error)
99
+ end
100
+
101
+ if error.message.include? ' != fc::time_point_sec::maximum()'
102
+ raise Steem::ReachedMaximumTimeError, "#{context}: #{error.message}", JSON.pretty_generate(error)
103
+ end
104
+
105
+ if error.message.include? 'Cannot transfer a negative amount (aka: stealing)'
106
+ raise Steem::TheftError, "#{context}: #{error.message}", JSON.pretty_generate(error)
107
+ end
108
+
109
+ if error.message.include? 'Must transfer a nonzero amount'
110
+ raise Steem::NonZeroRequiredError, "#{context}: #{error.message}", JSON.pretty_generate(error)
111
+ end
112
+
113
+ if error.message.include? 'is_asset_type'
114
+ raise Steem::UnexpectedAssetError, "#{context}: #{error.message}", JSON.pretty_generate(error)
115
+ end
116
+
117
+ if error.message.include? 'unable to convert ISO-formatted string to fc::time_point_sec'
118
+ raise Steem::ArgumentError, "#{context}: #{error.message}", JSON.pretty_generate(error)
119
+ end
120
+
121
+ puts JSON.pretty_generate(error) if ENV['DEBUG']
122
+ raise UnknownError, "#{context}: #{error.message}", JSON.pretty_generate(error)
123
+ end
124
+ end
125
+
126
+ class UnsupportedChainError < BaseError; end
127
+ class ArgumentError < BaseError; end
128
+ class RemoteNodeError < BaseError; end
129
+ class TypeError < BaseError; end
130
+ class EmptyTransactionError < BaseError; end
131
+ class TransactionExpiredError < BaseError; end
132
+ class DuplicateTransactionError < BaseError; end
133
+ class NonCanonicalSignatureError < BaseError; end
134
+ class BlockTooOldError < BaseError; end
135
+ class IrrelevantSignatureError < BaseError; end
136
+ class MissingPostingAuthorityError < BaseError; end
137
+ class MissingActiveAuthorityError < BaseError; end
138
+ class MissingOwnerAuthorityError < BaseError; end
139
+ class MissingOtherAuthorityError < BaseError; end
140
+ class InvalidAccountError < BaseError; end
141
+ class AuthorNotFoundError < BaseError; end
142
+ class ReachedMaximumTimeError < BaseError; end
143
+ class TheftError < BaseError; end
144
+ class NonZeroRequiredError < BaseError; end
145
+ class UnexpectedAssetError < BaseError; end
146
+ class IncorrectRequestIdError < BaseError; end
147
+ class IncorrectResponseIdError < BaseError; end
148
+ class UnknownApiError < BaseError; end
149
+ class UnknownOperationError < BaseError; end
150
+ class UnknownError < BaseError; end
151
+ end
@@ -0,0 +1,45 @@
1
+ module Steem
2
+ # {BlockApi} is used to query values related to the block plugin. It can also
3
+ # be used to access a range of multiple blocks by using
4
+ # {http://www.jsonrpc.org/specification#batch JSON-RPC 2.0 batch} requests.
5
+ #
6
+ # Also see: {https://developers.steem.io/apidefinitions/block-api Block API Definitions}
7
+ class BlockApi < Api
8
+ MAX_RANGE_SIZE = 3000
9
+
10
+ def initialize(options = {})
11
+ self.class.api_name = :block_api
12
+ super
13
+ end
14
+
15
+ # Uses a batched requst on a range of blocks.
16
+ #
17
+ # @param options [Hash] The attributes to get a block range with.
18
+ # @option options [Range] :block_range starting on one block number and ending on an higher block number.
19
+ def get_blocks(options = {block_range: [0..0]}, &block)
20
+ block_range = options[:block_range] || [0..0]
21
+
22
+ if block_range.size > MAX_RANGE_SIZE
23
+ raise Steem::ArgumentError, "Too many blocks requested: #{block_range.size}; maximum request size: #{MAX_RANGE_SIZE}."
24
+ end
25
+
26
+ request_body = []
27
+
28
+ for i in block_range do
29
+ @rpc_client.put(self.class.api_name, :get_block, block_num: i, request_body: request_body)
30
+ end
31
+
32
+ if !!block
33
+ @rpc_client.rpc_post(nil, nil, request_body: request_body) do |result, error, id|
34
+ yield result.nil? ? nil : result.block, error, id
35
+ end
36
+ else
37
+ blocks = []
38
+
39
+ @rpc_client.rpc_post(nil, nil, request_body: request_body) do |result, error, id|
40
+ blocks << result
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end