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