stellar_base-rails 0.7.1 → 0.8.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 +4 -4
- data/app/jobs/stellar_base/application_job.rb +4 -1
- data/app/jobs/stellar_base/enqueue_subscribe_accounts_job.rb +17 -0
- data/app/jobs/stellar_base/subscribe_account_job.rb +21 -0
- data/app/models/stellar_base/account_subscription.rb +4 -0
- data/app/services/stellar_base/account_subscriptions/execute_callback.rb +18 -0
- data/app/services/stellar_base/account_subscriptions/get_cursor.rb +21 -0
- data/app/services/stellar_base/account_subscriptions/get_operations.rb +22 -0
- data/app/services/stellar_base/account_subscriptions/get_tx.rb +16 -0
- data/app/services/stellar_base/account_subscriptions/save_cursor.rb +12 -0
- data/app/services/stellar_base/subscribe_account.rb +28 -0
- data/db/migrate/20181003072138_create_stellar_base_account_subscriptions.rb +10 -0
- data/lib/stellar_base.rb +16 -0
- data/lib/stellar_base/factories/account_subscription.rb +8 -0
- data/lib/stellar_base/version.rb +1 -1
- metadata +83 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 952ff7b6daad012f4455ec2fb98a767ad5db4736b8de3b09a145e33371f8125b
|
4
|
+
data.tar.gz: fa6d0be7aeb5bdfb813a966773d3770808de28284e4eefe32a4ec3bee5dfc37b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c30f41f12189c32702c59e33a0bb166ea185b657fc88c6302ff54d5fb6c7465f54da185351eaae567491151b1594e5a1b90769515b59b13882a37cf25be41223
|
7
|
+
data.tar.gz: 906829e824d97bab00df168602ec6614fd34da9aceea958121f0c227f56512dbfdd7e78435f107e2e0d453f3e88a0d1bc893ac77900b843e9757c563e48a23fb
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module StellarBase
|
2
|
+
class EnqueueSubscribeAccountsJob < ApplicationJob
|
3
|
+
|
4
|
+
extend LightService::Organizer
|
5
|
+
|
6
|
+
def perform
|
7
|
+
StellarBase.configuration.subscribe_to_accounts.each do |address|
|
8
|
+
AccountSubscription.where(address: address).first_or_create!
|
9
|
+
end
|
10
|
+
|
11
|
+
AccountSubscription.find_each do |account_subscription|
|
12
|
+
SubscribeAccountJob.perform_async(account_subscription.id)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module StellarBase
|
2
|
+
class SubscribeAccountJob < ApplicationJob
|
3
|
+
|
4
|
+
sidekiq_options(
|
5
|
+
retry: false,
|
6
|
+
lock: :until_executed,
|
7
|
+
unique_args: :unique_args,
|
8
|
+
on_conflict: :log,
|
9
|
+
)
|
10
|
+
|
11
|
+
def perform(account_subscription_id)
|
12
|
+
account_subscription = AccountSubscription.find(account_subscription_id)
|
13
|
+
SubscribeAccount.(account_subscription)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.unique_args(args)
|
17
|
+
args
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module AccountSubscriptions
|
3
|
+
class ExecuteCallback
|
4
|
+
|
5
|
+
extend LightService::Action
|
6
|
+
expects :account_subscription, :tx, :operation
|
7
|
+
|
8
|
+
executed do |c|
|
9
|
+
StellarBase.configuration.on_account_event.(
|
10
|
+
c.account_subscription.address,
|
11
|
+
c.tx,
|
12
|
+
c.operation,
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module AccountSubscriptions
|
3
|
+
class GetCursor
|
4
|
+
|
5
|
+
extend LightService::Action
|
6
|
+
expects :account_subscription, :stellar_sdk_client
|
7
|
+
promises :cursor
|
8
|
+
|
9
|
+
executed do |c|
|
10
|
+
c.cursor = c.account_subscription.cursor
|
11
|
+
|
12
|
+
next c if c.cursor.present?
|
13
|
+
|
14
|
+
c.cursor = c.stellar_sdk_client.horizon.
|
15
|
+
account(account_id: c.account_subscription.address).
|
16
|
+
operations(order: "desc", limit: 1).records.first.id
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module AccountSubscriptions
|
3
|
+
class GetOperations
|
4
|
+
|
5
|
+
extend LightService::Action
|
6
|
+
expects(
|
7
|
+
:cursor,
|
8
|
+
:account_subscription,
|
9
|
+
:stellar_sdk_client,
|
10
|
+
:operation_limit,
|
11
|
+
)
|
12
|
+
promises :operations
|
13
|
+
|
14
|
+
executed do |c|
|
15
|
+
c.operations = c.stellar_sdk_client.horizon.
|
16
|
+
account(account_id: c.account_subscription.address).
|
17
|
+
operations(order: "asc", limit: c.operation_limit).records
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module AccountSubscriptions
|
3
|
+
class GetTx
|
4
|
+
|
5
|
+
extend LightService::Action
|
6
|
+
expects :stellar_sdk_client, :operation
|
7
|
+
promises :tx
|
8
|
+
|
9
|
+
executed do |c|
|
10
|
+
hash = c.operation.transaction_hash
|
11
|
+
c.tx = c.stellar_sdk_client.horizon.transaction(hash: hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module StellarBase
|
2
|
+
class SubscribeAccount
|
3
|
+
|
4
|
+
extend LightService::Organizer
|
5
|
+
OPERATION_LIMIT = 200
|
6
|
+
|
7
|
+
def self.call(account_subscription, operation_limit: OPERATION_LIMIT)
|
8
|
+
with(
|
9
|
+
account_subscription: account_subscription,
|
10
|
+
operation_limit: operation_limit,
|
11
|
+
).reduce(actions)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.actions
|
15
|
+
[
|
16
|
+
InitStellarClient,
|
17
|
+
AccountSubscriptions::GetCursor,
|
18
|
+
AccountSubscriptions::GetOperations,
|
19
|
+
iterate(:operations, [
|
20
|
+
AccountSubscriptions::GetTx,
|
21
|
+
AccountSubscriptions::ExecuteCallback,
|
22
|
+
]),
|
23
|
+
AccountSubscriptions::SaveCursor,
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateStellarBaseAccountSubscriptions < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :stellar_base_account_subscriptions do |t|
|
4
|
+
t.string :address, null: false
|
5
|
+
t.string :cursor
|
6
|
+
t.index :address, unique: true
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/stellar_base.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "addressable"
|
1
2
|
require "gem_config"
|
2
3
|
require "stellar-base"
|
3
4
|
require "light-service"
|
@@ -10,6 +11,9 @@ require "reform"
|
|
10
11
|
require "reform/form/coercion"
|
11
12
|
require "representable"
|
12
13
|
require "toml-rb"
|
14
|
+
require "sidekiq"
|
15
|
+
require "sidekiq-cron"
|
16
|
+
require "sidekiq-unique-jobs"
|
13
17
|
|
14
18
|
require "stellar_base/engine"
|
15
19
|
|
@@ -25,6 +29,8 @@ module StellarBase
|
|
25
29
|
has :modules, default: [:bridge_callbacks]
|
26
30
|
has :on_bridge_callback
|
27
31
|
has :on_withdraw
|
32
|
+
has :on_account_event
|
33
|
+
has :subscribe_to_accounts, classes: [NilClass, Array]
|
28
34
|
has :stellar_network, classes: String, default: "testnet"
|
29
35
|
has :stellar_toml, classes: Hash, default: {}
|
30
36
|
has :depositable_assets, classes: [NilClass, Array, String, Pathname]
|
@@ -35,6 +41,7 @@ module StellarBase
|
|
35
41
|
convert_config_withdraw!
|
36
42
|
convert_config_deposit!
|
37
43
|
set_stellar_network!
|
44
|
+
configure_sidekiq_death_handler!
|
38
45
|
end
|
39
46
|
|
40
47
|
def self.on_deposit_trigger(network:, deposit_address:, tx_id:, amount:)
|
@@ -98,6 +105,15 @@ module StellarBase
|
|
98
105
|
rescue Errno::ENOENT
|
99
106
|
end
|
100
107
|
private_class_method :try_from_yaml_file_path
|
108
|
+
|
109
|
+
def self.configure_sidekiq_death_handler!
|
110
|
+
Sidekiq.configure_server do |config|
|
111
|
+
config.death_handlers << ->(job, _ex) do
|
112
|
+
return unless job['unique_digest']
|
113
|
+
SidekiqUniqueJobs::Digests.del(digest: job['unique_digest'])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
101
117
|
end
|
102
118
|
|
103
119
|
require "stellar_base/horizon_client"
|
data/lib/stellar_base/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stellar_base-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ace Subido
|
@@ -94,6 +94,62 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: addressable
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sidekiq
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '5.1'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '5.1'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: sidekiq-cron
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sidekiq-unique-jobs
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
97
153
|
- !ruby/object:Gem::Dependency
|
98
154
|
name: rails
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -276,6 +332,20 @@ dependencies:
|
|
276
332
|
- - ">="
|
277
333
|
- !ruby/object:Gem::Version
|
278
334
|
version: '0'
|
335
|
+
- !ruby/object:Gem::Dependency
|
336
|
+
name: rspec-sidekiq
|
337
|
+
requirement: !ruby/object:Gem::Requirement
|
338
|
+
requirements:
|
339
|
+
- - ">="
|
340
|
+
- !ruby/object:Gem::Version
|
341
|
+
version: '0'
|
342
|
+
type: :development
|
343
|
+
prerelease: false
|
344
|
+
version_requirements: !ruby/object:Gem::Requirement
|
345
|
+
requirements:
|
346
|
+
- - ">="
|
347
|
+
- !ruby/object:Gem::Version
|
348
|
+
version: '0'
|
279
349
|
description: API Endpoints for the Stellar Protocol
|
280
350
|
email:
|
281
351
|
- ace.subido@gmail.com
|
@@ -307,7 +377,10 @@ files:
|
|
307
377
|
- app/controllers/stellar_base/withdraw_controller.rb
|
308
378
|
- app/helpers/stellar_base/application_helper.rb
|
309
379
|
- app/jobs/stellar_base/application_job.rb
|
380
|
+
- app/jobs/stellar_base/enqueue_subscribe_accounts_job.rb
|
381
|
+
- app/jobs/stellar_base/subscribe_account_job.rb
|
310
382
|
- app/mailers/stellar_base/application_mailer.rb
|
383
|
+
- app/models/stellar_base/account_subscription.rb
|
311
384
|
- app/models/stellar_base/application_record.rb
|
312
385
|
- app/models/stellar_base/bridge_callback.rb
|
313
386
|
- app/models/stellar_base/deposit.rb
|
@@ -317,6 +390,11 @@ files:
|
|
317
390
|
- app/representers/stellar_base/application_representer.rb
|
318
391
|
- app/representers/stellar_base/deposit_request_representer.rb
|
319
392
|
- app/representers/stellar_base/withdrawal_request_representer.rb
|
393
|
+
- app/services/stellar_base/account_subscriptions/execute_callback.rb
|
394
|
+
- app/services/stellar_base/account_subscriptions/get_cursor.rb
|
395
|
+
- app/services/stellar_base/account_subscriptions/get_operations.rb
|
396
|
+
- app/services/stellar_base/account_subscriptions/get_tx.rb
|
397
|
+
- app/services/stellar_base/account_subscriptions/save_cursor.rb
|
320
398
|
- app/services/stellar_base/bridge_callbacks/check.rb
|
321
399
|
- app/services/stellar_base/bridge_callbacks/compare.rb
|
322
400
|
- app/services/stellar_base/bridge_callbacks/get_operation.rb
|
@@ -346,6 +424,7 @@ files:
|
|
346
424
|
- app/services/stellar_base/gen_memo_for.rb
|
347
425
|
- app/services/stellar_base/gen_random_string.rb
|
348
426
|
- app/services/stellar_base/init_stellar_client.rb
|
427
|
+
- app/services/stellar_base/subscribe_account.rb
|
349
428
|
- app/services/stellar_base/withdrawal_requests/call_on_withdraw.rb
|
350
429
|
- app/services/stellar_base/withdrawal_requests/determine_fee.rb
|
351
430
|
- app/services/stellar_base/withdrawal_requests/determine_max_amount.rb
|
@@ -363,10 +442,12 @@ files:
|
|
363
442
|
- db/migrate/20180816135847_unique_stellar_base_bridge_callbacks_operation_id.rb
|
364
443
|
- db/migrate/20180925045927_create_stellar_base_deposit_requests.rb
|
365
444
|
- db/migrate/20181001070647_create_stellar_base_deposits.rb
|
445
|
+
- db/migrate/20181003072138_create_stellar_base_account_subscriptions.rb
|
366
446
|
- lib/stellar_base-rails.rb
|
367
447
|
- lib/stellar_base.rb
|
368
448
|
- lib/stellar_base/engine.rb
|
369
449
|
- lib/stellar_base/factories.rb
|
450
|
+
- lib/stellar_base/factories/account_subscription.rb
|
370
451
|
- lib/stellar_base/factories/bridge_callbacks.rb
|
371
452
|
- lib/stellar_base/factories/deposit_requests.rb
|
372
453
|
- lib/stellar_base/factories/deposits.rb
|
@@ -395,7 +476,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
395
476
|
version: '0'
|
396
477
|
requirements: []
|
397
478
|
rubyforge_project:
|
398
|
-
rubygems_version: 2.7.
|
479
|
+
rubygems_version: 2.7.7
|
399
480
|
signing_key:
|
400
481
|
specification_version: 4
|
401
482
|
summary: Mountable Stellar API Endpoints for Rails
|