Skip to content

Commit 0987517

Browse files
authored
apps: fix txn ordering (MystenLabs#5432)
1 parent d3d1546 commit 0987517

File tree

8 files changed

+26
-85
lines changed

8 files changed

+26
-85
lines changed

apps/explorer/src/components/transaction-card/RecentTxCard.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ async function getRecentTransactions(
115115
endGatewayTxSeqNumber
116116
)
117117
.then((res: GetTxnDigestsResponse) =>
118-
getDataOnTxDigests(network, res)
118+
// result returned by getTransactionDigestsInRange is in ascending order
119+
getDataOnTxDigests(network, [...res].reverse())
119120
)) as TxnData[];
120121
} catch (error) {
121122
throw error;

apps/explorer/src/components/transaction-card/TxCardUtils.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export const getDataOnTxDigests = (
180180
: {}),
181181
};
182182
})
183-
// Remove failed transactions and sort by sequence number
183+
// Remove failed transactions
184184
.filter((itm) => itm)
185185
);
186186
});

apps/explorer/src/components/transaction-card/TxForID.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ const getTx = async (
3333
category: categoryType
3434
): Promise<GetTxnDigestsResponse> =>
3535
category === 'address'
36-
? rpc(network).getTransactionsForAddress(id)
37-
: rpc(network).getTransactionsForObject(id);
36+
? rpc(network).getTransactionsForAddress(id, 'Descending')
37+
: rpc(network).getTransactionsForObject(id, 'Descending');
3838

3939
const viewFn = (results: any) => <TxForIDView showData={results} />;
4040

apps/wallet/src/ui/app/redux/slices/txresults/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ export const getTransactionsByAddress = createAsyncThunk<
9595
}
9696
// Get all transactions txId for address
9797
const transactions: GetTxnDigestsResponse =
98-
await api.instance.fullNode.getTransactionsForAddress(address);
98+
await api.instance.fullNode.getTransactionsForAddress(
99+
address,
100+
'Descending'
101+
);
99102

100103
if (!transactions || !transactions.length) {
101104
return [];

sdk/typescript/src/providers/json-rpc-provider.ts

Lines changed: 14 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
isGetObjectDataResponse,
88
isGetOwnedObjectsResponse,
99
isGetTxnDigestsResponse,
10-
isGetTxnDigestsResponse__DEPRECATED,
1110
isPaginatedTransactionDigests,
1211
isSuiEvents,
1312
isSuiExecuteTransactionResponse,
@@ -223,11 +222,13 @@ export class JsonRpcProvider extends Provider {
223222
return objects.filter((obj: SuiObjectInfo) => Coin.isSUI(obj));
224223
}
225224

226-
getCoinDenominationInfo(
227-
coinType: string,
228-
): CoinDenominationInfoResponse {
225+
getCoinDenominationInfo(coinType: string): CoinDenominationInfoResponse {
229226
const [packageId, module, symbol] = coinType.split('::');
230-
if (normalizeSuiAddress(packageId) !== normalizeSuiAddress('0x2') || module != 'sui' || symbol !== 'SUI') {
227+
if (
228+
normalizeSuiAddress(packageId) !== normalizeSuiAddress('0x2') ||
229+
module != 'sui' ||
230+
symbol !== 'SUI'
231+
) {
231232
throw new Error(
232233
'only SUI coin is supported in getCoinDenominationInfo for now.'
233234
);
@@ -355,42 +356,17 @@ export class JsonRpcProvider extends Provider {
355356
}
356357

357358
async getTransactionsForObject(
358-
objectID: string
359+
objectID: string,
360+
ordering: Ordering = 'Descending'
359361
): Promise<GetTxnDigestsResponse> {
360-
// TODO: remove after we deploy 0.12.0 DevNet
361-
if ((await this.getRpcApiVersion()) === PRE_PAGINATION_API_VERSION) {
362-
const requests = [
363-
{
364-
method: 'sui_getTransactionsByInputObject',
365-
args: [objectID],
366-
},
367-
{
368-
method: 'sui_getTransactionsByMutatedObject',
369-
args: [objectID],
370-
},
371-
];
372-
373-
try {
374-
const results = await this.client.batchRequestWithType(
375-
requests,
376-
isGetTxnDigestsResponse__DEPRECATED,
377-
this.skipDataValidation
378-
);
379-
return [...results[0], ...results[1]].map((tx) => tx[1]);
380-
} catch (err) {
381-
throw new Error(
382-
`Error getting transactions for object: ${err} for id ${objectID}`
383-
);
384-
}
385-
}
386362
const requests = [
387363
{
388364
method: 'sui_getTransactions',
389-
args: [{ InputObject: objectID }, null, null, 'Ascending'],
365+
args: [{ InputObject: objectID }, null, null, ordering],
390366
},
391367
{
392368
method: 'sui_getTransactions',
393-
args: [{ MutatedObject: objectID }, null, null, 'Ascending'],
369+
args: [{ MutatedObject: objectID }, null, null, ordering],
394370
},
395371
];
396372

@@ -409,41 +385,17 @@ export class JsonRpcProvider extends Provider {
409385
}
410386

411387
async getTransactionsForAddress(
412-
addressID: string
388+
addressID: string,
389+
ordering: Ordering = 'Descending'
413390
): Promise<GetTxnDigestsResponse> {
414-
// TODO: remove after we deploy 0.12.0 DevNet
415-
if ((await this.getRpcApiVersion()) === PRE_PAGINATION_API_VERSION) {
416-
const requests = [
417-
{
418-
method: 'sui_getTransactionsToAddress',
419-
args: [addressID],
420-
},
421-
{
422-
method: 'sui_getTransactionsFromAddress',
423-
args: [addressID],
424-
},
425-
];
426-
try {
427-
const results = await this.client.batchRequestWithType(
428-
requests,
429-
isGetTxnDigestsResponse__DEPRECATED,
430-
this.skipDataValidation
431-
);
432-
return [...results[0], ...results[1]].map((r) => r[1]);
433-
} catch (err) {
434-
throw new Error(
435-
`Error getting transactions for address: ${err} for id ${addressID}`
436-
);
437-
}
438-
}
439391
const requests = [
440392
{
441393
method: 'sui_getTransactions',
442-
args: [{ ToAddress: addressID }, null, null, 'Ascending'],
394+
args: [{ ToAddress: addressID }, null, null, ordering],
443395
},
444396
{
445397
method: 'sui_getTransactions',
446-
args: [{ FromAddress: addressID }, null, null, 'Ascending'],
398+
args: [{ FromAddress: addressID }, null, null, ordering],
447399
},
448400
];
449401
try {

sdk/typescript/src/types/index.guard.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Generated type guards for "index.ts".
88
* WARNING: Do not manually change this file.
99
*/
10-
import { TransactionDigest, SuiAddress, ObjectOwner, SuiObjectRef, SuiObjectInfo, ObjectContentFields, MovePackageContent, SuiData, SuiMoveObject, CoinDenominationInfoResponse, SuiMovePackage, SuiMoveFunctionArgTypesResponse, SuiMoveFunctionArgType, SuiMoveFunctionArgTypes, SuiMoveNormalizedModules, SuiMoveNormalizedModule, SuiMoveModuleId, SuiMoveNormalizedStruct, SuiMoveStructTypeParameter, SuiMoveNormalizedField, SuiMoveNormalizedFunction, SuiMoveVisibility, SuiMoveTypeParameterIndex, SuiMoveAbilitySet, SuiMoveNormalizedType, SuiMoveNormalizedTypeParameterType, SuiMoveNormalizedStructType, SuiObject, ObjectStatus, ObjectType, GetOwnedObjectsResponse, GetObjectDataResponse, ObjectDigest, ObjectId, SequenceNumber, MoveEvent, PublishEvent, TransferObjectEvent, DeleteObjectEvent, NewObjectEvent, SuiEvent, MoveEventField, EventType, SuiEventFilter, SuiEventEnvelope, SuiEvents, SubscriptionId, SubscriptionEvent, TransferObject, SuiTransferSui, SuiChangeEpoch, Pay, ExecuteTransactionRequestType, TransactionKindName, SuiTransactionKind, SuiTransactionData, EpochId, GenericAuthoritySignature, AuthorityQuorumSignInfo, CertifiedTransaction, GasCostSummary, ExecutionStatusType, ExecutionStatus, OwnedObjectRef, TransactionEffects, SuiTransactionResponse, SuiCertifiedTransactionEffects, SuiExecuteTransactionResponse, GatewayTxSeqNumber, GetTxnDigestsResponse, GetTxnDigestsResponse__DEPRECATED, PaginatedTransactionDigests, TransactionQuery, Ordering, MoveCall, SuiJsonValue, EmptySignInfo, AuthorityName, AuthoritySignature, TransactionBytes, SuiParsedMergeCoinResponse, SuiParsedSplitCoinResponse, SuiParsedPublishResponse, SuiPackage, SuiParsedTransactionResponse, DelegationData, DelegationSuiObject, TransferObjectTx, TransferSuiTx, PayTx, PublishTx, SharedObjectRef, ObjectArg, CallArg, StructTag, TypeTag, MoveCallTx, Transaction, TransactionKind, TransactionData } from "./index";
10+
import { TransactionDigest, SuiAddress, ObjectOwner, SuiObjectRef, SuiObjectInfo, ObjectContentFields, MovePackageContent, SuiData, SuiMoveObject, CoinDenominationInfoResponse, SuiMovePackage, SuiMoveFunctionArgTypesResponse, SuiMoveFunctionArgType, SuiMoveFunctionArgTypes, SuiMoveNormalizedModules, SuiMoveNormalizedModule, SuiMoveModuleId, SuiMoveNormalizedStruct, SuiMoveStructTypeParameter, SuiMoveNormalizedField, SuiMoveNormalizedFunction, SuiMoveVisibility, SuiMoveTypeParameterIndex, SuiMoveAbilitySet, SuiMoveNormalizedType, SuiMoveNormalizedTypeParameterType, SuiMoveNormalizedStructType, SuiObject, ObjectStatus, ObjectType, GetOwnedObjectsResponse, GetObjectDataResponse, ObjectDigest, ObjectId, SequenceNumber, MoveEvent, PublishEvent, TransferObjectEvent, DeleteObjectEvent, NewObjectEvent, SuiEvent, MoveEventField, EventType, SuiEventFilter, SuiEventEnvelope, SuiEvents, SubscriptionId, SubscriptionEvent, TransferObject, SuiTransferSui, SuiChangeEpoch, Pay, ExecuteTransactionRequestType, TransactionKindName, SuiTransactionKind, SuiTransactionData, EpochId, GenericAuthoritySignature, AuthorityQuorumSignInfo, CertifiedTransaction, GasCostSummary, ExecutionStatusType, ExecutionStatus, OwnedObjectRef, TransactionEffects, SuiTransactionResponse, SuiCertifiedTransactionEffects, SuiExecuteTransactionResponse, GatewayTxSeqNumber, GetTxnDigestsResponse, PaginatedTransactionDigests, TransactionQuery, Ordering, MoveCall, SuiJsonValue, EmptySignInfo, AuthorityName, AuthoritySignature, TransactionBytes, SuiParsedMergeCoinResponse, SuiParsedSplitCoinResponse, SuiParsedPublishResponse, SuiPackage, SuiParsedTransactionResponse, DelegationData, DelegationSuiObject, TransferObjectTx, TransferSuiTx, PayTx, PublishTx, SharedObjectRef, ObjectArg, CallArg, StructTag, TypeTag, MoveCallTx, Transaction, TransactionKind, TransactionData } from "./index";
1111

1212
export function isTransactionDigest(obj: any, _argumentName?: string): obj is TransactionDigest {
1313
return (
@@ -948,17 +948,6 @@ export function isGetTxnDigestsResponse(obj: any, _argumentName?: string): obj i
948948
)
949949
}
950950

951-
export function isGetTxnDigestsResponse__DEPRECATED(obj: any, _argumentName?: string): obj is GetTxnDigestsResponse__DEPRECATED {
952-
return (
953-
Array.isArray(obj) &&
954-
obj.every((e: any) =>
955-
Array.isArray(e) &&
956-
isSuiMoveTypeParameterIndex(e[0]) as boolean &&
957-
isTransactionDigest(e[1]) as boolean
958-
)
959-
)
960-
}
961-
962951
export function isPaginatedTransactionDigests(obj: any, _argumentName?: string): obj is PaginatedTransactionDigests {
963952
return (
964953
(obj !== null &&

sdk/typescript/src/types/transactions.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,6 @@ export type SuiExecuteTransactionResponse =
153153
export type GatewayTxSeqNumber = number;
154154

155155
export type GetTxnDigestsResponse = TransactionDigest[];
156-
// TODO: remove after we deploy 0.12.0 DevNet
157-
export type GetTxnDigestsResponse__DEPRECATED = [
158-
GatewayTxSeqNumber,
159-
TransactionDigest
160-
][];
161156

162157
export type PaginatedTransactionDigests = {
163158
data: TransactionDigest[];

sdk/typescript/test/e2e/read-transactions.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ describe('Transaction Reading API', () => {
3030

3131
it('Get Transactions', async () => {
3232
const resp = await toolbox.provider.getTransactionsForAddress(
33-
toolbox.address()
33+
toolbox.address(),
34+
'Ascending'
3435
);
3536
expect(resp.length).to.greaterThan(0);
3637

0 commit comments

Comments
 (0)