diff --git a/app/assets/v2/js/cart.js b/app/assets/v2/js/cart.js index ff1ff5bef65..fb878fb033c 100644 --- a/app/assets/v2/js/cart.js +++ b/app/assets/v2/js/cart.js @@ -37,6 +37,11 @@ Vue.component('grants-cart', { data: function() { return { // Checkout, shared + selectedZcashPayment: 'taddress', + optionsZcashPayment: [ + { text: 'Wallet t-address', value: 'taddress' }, + { text: 'Transaction Hash', value: 'txid' } + ], chainId: '', network: 'mainnet', tabSelected: 'ETH', diff --git a/app/grants/sync/zcash.py b/app/grants/sync/zcash.py index 4520f0a4749..8ed4b1fcb28 100644 --- a/app/grants/sync/zcash.py +++ b/app/grants/sync/zcash.py @@ -7,6 +7,7 @@ def find_txn_on_zcash_explorer(contribution): + subscription = contribution.subscription grant = subscription.grant token_symbol = subscription.token_symbol @@ -27,17 +28,27 @@ def find_txn_on_zcash_explorer(contribution): # Check contributors txn history if response['status'] == 'success' and response['data'] and response['data']['txs']: txns = response['data']['txs'] + for txn in txns: if txn.get('outgoing') and txn['outgoing']['outputs']: for output in txn['outgoing']['outputs']: - if ( - output['address'] == to_address and - response['data']['address'] == from_address and - float(output['value']) == float(amount) and - is_txn_done_recently(txn['time']) and - not txn_already_used(txn['txid'], token_symbol) - ): - return txn['txid'] + if contribution.tx_id and contribution.tx_id != '0x0': + if txn['txid'] == contribution.tx_id: + if ( + output['address'] == to_address and + float(output['value']) == float(amount) and + is_txn_done_recently(txn['time']) + ): + return txn['txid'] + else: + if ( + output['address'] == to_address and + response['data']['address'] == from_address and + float(output['value']) == float(amount) and + is_txn_done_recently(txn['time']) and + not txn_already_used(txn['txid'], token_symbol) + ): + return txn['txid'] url = f'https://sochain.com/api/v2/address/ZEC/{to_address}' @@ -59,7 +70,7 @@ def find_txn_on_zcash_explorer(contribution): return None -def get_zcash_txn_status(txnid): +def is_zcash_txn_successful(txnid): if not txnid: return None @@ -90,18 +101,58 @@ def is_txn_done_recently(time_of_txn): return False +def is_valid_zcash_txn(contribution): + + subscription = contribution.subscription + grant = subscription.grant + + txn_id = contribution.tx_id + to_address = grant.zcash_payout_address + amount = subscription.amount_per_period + token_symbol = subscription.token_symbol + + + if not txn_id or txn_id == '0x0': + return None + + url = f'https://sochain.com/api/v2/tx/ZEC/{txn_id}' + + response = requests.get(url).json() + + if ( + response['status'] == 'success' and + response['data'] and + response['data']['outputs'] + ): + for txn in response['data']['outputs']: + if ( + txn['address'] == to_address and + float(txn['value']) == float(amount) and + is_txn_done_recently(response['data']['time']) and + not txn_already_used(txn_id, token_symbol) + ): + return True + + return None + + def sync_zcash_payout(contribution): -# if not contribution.tx_id: - txn = find_txn_on_zcash_explorer(contribution) - if txn: - contribution.tx_id = txn - contribution.save() + is_sucessfull_txn = False -# if contribution.tx_id: - is_sucessfull_txn = get_zcash_txn_status(contribution.tx_id) - if is_sucessfull_txn: - contribution.success = True - contribution.tx_cleared = True - contribution.checkout_type = 'zcash_std' - record_contribution_activity(contribution) + if not contribution.tx_id or contribution.tx_id == '0x0': + # user entered t-addr. + txn = find_txn_on_zcash_explorer(contribution) + if txn: + contribution.tx_id = txn contribution.save() + is_sucessfull_txn = is_zcash_txn_successful(contribution.tx_id) + else: + # user entered txn-id or txn-id picked up by cron. + is_sucessfull_txn = is_valid_zcash_txn(contribution) + + if is_sucessfull_txn: + contribution.success = True + contribution.tx_cleared = True + contribution.checkout_type = 'zcash_std' + record_contribution_activity(contribution) + contribution.save() diff --git a/app/grants/templates/grants/cart-vue.html b/app/grants/templates/grants/cart-vue.html index 6a1c7de52a9..4d65b9c30bb 100644 --- a/app/grants/templates/grants/cart-vue.html +++ b/app/grants/templates/grants/cart-vue.html @@ -533,22 +533,28 @@

-

Step 2: Copy and paste your Contributor Address below, and press the confirm button.

-
- -
+
+
- - + + + Only t-address are allowed (no z-address support)
-
- +
+
[[grant.error]]
diff --git a/app/grants/templates/grants/transaction.html b/app/grants/templates/grants/transaction.html index 09e2b83509b..01a8b24e888 100644 --- a/app/grants/templates/grants/transaction.html +++ b/app/grants/templates/grants/transaction.html @@ -30,8 +30,13 @@
- {% if not transaction.tx_cleared %}
(Pending) {% endif %} - {% if not transaction.success %}
(Failed) {% endif %} + + {% if not transaction.success %} + ( Failed ) + {% elif not transaction.tx_cleared %} + ( Pending ) + {% endif %} +
{% if not transaction.subscription.contributor_profile.hide_wallet_address %}