diff --git a/frontend/cypress/e2e/mainnet/mainnet.spec.ts b/frontend/cypress/e2e/mainnet/mainnet.spec.ts
index 3319b4835..da9e00b9f 100644
--- a/frontend/cypress/e2e/mainnet/mainnet.spec.ts
+++ b/frontend/cypress/e2e/mainnet/mainnet.spec.ts
@@ -504,9 +504,17 @@ describe('Mainnet', () => {
describe('RBF transactions', () => {
it('shows RBF transactions properly (mobile)', () => {
+ cy.intercept('/api/v1/tx/21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f/cached', {
+ fixture: 'mainnet_tx_cached.json'
+ }).as('cached_tx');
+
+ cy.intercept('/api/v1/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5/rbf', {
+ fixture: 'mainnet_rbf_new.json'
+ }).as('rbf');
+
cy.viewport('iphone-xr');
cy.mockMempoolSocket();
- cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5');
+ cy.visit('/tx/21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f');
cy.waitForSkeletonGone();
@@ -524,22 +532,30 @@ describe('Mainnet', () => {
}
});
- cy.get('.alert-mempool').should('be.visible');
- cy.get('.alert-mempool').invoke('css', 'width').then((alertWidth) => {
+ cy.get('.alert').should('be.visible');
+ cy.get('.alert').invoke('css', 'width').then((alertWidth) => {
cy.get('.container-xl > :nth-child(3)').invoke('css', 'width').should('equal', alertWidth);
});
- cy.get('.btn-success').then(getRectangle).then((rectA) => {
- cy.get('.alert-mempool').then(getRectangle).then((rectB) => {
+ cy.get('.btn-danger').then(getRectangle).then((rectA) => {
+ cy.get('.alert').then(getRectangle).then((rectB) => {
expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false;
});
});
});
it('shows RBF transactions properly (desktop)', () => {
+ cy.intercept('/api/v1/tx/21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f/cached', {
+ fixture: 'mainnet_tx_cached.json'
+ }).as('cached_tx');
+
+ cy.intercept('/api/v1/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5/rbf', {
+ fixture: 'mainnet_rbf_new.json'
+ }).as('rbf');
+
cy.viewport('macbook-16');
cy.mockMempoolSocket();
- cy.visit('/tx/f81a08699b62b2070ad8fe0f2a076f8bea0386a2fdcd8124caee42cbc564a0d5');
+ cy.visit('/tx/21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f');
cy.waitForSkeletonGone();
@@ -557,17 +573,17 @@ describe('Mainnet', () => {
}
});
- cy.get('.alert-mempool').should('be.visible');
+ cy.get('.alert').should('be.visible');
- const alertLocator = '.alert-mempool';
+ const alertLocator = '.alert';
const tableLocator = '.container-xl > :nth-child(3)';
cy.get(tableLocator).invoke('css', 'width').then((firstWidth) => {
cy.get(alertLocator).invoke('css', 'width').should('equal', firstWidth);
});
- cy.get('.btn-success').then(getRectangle).then((rectA) => {
- cy.get('.alert-mempool').then(getRectangle).then((rectB) => {
+ cy.get('.btn-danger').then(getRectangle).then((rectA) => {
+ cy.get('.alert').then(getRectangle).then((rectB) => {
expect(areOverlapping(rectA, rectB), 'Confirmations box and RBF alert are overlapping').to.be.false;
});
});
diff --git a/frontend/cypress/fixtures/mainnet_rbf.json b/frontend/cypress/fixtures/mainnet_rbf.json
index 50dbbb2df..f4db772c2 100644
--- a/frontend/cypress/fixtures/mainnet_rbf.json
+++ b/frontend/cypress/fixtures/mainnet_rbf.json
@@ -1,52 +1,4 @@
{
- "rbfTransaction": {
- "txid": "8913ec7ba0ede285dbd120e46f6d61a28f2903c10814a6f6c4f97d0edf3e1f46",
- "version": 2,
- "locktime": 632699,
- "vin": [
- {
- "txid": "02238126a63ea2669c5f378012180ef8b54402a949316f9b2f1352c51730a086",
- "vout": 0,
- "prevout": {
- "scriptpubkey": "a914f8e495456956c833e5e8c69b9a9dc041aa14c72f87",
- "scriptpubkey_asm": "OP_HASH160 OP_PUSHBYTES_20 f8e495456956c833e5e8c69b9a9dc041aa14c72f OP_EQUAL",
- "scriptpubkey_type": "p2sh",
- "scriptpubkey_address": "3QP3LMD8veT5GtWV83Nosif2Bhr73857VB",
- "value": 25000000
- },
- "scriptsig": "22002043288fbbc0fc5efa86c229dbb7d88ab78d57957c65b5d5ceaece70838976ad1b",
- "scriptsig_asm": "OP_PUSHBYTES_34 002043288fbbc0fc5efa86c229dbb7d88ab78d57957c65b5d5ceaece70838976ad1b",
- "witness": [
- "",
- "3044022009e2d3a8e645f65bc89c8492cd9c08e6fb02609fd402214884a754a1970145340220575bb325429def59f3a3f1e22d9740a3feecbe97438ff3bb5796b2c46b3c477f01",
- "3044022039c34372882da8fc1c1243bd72b5e7e5e6870301ef56bdebb87bc647fb50f9b5022071a704ee77d742f78b10e45be675d4c45a5f31e884139e75c975144fde70e41701",
- "522102346eb7133f11e0dc279bc592d5ac948a91676372a6144c9ae2085625d7fbf70421021b9508a458f9d59be4eb8cc87ad582c3b494106fb1d4ec22801569be0700eb7b52ae"
- ],
- "is_coinbase": false,
- "sequence": 4294967293,
- "inner_redeemscript_asm": "OP_0 OP_PUSHBYTES_32 43288fbbc0fc5efa86c229dbb7d88ab78d57957c65b5d5ceaece70838976ad1b",
- "inner_witnessscript_asm": "OP_PUSHNUM_2 OP_PUSHBYTES_33 02346eb7133f11e0dc279bc592d5ac948a91676372a6144c9ae2085625d7fbf704 OP_PUSHBYTES_33 021b9508a458f9d59be4eb8cc87ad582c3b494106fb1d4ec22801569be0700eb7b OP_PUSHNUM_2 OP_CHECKMULTISIG"
- }
- ],
- "vout": [
- {
- "scriptpubkey": "a914fd4e5e59dd5cf2dc48eaedf1a2a1650ca1ce9d7f87",
- "scriptpubkey_asm": "OP_HASH160 OP_PUSHBYTES_20 fd4e5e59dd5cf2dc48eaedf1a2a1650ca1ce9d7f OP_EQUAL",
- "scriptpubkey_type": "p2sh",
- "scriptpubkey_address": "3QnNmDhZS7toHA7bhhbTPBdtpLJoeecq5c",
- "value": 13986350
- },
- {
- "scriptpubkey": "76a914edc93d0446deec1c2d514f3a490f050096e74e0e88ac",
- "scriptpubkey_asm": "OP_DUP OP_HASH160 OP_PUSHBYTES_20 edc93d0446deec1c2d514f3a490f050096e74e0e OP_EQUALVERIFY OP_CHECKSIG",
- "scriptpubkey_type": "p2pkh",
- "scriptpubkey_address": "1NgJDkTUqJxxCAAZrrsC87kWag5kphrRtM",
- "value": 11000000
- }
- ],
- "size": 372,
- "weight": 828,
- "fee": 1.5,
- "status": { "confirmed": false }
- }
-}
\ No newline at end of file
+"txReplaced": {
+ "txid": "8913ec7ba0ede285dbd120e46f6d61a28f2903c10814a6f6c4f97d0edf3e1f46"
+}}
\ No newline at end of file
diff --git a/frontend/cypress/fixtures/mainnet_rbf_new.json b/frontend/cypress/fixtures/mainnet_rbf_new.json
new file mode 100644
index 000000000..2b23db4db
--- /dev/null
+++ b/frontend/cypress/fixtures/mainnet_rbf_new.json
@@ -0,0 +1,31 @@
+{
+ "replacements": {
+ "tx": {
+ "txid": "f22735aaa8eb84bcae3e7705f78609c6f5f0cd7dfc34ae03094e61f2dab0cc64",
+ "fee": 13843,
+ "vsize": 109.25,
+ "value": 253003805,
+ "rate": 36.04666732302845,
+ "rbf": true
+ },
+ "time": 1683865345,
+ "fullRbf": false,
+ "replaces": [
+ {
+ "tx": {
+ "txid": "21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f",
+ "fee": 8794,
+ "vsize": 109.25,
+ "value": 253008854,
+ "rate": 35.05247612484001,
+ "rbf": true
+ },
+ "time": 1683864993,
+ "interval": 352,
+ "fullRbf": false,
+ "replaces": []
+ }
+ ]
+ },
+ "replaces": null
+}
diff --git a/frontend/cypress/fixtures/mainnet_tx_cached.json b/frontend/cypress/fixtures/mainnet_tx_cached.json
new file mode 100644
index 000000000..f4e4338a4
--- /dev/null
+++ b/frontend/cypress/fixtures/mainnet_tx_cached.json
@@ -0,0 +1,60 @@
+{
+ "vsize": 109,
+ "feePerVsize": 80.49427917620137,
+ "effectiveFeePerVsize": 35.05247612484001,
+ "txid": "21518a98d1aa9df524865d2f88c578499f524eb1d0c4d3e70312ab863508692f",
+ "version": 2,
+ "locktime": 0,
+ "vin": [
+ {
+ "txid": "1e3bd5c634781a6ba8bb3d3385b14739bf38cad5332d5fbc5c0ab775e54b9aef",
+ "vout": 144,
+ "prevout": {
+ "scriptpubkey": "0014d98654186b90d95da7e31a30929f5b5b6a0af250",
+ "scriptpubkey_asm": "OP_0 OP_PUSHBYTES_20 d98654186b90d95da7e31a30929f5b5b6a0af250",
+ "scriptpubkey_type": "v0_p2wpkh",
+ "scriptpubkey_address": "bc1qmxr9gxrtjrv4mflrrgcf986mtd4q4ujss432tk",
+ "value": 253017648
+ },
+ "scriptsig": "",
+ "scriptsig_asm": "",
+ "witness": [
+ "30440220448e8f58fcdea87c1969d58438b49da5b43712380bc4c68b02d22cf6b164907302207b2ed660f1a5b3b74f712961ffb3f3a7d1ac6e48b269ea6ff15df985042211f301",
+ "02e39a1f3583e382cec1a1fab6a3f5950b6403c953fada58d809127a497f502ebe"
+ ],
+ "is_coinbase": false,
+ "sequence": 4294967293
+ }
+ ],
+ "vout": [
+ {
+ "scriptpubkey": "0014edb5167da7e97c73d7931eb2130ac3e34e6845a9",
+ "scriptpubkey_asm": "OP_0 OP_PUSHBYTES_20 edb5167da7e97c73d7931eb2130ac3e34e6845a9",
+ "scriptpubkey_type": "v0_p2wpkh",
+ "scriptpubkey_address": "bc1qak63vld8a97884unr6epxzkrud8xs3dfdqswy2",
+ "value": 253008854
+ }
+ ],
+ "size": 191,
+ "weight": 437,
+ "fee": 8794,
+ "status": {
+ "confirmed": false
+ },
+ "firstSeen": 1683864993,
+ "uid": 298353,
+ "position": {
+ "block": 0,
+ "vsize": 886207.5
+ },
+ "cpfpChecked": true,
+ "ancestors": [
+ {
+ "txid": "1e3bd5c634781a6ba8bb3d3385b14739bf38cad5332d5fbc5c0ab775e54b9aef",
+ "fee": 169220,
+ "weight": 19877
+ }
+ ],
+ "descendants": [],
+ "bestDescendant": null
+}
diff --git a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss
index 3bae38e56..e8db46928 100644
--- a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss
+++ b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss
@@ -1,11 +1,6 @@
.pagination-container {
float: none;
- margin-bottom: 200px;
@media(min-width: 400px){
float: right;
}
}
-
-.container-xl {
- padding-bottom: 110px;
-}
\ No newline at end of file
diff --git a/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html b/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html
index eab0537c7..cd99d6ed3 100644
--- a/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html
+++ b/frontend/src/app/bisq/bisq-main-dashboard/bisq-main-dashboard.component.html
@@ -36,7 +36,7 @@
US Dollar - BTC/USD
@@ -84,7 +84,7 @@
{{ ticker.volume?.num_trades ? ticker.volume?.num_trades : 0 }} |
-
+
@@ -105,9 +105,6 @@
-
-
-
@@ -124,4 +121,4 @@
-
\ No newline at end of file
+
diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html
index d050fc500..e67facfe1 100644
--- a/frontend/src/app/components/about/about.component.html
+++ b/frontend/src/app/components/about/about.component.html
@@ -393,27 +393,6 @@
-
-
diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
index 2054f1a5d..c1280efa1 100644
--- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
+++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
@@ -82,6 +82,10 @@
-
+
+
+
+
+
diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss
index fabb9e0e9..c4ecbb0ce 100644
--- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss
+++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.scss
@@ -17,6 +17,12 @@ li.nav-item {
padding-right: 10px;
}
+@media (max-width: 992px) {
+ footer > .container-fluid {
+ padding-bottom: 35px;
+ }
+}
+
@media (min-width: 992px) {
.navbar {
padding: 0rem 2rem;
diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts
index 0ab0259bd..f849998b1 100644
--- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts
+++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.ts
@@ -17,6 +17,7 @@ export class BisqMasterPageComponent implements OnInit {
isMobile = window.innerWidth <= 767.98;
urlLanguage: string;
networkPaths: { [network: string]: string };
+ footerVisible = true;
constructor(
private stateService: StateService,
@@ -31,6 +32,11 @@ export class BisqMasterPageComponent implements OnInit {
this.urlLanguage = this.languageService.getLanguageForUrl();
this.navigationService.subnetPaths.subscribe((paths) => {
this.networkPaths = paths;
+ if (paths.mainnet.indexOf('docs') > -1) {
+ this.footerVisible = false;
+ } else {
+ this.footerVisible = true;
+ }
});
}
diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html
index 6a2ad4965..3fa4f2766 100644
--- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html
+++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.html
@@ -44,7 +44,7 @@
-
+
@@ -92,10 +92,10 @@
-
+
+
+
-
-
-
+
\ No newline at end of file
diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
index e5d0aaa0a..07929d894 100644
--- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
+++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
@@ -19,6 +19,7 @@ export class LiquidMasterPageComponent implements OnInit {
network$: Observable
;
urlLanguage: string;
networkPaths: { [network: string]: string };
+ footerVisible = true;
constructor(
private stateService: StateService,
@@ -27,13 +28,18 @@ export class LiquidMasterPageComponent implements OnInit {
private navigationService: NavigationService,
) { }
- ngOnInit() {
+ ngOnInit(): void {
this.env = this.stateService.env;
this.connectionState$ = this.stateService.connectionState$;
this.network$ = merge(of(''), this.stateService.networkChanged$);
this.urlLanguage = this.languageService.getLanguageForUrl();
this.navigationService.subnetPaths.subscribe((paths) => {
this.networkPaths = paths;
+ if (paths.liquid.indexOf('docs') > -1) {
+ this.footerVisible = false;
+ } else {
+ this.footerVisible = true;
+ }
});
}
@@ -41,7 +47,7 @@ export class LiquidMasterPageComponent implements OnInit {
this.navCollapsed = !this.navCollapsed;
}
- onResize(event: any) {
+ onResize(): void {
this.isMobile = window.innerWidth <= 767.98;
}
}
diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html
index 6da59197c..9e4cd1513 100644
--- a/frontend/src/app/components/master-page/master-page.component.html
+++ b/frontend/src/app/components/master-page/master-page.component.html
@@ -17,7 +17,7 @@
-
+
@@ -64,9 +64,9 @@
-
+
-
+
diff --git a/frontend/src/app/components/master-page/master-page.component.ts b/frontend/src/app/components/master-page/master-page.component.ts
index 7c4f8dcff..7ae5019e0 100644
--- a/frontend/src/app/components/master-page/master-page.component.ts
+++ b/frontend/src/app/components/master-page/master-page.component.ts
@@ -20,6 +20,8 @@ export class MasterPageComponent implements OnInit {
urlLanguage: string;
subdomain = '';
networkPaths: { [network: string]: string };
+ networkPaths$: Observable>;
+ footerVisible = true;
constructor(
public stateService: StateService,
@@ -28,7 +30,7 @@ export class MasterPageComponent implements OnInit {
private navigationService: NavigationService,
) { }
- ngOnInit() {
+ ngOnInit(): void {
this.env = this.stateService.env;
this.connectionState$ = this.stateService.connectionState$;
this.network$ = merge(of(''), this.stateService.networkChanged$);
@@ -36,6 +38,11 @@ export class MasterPageComponent implements OnInit {
this.subdomain = this.enterpriseService.getSubdomain();
this.navigationService.subnetPaths.subscribe((paths) => {
this.networkPaths = paths;
+ if (paths.mainnet.indexOf('docs') > -1) {
+ this.footerVisible = false;
+ } else {
+ this.footerVisible = true;
+ }
});
}
@@ -43,7 +50,7 @@ export class MasterPageComponent implements OnInit {
this.navCollapsed = !this.navCollapsed;
}
- onResize(event: any) {
+ onResize(): void {
this.isMobile = window.innerWidth <= 767.98;
}
}
diff --git a/frontend/src/app/components/time/time.component.ts b/frontend/src/app/components/time/time.component.ts
index 6431f0b39..f2b220d39 100644
--- a/frontend/src/app/components/time/time.component.ts
+++ b/frontend/src/app/components/time/time.component.ts
@@ -11,6 +11,15 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy {
interval: number;
text: string;
units: string[] = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second'];
+ precisionThresholds = {
+ year: 100,
+ month: 18,
+ week: 12,
+ day: 31,
+ hour: 48,
+ minute: 90,
+ second: 90
+ };
intervals = {};
@Input() time: number;
@@ -85,8 +94,12 @@ export class TimeComponent implements OnInit, OnChanges, OnDestroy {
let counter: number;
for (const [index, unit] of this.units.entries()) {
- const precisionUnit = this.units[Math.min(this.units.length - 1), index + this.precision];
+ let precisionUnit = this.units[Math.min(this.units.length - 1, index + this.precision)];
counter = Math.floor(seconds / this.intervals[unit]);
+ const precisionCounter = Math.floor(seconds / this.intervals[precisionUnit]);
+ if (precisionCounter > this.precisionThresholds[precisionUnit]) {
+ precisionUnit = unit;
+ }
if (counter > 0) {
let rounded = Math.round(seconds / this.intervals[precisionUnit]);
if (this.fractionDigits) {
diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html
index d4425687a..1d07d9ef2 100644
--- a/frontend/src/app/shared/components/global-footer/global-footer.component.html
+++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html
@@ -1,29 +1,31 @@
-