stellar_base-rails 3.0.1 → 3.1.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/README.md +1 -7
- data/app/concepts/stellar_base/deposit_requests/operations/create.rb +2 -0
- data/app/concepts/stellar_base/fee_requests/contracts/show.rb +50 -0
- data/app/concepts/stellar_base/fee_requests/fee_request_policy.rb +18 -0
- data/app/concepts/stellar_base/fee_requests/operations/show.rb +42 -0
- data/app/concepts/stellar_base/withdrawal_requests/operations/create.rb +4 -0
- data/app/controllers/stellar_base/application_controller.rb +13 -0
- data/app/controllers/stellar_base/balances_controller.rb +0 -10
- data/app/controllers/stellar_base/deposit_controller.rb +1 -4
- data/app/controllers/stellar_base/fee_requests_controller.rb +31 -0
- data/app/controllers/stellar_base/withdraw_controller.rb +1 -4
- data/app/models/stellar_base/fee_request.rb +13 -0
- data/app/representers/stellar_base/fee_request_representer.rb +7 -0
- data/app/services/stellar_base/fee_requests/call_fee_from.rb +28 -0
- data/app/services/stellar_base/find_asset_details.rb +19 -0
- data/config/routes.rb +1 -0
- data/lib/stellar_base/factories/fee_requests.rb +11 -0
- data/lib/stellar_base/version.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74b62f61385eba2ad71a788469192da7d9056875055582a17c38e982688f0bfc
|
4
|
+
data.tar.gz: 37012d044e08a99b22116cfc54b243a27440721ed4a26eee198c022d10d327c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2868b757d5cea6de7ca3a25e9d4f3131f029954f07a2f995b674c858fb6602b00c041a1877176d1c9f106a8d2e543ef2cbd608129e116caa9b9fd01f3f2703ee
|
7
|
+
data.tar.gz: 54ef4814eb47f06e8d7148b4f6eaf1d68b0ba89d64b38d56b2af169b957e7962a2009cfffaf203c6ad918e6088eb1cd78507b043c4bdf12e5149f60033fbe26e
|
data/README.md
CHANGED
@@ -20,6 +20,7 @@ rails db:migrate
|
|
20
20
|
```
|
21
21
|
|
22
22
|
### Configuration
|
23
|
+
|
23
24
|
Create an initializer in your rails application:
|
24
25
|
|
25
26
|
```
|
@@ -115,14 +116,7 @@ gem("stellar-sdk", {
|
|
115
116
|
|
116
117
|
## Development
|
117
118
|
|
118
|
-
```ruby
|
119
|
-
cp spec/config.yml{.sample,}
|
120
|
-
```
|
121
|
-
|
122
|
-
Edit the `spec/config.yml` file.
|
123
|
-
|
124
119
|
```sh
|
125
|
-
cd spec/dummy
|
126
120
|
rails db:migrate
|
127
121
|
rails db:migrate RAILS_ENV=test
|
128
122
|
```
|
@@ -54,6 +54,8 @@ module StellarBase
|
|
54
54
|
options["model"].min_amount = 0.0
|
55
55
|
|
56
56
|
# Make Deposits free unless we want it configured
|
57
|
+
#
|
58
|
+
# TODO: this should come from `CallFeeFrom.(details[:fee_from)`
|
57
59
|
options["model"].fee_fixed = details[:fee_fixed] || 0.0
|
58
60
|
options["model"].fee_percent = details[:fee_percent] || 0.0
|
59
61
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module FeeRequests
|
3
|
+
module Contracts
|
4
|
+
class Show < ApplicationContract
|
5
|
+
|
6
|
+
property :operation
|
7
|
+
property :type
|
8
|
+
property :asset_code
|
9
|
+
property :amount
|
10
|
+
|
11
|
+
OPERATION_TYPES = %w[deposit withdraw].freeze
|
12
|
+
|
13
|
+
validates(
|
14
|
+
:operation,
|
15
|
+
presence: true,
|
16
|
+
inclusion: {
|
17
|
+
in: OPERATION_TYPES,
|
18
|
+
message: "%{value} is not a valid operation",
|
19
|
+
},
|
20
|
+
)
|
21
|
+
validates(:asset_code, :amount, presence: true)
|
22
|
+
|
23
|
+
validate :check_valid_asset_code
|
24
|
+
|
25
|
+
def check_valid_asset_code
|
26
|
+
return if operation.blank?
|
27
|
+
asset_codes = if operation == "deposit"
|
28
|
+
StellarBase.configuration.depositable_assets
|
29
|
+
&.map do |asset|
|
30
|
+
asset[:asset_code]
|
31
|
+
end
|
32
|
+
else
|
33
|
+
StellarBase.configuration.withdrawable_assets
|
34
|
+
&.map do |asset|
|
35
|
+
asset[:asset_code]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
return if asset_codes.include? asset_code
|
40
|
+
|
41
|
+
errors.add(
|
42
|
+
:asset_code,
|
43
|
+
"invalid asset_code. Valid asset_codes: #{asset_codes.join(', ')}",
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module FeeRequests
|
3
|
+
class FeeRequestPolicy
|
4
|
+
|
5
|
+
def initialize(_, _)
|
6
|
+
end
|
7
|
+
|
8
|
+
def show?
|
9
|
+
StellarBase.included_module?(:fees) &&
|
10
|
+
(
|
11
|
+
StellarBase.included_module?(:withdraw) ||
|
12
|
+
StellarBase.included_module?(:deposit)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module FeeRequests
|
3
|
+
module Operations
|
4
|
+
class Show < ApplicationOperation
|
5
|
+
|
6
|
+
POLICY_ERROR_MESSAGE = "You are unauthorized to request fee details".freeze
|
7
|
+
|
8
|
+
step self::Policy::Pundit(FeeRequestPolicy, :show?)
|
9
|
+
failure :set_policy_error!
|
10
|
+
step Model(FeeRequest, :new)
|
11
|
+
step Contract::Build(constant: Contracts::Show)
|
12
|
+
step Contract::Validate(key: :fee_request)
|
13
|
+
step Contract::Persist(method: :sync)
|
14
|
+
step :find_asset_details!
|
15
|
+
success :set_fee_response!
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def set_policy_error!(options, params:, **)
|
20
|
+
options["result.policy.message"] = POLICY_ERROR_MESSAGE
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_asset_details!(options, params:, **)
|
24
|
+
details = FindAssetDetails.(
|
25
|
+
operation: params[:fee_request][:operation],
|
26
|
+
asset_code: params[:fee_request][:asset_code],
|
27
|
+
)
|
28
|
+
options[:asset_details] = details.presence || {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_fee_response!(options, model:, asset_details:, params:, **)
|
32
|
+
model.fee_response = FeeRequests::CallFeeFrom.(
|
33
|
+
fee_request: model,
|
34
|
+
fee_from: asset_details[:fee_from],
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -52,8 +52,12 @@ module StellarBase
|
|
52
52
|
options["model"].min_amount = 0.0
|
53
53
|
options["model"].max_amount =
|
54
54
|
DetermineMaxAmount.(withdrawal_asset_details[:max_amount_from])
|
55
|
+
|
56
|
+
# TODO: This should come from `CallFeeFrom.(details[:fee_from])`
|
57
|
+
# or dest_extra
|
55
58
|
options["model"].fee_fixed =
|
56
59
|
DetermineFee.(withdrawal_asset_details[:fee_fixed])
|
60
|
+
|
57
61
|
options["model"].fee_percent =
|
58
62
|
DetermineFee.(withdrawal_asset_details[:fee_percent])
|
59
63
|
options["model"].fee_network = fee_network
|
@@ -1,5 +1,18 @@
|
|
1
1
|
module StellarBase
|
2
2
|
class ApplicationController < ActionController::Base
|
3
3
|
protect_from_forgery with: :null_session
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def errors_from(op)
|
8
|
+
unless op["result.policy.default"].success?
|
9
|
+
return { error: op["result.policy.message"] }
|
10
|
+
end
|
11
|
+
|
12
|
+
if op["contract.default"].errors.any?
|
13
|
+
return { error: op["contract.default"].errors }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
4
17
|
end
|
5
18
|
end
|
@@ -21,16 +21,6 @@ module StellarBase
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
def errors_from(op)
|
25
|
-
unless op["result.policy.default"].success?
|
26
|
-
return { errors: op["result.policy.message"] }
|
27
|
-
end
|
28
|
-
|
29
|
-
if op["contract.default"].errors.any?
|
30
|
-
return { errors: op["contract.default"].errors }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
24
|
def balance_params
|
35
25
|
params.permit(:asset_code).to_hash.with_indifferent_access
|
36
26
|
end
|
@@ -12,10 +12,7 @@ module StellarBase
|
|
12
12
|
representer = DepositRequestRepresenter.new(twin)
|
13
13
|
render json: representer
|
14
14
|
else
|
15
|
-
render(
|
16
|
-
json: { error: op["contract.default"].errors },
|
17
|
-
status: :unprocessable_entity,
|
18
|
-
)
|
15
|
+
render json: errors_from(op), status: :unprocessable_entity
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module StellarBase
|
2
|
+
class FeeRequestsController < ApplicationController
|
3
|
+
|
4
|
+
def show
|
5
|
+
op = FeeRequests::Operations::Show.(fee_request: fee_request_params)
|
6
|
+
|
7
|
+
respond_to do |f|
|
8
|
+
f.json do
|
9
|
+
if op.success?
|
10
|
+
representer = FeeRequestRepresenter.new(op["model"])
|
11
|
+
render json: representer
|
12
|
+
else
|
13
|
+
render json: errors_from(op), status: :unprocessable_entity
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def fee_request_params
|
22
|
+
params.permit(*%i[
|
23
|
+
asset_code
|
24
|
+
amount
|
25
|
+
type
|
26
|
+
operation
|
27
|
+
]).to_hash.with_indifferent_access
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -12,10 +12,7 @@ module StellarBase
|
|
12
12
|
representer = WithdrawalRequestRepresenter.new(twin)
|
13
13
|
render json: representer
|
14
14
|
else
|
15
|
-
render(
|
16
|
-
json: { error: op["result.policy.message"] || op["contract.default"].errors },
|
17
|
-
status: :unprocessable_entity,
|
18
|
-
)
|
15
|
+
render json: errors_from(op), status: :unprocessable_entity
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module StellarBase
|
2
|
+
module FeeRequests
|
3
|
+
class CallFeeFrom
|
4
|
+
|
5
|
+
FEE_FROM_ERROR = "`fee_from` must be a string of an object " \
|
6
|
+
"that responds to `.call` or the object itself".freeze
|
7
|
+
|
8
|
+
def self.call(fee_request:, fee_from:)
|
9
|
+
return 0 if fee_from.nil?
|
10
|
+
callback = callback_from(fee_from)
|
11
|
+
callback.(fee_request)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.callback_from(fee_from)
|
15
|
+
if fee_from.respond_to?(:constantize)
|
16
|
+
fee_from = fee_from.constantize
|
17
|
+
end
|
18
|
+
|
19
|
+
if !fee_from.respond_to?(:call)
|
20
|
+
fail ArgumentError, FEE_FROM_ERROR
|
21
|
+
end
|
22
|
+
|
23
|
+
fee_from
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module StellarBase
|
2
|
+
class FindAssetDetails
|
3
|
+
|
4
|
+
def self.call(operation:, asset_code:)
|
5
|
+
return nil if operation.blank?
|
6
|
+
return nil if asset_code.blank?
|
7
|
+
|
8
|
+
assets = if operation == "deposit"
|
9
|
+
StellarBase.configuration.depositable_assets
|
10
|
+
elsif operation == "withdraw"
|
11
|
+
StellarBase.configuration.withdrawable_assets
|
12
|
+
else
|
13
|
+
[]
|
14
|
+
end
|
15
|
+
assets.find {|asset| asset[:asset_code] == asset_code }
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/config/routes.rb
CHANGED
data/lib/stellar_base/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stellar_base-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ace Subido
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: disposable
|
@@ -426,6 +426,9 @@ files:
|
|
426
426
|
- app/concepts/stellar_base/deposit_requests/contracts/create.rb
|
427
427
|
- app/concepts/stellar_base/deposit_requests/deposit_request_policy.rb
|
428
428
|
- app/concepts/stellar_base/deposit_requests/operations/create.rb
|
429
|
+
- app/concepts/stellar_base/fee_requests/contracts/show.rb
|
430
|
+
- app/concepts/stellar_base/fee_requests/fee_request_policy.rb
|
431
|
+
- app/concepts/stellar_base/fee_requests/operations/show.rb
|
429
432
|
- app/concepts/stellar_base/withdrawal_requests/contracts/create.rb
|
430
433
|
- app/concepts/stellar_base/withdrawal_requests/operations/create.rb
|
431
434
|
- app/concepts/stellar_base/withdrawal_requests/withdrawal_request_policy.rb
|
@@ -433,6 +436,7 @@ files:
|
|
433
436
|
- app/controllers/stellar_base/balances_controller.rb
|
434
437
|
- app/controllers/stellar_base/bridge_callbacks_controller.rb
|
435
438
|
- app/controllers/stellar_base/deposit_controller.rb
|
439
|
+
- app/controllers/stellar_base/fee_requests_controller.rb
|
436
440
|
- app/controllers/stellar_base/home_controller.rb
|
437
441
|
- app/controllers/stellar_base/withdraw_controller.rb
|
438
442
|
- app/errors/stellar_base/not_found_error.rb
|
@@ -447,6 +451,7 @@ files:
|
|
447
451
|
- app/models/stellar_base/bridge_callback.rb
|
448
452
|
- app/models/stellar_base/deposit.rb
|
449
453
|
- app/models/stellar_base/deposit_request.rb
|
454
|
+
- app/models/stellar_base/fee_request.rb
|
450
455
|
- app/models/stellar_base/stellar_operation.rb
|
451
456
|
- app/models/stellar_base/stellar_payment.rb
|
452
457
|
- app/models/stellar_base/stellar_toml.rb
|
@@ -455,6 +460,7 @@ files:
|
|
455
460
|
- app/representers/stellar_base/application_representer.rb
|
456
461
|
- app/representers/stellar_base/balance_representer.rb
|
457
462
|
- app/representers/stellar_base/deposit_request_representer.rb
|
463
|
+
- app/representers/stellar_base/fee_request_representer.rb
|
458
464
|
- app/representers/stellar_base/withdrawal_request_representer.rb
|
459
465
|
- app/services/stellar_base/account_subscriptions/execute_account_subscription_callback.rb
|
460
466
|
- app/services/stellar_base/account_subscriptions/find_or_create_operation.rb
|
@@ -490,6 +496,8 @@ files:
|
|
490
496
|
- app/services/stellar_base/deposit_requests/send_asset.rb
|
491
497
|
- app/services/stellar_base/deposit_requests/trigger.rb
|
492
498
|
- app/services/stellar_base/deposit_requests/update_deposit.rb
|
499
|
+
- app/services/stellar_base/fee_requests/call_fee_from.rb
|
500
|
+
- app/services/stellar_base/find_asset_details.rb
|
493
501
|
- app/services/stellar_base/gen_memo_for.rb
|
494
502
|
- app/services/stellar_base/gen_random_string.rb
|
495
503
|
- app/services/stellar_base/init_asset_sending_client.rb
|
@@ -523,6 +531,7 @@ files:
|
|
523
531
|
- lib/stellar_base/factories/bridge_callbacks.rb
|
524
532
|
- lib/stellar_base/factories/deposit_requests.rb
|
525
533
|
- lib/stellar_base/factories/deposits.rb
|
534
|
+
- lib/stellar_base/factories/fee_requests.rb
|
526
535
|
- lib/stellar_base/factories/stellar_operations.rb
|
527
536
|
- lib/stellar_base/factories/stellar_transactions.rb
|
528
537
|
- lib/stellar_base/factories/withdrawal_requests.rb
|