Skip to content

Commit 7c51e17

Browse files
authored
Merge pull request #400 from blockonomics/include-usdt
Include USDT payments
2 parents beebb3f + d0584af commit 7c51e17

17 files changed

+779
-305
lines changed

blockonomics-woocommerce.php

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,7 @@ function blockonomics_enqueue_custom_admin_style() {
142142
function blockonomics_test_setup() {
143143
include_once plugin_dir_path(__FILE__) . 'php' . DIRECTORY_SEPARATOR . 'Blockonomics.php';
144144
$blockonomics = new Blockonomics;
145-
$result = array();
146-
147-
$result['crypto'] = $blockonomics->testSetup();
148-
149-
wp_send_json($result);
145+
wp_send_json($blockonomics->testSetup());
150146
wp_die();
151147
}
152148

@@ -386,10 +382,18 @@ function bnomics_display_payment_details($order, $transactions, $email=false)
386382
$total_paid_fiat = $blockonomics->calculate_total_paid_fiat($transactions);
387383
foreach ($transactions as $transaction) {
388384

389-
$base_url = ($transaction['crypto'] === 'btc') ? Blockonomics::BASE_URL . '/#/search?q=' : Blockonomics::BCH_BASE_URL . '/api/tx?txid=';
385+
$crypto = strtolower($transaction['crypto']);
386+
if ( $crypto === 'bch' ) {
387+
$txid_url = Blockonomics::BCH_BASE_URL . '/api/tx?txid=' . $transaction['txid'] . '&addr=' . $transaction['address'];
388+
} elseif ( $crypto === 'usdt' ) {
389+
$subdomain = $blockonomics->is_usdt_tenstnet_active() ? 'sepolia' : 'www';
390+
$txid_url = 'https://' . $subdomain . '.etherscan.io/tx/' . $transaction['txid'];
391+
} else {
392+
$txid_url = Blockonomics::BASE_URL . '/#/search?q=' . $transaction['txid'] . '&addr=' . $transaction['address'];
393+
}
390394

391395
$output .= '<tr><td scope="row">';
392-
$output .= '<a style="word-wrap: break-word;word-break: break-all;" href="' . $base_url . $transaction['txid'] . '&addr=' . $transaction['address'] . '">' . $transaction['txid'] . '</a></td>';
396+
$output .= '<a style="word-wrap: break-word;word-break: break-all;" href="' . $txid_url . '">' . $transaction['txid'] . '</a></td>';
393397
$formatted_paid_fiat = ($transaction['payment_status'] == '2') ? wc_price($transaction['paid_fiat']) : 'Processing';
394398
$output .= '<td>' . $formatted_paid_fiat . '</td></tr>';
395399

@@ -439,6 +443,7 @@ function bnomics_register_scripts(){
439443
wp_register_script( 'qrious', plugins_url('js/vendors/qrious.min.js', __FILE__), array(), get_plugin_data( __FILE__ )['Version'], array( 'strategy' => 'defer' ) );
440444
wp_register_script( 'copytoclipboard', plugins_url('js/vendors/copytoclipboard.js', __FILE__), array(), get_plugin_data( __FILE__ )['Version'], array( 'strategy' => 'defer' ) );
441445
wp_register_script( 'bnomics-checkout', plugins_url('js/checkout.js', __FILE__), array('reconnecting-websocket', 'qrious','copytoclipboard'), get_plugin_data( __FILE__ )['Version'], array('in_footer' => true, 'strategy' => 'defer' ) );
446+
wp_register_script( 'bnomics-web3-checkout', "https://www.blockonomics.co/js/web3-payment.js", False, get_plugin_data( __FILE__ )['Version'], array('in_footer' => true, 'strategy' => 'defer' ) );
442447
}
443448
}
444449

@@ -455,7 +460,7 @@ function bnomics_register_scripts(){
455460
} );
456461

457462
global $blockonomics_db_version;
458-
$blockonomics_db_version = '1.4';
463+
$blockonomics_db_version = '1.5';
459464

460465
function blockonomics_create_table() {
461466
// Create blockonomics_payments table
@@ -473,15 +478,15 @@ function blockonomics_create_table() {
473478
$sql = "CREATE TABLE $table_name (
474479
order_id int NOT NULL,
475480
payment_status int NOT NULL,
476-
crypto varchar(3) NOT NULL,
481+
crypto varchar(4) NOT NULL,
477482
address varchar(191) NOT NULL,
478483
expected_satoshi bigint,
479484
expected_fiat double,
480485
currency varchar(3),
481486
paid_satoshi bigint,
482487
paid_fiat double,
483-
txid text,
484-
PRIMARY KEY (address),
488+
txid varchar(191),
489+
PRIMARY KEY (order_id,crypto,address,txid),
485490
KEY orderkey (order_id,crypto)
486491
) $charset_collate;";
487492
dbDelta( $sql );
@@ -539,10 +544,20 @@ function blockonomics_run_db_updates($installed_ver){
539544
if (version_compare($installed_ver, '1.2', '<')){
540545
blockonomics_create_table();
541546
}
542-
if (version_compare($installed_ver, '1.4', '<')){ // Plugin version should be 1.4
547+
if (version_compare($installed_ver, '1.4', '<')){
543548
include_once(WC()->plugin_path().'/includes/admin/wc-admin-functions.php');
544549
blockonomics_create_payment_page();
545550
}
551+
if (version_compare($installed_ver, '1.5', '<')){
552+
blockonomics_create_table();
553+
blockonomics_update_primary_key();
554+
// 6. MySQL 8+ only: add partial unique indexes for BTC/USDT
555+
$mysql_version = $wpdb->get_var("SELECT VERSION()");
556+
if (version_compare($mysql_version, '8.0.0', '>=')) {
557+
$wpdb->query("CREATE UNIQUE INDEX unique_btc_address ON $table_name (address) WHERE crypto = 'BTC'");
558+
$wpdb->query("CREATE UNIQUE INDEX unique_usdt_txid ON $table_name (txid) WHERE crypto = 'USDT' AND txid <> ''");
559+
}
560+
}
546561
update_option( 'blockonomics_db_version', $blockonomics_db_version );
547562
}
548563

@@ -554,6 +569,15 @@ function blockonomics_plugin_setup() {
554569
blockonomics_create_payment_page();
555570
}
556571

572+
function blockonomics_update_primary_key() {
573+
global $wpdb;
574+
$table_name = $wpdb->prefix . 'blockonomics_payments';
575+
// First replace NULL txid values with empty strings
576+
$wpdb->query("UPDATE $table_name SET txid = '' WHERE txid IS NULL");
577+
$wpdb->query("ALTER TABLE $table_name DROP PRIMARY KEY");
578+
$wpdb->query("ALTER TABLE $table_name ADD PRIMARY KEY (order_id, crypto, address, txid)");
579+
}
580+
557581
//Show message when plugin is activated
558582
function blockonomics_plugin_activation() {
559583
if(!is_plugin_active('woocommerce/woocommerce.php'))
@@ -589,6 +613,7 @@ function blockonomics_uninstall_hook() {
589613
delete_option('blockonomics_bch');
590614
delete_option('blockonomics_btc');
591615
delete_option('blockonomics_underpayment_slack');
616+
delete_option('blockonomics_usdt_testnet');
592617
// blockonomics_lite is only for db version below 1.3
593618
delete_option('blockonomics_lite');
594619
delete_option('blockonomics_nojs');

css/order.css

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ svg {
116116
content: '\e901';
117117
}
118118

119+
.bnomics-icon-usdt:before {
120+
content: "\e902";
121+
}
122+
119123
.bnomics-select-options {
120124
cursor: pointer;
121125
width: 100%;
@@ -394,7 +398,7 @@ svg {
394398
justify-content: center;
395399
}
396400

397-
.bnomics-order-panel {
401+
.bnomics-order-panel, .bnomics-web3-order-panel {
398402
display: flex;
399403
flex-direction: column;
400404
align-items: center;

fonts/cryptos.woff

516 Bytes
Binary file not shown.

img/bch-icon.png

-1.46 KB
Binary file not shown.

img/bch.png

1.36 KB
Loading

img/bitcoin-bch-icon.png

-1.86 KB
Binary file not shown.

img/bitcoin-icon.png

-2.11 KB
Binary file not shown.

img/btc.png

989 Bytes
Loading

img/usdt.png

5.85 KB
Loading

js/admin.js

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ class BlockonomicsAdmin {
3232

3333
// Initialize crypto DOM elements
3434
this.cryptoElements = {
35-
btc: {
36-
success: document.querySelector('.btc-success-notice'),
37-
error: document.querySelector('.btc-error-notice'),
38-
errorText: document.querySelector('.btc-error-notice .errorText')
39-
}
35+
success: document.querySelector('.notice-success'),
36+
successText: document.querySelector('.notice-success .successText'),
37+
error: document.querySelector('.notice-error'),
38+
errorText: document.querySelector('.notice-error .errorText')
4039
};
4140
}
4241

@@ -82,7 +81,11 @@ class BlockonomicsAdmin {
8281
if (this.state.apiKeyChanged) {
8382
await this.saveApiKey();
8483
}
85-
84+
const cryptoElements = this.cryptoElements;
85+
cryptoElements.success.style.display = 'none';
86+
cryptoElements.successText.innerHTML = '';
87+
cryptoElements.error.style.display = 'none';
88+
cryptoElements.errorText.innerHTML = '';
8689
const result = await this.performTestSetup();
8790
this.handleTestSetupResponse(result);
8891
} catch (error) {
@@ -147,26 +150,41 @@ class BlockonomicsAdmin {
147150
}
148151

149152
handleTestSetupResponse(result) {
150-
this.updateCryptoStatus(result.crypto);
153+
this.updateCryptoStatus(result);
151154
this.updateMetadata(result);
152155
}
153156

154157
updateCryptoStatus(cryptoResults) {
155-
const btcResult = cryptoResults.btc;
156-
const btcElements = this.cryptoElements.btc;
157-
158-
if (!btcElements) return;
159-
160-
if (btcResult === false) {
161-
// Success case
162-
btcElements.error.style.display = 'none';
163-
btcElements.success.style.display = 'block';
164-
} else {
165-
// Error case
166-
btcElements.success.style.display = 'none';
167-
btcElements.error.style.display = 'block';
168-
if (typeof btcResult === 'string') {
169-
btcElements.errorText.innerHTML = btcResult;
158+
const cryptoElements = this.cryptoElements;
159+
160+
if (cryptoResults && cryptoResults.error) {
161+
// Handle string error message
162+
cryptoElements.error.style.display = 'block';
163+
cryptoElements.errorText.innerHTML = cryptoResults.error;
164+
return;
165+
}
166+
167+
if (cryptoResults.success_messages) {
168+
// Success cases
169+
cryptoElements.success.style.display = 'block';
170+
for (let index = 0; index < cryptoResults.success_messages.length; index++) {
171+
const crypto = cryptoResults.success_messages[index];
172+
cryptoElements.successText.innerHTML += crypto;
173+
if (index < cryptoResults.success_messages.length - 1) {
174+
cryptoElements.successText.innerHTML += '</br>';
175+
}
176+
}
177+
}
178+
179+
if (cryptoResults.error_messages) {
180+
// Error cases
181+
cryptoElements.error.style.display = 'block';
182+
for (let index = 0; index < cryptoResults.error_messages.length; index++) {
183+
const crypto = cryptoResults.error_messages[index];
184+
cryptoElements.errorText.innerHTML += crypto;
185+
if (index < cryptoResults.error_messages.length - 1) {
186+
cryptoElements.errorText.innerHTML += '</br>';
187+
}
170188
}
171189
}
172190
}

0 commit comments

Comments
 (0)