diff --git a/app/lib/verify-address.spec.ts b/app/lib/verify-address.spec.ts index 447b608..ee81c30 100644 --- a/app/lib/verify-address.spec.ts +++ b/app/lib/verify-address.spec.ts @@ -21,26 +21,6 @@ describe('verifyXpub', () => { expect(verifyXpub(invalid)).toBe(false); }); - test('Testnet Segwit', () => { - const valid = 'tpubDDmYUCp38iSBdNXvGvNuPSpKCRZp8Qs2MNchdr6rAkwA36KjZDkveF5pZ3gU5CJGuYvcuj2CwveKgQDBRJh9vH784hSpvubS9zw2wCoDtzn'; - expect(verifyXpub(valid)).toBe(true); - }); - - test('Testnet P2PKH', () => { - const valid = 'tpubDDCnvgBWxj9Ybh6zg6c1atUtpfFWbqnrEcWWrtXmWSMuqsWrhSzPc73fE7cYiJjVtsY9JE9JBwZyFbdPQ9SqbW6YLymzx5j1WS3wVz4vN46'; - expect(verifyXpub(valid)).toBe(true); - }); - - test('Testnet P2TR', () => { - const valid = 'tpubDCdJV3Q5vPhUmKiSCiS68w43yKZKEZsd8wxa3t8q4DsPjfejaPDT76SDcf6iscyvLnpz4UXFMzVXxZmH5U6XEQfQYGit5NQCH1McwNSHQhq'; - expect(verifyXpub(valid)).toBe(true); - }); - - test('Testnet garbage', () => { - const invalid = 'tpubDCdJV3Q5vPhUmKiSCiS68w43yKZKEZsd8wxa3t8q4DsPjfejaPDT76SDcf6iscyvLnpz4UXFMzVXxZmH5U6XEQfQYGit'; - expect(verifyXpub(invalid)).toBe(false); - }); - test('ypub', () => {}); test('zpub', () => {}); diff --git a/app/lib/verify-address.ts b/app/lib/verify-address.ts index 37a1549..4fc9201 100644 --- a/app/lib/verify-address.ts +++ b/app/lib/verify-address.ts @@ -42,13 +42,8 @@ export function getAllAddresses(wallet: Wallet, i: number): Address[] { } } - -function getNetwork(wallet: Wallet) { - return (wallet.keys[0].value.startsWith('tpub')) ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; -} - function getSingleSigAddress(wallet: Wallet, account: number, i: number, type: AddressType, bip32: any): string { - const network = getNetwork(wallet); + const network = bitcoin.networks.bitcoin; const pubkey = toHex(wallet.keys[0], account, i, bip32); @@ -74,7 +69,7 @@ function getSingleSigAddress(wallet: Wallet, account: number, i: number, type: A } function getMultiSigAddress(wallet: Wallet, account: number, i: number, type: AddressType, bip32: any): string { - const network = getNetwork(wallet); + const network = bitcoin.networks.bitcoin; var pubkeys = wallet.keys .map((key) => toHex(key, account, i, bip32)) diff --git a/app/main.ts b/app/main.ts index 50ddba0..2481f5b 100644 --- a/app/main.ts +++ b/app/main.ts @@ -207,7 +207,7 @@ function createWindow() { const contextMenu = Menu.buildFromTemplate([ { label: 'Open', type: 'normal', click: () => mainWindow.show() }, - { label: 'Help', type: 'normal', click: () => openUrl('https://developer.branta.pro/core') }, + { label: 'Help', type: 'normal', click: () => openUrl('https://developer.branta.pro/branta-core') }, { label: '', type: 'separator' }, { label: 'Quit', type: 'normal', click: forceQuit }, { label: `Version ${packageJson.version}`, type: 'normal', enabled: false } diff --git a/installers/windows/Branta.Wix/Package.wxs b/installers/windows/Branta.Wix/Package.wxs index 0e081a9..5032b7c 100644 --- a/installers/windows/Branta.Wix/Package.wxs +++ b/installers/windows/Branta.Wix/Package.wxs @@ -1,7 +1,7 @@ diff --git a/package-lock.json b/package-lock.json index 5e1890a..ec02bb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "branta", - "version": "0.9.0", + "version": "0.10.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index ab51378..10a0ce5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "branta", "productName": "Branta", - "version": "0.9.0", + "version": "0.10.0", "main": "build/app/main.js", "author": "Branta LLC", "description": "Verify your bitcoin payments.", diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 2449509..b7d978e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -22,6 +22,6 @@ export class AppComponent { } onHelp(): void { - window.electron.openUrl('https://developer.branta.pro/core'); + window.electron.openUrl('https://developer.branta.pro/branta-core'); } } diff --git a/src/app/features/clipboard/clipboard-details/clipboard-details.component.html b/src/app/features/clipboard/clipboard-details/clipboard-details.component.html index d17080d..89782ae 100644 --- a/src/app/features/clipboard/clipboard-details/clipboard-details.component.html +++ b/src/app/features/clipboard/clipboard-details/clipboard-details.component.html @@ -29,9 +29,6 @@
Derivation Path:
{{ clipboardItem.derivationPath }}
-
- -
} @else if (isPaymentClipboardItem(clipboardItem)) {
Value:
@@ -50,9 +47,6 @@
{{ clipboardItem.description }}
} -
- -
} @else if (isBolt11ClipboardItem(clipboardItem)) {
Value:
@@ -79,4 +73,10 @@
No Bitcoin/Nostr content detected.
}
+ @if (clipboardItem && !isPaymentClipboardItem(clipboardItem)) { +
+ + info +
+ } diff --git a/src/app/features/clipboard/clipboard-details/clipboard-details.component.scss b/src/app/features/clipboard/clipboard-details/clipboard-details.component.scss index b2b910a..3247d86 100644 --- a/src/app/features/clipboard/clipboard-details/clipboard-details.component.scss +++ b/src/app/features/clipboard/clipboard-details/clipboard-details.component.scss @@ -62,16 +62,17 @@ justify-content: center; color: $text-gray; } - - .unexpected { - display: flex; - flex-direction: row; - justify-content: center; - margin-bottom: -15px; - } } } .value { word-break: break-all; } + +.verify-container { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; + padding-top: 10px; +} diff --git a/src/app/features/clipboard/clipboard-details/clipboard-details.component.ts b/src/app/features/clipboard/clipboard-details/clipboard-details.component.ts index 6446b81..c716e32 100644 --- a/src/app/features/clipboard/clipboard-details/clipboard-details.component.ts +++ b/src/app/features/clipboard/clipboard-details/clipboard-details.component.ts @@ -1,21 +1,56 @@ import { CommonModule } from '@angular/common'; -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { ExpandableTextComponent } from '../../../shared/components/expandable-text/expandable-text.component'; -import { ClipboardItem } from '../../../shared/models/clipboard-item'; +import { ClipboardItem, PaymentClipboardItem } from '../../../shared/models/clipboard-item'; import { BaseClipboardComponent } from '../base-clipboard'; import { BitcoinAmountComponent } from '../../../shared/components/bitcoin-amount/bitcoin-amount.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { lastValueFrom } from 'rxjs'; +import { ServerService } from '../../../shared/services/server.service'; +import { ToastrService } from 'ngx-toastr'; @Component({ selector: 'app-clipboard-details', - imports: [CommonModule, MatButtonModule, ExpandableTextComponent, BitcoinAmountComponent], + imports: [CommonModule, MatButtonModule, ExpandableTextComponent, BitcoinAmountComponent, MatIconModule, MatTooltipModule], templateUrl: './clipboard-details.component.html', styleUrl: './clipboard-details.component.scss' }) export class ClipboardDetailsComponent extends BaseClipboardComponent { @Input() clipboardItem: ClipboardItem | null; + @Output() clipboardItemChange = new EventEmitter(); - onShareFeedback(): void { - window.electron.openUrl('https://branta.pro'); + verifyTooltip = "Verify clipboard content against Branta's server."; + + constructor(private serverService: ServerService, private toastrService: ToastrService) { + super(); + } + + onVerify(): void { + (async () => { + var result = await this.queryPayments(this.clipboardItem?.value ?? "") + + if (result) { + this.clipboardItemChange.emit(result as PaymentClipboardItem); + } else { + this.toastrService.error(`Payment not found.`); + } + })(); + } + + private async queryPayments(value: string): Promise { + try { + const paymentClipboardItems = await lastValueFrom(this.serverService.getPayment(value)); + + const paymentClipboardItem = paymentClipboardItems[0]; + + paymentClipboardItem.name = paymentClipboardItem.platform; + paymentClipboardItem.value = value; + + return paymentClipboardItem; + } catch (error) { + return null; + } } } diff --git a/src/app/features/clipboard/clipboard.component.html b/src/app/features/clipboard/clipboard.component.html index 5024c2e..39ba50e 100644 --- a/src/app/features/clipboard/clipboard.component.html +++ b/src/app/features/clipboard/clipboard.component.html @@ -1,5 +1,5 @@
- + @if (showHistory) { } diff --git a/src/app/features/clipboard/clipboard.component.scss b/src/app/features/clipboard/clipboard.component.scss index 7ddda3a..4bb5504 100644 --- a/src/app/features/clipboard/clipboard.component.scss +++ b/src/app/features/clipboard/clipboard.component.scss @@ -1,7 +1,7 @@ :host { height: 100%; width: 100%; - max-width: 640px; + max-width: 900px; display: flex; } diff --git a/src/app/features/settings/settings.component.html b/src/app/features/settings/settings.component.html index cff4ce1..ee8344d 100644 --- a/src/app/features/settings/settings.component.html +++ b/src/app/features/settings/settings.component.html @@ -3,10 +3,6 @@
General
-
- Checkout Mode - help -
Bitcoin Unit @@ -54,6 +50,7 @@
+
Extras
Developer Mode help diff --git a/src/app/features/settings/settings.component.scss b/src/app/features/settings/settings.component.scss index dd0e70a..b6ab093 100644 --- a/src/app/features/settings/settings.component.scss +++ b/src/app/features/settings/settings.component.scss @@ -3,7 +3,7 @@ :host { height: 100%; width: 100%; - max-width: 600px; + max-width: 900px; display: flex; } @@ -29,6 +29,8 @@ .title { font-size: 18px; margin-bottom: 15px; + padding-bottom: 5px; + border-bottom: 1px solid $border-color; } .option { diff --git a/src/app/features/settings/settings.component.ts b/src/app/features/settings/settings.component.ts index 68e1b5a..b9c5f30 100644 --- a/src/app/features/settings/settings.component.ts +++ b/src/app/features/settings/settings.component.ts @@ -22,15 +22,12 @@ import { SettingsService } from '../../shared/services/settings.service'; export class SettingsComponent { formGroup: FormGroup; - checkoutModeTooltip = 'Verify addresses by querying Branta with clipboard content. Requires internet.'; developerModeTooltip = "Only check this if you're a developer. Enables staging environment."; BitcoinUnitTypes = Object.values(BitcoinUnitType); ClipboardHistoryRolloffTypes = Object.values(ClipboardHistoryRolloffType); - private isCheckoutModeChange = false; - constructor( private settingsService: SettingsService, private historyService: HistoryService, @@ -40,7 +37,6 @@ export class SettingsComponent { const settings = settingsService.settings(); this.formGroup = new FormGroup({ - checkoutMode: new FormControl(settings.checkoutMode), bitcoinUnitType: new FormControl(settings.bitcoinUnitType), generalNotifications: new FormGroup({ bitcoinAddress: new FormControl(settings.generalNotifications.bitcoinAddress), @@ -56,19 +52,6 @@ export class SettingsComponent { developerMode: new FormControl(settings.developerMode) }); - this.formGroup.valueChanges.subscribe((settings) => { - if (!this.isCheckoutModeChange) { - this.settingsService.save(settings); - } - - this.isCheckoutModeChange = false; - }); - - this.formGroup.get('checkoutMode')?.valueChanges.subscribe((value) => { - this.handleCheckoutModeChange(value); - this.clipboardService.rerunGetClipboardItem(); - }); - this.formGroup.get('developerMode')?.valueChanges.subscribe(() => { this.clipboardService.rerunGetClipboardItem(); }); @@ -89,30 +72,4 @@ export class SettingsComponent { } }); } - - private handleCheckoutModeChange(newValue: boolean): void { - if (!newValue) { - this.settingsService.save(this.formGroup.value); - return; - } - - this.isCheckoutModeChange = true; - - const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - data: { - title: 'Turn Checkout Mode on?', - message: 'Are you sure you want to turn Checkout Mode on? This will query Branta with bitcoin addresses you copy.', - submitText: 'Confirm' - } - }); - - dialogRef.afterClosed().subscribe((confirmed) => { - if (confirmed) { - this.settingsService.save(this.formGroup.value); - this.clipboardService.rerunGetClipboardItem(); - } else { - this.formGroup.get('checkoutMode')?.setValue(false, { emitEvent: false }); - } - }); - } } diff --git a/src/app/features/vaults/vaults.component.scss b/src/app/features/vaults/vaults.component.scss index 0c64b21..446a216 100644 --- a/src/app/features/vaults/vaults.component.scss +++ b/src/app/features/vaults/vaults.component.scss @@ -3,7 +3,7 @@ :host { height: 100%; width: 100%; - max-width: 600px; + max-width: 900px; display: flex; } diff --git a/src/app/features/wallets/wallet-form/wallet-form.component.scss b/src/app/features/wallets/wallet-form/wallet-form.component.scss index 9a98ac5..64968c3 100644 --- a/src/app/features/wallets/wallet-form/wallet-form.component.scss +++ b/src/app/features/wallets/wallet-form/wallet-form.component.scss @@ -3,7 +3,7 @@ :host { height: 100%; width: 100%; - max-width: 600px; + max-width: 900px; display: flex; } diff --git a/src/app/features/wallets/wallets.component.scss b/src/app/features/wallets/wallets.component.scss index c54b4d7..e288b66 100644 --- a/src/app/features/wallets/wallets.component.scss +++ b/src/app/features/wallets/wallets.component.scss @@ -3,7 +3,7 @@ :host { height: 100%; width: 100%; - max-width: 600px; + max-width: 900px; display: flex; } diff --git a/src/app/shared/models/settings.ts b/src/app/shared/models/settings.ts index a4ed016..c3fe9b9 100644 --- a/src/app/shared/models/settings.ts +++ b/src/app/shared/models/settings.ts @@ -1,5 +1,4 @@ export interface Settings { - checkoutMode: boolean; developerMode: boolean; generalNotifications: GeneralNotifications; clipboardHistory: ClipboardHistory; diff --git a/src/app/shared/services/base-clipboard.service.ts b/src/app/shared/services/base-clipboard.service.ts index f0d0053..ad1fb51 100644 --- a/src/app/shared/services/base-clipboard.service.ts +++ b/src/app/shared/services/base-clipboard.service.ts @@ -24,7 +24,7 @@ export class BaseClipboardService { ): Promise { if (text == '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa') { if (settings?.generalNotifications.bitcoinAddress && notify) { - await window.electron.showNotification('Bitcoin genesis block address copied.', 'We are all Satoshi'); + await window.electron.showNotification('Clipboard: Bitcoin genesis block address', 'We are all Satoshi'); } return createAddressClipboardItem({ @@ -38,7 +38,7 @@ export class BaseClipboardService { if (vault) { if (settings?.generalNotifications.bitcoinAddress && notify) { - await window.electron.showNotification('BTC address: ' + vault.wallet?.name, 'Derivation: ' + vault.derivationPath); + await window.electron.showNotification(`Clipboard: Valut Match - ${vault.wallet?.name}`, ` ${BaseClipboardService.getAddressText(text)} (Derivation ${vault.derivationPath})`); } return vault; @@ -49,27 +49,15 @@ export class BaseClipboardService { // Found the users wallet if (wallet) { if (settings?.generalNotifications.bitcoinAddress && notify) { - await window.electron.showNotification('BTC address: ' + wallet.wallet?.name, 'Derivation: ' + wallet.derivationPath); + await window.electron.showNotification(`Clipboard: Wallet Match - ${wallet.wallet?.name}`, ` ${BaseClipboardService.getAddressText(text)} (Derivation ${wallet.derivationPath})`); } return wallet; } // Didn't find the users wallet else { - if (settings?.checkoutMode) { - const paymentItem = await this.queryPayments(text, serverService); - - if (paymentItem) { - if (notify) { - await window.electron.showNotification(paymentItem.platform, paymentItem.description ?? ''); - } - - return paymentItem; - } - } - if (settings?.generalNotifications.bitcoinAddress && notify) { - await window.electron.showNotification('New Bitcoin Address in Clipboard', 'Bitcoin Address Detected.'); + await window.electron.showNotification('Clipboard: Unknown Bitcoin Address', BaseClipboardService.getAddressText(text)); } return createAddressClipboardItem({ @@ -80,7 +68,7 @@ export class BaseClipboardService { if (ExtendedKeyRegExp.test(text)) { if (settings?.generalNotifications.bitcoinPublicKey && notify) { - await window.electron.showNotification('Bitcoin Extended Public Key in Clipboard.', 'Sharing can lead to loss of privacy.'); + await window.electron.showNotification('Clipboard: Bitcoin Extended Public Key', 'Sharing can lead to loss of privacy.'); } return createClipboardItem({ @@ -92,7 +80,7 @@ export class BaseClipboardService { if (NostrPubKeyRegExp.test(text)) { if (settings?.generalNotifications.nostrPublicKey && notify) { - await window.electron.showNotification('Nostr Public Key in Clipboard.', text); + await window.electron.showNotification('Clipboard: Nostr Public Key', text); } return createClipboardItem({ @@ -104,7 +92,7 @@ export class BaseClipboardService { if (NostrPrivateKeyRegExp.test(text)) { if (settings?.generalNotifications.nostrPrivateKey && notify) { - await window.electron.showNotification('Nostr Private Key in Clipboard.', 'Never share this.'); + await window.electron.showNotification('Clipboard: Nostr Private Key', 'Never share this.'); } return createClipboardItem({ @@ -121,19 +109,8 @@ export class BaseClipboardService { return null; } - if (settings?.checkoutMode) { - const paymentItem = await this.queryPayments(text, serverService); - - if (paymentItem) { - if (settings?.generalNotifications.lightningAddress && notify) { - await window.electron.showNotification(paymentItem.platform, paymentItem.description ?? ''); - } - return paymentItem; - } - } - if (settings?.generalNotifications.lightningAddress && notify) { - await window.electron.showNotification('Lightning Address in Clipboard', 'Lightning Address Detected.'); + await window.electron.showNotification('Clipboard: Lightning Address', 'Lightning Address Detected.'); } return createBolt11ClipboardItem({ @@ -145,18 +122,7 @@ export class BaseClipboardService { return null; } - private static async queryPayments(value: string, serverService: ServerService): Promise { - try { - const paymentClipboardItems = await lastValueFrom(serverService.getPayment(value)); - - const paymentClipboardItem = paymentClipboardItems[0]; - - paymentClipboardItem.name = paymentClipboardItem.platform; - paymentClipboardItem.value = value; - - return paymentClipboardItem; - } catch (error) { - return null; - } + private static getAddressText(text: string) : string { + return `${text.substring(0, 6)}...${text.substring(text.length - 5)}` } } diff --git a/src/app/shared/services/clipboard.service.spec.ts b/src/app/shared/services/clipboard.service.spec.ts index a9605f8..26d630e 100644 --- a/src/app/shared/services/clipboard.service.spec.ts +++ b/src/app/shared/services/clipboard.service.spec.ts @@ -142,32 +142,6 @@ describe('ClipboardService getClipboardItem', () => { expect(result?.wallet?.name).toBe(vaultName); }); - test.each([ - ['1HD1cVCJ5ZTgF6Tp7a7F92qqe3945NpKtu', true, true, 1], - ['1HD1cVCJ5ZTgF6Tp7a7F92qqe3945NpKtu', false, true, 1], - ['1HD1cVCJ5ZTgF6Tp7a7F92qqe3945NpKtu', true, false, 0], - ['1HD1cVCJ5ZTgF6Txxxxxxxxxxxxxxxxxxz', true, true, 1] - ])('Payment: %s', async (address: string, checkoutMode: boolean, notify: boolean, notificationCount: number) => { - const showNotificationMock = jest.spyOn(window.electron, 'showNotification').mockResolvedValue(); - - var result = (await BaseClipboardService.getClipboardItem( - address, - notify, - [], - [], - { - checkoutMode, - generalNotifications: { - bitcoinAddress: true - } - } as Settings, - serverServiceMock - )) as PaymentClipboardItem; - - expect(showNotificationMock).toHaveBeenCalledTimes(notificationCount); - expect(result?.value).toBe(address); - }); - test.each([ [npub, true, true, 1], [npub, false, true, 0], @@ -222,19 +196,17 @@ describe('ClipboardService getClipboardItem', () => { 'lnbc1pwr45dpp5q9wa3sjr4cnyvdh0wwufzldvlnm2qa5lc2sh3qkp3y', true, true, - true, undefined, 0 ], - ['Lightning address on payment server should show default when checkout is off.', lnbc[0], false, true, true, lnbc[0], 1], - ['Lightning address on payment server should show payment when checkout is on.', lnbc[0], true, true, true, lnbc[0], 1], - ['Lightning address not on payment server should not show payment when checkout is on.', lnbc[1], true, true, true, lnbc[1], 1] + ['Lightning address on payment server should show default when checkout is off.', lnbc[0], true, true, lnbc[0], 1], + ['Lightning address on payment server should show payment when checkout is on.', lnbc[0], true, true, lnbc[0], 1], + ['Lightning address not on payment server should not show payment when checkout is on.', lnbc[1], true, true, lnbc[1], 1] ])( 'Lightning: %s', async ( _testDescription: string, value: string, - checkoutMode: boolean, notify: boolean, lightningAddress: boolean, paymentValue: string | undefined, @@ -248,7 +220,6 @@ describe('ClipboardService getClipboardItem', () => { [], [], { - checkoutMode, generalNotifications: { lightningAddress } diff --git a/src/app/shared/services/regex.ts b/src/app/shared/services/regex.ts index dba0854..e5858db 100644 --- a/src/app/shared/services/regex.ts +++ b/src/app/shared/services/regex.ts @@ -2,8 +2,6 @@ const XPUB_REGEX = '^([xyYzZtuUvV]pub[1-9A-HJ-NP-Za-km-z]{79,108})$'; export const AddressRegExp = new RegExp('^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$'); export const SegwitAddressRegExp = new RegExp('^bc1[0-9a-zA-Z]{25,65}$'); -export const TestnetAddressRegExp = new RegExp('^tb1[0-9a-zA-Z]{25,65}$'); -export const TestnetLegacyAddressRegExp = new RegExp('^[2mn](?!sec|pub)[0-9a-zA-Z]{25,65}$'); export const ExtendedKeyRegExp = new RegExp(XPUB_REGEX); export const NostrPubKeyRegExp = new RegExp('^npub[0-9a-z]{58,65}$'); export const NostrPrivateKeyRegExp = new RegExp('^nsec[0-9a-z]{58,65}$'); @@ -11,8 +9,6 @@ export const LightningAddressRegExp = new RegExp('^[lL][nN][bB][cC][a-zA-z0-9]+$ export const isBitcoinAddress = (text: string) => { return ( AddressRegExp.test(text) || - SegwitAddressRegExp.test(text) || - TestnetAddressRegExp.test(text) || - (TestnetLegacyAddressRegExp.test(text)) + SegwitAddressRegExp.test(text) ); }; diff --git a/src/app/shared/services/settings.service.ts b/src/app/shared/services/settings.service.ts index 81d1c29..5c5d759 100644 --- a/src/app/shared/services/settings.service.ts +++ b/src/app/shared/services/settings.service.ts @@ -6,7 +6,6 @@ import { BitcoinUnitType, ClipboardHistoryRolloffType, Settings } from '../model }) export class SettingsService { defaultSettings: Settings = { - checkoutMode: false, bitcoinUnitType: BitcoinUnitType.Sats, developerMode: false, clipboardHistory: { diff --git a/src/styles.scss b/src/styles.scss index 4f0806b..4c90ca9 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -12,6 +12,7 @@ $secondary-color: #466362; $success-color: #4ab15e; $warn-color: #ba3f1d; $error-color: #b15e4a; +$border-color: #2f2f2f; $text-gray: #bbbbbb;