@@ -24,6 +24,8 @@ namespace AElf.WebApp.Application.Chain;
2424public interface ITransactionResultAppService
2525{
2626 Task < TransactionResultDto > GetTransactionResultAsync ( string transactionId ) ;
27+
28+ Task < TransactionResultDto > GetTransactionResultV2Async ( string transactionId ) ;
2729
2830 Task < List < TransactionResultDto > > GetTransactionResultsAsync ( string blockHash , int offset = 0 ,
2931 int limit = 10 ) ;
@@ -130,6 +132,72 @@ await _transactionResultProxyService.InvalidTransactionResultService.GetInvalidT
130132 }
131133 return output ;
132134 }
135+ /// <summary>
136+ /// Get the current status of a transaction, available since V1.12.0
137+ /// </summary>
138+ /// <param name="transactionId">transaction id</param>
139+ /// <returns></returns>
140+ public async Task < TransactionResultDto > GetTransactionResultV2Async ( string transactionId )
141+ {
142+ Hash transactionIdHash ;
143+ try
144+ {
145+ transactionIdHash = Hash . LoadFromHex ( transactionId ) ;
146+ }
147+ catch
148+ {
149+ throw new UserFriendlyException ( Error . Message [ Error . InvalidTransactionId ] ,
150+ Error . InvalidTransactionId . ToString ( ) ) ;
151+ }
152+
153+ var transactionResult = await GetTransactionResultAsync ( transactionIdHash ) ;
154+ var output = _objectMapper . GetMapper ( )
155+ . Map < TransactionResult , TransactionResultDto > ( transactionResult ,
156+ opt => opt . Items [ TransactionProfile . ErrorTrace ] = _webAppOptions . IsDebugMode ) ;
157+ output . StatusV2 = output . Status ;
158+
159+ var transaction = await _transactionManager . GetTransactionAsync ( transactionResult . TransactionId ) ;
160+ output . Transaction = _objectMapper . Map < Transaction , TransactionDto > ( transaction ) ;
161+ output . TransactionSize = transaction ? . CalculateSize ( ) ?? 0 ;
162+
163+ var chain = await _blockchainService . GetChainAsync ( ) ;
164+ if ( transactionResult . Status == TransactionResultStatus . Pending &&
165+ chain . BestChainHeight - output . Transaction ? . RefBlockNumber > KernelConstants . ReferenceBlockValidPeriod )
166+ {
167+ output . StatusV2 = TransactionResultStatus . Expired . ToString ( ) . ToUpper ( ) ;
168+ return output ;
169+ }
170+
171+ if ( transactionResult . Status != TransactionResultStatus . NotExisted )
172+ {
173+ await FormatTransactionParamsAsync ( output . Transaction , transaction . Params ) ;
174+ return output ;
175+ }
176+
177+ var validationStatus = _transactionResultStatusCacheProvider . GetTransactionResultStatus ( transactionIdHash ) ;
178+ if ( validationStatus != null )
179+ {
180+ output . StatusV2 = validationStatus . TransactionResultStatus . ToString ( ) . ToUpper ( ) ;
181+ output . Error =
182+ TransactionErrorResolver . TakeErrorMessage ( validationStatus . Error , _webAppOptions . IsDebugMode ) ;
183+ return output ;
184+ }
185+
186+ if ( _transactionOptions . StoreInvalidTransactionResultEnabled )
187+ {
188+ var failedTransactionResult =
189+ await _transactionResultProxyService . InvalidTransactionResultService . GetInvalidTransactionResultAsync (
190+ transactionIdHash ) ;
191+ if ( failedTransactionResult != null )
192+ {
193+ output . StatusV2 = failedTransactionResult . Status . ToString ( ) . ToUpper ( ) ;
194+ output . Error = failedTransactionResult . Error ;
195+ return output ;
196+ }
197+ }
198+
199+ return output ;
200+ }
133201
134202 /// <summary>
135203 /// Get multiple transaction results.
0 commit comments