Merge pull request #1178 from knorrium/update_e2e_tests
Update e2e tests: new scenarios for Liquid, Bisq and refactor button selectors
This commit is contained in:
		
						commit
						230f563235
					
				@ -1,87 +1,163 @@
 | 
			
		||||
describe('Bisq', () => {
 | 
			
		||||
    const baseModule = Cypress.env("BASE_MODULE");
 | 
			
		||||
    const basePath = '';
 | 
			
		||||
  const baseModule = Cypress.env("BASE_MODULE");
 | 
			
		||||
  const basePath = '';
 | 
			
		||||
 | 
			
		||||
    beforeEach(() => {
 | 
			
		||||
        cy.intercept('/sockjs-node/info*').as('socket');
 | 
			
		||||
        cy.intercept('/bisq/api/markets/hloc?market=btc_usd&interval=day').as('hloc');
 | 
			
		||||
        cy.intercept('/bisq/api/markets/ticker').as('ticker');
 | 
			
		||||
        cy.intercept('/bisq/api/markets/markets').as('markets');
 | 
			
		||||
        cy.intercept('/bisq/api/markets/volumes/7d').as('7d');
 | 
			
		||||
        cy.intercept('/bisq/api/markets/trades?market=all').as('trades');
 | 
			
		||||
        cy.intercept('/bisq/api/txs/*/*').as('txs');
 | 
			
		||||
        cy.intercept('/bisq/api/blocks/*/*').as('blocks');
 | 
			
		||||
        cy.intercept('/bisq/api/stats').as('stats');
 | 
			
		||||
  beforeEach(() => {
 | 
			
		||||
    cy.intercept('/sockjs-node/info*').as('socket');
 | 
			
		||||
    cy.intercept('/bisq/api/markets/hloc?market=btc_usd&interval=day').as('hloc');
 | 
			
		||||
    cy.intercept('/bisq/api/markets/ticker').as('ticker');
 | 
			
		||||
    cy.intercept('/bisq/api/markets/markets').as('markets');
 | 
			
		||||
    cy.intercept('/bisq/api/markets/volumes/7d').as('7d');
 | 
			
		||||
    cy.intercept('/bisq/api/markets/trades?market=all').as('trades');
 | 
			
		||||
    cy.intercept('/bisq/api/txs/*/*').as('txs');
 | 
			
		||||
    cy.intercept('/bisq/api/blocks/*/*').as('blocks');
 | 
			
		||||
    cy.intercept('/bisq/api/stats').as('stats');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
        Cypress.Commands.add('waitForDashboard', () => {
 | 
			
		||||
            cy.wait('@socket');
 | 
			
		||||
            cy.wait('@hloc');
 | 
			
		||||
            cy.wait('@ticker');
 | 
			
		||||
            cy.wait('@markets');
 | 
			
		||||
            cy.wait('@7d');
 | 
			
		||||
            cy.wait('@trades');
 | 
			
		||||
          });
 | 
			
		||||
  if (baseModule === 'bisq') {
 | 
			
		||||
    it('loads the dashboard', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (baseModule === 'bisq') {
 | 
			
		||||
 | 
			
		||||
        it('loads the dashboard', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
    describe("transactions", () => {
 | 
			
		||||
      it('loads the transactions screen', () => {
 | 
			
		||||
        cy.visit(`${basePath}`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-transactions').click().then(() => {
 | 
			
		||||
          cy.get('.table > tr').should('have.length', 50);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the transactions screen', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(2) > a').click().then(() => {
 | 
			
		||||
                cy.get('.table > tr').should('have.length', 50);
 | 
			
		||||
            });
 | 
			
		||||
      const filters = [
 | 
			
		||||
        "Asset listing fee", "Blind vote", "Compensation request",
 | 
			
		||||
        "Genesis", "Irregular", "Lockup", "Pay trade fee", "Proof of burn",
 | 
			
		||||
        "Proposal", "Reimbursement request", "Transfer BSQ", "Unlock", "Vote reveal"
 | 
			
		||||
      ];
 | 
			
		||||
      filters.forEach((filter) => {
 | 
			
		||||
        it(`filters the transaction screen by ${filter}`, () => {
 | 
			
		||||
          cy.visit(`${basePath}/transactions`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          cy.get('#filter').click();
 | 
			
		||||
          cy.contains(filter).find('input').click();
 | 
			
		||||
          //TODO: change this waiter
 | 
			
		||||
          cy.wait(1000);
 | 
			
		||||
          cy.get('td:nth-of-type(2)').each(($td) => {
 | 
			
		||||
            expect($td.text().trim()).to.eq(filter);
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the blocks screen', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
                cy.wait('@blocks');
 | 
			
		||||
                cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
            });
 | 
			
		||||
      it("filters using multiple criteria", () => {
 | 
			
		||||
        const filters = ['Proposal', 'Lockup', 'Unlock'];
 | 
			
		||||
        cy.visit(`${basePath}/transactions`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#filter').click();
 | 
			
		||||
        filters.forEach((filter) => {
 | 
			
		||||
          cy.contains(filter).find('input').click();
 | 
			
		||||
          //TODO: change this waiter
 | 
			
		||||
          cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
        cy.get('td:nth-of-type(2)').each(($td) => {
 | 
			
		||||
          const regex = new RegExp(`${filters.join('|')}`, 'g');
 | 
			
		||||
          expect($td.text().trim()).to.match(regex);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the stats screen', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(4) > a').click().then(() => {
 | 
			
		||||
                cy.wait('@stats');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
      const transactions = [
 | 
			
		||||
        { type: 'Asset listing fee', txid: '3548aa0c002b015ea700072b7d7d76d45d4f10a3573804d0d2f624c0bb255b6b' },
 | 
			
		||||
        { type: 'Blind vote', txid: 'f8fabb95efa1bb81325e4c961b9fc7e3508a9b9ecd4eddf1400e58867eff8d92' },
 | 
			
		||||
        { type: 'Compensation request', txid: 'a8cdc65fe6bb8730f5f89f99f779d0469b0a493e1ae570e20eb7afda696a18a9' },
 | 
			
		||||
        { type: 'Genesis', txid: '4b5417ec5ab6112bedf539c3b4f5a806ed539542d8b717e1c4470aa3180edce5' },
 | 
			
		||||
        { type: 'Irregular', txid: '90b06684a517388fec2237e2362a29810dc82f0e13e019c84747ec27051e6c53' },
 | 
			
		||||
        { type: 'Lockup', txid: '365425b3b7487229e2ba598fb8f2a9e359e3351620383e5018548649a28b78c4' },
 | 
			
		||||
        { type: 'Pay trade fee', txid: 'a66b30e9777e16572ab36723539df8f45bd5d8130d810b2c3d75b8c02a191eaf' },
 | 
			
		||||
        { type: 'Proof of burn', txid: '8325ccb87065fb9243ed9ff1cbb431fc2ac5060a60433bcde474ccbd97b76dcb' },
 | 
			
		||||
        { type: 'Proposal', txid: '34e2a20f045c82fbcf7cb191b42dea6fba45641777e1751ffb29d3981c4bf413' },
 | 
			
		||||
        { type: 'Reimbursement request', txid: '04c16c79ca6b9ec9978880024b0d0ad3100020f33286b63c85ca7b1a319421ae' },
 | 
			
		||||
        { type: 'Transfer BSQ', txid: '64500bd9220675ad30d5ace27de95a341a498d7eda08162ee0ce7feb8c56cb14' },
 | 
			
		||||
        { type: 'Unlock', txid: '5a756841bbb11137d15b0082a3fcadbe102791f41a95d661d3bd0c5ad0b3b1a3' },
 | 
			
		||||
        { type: 'Vote reveal', txid: 'bd7daae1d4af8837db5e47d7bd9d8b9f83dcfd35d112f85e90728b9be45191f7' }
 | 
			
		||||
      ];
 | 
			
		||||
 | 
			
		||||
        it('loads the api screen', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(5) > a').click().then(() => {
 | 
			
		||||
                cy.get('.section-header').should('have.length.at.least', 1);
 | 
			
		||||
                cy.get('.endpoint-container').should('have.length.at.least', 1);
 | 
			
		||||
            });
 | 
			
		||||
      transactions.forEach((transaction) => {
 | 
			
		||||
        it(`loads a "${transaction.type}" transaction`, () => {
 | 
			
		||||
          cy.visit(`${basePath}/tx/${transaction.txid}`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        it('shows blocks pagination with 5 pages (desktop)', () => {
 | 
			
		||||
            cy.viewport(760, 800);
 | 
			
		||||
            cy.visit(`${basePath}/blocks`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
            // 5 pages + 4 buttons = 9 buttons
 | 
			
		||||
            cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9);
 | 
			
		||||
    describe('blocks', () => {
 | 
			
		||||
      it('loads the blocks screen', () => {
 | 
			
		||||
        cy.visit(`${basePath}`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-blocks').click().then(() => {
 | 
			
		||||
          cy.wait('@blocks');
 | 
			
		||||
          cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('shows blocks pagination with 3 pages (mobile)', () => {
 | 
			
		||||
            cy.viewport(669, 800);
 | 
			
		||||
            cy.visit(`${basePath}/blocks`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
            // 3 pages + 4 buttons = 7 buttons
 | 
			
		||||
            cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7);
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
      it('loads a specific block', () => {
 | 
			
		||||
        cy.visit(`${basePath}/block/0000000000000000000137ef33faa63bc6e809ab30932cf77d454fb36d2bd83a`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('markets', () => {
 | 
			
		||||
      it('loads the markets screen', () => {
 | 
			
		||||
        cy.visit(`${basePath}/markets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads a specific market', () => {
 | 
			
		||||
        cy.visit(`${basePath}/market/btc_eur`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        //Buy Offers
 | 
			
		||||
        cy.get('.row > :nth-child(1) td').should('have.length.at.least', 1);
 | 
			
		||||
        //Sell offers
 | 
			
		||||
        cy.get('.row > :nth-child(1) td').should('have.length.at.least', 1);
 | 
			
		||||
        //Trades
 | 
			
		||||
        cy.get('app-bisq-trades > .table-container td').should('have.length.at.least', 1);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the stats screen', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-stats').click().then(() => {
 | 
			
		||||
        cy.wait('@stats');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the api screen', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-docs').click().then(() => {
 | 
			
		||||
        cy.get('.section-header').should('have.length.at.least', 1);
 | 
			
		||||
        cy.get('.endpoint-container').should('have.length.at.least', 1);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('shows blocks pagination with 5 pages (desktop)', () => {
 | 
			
		||||
      cy.viewport(760, 800);
 | 
			
		||||
      cy.visit(`${basePath}/blocks`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
      // 5 pages + 4 buttons = 9 buttons
 | 
			
		||||
      cy.get('.pagination-container ul.pagination').first().children().should('have.length', 9);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('shows blocks pagination with 3 pages (mobile)', () => {
 | 
			
		||||
      cy.viewport(669, 800);
 | 
			
		||||
      cy.visit(`${basePath}/blocks`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('tbody tr').should('have.length', 10);
 | 
			
		||||
      // 3 pages + 4 buttons = 7 buttons
 | 
			
		||||
      cy.get('.pagination-container ul.pagination').first().children().should('have.length', 7);
 | 
			
		||||
    });
 | 
			
		||||
  } else {
 | 
			
		||||
    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -1,210 +1,214 @@
 | 
			
		||||
describe('Liquid', () => {
 | 
			
		||||
    const baseModule = Cypress.env("BASE_MODULE");
 | 
			
		||||
    const basePath = '';
 | 
			
		||||
  const baseModule = Cypress.env("BASE_MODULE");
 | 
			
		||||
  const basePath = '';
 | 
			
		||||
 | 
			
		||||
    beforeEach(() => {
 | 
			
		||||
        cy.intercept('/liquid/api/block/**').as('block');
 | 
			
		||||
        cy.intercept('/liquid/api/blocks/').as('blocks');
 | 
			
		||||
        cy.intercept('/liquid/api/tx/**/outspends').as('outspends');
 | 
			
		||||
        cy.intercept('/liquid/api/block/**/txs/**').as('block-txs');
 | 
			
		||||
        cy.intercept('/resources/pools.json').as('pools');
 | 
			
		||||
  beforeEach(() => {
 | 
			
		||||
    cy.intercept('/liquid/api/block/**').as('block');
 | 
			
		||||
    cy.intercept('/liquid/api/blocks/').as('blocks');
 | 
			
		||||
    cy.intercept('/liquid/api/tx/**/outspends').as('outspends');
 | 
			
		||||
    cy.intercept('/liquid/api/block/**/txs/**').as('block-txs');
 | 
			
		||||
    cy.intercept('/resources/pools.json').as('pools');
 | 
			
		||||
 | 
			
		||||
        Cypress.Commands.add('waitForBlockData', () => {
 | 
			
		||||
            cy.wait('@socket');
 | 
			
		||||
            cy.wait('@block');
 | 
			
		||||
            cy.wait('@outspends');
 | 
			
		||||
          });
 | 
			
		||||
    Cypress.Commands.add('waitForBlockData', () => {
 | 
			
		||||
      cy.wait('@socket');
 | 
			
		||||
      cy.wait('@block');
 | 
			
		||||
      cy.wait('@outspends');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (baseModule === 'liquid') {
 | 
			
		||||
 | 
			
		||||
    it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#mempool-block-0 > .blockLink').should('exist');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (baseModule === 'liquid') {
 | 
			
		||||
    it('loads the dashboard', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('#mempool-block-0 > .blockLink').should('exist');
 | 
			
		||||
    it('loads the blocks page', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.get('#btn-blocks').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads a specific block page', () => {
 | 
			
		||||
      cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs page', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-graphs').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the tv page - desktop', () => {
 | 
			
		||||
      cy.visit(`${basePath}/tv`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs page - mobile', () => {
 | 
			
		||||
      cy.visit(`${basePath}`)
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-graphs').click().then(() => {
 | 
			
		||||
        cy.viewport('iphone-6');
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
        cy.get('.tv-only').should('not.exist');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('renders unconfidential addresses correctly on mobile', () => {
 | 
			
		||||
      cy.viewport('iphone-6');
 | 
			
		||||
      cy.visit(`${basePath}/address/ex1qqmmjdwrlg59c8q4l75sj6wedjx57tj5grt8pat`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      //TODO: Add proper IDs for these selectors
 | 
			
		||||
      const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody';
 | 
			
		||||
      const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)';
 | 
			
		||||
      cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => {
 | 
			
		||||
        cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => {
 | 
			
		||||
          expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth));
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        it('loads the dashboard', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
    describe('peg in/peg out', () => {
 | 
			
		||||
      it('loads peg in addresses', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/fe764f7bedfc2a37b29d9c8aef67d64a57d253a6b11c5a55555cfd5826483a58`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        //TODO: Change to an element id so we don't assert on a string
 | 
			
		||||
        cy.get('#table-tx-vin').should('contain', 'Peg-in');
 | 
			
		||||
        cy.get('#table-tx-vin a').click().then(() => {
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          if (baseModule === 'liquid') {
 | 
			
		||||
            cy.url().should('eq', 'https://mempool.space/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592');
 | 
			
		||||
          } else {
 | 
			
		||||
            //TODO: Use an environment variable to get the hostname
 | 
			
		||||
            cy.url().should('eq', 'http://localhost:4200/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592');
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the blocks page', () => {
 | 
			
		||||
            cy.visit(`${basePath}/blocks`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
      it('loads peg out addresses', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/ecf6eba04ffb3946faa172343c87162df76f1a57b07b0d6dc6ad956b13376dc8`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout a').first().click().then(() => {
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          if (baseModule === 'liquid') {
 | 
			
		||||
            cy.url().should('eq', 'https://mempool.space/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR');
 | 
			
		||||
          } else {
 | 
			
		||||
            //TODO: Use an environment variable to get the hostname
 | 
			
		||||
            cy.url().should('eq', 'http://localhost:4200/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR');
 | 
			
		||||
          }
 | 
			
		||||
          //TODO: Add a custom class so we don't assert on a string
 | 
			
		||||
          cy.get('.badge').should('contain', 'Liquid Peg Out');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        it('loads a specific block page', () => {
 | 
			
		||||
            cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
    describe('assets', () => {
 | 
			
		||||
      it('shows the assets screen', () => {
 | 
			
		||||
        cy.visit(`${basePath}`);
 | 
			
		||||
        cy.get('#btn-assets');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('table tr').should('have.length.at.least', 5);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('allows searching assets', () => {
 | 
			
		||||
        cy.visit(`${basePath}/assets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => {
 | 
			
		||||
          cy.get('table tr').should('have.length', 1);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the graphs page', () => {
 | 
			
		||||
            cy.visit(`${basePath}/graphs`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('loads the tv page - desktop', () => {
 | 
			
		||||
            cy.visit(`${basePath}`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
                cy.wait(1000);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('loads the graphs page - mobile', () => {
 | 
			
		||||
            cy.visit(`${basePath}`)
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
                cy.viewport('iphone-6');
 | 
			
		||||
                cy.wait(1000);
 | 
			
		||||
                cy.get('.tv-only').should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('renders unconfidential addresses correctly on mobile', () => {
 | 
			
		||||
            cy.viewport('iphone-6');
 | 
			
		||||
            cy.visit(`${basePath}/address/ex1qqmmjdwrlg59c8q4l75sj6wedjx57tj5grt8pat`);
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            //TODO: Add proper IDs for these selectors
 | 
			
		||||
            const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody';
 | 
			
		||||
            const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)';
 | 
			
		||||
            cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => {
 | 
			
		||||
                cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => {
 | 
			
		||||
                    expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth));
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        describe('peg in/peg out', () => {
 | 
			
		||||
            it('loads peg in addresses', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/fe764f7bedfc2a37b29d9c8aef67d64a57d253a6b11c5a55555cfd5826483a58`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                //TODO: Change to an element id so we don't assert on a string
 | 
			
		||||
                cy.get('#table-tx-vin').should('contain', 'Peg-in');
 | 
			
		||||
                cy.get('#table-tx-vin a').click().then(() => {
 | 
			
		||||
                    cy.waitForSkeletonGone();
 | 
			
		||||
                    if (baseModule === 'liquid') {
 | 
			
		||||
                        cy.url().should('eq', 'https://mempool.space/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592');
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //TODO: Use an environment variable to get the hostname
 | 
			
		||||
                        cy.url().should('eq', 'http://localhost:4200/tx/f148c0d854db4174ea420655235f910543f0ec3680566dcfdf84fb0a1697b592');
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it('loads peg out addresses', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/ecf6eba04ffb3946faa172343c87162df76f1a57b07b0d6dc6ad956b13376dc8`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vout a').first().click().then(() => {
 | 
			
		||||
                    cy.waitForSkeletonGone();
 | 
			
		||||
                    if (baseModule === 'liquid') {
 | 
			
		||||
                        cy.url().should('eq', 'https://mempool.space/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR');
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //TODO: Use an environment variable to get the hostname
 | 
			
		||||
                        cy.url().should('eq', 'http://localhost:4200/address/1BxoGcMg14oaH3CwHD2hF4gU9VcfgX5yoR');
 | 
			
		||||
                    }
 | 
			
		||||
                    //TODO: Add a custom class so we don't assert on a string
 | 
			
		||||
                    cy.get('.badge').should('contain','Liquid Peg Out');
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        describe('assets', () => {
 | 
			
		||||
            it('shows the assets screen', () => {
 | 
			
		||||
                cy.visit(`${basePath}/assets`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('table tr').should('have.length.at.least', 5);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it('allows searching assets', () => {
 | 
			
		||||
                cy.visit(`${basePath}/assets`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => {
 | 
			
		||||
                    cy.get('table tr').should('have.length', 1);
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            it('shows a specific asset ID', () => {
 | 
			
		||||
                cy.visit(`${basePath}/assets`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('.container-xl input').click().type('Liquid AUD').then(() => {
 | 
			
		||||
                    cy.get('table tr td:nth-of-type(1) a').click();
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
      it('shows a specific asset ID', () => {
 | 
			
		||||
        cy.visit(`${basePath}/assets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.container-xl input').click().type('Liquid AUD').then(() => {
 | 
			
		||||
          cy.get('table tr td:nth-of-type(1) a').click();
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        describe('unblinded TX', () => {
 | 
			
		||||
    describe('unblinded TX', () => {
 | 
			
		||||
 | 
			
		||||
            it('should not show an unblinding error message for regular txs', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('.error-unblinded' ).should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
      it('should not show an unblinding error message for regular txs', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.error-unblinded').should('not.exist');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show unblinded TX', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.02465000 L-BTC');
 | 
			
		||||
                cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC');
 | 
			
		||||
                cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
            });
 | 
			
		||||
      it('show unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.02465000 L-BTC');
 | 
			
		||||
        cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC');
 | 
			
		||||
        cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show empty unblinded TX', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
                cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', '');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
            });
 | 
			
		||||
      it('show empty unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show invalid unblinded TX hex', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=123`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vin tr').should('have.class', '');
 | 
			
		||||
                cy.get('#table-tx-vout tr').should('have.class', '');
 | 
			
		||||
                cy.get('.error-unblinded' ).contains('Error: Invalid blinding data (invalid hex)');
 | 
			
		||||
            });
 | 
			
		||||
      it('show invalid unblinded TX hex', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=123`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr').should('have.class', '');
 | 
			
		||||
        cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show first unblinded vout', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC');
 | 
			
		||||
            });
 | 
			
		||||
      it('show first unblinded vout', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00100000 L-BTC');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show second unblinded vout', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`);
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(2').should('have.class', 'assetBox');
 | 
			
		||||
                cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC');
 | 
			
		||||
            });
 | 
			
		||||
      it('show second unblinded vout', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3a`);
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.02364760 L-BTC');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('show invalid error unblinded TX', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3c`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
                cy.get('.error-unblinded' ).contains('Error: Invalid blinding data.');
 | 
			
		||||
            });
 | 
			
		||||
      it('show invalid error unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/f2f41c0850e8e7e3f1af233161fd596662e67c11ef10ed15943884186fbb7f46#blinded=100000,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,0ab9f70650f16b1db8dfada05237f7d0d65191c3a13183da8a2ddddfbde9a2ad,fd98b2edc5530d76acd553f206a431f4c1fab27e10e290ad719582af878e98fc,2364760,6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d,90c7a43b15b905bca045ca42a01271cfe71d2efe3133f4197792c24505cb32ed,12eb5959d9293b8842e7dd8bc9aa9639fd3fd031c5de3ba911adeca94eb57a3c`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('.error-unblinded').contains('Error: Invalid blinding data.');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('shows asset peg in/out and burn transactions', () => {
 | 
			
		||||
                cy.visit(`${basePath}/asset/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.get('#table-tx-vout tr').not('.assetBox');
 | 
			
		||||
                cy.get('#table-tx-vin tr').not('.assetBox');
 | 
			
		||||
            });
 | 
			
		||||
      it('shows asset peg in/out and burn transactions', () => {
 | 
			
		||||
        cy.visit(`${basePath}/asset/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout tr').not('.assetBox');
 | 
			
		||||
        cy.get('#table-tx-vin tr').not('.assetBox');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
            it('prevents regressing issue #644', () => {
 | 
			
		||||
                cy.visit(`${basePath}/tx/393b890966f305e7c440fcfb12a13f51a7a9011cc59ff5f14f6f93214261bd82`);
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
    }
 | 
			
		||||
      it('prevents regressing issue #644', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/393b890966f305e7c440fcfb12a13f51a7a9011cc59ff5f14f6f93214261bd82`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  } else {
 | 
			
		||||
    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -3,177 +3,173 @@ describe('Liquid Testnet', () => {
 | 
			
		||||
  const basePath = '/testnet';
 | 
			
		||||
 | 
			
		||||
  beforeEach(() => {
 | 
			
		||||
      cy.intercept('/liquidtestnet/api/block/**').as('block');
 | 
			
		||||
      cy.intercept('/liquidtestnet/api/blocks/').as('blocks');
 | 
			
		||||
      cy.intercept('/liquidtestnet/api/tx/**/outspends').as('outspends');
 | 
			
		||||
      cy.intercept('/liquidtestnet/api/block/**/txs/**').as('block-txs');
 | 
			
		||||
      cy.intercept('/resources/pools.json').as('pools');
 | 
			
		||||
    cy.intercept('/liquidtestnet/api/block/**').as('block');
 | 
			
		||||
    cy.intercept('/liquidtestnet/api/blocks/').as('blocks');
 | 
			
		||||
    cy.intercept('/liquidtestnet/api/tx/**/outspends').as('outspends');
 | 
			
		||||
    cy.intercept('/liquidtestnet/api/block/**/txs/**').as('block-txs');
 | 
			
		||||
    cy.intercept('/resources/pools.json').as('pools');
 | 
			
		||||
 | 
			
		||||
      Cypress.Commands.add('waitForBlockData', () => {
 | 
			
		||||
          cy.wait('@socket');
 | 
			
		||||
          cy.wait('@block');
 | 
			
		||||
          cy.wait('@outspends');
 | 
			
		||||
        });
 | 
			
		||||
    Cypress.Commands.add('waitForBlockData', () => {
 | 
			
		||||
      cy.wait('@socket');
 | 
			
		||||
      cy.wait('@block');
 | 
			
		||||
      cy.wait('@outspends');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (baseModule === 'liquid') {
 | 
			
		||||
 | 
			
		||||
      it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
          cy.visit(`${basePath}`);
 | 
			
		||||
    it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#mempool-block-0 > .blockLink').should('exist');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the dashboard', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the blocks page', () => {
 | 
			
		||||
      cy.visit(`${basePath}`)
 | 
			
		||||
      cy.get('#btn-blocks');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads a specific block page', () => {
 | 
			
		||||
      cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs page', () => {
 | 
			
		||||
      cy.visit(`${basePath}`);
 | 
			
		||||
      cy.get('#btn-graphs');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the tv page - desktop', () => {
 | 
			
		||||
      cy.visit(`${basePath}/tv`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs page - mobile', () => {
 | 
			
		||||
      cy.visit(`${basePath}`)
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.viewport('iphone-6');
 | 
			
		||||
      cy.get('.tv-only').should('not.exist');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it.skip('renders unconfidential addresses correctly on mobile', () => {
 | 
			
		||||
      cy.viewport('iphone-6');
 | 
			
		||||
      cy.visit(`${basePath}/address/__TODO__`);
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      //TODO: Add proper IDs for these selectors
 | 
			
		||||
      const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody';
 | 
			
		||||
      const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)';
 | 
			
		||||
      cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => {
 | 
			
		||||
        cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => {
 | 
			
		||||
          expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth));
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('assets', () => {
 | 
			
		||||
      it('shows the assets screen', () => {
 | 
			
		||||
        cy.visit(`${basePath}/assets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('table tr').should('have.length.at.least', 5);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('allows searching assets', () => {
 | 
			
		||||
        cy.visit(`${basePath}/assets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => {
 | 
			
		||||
          cy.get('table tr').should('have.length', 1);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('shows a specific asset ID', () => {
 | 
			
		||||
        cy.visit(`${basePath}/assets`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.container-xl input').click().type('Liquid CAD').then(() => {
 | 
			
		||||
          cy.get('table tr td:nth-of-type(1) a').click();
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('unblinded TX', () => {
 | 
			
		||||
      it('should not show an unblinding error message for regular txs', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.error-unblinded').should('not.exist');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('show unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508a`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.00100000 tL-BTC');
 | 
			
		||||
        cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00050000 tL-BTC');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.00049741 tL-BTC');
 | 
			
		||||
        cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('show empty unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('show invalid unblinded TX hex', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/2477f220eef1d03f8ffa4a2861c275d155c3562adf0d79523aeeb0c59ee611ba#blinded=5000`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr').should('have.class', '');
 | 
			
		||||
        cy.get('#table-tx-vout tr').should('have.class', '');
 | 
			
		||||
        cy.get('.error-unblinded').contains('Error: Invalid blinding data (invalid hex)');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('show first unblinded vout', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00099729 tL-BTC');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('show second unblinded vout (asset)', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', 'assetBox');
 | 
			
		||||
        //TODO Update after the precision bug fix is merged
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0 TEST');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('should link to the asset page from the unblinded tx', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
        cy.get('#table-tx-vout tr:nth-child(2) .amount a').click().then(() => {
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          cy.get('#mempool-block-0 > .blockLink').should('exist');
 | 
			
		||||
          cy.url().should('contain', '/asset/38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads the dashboard', () => {
 | 
			
		||||
          cy.visit(`${basePath}`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
      it('show invalid error unblinded TX', () => {
 | 
			
		||||
        cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508c`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
        cy.get('.error-unblinded').contains('Error: Invalid blinding data.');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads the blocks page', () => {
 | 
			
		||||
          cy.visit(`${basePath}/blocks`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
      it('shows asset peg in/out and burn transactions', () => {
 | 
			
		||||
        cy.visit(`${basePath}/asset/ac3e0ff248c5051ffd61e00155b7122e5ebc04fd397a0ecbdd4f4e4a56232926`);
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#table-tx-vout tr').not('.assetBox');
 | 
			
		||||
        cy.get('#table-tx-vin tr').not('.assetBox');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads a specific block page', () => {
 | 
			
		||||
          cy.visit(`${basePath}/block/7e1369a23a5ab861e7bdede2aadcccae4ea873ffd9caf11c7c5541eb5bcdff54`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads the graphs page', () => {
 | 
			
		||||
          cy.visit(`${basePath}/graphs`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads the tv page - desktop', () => {
 | 
			
		||||
          cy.visit(`${basePath}`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
              cy.wait(1000);
 | 
			
		||||
          });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('loads the graphs page - mobile', () => {
 | 
			
		||||
          cy.visit(`${basePath}`)
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
              cy.viewport('iphone-6');
 | 
			
		||||
              cy.wait(1000);
 | 
			
		||||
              cy.get('.tv-only').should('not.exist');
 | 
			
		||||
          });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it.skip('renders unconfidential addresses correctly on mobile', () => {
 | 
			
		||||
          cy.viewport('iphone-6');
 | 
			
		||||
          cy.visit(`${basePath}/address/__TODO__`);
 | 
			
		||||
          cy.waitForSkeletonGone();
 | 
			
		||||
          //TODO: Add proper IDs for these selectors
 | 
			
		||||
          const firstRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(1) > .table > tbody';
 | 
			
		||||
          const thirdRowSelector = '.container-xl > :nth-child(3) > div > :nth-child(3)';
 | 
			
		||||
          cy.get(firstRowSelector).invoke('css', 'width').then(firstRowWidth => {
 | 
			
		||||
              cy.get(thirdRowSelector).invoke('css', 'width').then(thirdRowWidth => {
 | 
			
		||||
                  expect(parseInt(firstRowWidth)).to.be.lessThan(parseInt(thirdRowWidth));
 | 
			
		||||
              });
 | 
			
		||||
          });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      describe('assets', () => {
 | 
			
		||||
          it('shows the assets screen', () => {
 | 
			
		||||
              cy.visit(`${basePath}/assets`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('table tr').should('have.length.at.least', 5);
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('allows searching assets', () => {
 | 
			
		||||
              cy.visit(`${basePath}/assets`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('.container-xl input').click().type('Liquid Bitcoin').then(() => {
 | 
			
		||||
                  cy.get('table tr').should('have.length', 1);
 | 
			
		||||
              });
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('shows a specific asset ID', () => {
 | 
			
		||||
              cy.visit(`${basePath}/assets`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('.container-xl input').click().type('Liquid CAD').then(() => {
 | 
			
		||||
                  cy.get('table tr td:nth-of-type(1) a').click();
 | 
			
		||||
              });
 | 
			
		||||
          });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      describe('unblinded TX', () => {
 | 
			
		||||
          it('should not show an unblinding error message for regular txs', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/82a479043ec3841e0d3f829afc8df4f0e2bbd675a13f013ea611b2fde0027d45`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('.error-unblinded' ).should('not.exist');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show unblinded TX', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508a`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', '0.00100000 tL-BTC');
 | 
			
		||||
              cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00050000 tL-BTC');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0.00049741 tL-BTC');
 | 
			
		||||
              cy.get('#table-tx-vout tr').should('have.class', 'assetBox');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show empty unblinded TX', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vin tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
              cy.get('#table-tx-vin tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', '');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', '');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', 'Confidential');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show invalid unblinded TX hex', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/2477f220eef1d03f8ffa4a2861c275d155c3562adf0d79523aeeb0c59ee611ba#blinded=5000`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vin tr').should('have.class', '');
 | 
			
		||||
              cy.get('#table-tx-vout tr').should('have.class', '');
 | 
			
		||||
              cy.get('.error-unblinded' ).contains('Error: Invalid blinding data (invalid hex)');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show first unblinded vout', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(1)').should('have.class', 'assetBox');
 | 
			
		||||
              cy.get('#table-tx-vout tr:nth-child(1) .amount').should('contain.text', '0.00099729 tL-BTC');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show second unblinded vout (asset)', () => {
 | 
			
		||||
            cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
            cy.get('#table-tx-vout tr:nth-child(2)').should('have.class', 'assetBox');
 | 
			
		||||
            //TODO Update after the precision bug fix is merged
 | 
			
		||||
            cy.get('#table-tx-vout tr:nth-child(2) .amount').should('contain.text', '0 TEST');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('should link to the asset page from the unblinded tx', () => {
 | 
			
		||||
            cy.visit(`${basePath}/tx/0877bc0c7aa5c2b8d0e4b15450425879b8783c40e341806037a605ef836fb886#blinded=5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,328de54e90e867a9154b4f1eb7fcab86267e880fa2ee9e53b41a91e61dab86e6,8885831e6b089eaf06889d53a24843f0da533d300a7b1527b136883a6819f3ae,5000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,aca78b953615d69ae0ae68c4c5c3c0ee077c10bc20ad3f0c5960706004e6cb56,d2ec175afe5f761e2dbd443faf46abbb7091f341deb3387e5787d812bdb2df9f,100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,4b54a4ca809b3844f34dd88b68617c4c866d92a02211f02ba355755bac20a1c6,eddd02e92b0cfbad8cab89828570a50f2c643bb2a54d886c86e25ce47e818685,99729,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,8b86d565c9549eb0352bb81ee576d01d064435b64fddcc045decebeb1d9913ce,b082ce3448d40d47b5b39f15d72b285f4a1046b636b56c25f32f498ece29d062,10000,38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5,62b04ee86198d6b41681cdd0acb450ab366af727a010aaee8ba0b9e69ff43896,3f98429bca9b538dc943c22111f25d9c4448d45a63ff0f4e58b22fd434c0365e`);
 | 
			
		||||
            cy.get('#table-tx-vout tr:nth-child(2) .amount a').click().then(() => {
 | 
			
		||||
                cy.waitForSkeletonGone();
 | 
			
		||||
                cy.url().should('contain', '/asset/38fca2d939696061a8f76d4e6b5eecd54e3b4221c846f24a6b279e79952850a5');
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('show invalid error unblinded TX', () => {
 | 
			
		||||
              cy.visit(`${basePath}/tx/c3d908ab77891e4c569b0df71aae90f4720b157019ebb20db176f4f9c4d626b8#blinded=100000,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,df290ead654d7d110ebc5aaf0bcf11d5b5d360431a467f1cde0a856fde986893,33cb3a2fd2e76643843691cf44a78c5cd28ec652a414da752160ad63fbd37bc9,49741,144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49,edb0713bcbfcb3daabf601cb50978439667d208e15fed8a5ebbfea5696cda1d5,4de70115501e8c7d6bd763e229bf42781edeacf6e75e1d7bdfa4c63104bc508c`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vin tr').should('have.class', 'assetBox');
 | 
			
		||||
              cy.get('.error-unblinded' ).contains('Error: Invalid blinding data.');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          it('shows asset peg in/out and burn transactions', () => {
 | 
			
		||||
              cy.visit(`${basePath}/asset/ac3e0ff248c5051ffd61e00155b7122e5ebc04fd397a0ecbdd4f4e4a56232926`);
 | 
			
		||||
              cy.waitForSkeletonGone();
 | 
			
		||||
              cy.get('#table-tx-vout tr').not('.assetBox');
 | 
			
		||||
              cy.get('#table-tx-vin tr').not('.assetBox');
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  } else {
 | 
			
		||||
      it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -13,8 +13,8 @@ describe('Signet', () => {
 | 
			
		||||
 | 
			
		||||
  if (baseModule === 'mempool') {
 | 
			
		||||
    it('loads the dashboard', () => {
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
      cy.visit('/signet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
@ -24,116 +24,116 @@ describe('Signet', () => {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it.skip('loads the dashboard with the skeleton blocks', () => {
 | 
			
		||||
        cy.mockMempoolSocket();
 | 
			
		||||
        cy.visit("/signet");
 | 
			
		||||
        cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-1').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-2').should('be.visible');
 | 
			
		||||
      cy.mockMempoolSocket();
 | 
			
		||||
      cy.visit("/signet");
 | 
			
		||||
      cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-1').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-2').should('be.visible');
 | 
			
		||||
 | 
			
		||||
        emitMempoolInfo({
 | 
			
		||||
            'params': {
 | 
			
		||||
            "network": "signet"
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
      emitMempoolInfo({
 | 
			
		||||
        'params': {
 | 
			
		||||
          "network": "signet"
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
        cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
        cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the blocks screen', () => {
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(2) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/signet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-blocks').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs screen', () => {
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/signet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-graphs').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('tv mode', () => {
 | 
			
		||||
        it('loads the tv screen - desktop', () => {
 | 
			
		||||
            cy.viewport('macbook-16');
 | 
			
		||||
            cy.visit('/signet');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(4) > a').click().then(() => {
 | 
			
		||||
                cy.get('.chart-holder').should('be.visible');
 | 
			
		||||
                cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
                cy.get('.tv-only').should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
      it('loads the tv screen - desktop', () => {
 | 
			
		||||
        cy.viewport('macbook-16');
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-tv').click().then(() => {
 | 
			
		||||
          cy.get('.chart-holder').should('be.visible');
 | 
			
		||||
          cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
          cy.get('.tv-only').should('not.exist');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the tv screen - mobile', () => {
 | 
			
		||||
            cy.visit('/signet');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(4) > a').click().then(() => {
 | 
			
		||||
                cy.viewport('iphone-8');
 | 
			
		||||
                cy.get('.chart-holder').should('be.visible');
 | 
			
		||||
                //TODO: Remove comment when the bug is fixed
 | 
			
		||||
                //cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
                cy.get('.tv-only').should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
      it('loads the tv screen - mobile', () => {
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-tv').click().then(() => {
 | 
			
		||||
          cy.viewport('iphone-8');
 | 
			
		||||
          cy.get('.chart-holder').should('be.visible');
 | 
			
		||||
          cy.get('.tv-only').should('not.exist');
 | 
			
		||||
          //TODO: Remove comment when the bug is fixed
 | 
			
		||||
          //cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    it('loads the api screen', () => {
 | 
			
		||||
        cy.visit('/signet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(5) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/signet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-docs').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('blocks', () => {
 | 
			
		||||
        it('shows empty blocks properly', () => {
 | 
			
		||||
            cy.visit('/signet/block/00000133d54e4589f6436703b067ec23209e0a21b8a9b12f57d0592fd85f7a42');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('h2').invoke('text').should('equal', '1 transaction');
 | 
			
		||||
      it('shows empty blocks properly', () => {
 | 
			
		||||
        cy.visit('/signet/block/00000133d54e4589f6436703b067ec23209e0a21b8a9b12f57d0592fd85f7a42');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('h2').invoke('text').should('equal', '1 transaction');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('expands and collapses the block details', () => {
 | 
			
		||||
        cy.visit('/signet/block/0');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
          cy.get('#details').should('be.visible');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('expands and collapses the block details', () => {
 | 
			
		||||
            cy.visit('/signet/block/0');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
                cy.get('#details').should('be.visible');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
                cy.get('#details').should('not.be.visible');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('shows blocks with no pagination', () => {
 | 
			
		||||
            cy.visit('/signet/block/00000078f920a96a69089877b934ce7fd009ab55e3170920a021262cb258e7cc');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('h2').invoke('text').should('equal', '13 transactions');
 | 
			
		||||
            cy.get('ul.pagination').first().children().should('have.length', 5);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('supports pagination on the block screen', () => {
 | 
			
		||||
            // 43 txs
 | 
			
		||||
            cy.visit('/signet/block/00000094bd52f73bdbfc4bece3a94c21fec2dc968cd54210496e69e4059d66a6');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('.header-bg.box > a').invoke('text').then((text1) => {
 | 
			
		||||
                cy.get('.active + li').first().click().then(() => {
 | 
			
		||||
                    cy.get('.header-bg.box > a').invoke('text').then((text2) => {
 | 
			
		||||
                        expect(text1).not.to.eq(text2);
 | 
			
		||||
                    });
 | 
			
		||||
                });
 | 
			
		||||
        cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
          cy.get('#details').should('not.be.visible');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('shows blocks with no pagination', () => {
 | 
			
		||||
        cy.visit('/signet/block/00000078f920a96a69089877b934ce7fd009ab55e3170920a021262cb258e7cc');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('h2').invoke('text').should('equal', '13 transactions');
 | 
			
		||||
        cy.get('ul.pagination').first().children().should('have.length', 5);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('supports pagination on the block screen', () => {
 | 
			
		||||
        // 43 txs
 | 
			
		||||
        cy.visit('/signet/block/00000094bd52f73bdbfc4bece3a94c21fec2dc968cd54210496e69e4059d66a6');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.header-bg.box > a').invoke('text').then((text1) => {
 | 
			
		||||
          cy.get('.active + li').first().click().then(() => {
 | 
			
		||||
            cy.get('.header-bg.box > a').invoke('text').then((text2) => {
 | 
			
		||||
              expect(text1).not.to.eq(text2);
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
    } else {
 | 
			
		||||
        it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  } else {
 | 
			
		||||
    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -13,8 +13,8 @@ describe('Testnet', () => {
 | 
			
		||||
  if (baseModule === 'mempool') {
 | 
			
		||||
 | 
			
		||||
    it('loads the dashboard', () => {
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
      cy.visit('/testnet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('check first mempool block after skeleton loads', () => {
 | 
			
		||||
@ -24,113 +24,115 @@ describe('Testnet', () => {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it.skip('loads the dashboard with the skeleton blocks', () => {
 | 
			
		||||
        cy.mockMempoolSocket();
 | 
			
		||||
        cy.visit("/testnet");
 | 
			
		||||
        cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-1').should('be.visible');
 | 
			
		||||
        cy.get('#mempool-block-2').should('be.visible');
 | 
			
		||||
      cy.mockMempoolSocket();
 | 
			
		||||
      cy.visit("/testnet");
 | 
			
		||||
      cy.get(':nth-child(1) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get(':nth-child(2) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get(':nth-child(3) > #bitcoin-block-0').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-1').should('be.visible');
 | 
			
		||||
      cy.get('#mempool-block-2').should('be.visible');
 | 
			
		||||
 | 
			
		||||
        emitMempoolInfo({
 | 
			
		||||
            'params': {
 | 
			
		||||
            loaded: true
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
      emitMempoolInfo({
 | 
			
		||||
        'params': {
 | 
			
		||||
          loaded: true
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
        cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
        cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(1) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(2) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
      cy.get(':nth-child(3) > #bitcoin-block-0').should('not.exist');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the blocks screen', () => {
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(2) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/testnet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-blocks').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('loads the graphs screen', () => {
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(3) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/testnet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-graphs').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('tv mode', () => {
 | 
			
		||||
        it('loads the tv screen - desktop', () => {
 | 
			
		||||
            cy.viewport('macbook-16');
 | 
			
		||||
            cy.visit('/testnet');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(4) > a').click().then(() => {
 | 
			
		||||
                cy.wait(1000);
 | 
			
		||||
                cy.get('.tv-only').should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
      it('loads the tv screen - desktop', () => {
 | 
			
		||||
        cy.viewport('macbook-16');
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-tv').click().then(() => {
 | 
			
		||||
          cy.wait(1000);
 | 
			
		||||
          cy.get('.tv-only').should('not.exist');
 | 
			
		||||
          //TODO: Remove comment when the bug is fixed
 | 
			
		||||
          //cy.get('#mempool-block-0').should('be.visible');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
        it('loads the tv screen - mobile', () => {
 | 
			
		||||
            cy.visit('/testnet');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('li:nth-of-type(4) > a').click().then(() => {
 | 
			
		||||
                cy.viewport('iphone-6');
 | 
			
		||||
                cy.wait(1000);
 | 
			
		||||
                cy.get('.tv-only').should('not.exist');
 | 
			
		||||
            });
 | 
			
		||||
      it('loads the tv screen - mobile', () => {
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('#btn-tv').click().then(() => {
 | 
			
		||||
          cy.viewport('iphone-6');
 | 
			
		||||
          cy.wait(1000);
 | 
			
		||||
          cy.get('.tv-only').should('not.exist');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    it('loads the api screen', () => {
 | 
			
		||||
        cy.visit('/testnet');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('li:nth-of-type(5) > a').click().then(() => {
 | 
			
		||||
            cy.wait(1000);
 | 
			
		||||
        });
 | 
			
		||||
      cy.visit('/testnet');
 | 
			
		||||
      cy.waitForSkeletonGone();
 | 
			
		||||
      cy.get('#btn-docs').click().then(() => {
 | 
			
		||||
        cy.wait(1000);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    describe('blocks', () => {
 | 
			
		||||
        it('shows empty blocks properly', () => {
 | 
			
		||||
            cy.visit('/testnet/block/0');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('h2').invoke('text').should('equal', '1 transaction');
 | 
			
		||||
      it('shows empty blocks properly', () => {
 | 
			
		||||
        cy.visit('/testnet/block/0');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('h2').invoke('text').should('equal', '1 transaction');
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('expands and collapses the block details', () => {
 | 
			
		||||
        cy.visit('/testnet/block/0');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
          cy.get('#details').should('be.visible');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('expands and collapses the block details', () => {
 | 
			
		||||
            cy.visit('/testnet/block/0');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
                cy.get('#details').should('be.visible');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
                cy.get('#details').should('not.be.visible');
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('shows blocks with no pagination', () => {
 | 
			
		||||
            cy.visit('/testnet/block/000000000000002f8ce27716e74ecc7ad9f7b5101fed12d09e28bb721b9460ea');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('h2').invoke('text').should('equal', '11 transactions');
 | 
			
		||||
            cy.get('ul.pagination').first().children().should('have.length', 5);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        it('supports pagination on the block screen', () => {
 | 
			
		||||
            // 48 txs
 | 
			
		||||
            cy.visit('/testnet/block/000000000000002ca3878ebd98b313a1c2d531f2e70a6575d232ca7564dea7a9');
 | 
			
		||||
            cy.waitForSkeletonGone();
 | 
			
		||||
            cy.get('.header-bg.box > a').invoke('text').then((text1) => {
 | 
			
		||||
                cy.get('.active + li').first().click().then(() => {
 | 
			
		||||
                    cy.get('.header-bg.box > a').invoke('text').then((text2) => {
 | 
			
		||||
                        expect(text1).not.to.eq(text2);
 | 
			
		||||
                    });
 | 
			
		||||
                });
 | 
			
		||||
        cy.get('.btn.btn-outline-info').click().then(() => {
 | 
			
		||||
          cy.get('#details').should('not.be.visible');
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('shows blocks with no pagination', () => {
 | 
			
		||||
        cy.visit('/testnet/block/000000000000002f8ce27716e74ecc7ad9f7b5101fed12d09e28bb721b9460ea');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('h2').invoke('text').should('equal', '11 transactions');
 | 
			
		||||
        cy.get('ul.pagination').first().children().should('have.length', 5);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      it('supports pagination on the block screen', () => {
 | 
			
		||||
        // 48 txs
 | 
			
		||||
        cy.visit('/testnet/block/000000000000002ca3878ebd98b313a1c2d531f2e70a6575d232ca7564dea7a9');
 | 
			
		||||
        cy.waitForSkeletonGone();
 | 
			
		||||
        cy.get('.header-bg.box > a').invoke('text').then((text1) => {
 | 
			
		||||
          cy.get('.active + li').first().click().then(() => {
 | 
			
		||||
            cy.get('.header-bg.box > a').invoke('text').then((text2) => {
 | 
			
		||||
              expect(text1).not.to.eq(text2);
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
    } else {
 | 
			
		||||
        it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  } else {
 | 
			
		||||
    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
<div class="container-xl" (window:resize)="onResize($event)">
 | 
			
		||||
  <h1 style="float: left;" i18n>BSQ Transactions</h1>
 | 
			
		||||
 | 
			
		||||
  <div class="d-block float-right">
 | 
			
		||||
  <div class="d-block float-right" id="filter">
 | 
			
		||||
    <form [formGroup]="radioGroupForm">
 | 
			
		||||
      <ngx-bootrap-multiselect [options]="txTypeOptions" [settings]="txTypeDropdownSettings" [texts]="txTypeDropdownTexts" formControlName="txTypes"></ngx-bootrap-multiselect>
 | 
			
		||||
    </form>
 | 
			
		||||
 | 
			
		||||
@ -27,22 +27,22 @@
 | 
			
		||||
 | 
			
		||||
  <div class="navbar-collapse" id="navbarCollapse">
 | 
			
		||||
    <ul class="navbar-nav">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}" id="btn-home">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tachometer-alt']" [fixedWidth]="true" i18n-title="master-page.dashboard" title="Dashboard"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}" id="btn-transactions">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/transactions']" (click)="collapse()"><fa-icon [icon]="['fas', 'list']" [fixedWidth]="true" i18n-title="master-page.transactions" title="Transactions"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-blocks">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/blocks']" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-stats">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/stats']" (click)="collapse()"><fa-icon [icon]="['fas', 'file-alt']" [fixedWidth]="true"  i18n-title="master-page.stats" title="Stats"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-docs">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/docs']" (click)="collapse()"><fa-icon [icon]="['fas', 'book']" [fixedWidth]="true"  i18n-title="master-page.docs" title="Docs"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-about">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/about']" (click)="collapse()"><fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true" i18n-title="master-page.about" title="About"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
@ -28,13 +28,13 @@
 | 
			
		||||
 | 
			
		||||
  <div class="navbar-collapse" id="navbarCollapse">
 | 
			
		||||
    <ul class="navbar-nav {{ network.val }}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}" id="btn-home">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tachometer-alt']" [fixedWidth]="true" i18n-title="master-page.dashboard" title="Dashboard"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-blocks">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/blocks' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-graphs">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/graphs' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <!--
 | 
			
		||||
@ -42,13 +42,13 @@
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/tv' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      -->
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-assets">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/assets' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'database']" [fixedWidth]="true" i18n-title="master-page.assets" title="Assets"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li [hidden]="isMobile" class="nav-item mr-2" routerLinkActive="active">
 | 
			
		||||
      <li [hidden]="isMobile" class="nav-item mr-2" routerLinkActive="active" id="btn-docs">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/docs' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'book']" [fixedWidth]="true" i18n-title="master-page.docs" title="Docs"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-about">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/about']" (click)="collapse()"><fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true" i18n-title="master-page.about" title="About"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
@ -28,38 +28,38 @@
 | 
			
		||||
 | 
			
		||||
  <div class="navbar-collapse" id="navbarCollapse">
 | 
			
		||||
    <ul class="navbar-nav {{ network.val }}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}" id="btn-home">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tachometer-alt']" [fixedWidth]="true" i18n-title="master-page.dashboard" title="Dashboard"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <ng-template [ngIf]="network.val === 'bisq'" [ngIfElse]="notBisq">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}" id="btn-transactions">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/bisq/transactions']" (click)="collapse()"><fa-icon [icon]="['fas', 'list']" [fixedWidth]="true" i18n-title="master-page.transactions" title="Transactions"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" id="btn-blocks">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/bisq/blocks']" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" id="btn-stats">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/bisq/stats']" (click)="collapse()"><fa-icon [icon]="['fas', 'file-alt']" [fixedWidth]="true"  i18n-title="master-page.stats" title="Stats"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ng-template>
 | 
			
		||||
      <ng-template #notBisq>
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" id="btn-blocks">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/blocks' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
        <li class="nav-item" routerLinkActive="active" id="btn-graphs">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/graphs' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item d-none d-lg-block" routerLinkActive="active">
 | 
			
		||||
        <li class="nav-item d-none d-lg-block" routerLinkActive="active" id="btn-tv">
 | 
			
		||||
          <a class="nav-link" [routerLink]="['/tv' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon></a>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ng-template>
 | 
			
		||||
      <li *ngIf="network.val === 'liquid' || network.val === 'liquidtestnet'" class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li *ngIf="network.val === 'liquid' || network.val === 'liquidtestnet'" class="nav-item" routerLinkActive="active" id="btn-assets" >
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/assets' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'database']" [fixedWidth]="true" i18n-title="master-page.assets" title="Assets"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-docs">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/docs' | relativeUrl ]" (click)="collapse()"><fa-icon [icon]="['fas', 'book']" [fixedWidth]="true" i18n-title="documentation.title" title="Documentation"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active">
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-about">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/about']" (click)="collapse()"><fa-icon [icon]="['fas', 'info-circle']" [fixedWidth]="true" i18n-title="master-page.about" title="About"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user