Compare commits
13 Commits
mononaut/p
...
hunicus/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b115214119 | ||
|
|
5bb3e930cc | ||
|
|
347bddc974 | ||
|
|
4eca8240db | ||
|
|
1c135b4c67 | ||
|
|
f24223ca06 | ||
|
|
9748aa05cf | ||
|
|
1a5613bf65 | ||
|
|
e55e4e378a | ||
|
|
927eb98072 | ||
|
|
bbff50527b | ||
|
|
4470461a98 | ||
|
|
645fd98c30 |
@@ -8,6 +8,7 @@ import { ETA, EtaService } from '../../services/eta.service';
|
|||||||
import { Transaction } from '../../interfaces/electrs.interface';
|
import { Transaction } from '../../interfaces/electrs.interface';
|
||||||
import { MiningStats } from '../../services/mining.service';
|
import { MiningStats } from '../../services/mining.service';
|
||||||
import { IAuth, AuthServiceMempool } from '../../services/auth.service';
|
import { IAuth, AuthServiceMempool } from '../../services/auth.service';
|
||||||
|
import { EnterpriseService } from '../../services/enterprise.service';
|
||||||
|
|
||||||
export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp';
|
export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp';
|
||||||
|
|
||||||
@@ -126,7 +127,8 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
private etaService: EtaService,
|
private etaService: EtaService,
|
||||||
private audioService: AudioService,
|
private audioService: AudioService,
|
||||||
private cd: ChangeDetectorRef,
|
private cd: ChangeDetectorRef,
|
||||||
private authService: AuthServiceMempool
|
private authService: AuthServiceMempool,
|
||||||
|
private enterpriseService: EnterpriseService,
|
||||||
) {
|
) {
|
||||||
this.accelerationUUID = window.crypto.randomUUID();
|
this.accelerationUUID = window.crypto.randomUUID();
|
||||||
}
|
}
|
||||||
@@ -198,6 +200,9 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
if (!this.estimate && ['quote', 'summary', 'checkout'].includes(this.step)) {
|
if (!this.estimate && ['quote', 'summary', 'checkout'].includes(this.step)) {
|
||||||
this.fetchEstimate();
|
this.fetchEstimate();
|
||||||
}
|
}
|
||||||
|
if (this._step === 'checkout') {
|
||||||
|
this.enterpriseService.goal(8);
|
||||||
|
}
|
||||||
if (this._step === 'checkout' && this.canPayWithBitcoin) {
|
if (this._step === 'checkout' && this.canPayWithBitcoin) {
|
||||||
this.btcpayInvoiceFailed = false;
|
this.btcpayInvoiceFailed = false;
|
||||||
this.loadingBtcpayInvoice = true;
|
this.loadingBtcpayInvoice = true;
|
||||||
@@ -546,7 +551,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get couldPayWithCashapp() {
|
get couldPayWithCashapp() {
|
||||||
if (!this.cashappEnabled || this.stateService.referrer !== 'https://cash.app/') {
|
if (!this.cashappEnabled) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !!this.estimate?.availablePaymentMethods?.cashapp;
|
return !!this.estimate?.availablePaymentMethods?.cashapp;
|
||||||
@@ -569,7 +574,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get canPayWithCashapp() {
|
get canPayWithCashapp() {
|
||||||
if (!this.cashappEnabled || !this.conversions || this.stateService.referrer !== 'https://cash.app/') {
|
if (!this.cashappEnabled || !this.conversions) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,11 @@
|
|||||||
min-height: auto;
|
min-height: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.container-lg.widget-container {
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
.container {
|
.container {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
@@ -90,7 +94,7 @@ tr, td, th {
|
|||||||
|
|
||||||
.widget {
|
.widget {
|
||||||
.txid {
|
.txid {
|
||||||
width: 30%;
|
width: 35%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -137,7 +141,7 @@ tr, td, th {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.status {
|
.status {
|
||||||
width: 20%
|
width: 115px
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,4 +137,4 @@ export class AccelerationsListComponent implements OnInit, OnDestroy {
|
|||||||
this.paramSubscription?.unsubscribe();
|
this.paramSubscription?.unsubscribe();
|
||||||
this.keyNavigationSubscription?.unsubscribe();
|
this.keyNavigationSubscription?.unsubscribe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,7 @@
|
|||||||
<span> </span>
|
<span> </span>
|
||||||
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: var(--title-fg)"></fa-icon>
|
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: var(--title-fg)"></fa-icon>
|
||||||
</a>
|
</a>
|
||||||
<app-accelerations-list [attr.data-cy]="'recent-accelerations'" [widget]=true [accelerations$]="minedAccelerations$"></app-accelerations-list>
|
<app-accelerations-list [attr.data-cy]="'recent-accelerations'" [widget]=true [accelerations$]="accelerations$"></app-accelerations-list>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -75,9 +75,6 @@
|
|||||||
} @else {
|
} @else {
|
||||||
<app-time kind="until" [time]="eta.time" [fastRender]="false" [fixedRender]="true"></app-time>
|
<app-time kind="until" [time]="eta.time" [fastRender]="false" [fixedRender]="true"></app-time>
|
||||||
}
|
}
|
||||||
<!-- @if (!showAccelerationSummary && isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) {
|
|
||||||
<a class="btn btn-sm accelerate btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a>
|
|
||||||
} -->
|
|
||||||
</span>
|
</span>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-template #etaSkeleton>
|
<ng-template #etaSkeleton>
|
||||||
|
|||||||
@@ -728,7 +728,6 @@ export class TrackerComponent implements OnInit, OnDestroy {
|
|||||||
if (!this.txId) {
|
if (!this.txId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.enterpriseService.goal(8);
|
|
||||||
this.accelerationFlowCompleted = false;
|
this.accelerationFlowCompleted = false;
|
||||||
if (this.showAccelerationSummary) {
|
if (this.showAccelerationSummary) {
|
||||||
this.scrollIntoAccelPreview = true;
|
this.scrollIntoAccelPreview = true;
|
||||||
|
|||||||
@@ -639,7 +639,7 @@
|
|||||||
}
|
}
|
||||||
<td>
|
<td>
|
||||||
<div class="effective-fee-container">
|
<div class="effective-fee-container">
|
||||||
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
|
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize || tx.acceleration)) {
|
||||||
<app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
<app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
||||||
} @else {
|
} @else {
|
||||||
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
tooltipPosition: { x: number, y: number };
|
tooltipPosition: { x: number, y: number };
|
||||||
isMobile: boolean;
|
isMobile: boolean;
|
||||||
firstLoad = true;
|
firstLoad = true;
|
||||||
|
waitingForAccelerationInfo: boolean = false;
|
||||||
|
|
||||||
featuresEnabled: boolean;
|
featuresEnabled: boolean;
|
||||||
segwitEnabled: boolean;
|
segwitEnabled: boolean;
|
||||||
@@ -317,11 +318,19 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
this.setIsAccelerated();
|
this.setIsAccelerated();
|
||||||
}),
|
}),
|
||||||
switchMap((blockHeight: number) => {
|
switchMap((blockHeight: number) => {
|
||||||
return this.servicesApiService.getAccelerationHistory$({ blockHeight });
|
return this.servicesApiService.getAccelerationHistory$({ blockHeight }).pipe(
|
||||||
|
switchMap((accelerationHistory: Acceleration[]) => {
|
||||||
|
if (this.tx.acceleration && !accelerationHistory.length) { // If the just mined transaction was accelerated, but services backend did not return any acceleration data, retry
|
||||||
|
return throwError('retry');
|
||||||
|
}
|
||||||
|
return of(accelerationHistory);
|
||||||
|
}),
|
||||||
|
retry({ count: 3, delay: 2000 }),
|
||||||
|
catchError(() => {
|
||||||
|
return of([]);
|
||||||
|
})
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
catchError(() => {
|
|
||||||
return of([]);
|
|
||||||
})
|
|
||||||
).subscribe((accelerationHistory) => {
|
).subscribe((accelerationHistory) => {
|
||||||
for (const acceleration of accelerationHistory) {
|
for (const acceleration of accelerationHistory) {
|
||||||
if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) {
|
if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) {
|
||||||
@@ -330,6 +339,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
acceleration.boost = boostCost;
|
acceleration.boost = boostCost;
|
||||||
this.tx.acceleratedAt = acceleration.added;
|
this.tx.acceleratedAt = acceleration.added;
|
||||||
this.accelerationInfo = acceleration;
|
this.accelerationInfo = acceleration;
|
||||||
|
this.waitingForAccelerationInfo = false;
|
||||||
this.setIsAccelerated();
|
this.setIsAccelerated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -608,6 +618,9 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
|
|
||||||
this.stateService.txConfirmed$.subscribe(([txConfirmed, block]) => {
|
this.stateService.txConfirmed$.subscribe(([txConfirmed, block]) => {
|
||||||
if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) {
|
if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) {
|
||||||
|
if (this.tx.acceleration) {
|
||||||
|
this.waitingForAccelerationInfo = true;
|
||||||
|
}
|
||||||
this.tx.status = {
|
this.tx.status = {
|
||||||
confirmed: true,
|
confirmed: true,
|
||||||
block_height: block.height,
|
block_height: block.height,
|
||||||
@@ -725,7 +738,6 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
document.location.hash = '#accelerate';
|
document.location.hash = '#accelerate';
|
||||||
this.enterpriseService.goal(8);
|
|
||||||
this.openAccelerator();
|
this.openAccelerator();
|
||||||
this.scrollIntoAccelPreview = true;
|
this.scrollIntoAccelPreview = true;
|
||||||
return false;
|
return false;
|
||||||
@@ -804,7 +816,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setIsAccelerated(initialState: boolean = false) {
|
setIsAccelerated(initialState: boolean = false) {
|
||||||
this.isAcceleration = (this.tx.acceleration || (this.accelerationInfo && this.pool && this.accelerationInfo.pools.some(pool => (pool === this.pool.id))));
|
this.isAcceleration = ((this.tx.acceleration && (!this.tx.status.confirmed || this.waitingForAccelerationInfo)) || (this.accelerationInfo && this.pool && this.accelerationInfo.pools.some(pool => (pool === this.pool.id))));
|
||||||
if (this.isAcceleration) {
|
if (this.isAcceleration) {
|
||||||
if (initialState) {
|
if (initialState) {
|
||||||
this.accelerationFlowCompleted = true;
|
this.accelerationFlowCompleted = true;
|
||||||
|
|||||||
@@ -194,7 +194,7 @@
|
|||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template type="how-to-get-transaction-confirmed-quickly">
|
<ng-template type="how-to-get-transaction-confirmed-quickly">
|
||||||
<p>To get your transaction confirmed quicker, you will need to increase its effective feerate.</p><p>If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.</p><p>If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).</p><p *ngIf="officialMempoolInstance">Another option to get your transaction confirmed more quickly is Mempool Accelerator™. This service is still in development, but you can <a href="https://mempool.space/accelerator">sign up for the waitlist</a> to be notified when it's ready.</p>
|
<p>To get your transaction confirmed quicker, you will need to increase its effective feerate.</p><p>If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.</p><p>If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).</p><p>Another option to get your transaction confirmed more quickly is <a [href]="[ isMempoolSpaceBuild ? '/accelerator' : 'https://mempool.space/accelerator']" [target]="isMempoolSpaceBuild ? '' : 'blank'">Mempool Accelerator™</a>.</p>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template type="how-prevent-stuck-transaction">
|
<ng-template type="how-prevent-stuck-transaction">
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export class ApiDocsComponent implements OnInit, AfterViewInit {
|
|||||||
showMobileEnterpriseUpsell: boolean = true;
|
showMobileEnterpriseUpsell: boolean = true;
|
||||||
timeLtrSubscription: Subscription;
|
timeLtrSubscription: Subscription;
|
||||||
timeLtr: boolean = this.stateService.timeLtr.value;
|
timeLtr: boolean = this.stateService.timeLtr.value;
|
||||||
|
isMempoolSpaceBuild = this.stateService.isMempoolSpaceBuild;
|
||||||
|
|
||||||
@ViewChildren(FaqTemplateDirective) faqTemplates: QueryList<FaqTemplateDirective>;
|
@ViewChildren(FaqTemplateDirective) faqTemplates: QueryList<FaqTemplateDirective>;
|
||||||
dict = {};
|
dict = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user