stellar_base-rails 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|