bitsy-bitcoin 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/bitsy/v1/blockchain_notifications_controller.rb +29 -0
- data/app/controllers/bitsy/v1/payment_depots_controller.rb +3 -1
- data/app/controllers/bitsy/v1/syncs_controller.rb +1 -1
- data/app/jobs/bitsy/blockchain_notification_job.rb +14 -0
- data/app/jobs/bitsy/forward_job.rb +11 -0
- data/app/jobs/bitsy/transactions_sync_job.rb +11 -0
- data/app/models/bitsy/blockchain_notification.rb +15 -0
- data/app/models/bitsy/payment_depot.rb +7 -34
- data/app/models/bitsy/payment_transaction.rb +0 -9
- data/app/services/bitsy/associates_transactions.rb +3 -3
- data/app/services/bitsy/{builds_send_many_hash.rb → build_send_many_hash.rb} +3 -3
- data/app/services/bitsy/create_payment_depot.rb +19 -0
- data/app/services/bitsy/forward_payments.rb +28 -0
- data/app/services/bitsy/instantiate_blockchain_wallet.rb +18 -0
- data/app/services/bitsy/process_blockchain_notification.rb +22 -0
- data/app/services/bitsy/send_payments.rb +14 -0
- data/app/services/bitsy/updating/get_latest_block.rb +14 -0
- data/app/services/bitsy/updating/select_transactions.rb +14 -0
- data/app/services/bitsy/updating/sync_transactions.rb +17 -0
- data/app/services/bitsy/updating/update_transaction.rb +24 -0
- data/app/services/bitsy/updating/update_transactions.rb +19 -0
- data/config/bitsy.yml +5 -6
- data/config/database.yml +25 -0
- data/config/initializers/bitsy.rb +3 -3
- data/config/routes.rb +1 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20141106123922_create_bitsy_blockchain_notifications.rb +11 -0
- data/db/migrate/20141108002656_drop_occurred_at_and_received_at_from_payment_transactions.rb +11 -0
- data/db/migrate/20141109072242_change_payment_depot_balance_cache_default.rb +5 -0
- data/lib/bitsy.rb +1 -14
- data/lib/bitsy/config.rb +3 -2
- data/lib/bitsy/version.rb +1 -1
- data/lib/generators/bitsy/config/templates/bitsy.yml +5 -6
- data/lib/generators/bitsy/config/templates/clock.rb +1 -1
- data/lib/generators/bitsy/config/templates/initializer.rb +0 -5
- metadata +45 -21
- data/app/jobs/bitsy/payment_job.rb +0 -15
- data/app/services/bitsy/creates_transaction.rb +0 -25
- data/app/services/bitsy/forwards_payments.rb +0 -31
- data/app/services/bitsy/processes_payments.rb +0 -20
- data/app/services/bitsy/selects_transactions_for_sync.rb +0 -13
- data/app/services/bitsy/sends_payments.rb +0 -14
- data/app/services/bitsy/stockpiles_transaction.rb +0 -24
- data/app/services/bitsy/syncs_transaction.rb +0 -26
- data/app/services/bitsy/syncs_transactions.rb +0 -17
- data/app/services/bitsy/updates_transaction.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69731136aaba219d6340e7c69b9fccb67ae105a3
|
4
|
+
data.tar.gz: 5ca72a140e548a493509c90132a677ea46efce9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a67445e06d2b25e68c53a18f6b279ba0b6a1dafd253a2cdab3f87c1074e6301a2694f7546e144fef7a04095a624ed2ca615503d182e4079c012b5ac6680ee1fd
|
7
|
+
data.tar.gz: e85fe799479da643660a294f8bd83e16271a515e465dbef7aa464bcbc3ecfb301b2a1fbc3a1fa419f6e55b476c6e769d3f8686339e7b315e0a4d51525f37a477
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Bitsy
|
2
|
+
module V1
|
3
|
+
class BlockchainNotificationsController < ApplicationController
|
4
|
+
|
5
|
+
def index
|
6
|
+
bn = BlockchainNotification.new(blockchain_notification_params)
|
7
|
+
if bn.save
|
8
|
+
BlockchainNotificationJob.perform_async(bn.id)
|
9
|
+
render nothing: true, status: 200
|
10
|
+
else
|
11
|
+
render nothing: true, status: 422
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def blockchain_notification_params
|
18
|
+
params.permit(
|
19
|
+
:value,
|
20
|
+
:transaction_hash,
|
21
|
+
:input_address,
|
22
|
+
:confirmations,
|
23
|
+
:secret,
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class BlockchainNotificationJob
|
3
|
+
|
4
|
+
include Sidekiq::Worker
|
5
|
+
|
6
|
+
def perform(blockchain_notification_id)
|
7
|
+
blockchain_notification = BlockchainNotification.
|
8
|
+
find(blockchain_notification_id)
|
9
|
+
ProcessBlockchainNotification.
|
10
|
+
execute(blockchain_notification: blockchain_notification)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class BlockchainNotification < ActiveRecord::Base
|
3
|
+
|
4
|
+
validates(
|
5
|
+
:value,
|
6
|
+
:transaction_hash,
|
7
|
+
:input_address,
|
8
|
+
:confirmations,
|
9
|
+
presence: true
|
10
|
+
)
|
11
|
+
|
12
|
+
validates(:secret, inclusion: {in: Bitsy.config.blockchain_secrets})
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -6,23 +6,19 @@ module Bitsy
|
|
6
6
|
|
7
7
|
alias_attribute :balance, :balance_cache
|
8
8
|
after_initialize :set_uuid
|
9
|
-
before_create :set_bitcoin_address
|
10
|
-
before_create :set_balance_cache
|
11
|
-
delegate :balance, to: :bit_wallet_account
|
12
9
|
scope :with_balance, -> { where('balance_cache > 0.0') }
|
13
|
-
|
10
|
+
validates(
|
14
11
|
:initial_tax_rate,
|
15
12
|
inclusion: {
|
16
|
-
in:
|
13
|
+
in: 0.0..1.0,
|
17
14
|
message: 'must be a value within 0.0 and 1.0'
|
18
15
|
}
|
19
16
|
)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
delegate :bit_wallet, to: :Bitsy
|
17
|
+
validates :address, presence: true, uniqueness: true
|
18
|
+
validates :balance_cache, presence: true
|
19
|
+
validates :owner_address, presence: true
|
20
|
+
validates :tax_address, presence: true
|
21
|
+
validates :uuid, uniqueness: true, presence: true
|
26
22
|
|
27
23
|
def initial_owner_rate
|
28
24
|
self.min_payment * (1 - self.initial_tax_rate)
|
@@ -76,10 +72,6 @@ module Bitsy
|
|
76
72
|
added_fee_received * self.added_tax_fee
|
77
73
|
end
|
78
74
|
|
79
|
-
def balance
|
80
|
-
self.balance_cache = bit_wallet_account_balance
|
81
|
-
end
|
82
|
-
|
83
75
|
def has_balance?
|
84
76
|
self.balance > 0
|
85
77
|
end
|
@@ -90,16 +82,6 @@ module Bitsy
|
|
90
82
|
|
91
83
|
private
|
92
84
|
|
93
|
-
def set_bitcoin_address
|
94
|
-
if self.address.blank?
|
95
|
-
self.address = bit_wallet_account.addresses.new.address
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def set_balance_cache
|
100
|
-
self.balance_cache = bit_wallet_account.balance
|
101
|
-
end
|
102
|
-
|
103
85
|
def tax_transactions
|
104
86
|
self.transactions.debit.tax
|
105
87
|
end
|
@@ -108,15 +90,6 @@ module Bitsy
|
|
108
90
|
self.transactions.debit.non_tax
|
109
91
|
end
|
110
92
|
|
111
|
-
def bit_wallet_account
|
112
|
-
return @bit_wallet_account if @bit_wallet_account
|
113
|
-
@bit_wallet_account = bit_wallet.accounts.new(self.bitcoin_account_name)
|
114
|
-
end
|
115
|
-
|
116
|
-
def bit_wallet_account_balance
|
117
|
-
bit_wallet_account.balance
|
118
|
-
end
|
119
|
-
|
120
93
|
def set_uuid
|
121
94
|
self.uuid ||= UUIDTools::UUID.random_create.to_s
|
122
95
|
end
|
@@ -18,15 +18,6 @@ module Bitsy
|
|
18
18
|
scope :sent_by, lambda { |address| where(sending_address: address) }
|
19
19
|
scope :tax, lambda { where(payment_type: 'tax') }
|
20
20
|
scope :non_tax, lambda { where('payment_type != ?', 'tax') }
|
21
|
-
scope :matching_bit_wallet_transaction, lambda { |bw_tx|
|
22
|
-
where(
|
23
|
-
transaction_id: bw_tx.id,
|
24
|
-
receiving_address: bw_tx.address_str,
|
25
|
-
amount: bw_tx.amount,
|
26
|
-
occurred_at: bw_tx.occurred_at,
|
27
|
-
received_at: bw_tx.received_at
|
28
|
-
)
|
29
|
-
}
|
30
21
|
scope :for_forwarding, -> { safely_confirmed.not_forwarded.received }
|
31
22
|
scope :credits, -> { received }
|
32
23
|
|
@@ -2,11 +2,11 @@ module Bitsy
|
|
2
2
|
class AssociatesTransactions
|
3
3
|
|
4
4
|
include LightService::Action
|
5
|
+
expects :forwarding_transaction_id, :payment_transactions
|
5
6
|
|
6
7
|
executed do |ctx|
|
7
|
-
|
8
|
-
|
9
|
-
payment_txs.update_all(forwarding_transaction_id: forwarding_transaction_id)
|
8
|
+
ctx.payment_transactions.
|
9
|
+
update_all(forwarding_transaction_id: ctx.forwarding_transaction_id)
|
10
10
|
end
|
11
11
|
|
12
12
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Bitsy
|
2
|
-
class
|
2
|
+
class BuildSendManyHash
|
3
3
|
|
4
4
|
include LightService::Action
|
5
5
|
|
@@ -26,8 +26,8 @@ module Bitsy
|
|
26
26
|
owner_address = payment_depot.owner_address
|
27
27
|
tax_address = payment_depot.tax_address
|
28
28
|
{
|
29
|
-
tax_address => payment_transaction.forward_tax_fee.to_f,
|
30
|
-
owner_address => payment_transaction.owner_fee.to_f
|
29
|
+
tax_address => payment_transaction.forward_tax_fee.to_f * 100_000_000,
|
30
|
+
owner_address => payment_transaction.owner_fee.to_f * 100_000_000,
|
31
31
|
}
|
32
32
|
end
|
33
33
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class CreatePaymentDepot
|
3
|
+
|
4
|
+
include LightService::Action
|
5
|
+
expects :params
|
6
|
+
promises :payment_depot
|
7
|
+
|
8
|
+
executed do |ctx|
|
9
|
+
wallet = InstantiateBlockchainWallet.execute.wallet
|
10
|
+
|
11
|
+
params = ctx.params
|
12
|
+
params[:address] = address = wallet.new_address.address
|
13
|
+
params[:balance] = wallet.get_address(address)
|
14
|
+
|
15
|
+
ctx.payment_depot = PaymentDepot.create(params)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class ForwardPayments
|
3
|
+
|
4
|
+
include LightService::Organizer
|
5
|
+
include LightService::Action
|
6
|
+
|
7
|
+
def self.execute
|
8
|
+
payment_transactions = PaymentTransaction.for_forwarding
|
9
|
+
|
10
|
+
return unless past_threshold?(payment_transactions)
|
11
|
+
with(
|
12
|
+
payment_transactions: payment_transactions
|
13
|
+
).reduce([
|
14
|
+
InstantiateBlockchainWallet,
|
15
|
+
BuildSendManyHash,
|
16
|
+
SendPayments,
|
17
|
+
AssociatesTransactions
|
18
|
+
])
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def self.past_threshold?(payment_txs)
|
24
|
+
payment_txs.sum(:amount) >= Bitsy.config.forward_threshold_amount
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class InstantiateBlockchainWallet
|
3
|
+
|
4
|
+
include LightService::Action
|
5
|
+
promises :wallet
|
6
|
+
|
7
|
+
executed do |ctx|
|
8
|
+
config = Bitsy.config.blockchain
|
9
|
+
ctx.wallet = Blockchain::Wallet.new(
|
10
|
+
config[:identifier],
|
11
|
+
config[:password],
|
12
|
+
config[:second_password],
|
13
|
+
config[:api_code],
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class ProcessBlockchainNotification
|
3
|
+
|
4
|
+
include LightService::Action
|
5
|
+
expects :blockchain_notification
|
6
|
+
promises :payment_transaction
|
7
|
+
|
8
|
+
executed do |ctx|
|
9
|
+
bn = ctx.blockchain_notification
|
10
|
+
payment_depot = PaymentDepot.find_by(address: bn.input_address)
|
11
|
+
ctx.payment_transaction = PaymentTransaction.create!(
|
12
|
+
payment_depot_id: payment_depot.id,
|
13
|
+
amount: bn.value / 100_000_000.0,
|
14
|
+
receiving_address: bn.input_address,
|
15
|
+
payment_type: "receive",
|
16
|
+
confirmations: bn.confirmations,
|
17
|
+
transaction_id: bn.transaction_hash,
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bitsy
|
2
|
+
class SendPayments
|
3
|
+
|
4
|
+
include LightService::Action
|
5
|
+
expects :send_many_hash, :wallet
|
6
|
+
promises :forwarding_transaction_id
|
7
|
+
|
8
|
+
executed do |ctx|
|
9
|
+
payment_response = ctx.wallet.send_many(ctx.send_many_hash)
|
10
|
+
ctx.forwarding_transaction_id = payment_response.tx_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Bitsy
|
2
|
+
module Updating
|
3
|
+
class UpdateTransaction
|
4
|
+
|
5
|
+
include LightService::Action
|
6
|
+
expects :latest_block, :payment_transaction
|
7
|
+
|
8
|
+
executed do |ctx|
|
9
|
+
blockchain_tx = Blockchain.
|
10
|
+
get_tx(ctx.payment_transaction.transaction_id)
|
11
|
+
confirmations = if blockchain_tx.block_height
|
12
|
+
blockchain_tx.block_height + 1 -
|
13
|
+
ctx.latest_block.height
|
14
|
+
else
|
15
|
+
0
|
16
|
+
end
|
17
|
+
ctx.payment_transaction.update_attributes(
|
18
|
+
confirmations: confirmations
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bitsy
|
2
|
+
module Updating
|
3
|
+
class UpdateTransactions
|
4
|
+
|
5
|
+
include LightService::Action
|
6
|
+
expects :payment_transactions, :latest_block
|
7
|
+
|
8
|
+
executed do |ctx|
|
9
|
+
ctx.payment_transactions.each do |tx|
|
10
|
+
UpdateTransaction.execute(
|
11
|
+
payment_transaction: tx,
|
12
|
+
latest_block: ctx.latest_block,
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/config/bitsy.yml
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
defaults: &defaults
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
ssl: false
|
2
|
+
blockchain:
|
3
|
+
identifier: eeadf652-e1c3-414e-bd3b-c4aef10756c4
|
4
|
+
password: Ye054oH96zSueHnVHLAAWwwM9
|
5
|
+
second_password:
|
6
|
+
api_code:
|
8
7
|
|
9
8
|
development:
|
10
9
|
<<: *defaults
|
data/config/database.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# SQLite version 3.x
|
2
|
+
# gem install sqlite3
|
3
|
+
#
|
4
|
+
# Ensure the SQLite 3 gem is defined in your Gemfile
|
5
|
+
# gem 'sqlite3'
|
6
|
+
#
|
7
|
+
default: &default
|
8
|
+
adapter: sqlite3
|
9
|
+
pool: 5
|
10
|
+
timeout: 5000
|
11
|
+
|
12
|
+
development:
|
13
|
+
<<: *default
|
14
|
+
database: db/development.sqlite3
|
15
|
+
|
16
|
+
# Warning: The database defined as "test" will be erased and
|
17
|
+
# re-generated from your development database when you run "rake".
|
18
|
+
# Do not set this db to the same as development or production.
|
19
|
+
test:
|
20
|
+
<<: *default
|
21
|
+
database: db/test.sqlite3
|
22
|
+
|
23
|
+
production:
|
24
|
+
<<: *default
|
25
|
+
database: db/production.sqlite3
|
@@ -10,7 +10,7 @@ Bitsy.configure do |c|
|
|
10
10
|
# How many confirmations are needed to consider a transaction as complete
|
11
11
|
c.safe_confirmation_threshold = 0
|
12
12
|
|
13
|
-
#
|
14
|
-
#
|
15
|
-
c.
|
13
|
+
# List of allowed secrets from Blockchain.info. The callback URL should look
|
14
|
+
# like this http://app.com/bitsy/v1/blockchain_notifications?secret=mysecret
|
15
|
+
c.blockchain_secrets = %w(secret)
|
16
16
|
end
|
data/config/routes.rb
CHANGED
File without changes
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateBitsyBlockchainNotifications < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :bitsy_blockchain_notifications do |t|
|
4
|
+
t.integer :value, null: false
|
5
|
+
t.string :transaction_hash, null: false
|
6
|
+
t.string :input_address, null: false
|
7
|
+
t.integer :confirmations, null: false, default: 0
|
8
|
+
t.string :secret, null: false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class DropOccurredAtAndReceivedAtFromPaymentTransactions < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
remove_column :bitsy_payment_transactions, :occurred_at
|
4
|
+
remove_column :bitsy_payment_transactions, :received_at
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
add_column :bitsy_payment_transactions, :occurred_at, :datetime, null: false
|
9
|
+
add_column :bitsy_payment_transactions, :received_at, :datetime, null: false
|
10
|
+
end
|
11
|
+
end
|
data/lib/bitsy.rb
CHANGED
@@ -6,6 +6,7 @@ require "clockwork"
|
|
6
6
|
require "daemons"
|
7
7
|
require "light-service"
|
8
8
|
require "uuidtools"
|
9
|
+
require "blockchain"
|
9
10
|
require "bitsy/engine"
|
10
11
|
require "bitsy/config"
|
11
12
|
|
@@ -22,18 +23,4 @@ module Bitsy
|
|
22
23
|
yield self.config
|
23
24
|
end
|
24
25
|
|
25
|
-
def self.master_account
|
26
|
-
bit_wallet.accounts.new(self.config.master_account_name)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.bit_wallet
|
30
|
-
BitWallet.at(
|
31
|
-
host: Bitsy.config.bitcoind.fetch(:host),
|
32
|
-
port: Bitsy.config.bitcoind.fetch(:port),
|
33
|
-
username: Bitsy.config.bitcoind.fetch(:username),
|
34
|
-
password: Bitsy.config.bitcoind.fetch(:password),
|
35
|
-
ssl: Bitsy.config.bitcoind.fetch(:ssl),
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
26
|
end
|
data/lib/bitsy/config.rb
CHANGED
@@ -5,7 +5,8 @@ module Bitsy
|
|
5
5
|
:transaction_fee,
|
6
6
|
:transaction_fee_threshold_multiplier,
|
7
7
|
:safe_confirmation_threshold,
|
8
|
-
:
|
8
|
+
:blockchain_secrets,
|
9
|
+
:blockchain,
|
9
10
|
)
|
10
11
|
|
11
12
|
def initialize(file_path)
|
@@ -20,7 +21,7 @@ module Bitsy
|
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
|
-
def
|
24
|
+
def forward_threshold_amount
|
24
25
|
transaction_fee * transaction_fee_threshold_multiplier
|
25
26
|
end
|
26
27
|
|
data/lib/bitsy/version.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
defaults: &defaults
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
ssl: false
|
2
|
+
blockchain:
|
3
|
+
identifier: ada4e4b6-3c9f-11e4-baad-164230d1df67
|
4
|
+
password: password123
|
5
|
+
second_password: if any
|
6
|
+
api_code: if any
|
8
7
|
|
9
8
|
development:
|
10
9
|
<<: *defaults
|
@@ -10,9 +10,4 @@ Bitsy.configure do |c|
|
|
10
10
|
|
11
11
|
# How many confirmations are needed to consider a transaction as complete
|
12
12
|
c.safe_confirmation_threshold = 0
|
13
|
-
|
14
|
-
# The name where all money is pooled before sending out. You will likely not
|
15
|
-
# need to change this value. Note that blockchain.info only accepts master
|
16
|
-
# account names between 0 and 255 characters.
|
17
|
-
c.master_account_name = "master"
|
18
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitsy-bitcoin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ramon Tayag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - '='
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.5.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.5.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: uuidtools
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '2.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: blockchain
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '1.0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: sqlite3
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -241,21 +255,21 @@ dependencies:
|
|
241
255
|
- !ruby/object:Gem::Version
|
242
256
|
version: '0'
|
243
257
|
- !ruby/object:Gem::Dependency
|
244
|
-
name:
|
258
|
+
name: standalone_migrations
|
245
259
|
requirement: !ruby/object:Gem::Requirement
|
246
260
|
requirements:
|
247
|
-
- -
|
261
|
+
- - ">="
|
248
262
|
- !ruby/object:Gem::Version
|
249
|
-
version:
|
263
|
+
version: '0'
|
250
264
|
type: :development
|
251
265
|
prerelease: false
|
252
266
|
version_requirements: !ruby/object:Gem::Requirement
|
253
267
|
requirements:
|
254
|
-
- -
|
268
|
+
- - ">="
|
255
269
|
- !ruby/object:Gem::Version
|
256
|
-
version:
|
270
|
+
version: '0'
|
257
271
|
- !ruby/object:Gem::Dependency
|
258
|
-
name:
|
272
|
+
name: shoulda-matchers
|
259
273
|
requirement: !ruby/object:Gem::Requirement
|
260
274
|
requirements:
|
261
275
|
- - ">="
|
@@ -281,33 +295,43 @@ files:
|
|
281
295
|
- app/assets/javascripts/bitsy/application.js
|
282
296
|
- app/assets/stylesheets/bitsy/application.css
|
283
297
|
- app/controllers/bitsy/application_controller.rb
|
298
|
+
- app/controllers/bitsy/v1/blockchain_notifications_controller.rb
|
284
299
|
- app/controllers/bitsy/v1/payment_depots_controller.rb
|
285
300
|
- app/controllers/bitsy/v1/syncs_controller.rb
|
286
301
|
- app/controllers/bitsy/v1/truncations_controller.rb
|
287
302
|
- app/helpers/bitsy/application_helper.rb
|
288
|
-
- app/jobs/bitsy/
|
303
|
+
- app/jobs/bitsy/blockchain_notification_job.rb
|
304
|
+
- app/jobs/bitsy/forward_job.rb
|
305
|
+
- app/jobs/bitsy/transactions_sync_job.rb
|
306
|
+
- app/models/bitsy/blockchain_notification.rb
|
289
307
|
- app/models/bitsy/payment_depot.rb
|
290
308
|
- app/models/bitsy/payment_transaction.rb
|
291
309
|
- app/serializers/bitsy/payment_depot_serializer.rb
|
292
310
|
- app/services/bitsy/amount_for_initial_tax_calculator.rb
|
293
311
|
- app/services/bitsy/associates_transactions.rb
|
294
|
-
- app/services/bitsy/
|
295
|
-
- app/services/bitsy/
|
312
|
+
- app/services/bitsy/build_send_many_hash.rb
|
313
|
+
- app/services/bitsy/create_payment_depot.rb
|
314
|
+
- app/services/bitsy/forward_payments.rb
|
296
315
|
- app/services/bitsy/forward_tax_calculator.rb
|
297
|
-
- app/services/bitsy/
|
298
|
-
- app/services/bitsy/
|
299
|
-
- app/services/bitsy/
|
300
|
-
- app/services/bitsy/
|
301
|
-
- app/services/bitsy/
|
302
|
-
- app/services/bitsy/
|
303
|
-
- app/services/bitsy/
|
304
|
-
- app/services/bitsy/
|
316
|
+
- app/services/bitsy/instantiate_blockchain_wallet.rb
|
317
|
+
- app/services/bitsy/process_blockchain_notification.rb
|
318
|
+
- app/services/bitsy/send_payments.rb
|
319
|
+
- app/services/bitsy/updating/get_latest_block.rb
|
320
|
+
- app/services/bitsy/updating/select_transactions.rb
|
321
|
+
- app/services/bitsy/updating/sync_transactions.rb
|
322
|
+
- app/services/bitsy/updating/update_transaction.rb
|
323
|
+
- app/services/bitsy/updating/update_transactions.rb
|
305
324
|
- app/views/layouts/bitsy/application.html.erb
|
306
325
|
- config/bitsy.yml
|
326
|
+
- config/database.yml
|
307
327
|
- config/initializers/bitsy.rb
|
308
328
|
- config/routes.rb
|
329
|
+
- db/development.sqlite3
|
309
330
|
- db/migrate/20140607015614_create_bitsy_payment_depots.rb
|
310
331
|
- db/migrate/20140607015859_create_bitsy_payment_transactions.rb
|
332
|
+
- db/migrate/20141106123922_create_bitsy_blockchain_notifications.rb
|
333
|
+
- db/migrate/20141108002656_drop_occurred_at_and_received_at_from_payment_transactions.rb
|
334
|
+
- db/migrate/20141109072242_change_payment_depot_balance_cache_default.rb
|
311
335
|
- lib/bitsy-bitcoin.rb
|
312
336
|
- lib/bitsy.rb
|
313
337
|
- lib/bitsy/config.rb
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class CreatesTransaction
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
bit_wallet_tx = ctx.fetch(:bit_wallet_transaction)
|
8
|
-
payment_depot = PaymentDepot.find_by_address(bit_wallet_tx.address_str)
|
9
|
-
if payment_depot
|
10
|
-
payment_tx = PaymentTransaction.create(
|
11
|
-
payment_depot_id: payment_depot.id,
|
12
|
-
amount: bit_wallet_tx.amount,
|
13
|
-
receiving_address: bit_wallet_tx.address_str,
|
14
|
-
transaction_id: bit_wallet_tx.id,
|
15
|
-
confirmations: bit_wallet_tx.confirmations,
|
16
|
-
payment_type: bit_wallet_tx.category,
|
17
|
-
occurred_at: bit_wallet_tx.occurred_at,
|
18
|
-
received_at: bit_wallet_tx.received_at
|
19
|
-
)
|
20
|
-
ctx[:payment_transaction] = payment_tx
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class ForwardsPayments
|
3
|
-
|
4
|
-
include LightService::Organizer
|
5
|
-
include LightService::Action
|
6
|
-
|
7
|
-
executed do |ctx|
|
8
|
-
payment_transactions = PaymentTransaction.for_forwarding
|
9
|
-
|
10
|
-
if past_threshold?(payment_transactions)
|
11
|
-
bit_wallet_master_account = ctx.fetch(:bit_wallet_master_account)
|
12
|
-
context = {
|
13
|
-
bit_wallet_master_account: bit_wallet_master_account,
|
14
|
-
payment_transactions: payment_transactions
|
15
|
-
}
|
16
|
-
with(context).reduce([
|
17
|
-
BuildsSendManyHash,
|
18
|
-
SendsPayments,
|
19
|
-
AssociatesTransactions
|
20
|
-
])
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def self.past_threshold?(payment_txs)
|
27
|
-
payment_txs.sum(:amount) >= Bitsy.config.forward_threshold
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class ProcessesPayments
|
3
|
-
|
4
|
-
include LightService::Organizer
|
5
|
-
|
6
|
-
def self.for(args={})
|
7
|
-
bit_wallet = args.fetch(:bit_wallet)
|
8
|
-
bit_wallet_master_account = args.fetch(:bit_wallet_master_account)
|
9
|
-
|
10
|
-
ctx = { bit_wallet: bit_wallet,
|
11
|
-
bit_wallet_master_account: bit_wallet_master_account }
|
12
|
-
with(ctx).reduce([
|
13
|
-
SelectsTransactionsForSync,
|
14
|
-
SyncsTransactions,
|
15
|
-
ForwardsPayments
|
16
|
-
])
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class SelectsTransactionsForSync
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
bit_wallet = ctx.fetch(:bit_wallet)
|
8
|
-
txs = bit_wallet.recent_transactions.select {|tx| tx.category == "receive"}
|
9
|
-
ctx[:bit_wallet_transactions] = txs
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class SendsPayments
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
bit_wallet_master_account = ctx.fetch(:bit_wallet_master_account)
|
8
|
-
send_many_hash = ctx.fetch(:send_many_hash)
|
9
|
-
tx_id = bit_wallet_master_account.send_many(send_many_hash)
|
10
|
-
ctx[:forwarding_transaction_id] = tx_id
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class StockpilesTransaction
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
payment_tx = ctx.fetch(:payment_transaction)
|
8
|
-
|
9
|
-
if payment_tx && payment_tx.payment_type == "receive"
|
10
|
-
bit_wallet_tx = ctx.fetch(:bit_wallet_transaction)
|
11
|
-
bit_wallet_master_account = ctx.fetch(:bit_wallet_master_account)
|
12
|
-
bit_wallet = bit_wallet_tx.account.wallet
|
13
|
-
payment_depot = payment_tx.payment_depot
|
14
|
-
|
15
|
-
bit_wallet.move(
|
16
|
-
payment_depot.bitcoin_account_name,
|
17
|
-
bit_wallet_master_account.name,
|
18
|
-
payment_tx.amount.to_f
|
19
|
-
)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class SyncsTransaction
|
3
|
-
|
4
|
-
include LightService::Organizer
|
5
|
-
|
6
|
-
def self.for(args={})
|
7
|
-
bit_wallet_tx = args.fetch(:bit_wallet_transaction)
|
8
|
-
|
9
|
-
payment_tx = PaymentTransaction.
|
10
|
-
matching_bit_wallet_transaction(bit_wallet_tx).first
|
11
|
-
ctx = { payment_transaction: payment_tx,
|
12
|
-
bit_wallet_transaction: bit_wallet_tx }
|
13
|
-
|
14
|
-
actions = []
|
15
|
-
if payment_tx
|
16
|
-
actions << UpdatesTransaction
|
17
|
-
else
|
18
|
-
ctx[:bit_wallet_master_account] = args.fetch(:bit_wallet_master_account)
|
19
|
-
actions += [CreatesTransaction, StockpilesTransaction]
|
20
|
-
end
|
21
|
-
|
22
|
-
with(ctx).reduce(actions)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class SyncsTransactions
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
bit_wallet_txs = ctx.fetch(:bit_wallet_transactions)
|
8
|
-
bit_wallet_master_account = ctx.fetch(:bit_wallet_master_account)
|
9
|
-
|
10
|
-
bit_wallet_txs.each do |bit_wallet_tx|
|
11
|
-
SyncsTransaction.for(bit_wallet_transaction: bit_wallet_tx,
|
12
|
-
bit_wallet_master_account: bit_wallet_master_account)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Bitsy
|
2
|
-
class UpdatesTransaction
|
3
|
-
|
4
|
-
include LightService::Action
|
5
|
-
|
6
|
-
executed do |ctx|
|
7
|
-
bit_wallet_tx = ctx.fetch(:bit_wallet_transaction)
|
8
|
-
payment_tx = ctx.fetch(:payment_transaction)
|
9
|
-
payment_tx.update_attributes(confirmations: bit_wallet_tx.confirmations)
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|