Skip to content

Commit

Permalink
Merge pull request #9 from ElrondNetwork/handle-completion
Browse files Browse the repository at this point in the history
Better handle transaction completion: proxy vs. API
  • Loading branch information
andreibancioiu authored Apr 8, 2022
2 parents 019b9a5 + 5cef3fe commit b99a17f
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 14 deletions.
4 changes: 4 additions & 0 deletions src-network-providers/providers.dev.net.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ describe("test network providers on devnet: Proxy and API", function () {

ignoreKnownTransactionDifferencesBetweenProviders(apiResponse, proxyResponse);
assert.deepEqual(apiResponse, proxyResponse, `transaction: ${hash}`);

// Also assert completion
assert.isTrue(apiResponse.isCompleted);
assert.isTrue(proxyResponse.isCompleted);
}
});

Expand Down
11 changes: 7 additions & 4 deletions src-network-providers/transactionCompletionStrategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ import { ITransactionPayload } from "./interface";
import { TransactionLogs } from "./transactionLogs";
import { isPaddedHex } from "./primitives";

/**
* Internal interface: a transaction, as seen from the perspective of a {@link TransactionCompletionStrategy}.
*/
interface ITransactionOnNetwork {
logs: TransactionLogs;
status: TransactionStatus;
Expand All @@ -19,7 +16,7 @@ const WellKnownCompletionEvents = ["completedTxEvent", "SCDeploy", "signalError"
* Algorithm for detecting transaction completion.
* Based on some heuristics (a bit imprecise therefore, at this moment).
*/
export class TransactionCompletionStrategy {
export class TransactionCompletionStrategyOnProxy {
isCompleted(transaction: ITransactionOnNetwork): boolean {
if (transaction.status.isPending()) {
// Certainly not completed.
Expand Down Expand Up @@ -65,3 +62,9 @@ export class TransactionCompletionStrategy {
return isPaddedHex(arg);
}
}

export class TransactionCompletionStrategyOnAPI {
isCompleted(transaction: ITransactionOnNetwork): boolean {
return !transaction.status.isPending();
}
}
14 changes: 4 additions & 10 deletions src-network-providers/transactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import { TransactionStatus } from "./transactionStatus";
import { ContractResults } from "./contractResults";
import { Address, Hash, Nonce, TransactionValue, TransactionPayload } from "./primitives";
import { IAddress, IGasLimit, IGasPrice, IHash, INonce, ITransactionPayload } from "./interface";
import { TransactionCompletionStrategy } from "./transactionCompletionStrategy";
import { TransactionCompletionStrategyOnAPI, TransactionCompletionStrategyOnProxy } from "./transactionCompletionStrategy";
import { TransactionLogs } from "./transactionLogs";
import { TransactionReceipt } from "./transactionReceipt";

export class TransactionOnNetwork {
isCompleted: boolean = false;
hash: IHash = new Hash("");
type: string = "";
nonce: INonce = new Nonce(0);
Expand All @@ -25,7 +26,6 @@ export class TransactionOnNetwork {
blockNonce: number = 0;
hyperblockNonce: number = 0;
hyperblockHash: string = "";
pendingResults: boolean = false;

receipt: TransactionReceipt = new TransactionReceipt();
contractResults: ContractResults = ContractResults.empty();
Expand All @@ -38,16 +38,16 @@ export class TransactionOnNetwork {
static fromProxyHttpResponse(txHash: IHash, response: any): TransactionOnNetwork {
let result = TransactionOnNetwork.fromHttpResponse(txHash, response);
result.contractResults = ContractResults.fromProxyHttpResponse(response.smartContractResults || []);
result.isCompleted = new TransactionCompletionStrategyOnProxy().isCompleted(result);
// TODO: uniformize transaction status.
// TODO: Use specific completion detection strategy.
return result;
}

static fromApiHttpResponse(txHash: IHash, response: any): TransactionOnNetwork {
let result = TransactionOnNetwork.fromHttpResponse(txHash, response);
result.contractResults = ContractResults.fromApiHttpResponse(response.results || []);
result.isCompleted = new TransactionCompletionStrategyOnAPI().isCompleted(result);
// TODO: uniformize transaction status.
// TODO: Use specific completion detection strategy.
return result;
}

Expand All @@ -71,7 +71,6 @@ export class TransactionOnNetwork {
result.blockNonce = response.blockNonce || 0;
result.hyperblockNonce = response.hyperblockNonce || 0;
result.hyperblockHash = response.hyperblockHash || "";
result.pendingResults = response.pendingResults || false;

result.receipt = TransactionReceipt.fromHttpResponse(response.receipt || {});
result.logs = TransactionLogs.fromHttpResponse(response.logs || {});
Expand All @@ -82,10 +81,5 @@ export class TransactionOnNetwork {
getDateTime(): Date {
return new Date(this.timestamp * 1000);
}

isCompleted(): boolean {
// TODO: use different transaction completion strategies - API / Proxy.
return new TransactionCompletionStrategy().isCompleted(this);
}
}

0 comments on commit b99a17f

Please sign in to comment.