Skip to content

Commit 96e80cc

Browse files
authored
Merge branch 'develop' into chore/sync-strategy
2 parents cb9a2b6 + 243d43e commit 96e80cc

29 files changed

Lines changed: 288 additions & 371 deletions

apps/core/src/components/transaction/TransactionIcon.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ import {
1414
} from '@iota/apps-ui-icons';
1515
import { TransactionAction } from '../../interfaces';
1616

17+
export enum TransactionIconSize {
18+
Small = 'small',
19+
Medium = 'medium',
20+
Large = 'large',
21+
}
22+
1723
const ICON_COLORS = {
1824
primary: 'text-iota-primary-30 dark:text-iota-primary-80',
1925
error: 'text-iota-error-30 dark:text-iota-error-80',
@@ -32,18 +38,26 @@ const icons = {
3238
[TransactionAction.TimelockedCollect]: <Vesting />,
3339
};
3440

41+
const ICON_SIZES: Record<TransactionIconSize, string> = {
42+
[TransactionIconSize.Small]: '[&_svg]:size-4',
43+
[TransactionIconSize.Medium]: '[&_svg]:size-5',
44+
[TransactionIconSize.Large]: '[&_svg]:size-6',
45+
};
46+
3547
interface TransactionIconProps {
3648
txnFailed?: boolean;
3749
variant: TransactionAction;
50+
size?: TransactionIconSize;
3851
}
3952

40-
export function TransactionIcon({ txnFailed, variant }: TransactionIconProps) {
53+
export function TransactionIcon({
54+
txnFailed,
55+
variant,
56+
size = TransactionIconSize.Medium,
57+
}: TransactionIconProps) {
4158
return (
4259
<div
43-
className={clsx(
44-
'[&_svg]:h-5 [&_svg]:w-5',
45-
txnFailed ? ICON_COLORS.error : ICON_COLORS.primary,
46-
)}
60+
className={clsx(ICON_SIZES[size], txnFailed ? ICON_COLORS.error : ICON_COLORS.primary)}
4761
>
4862
{txnFailed ? <Info /> : icons[variant]}
4963
</div>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
// Copyright (c) 2024 IOTA Stiftung
22
// SPDX-License-Identifier: Apache-2.0
33

4+
import { normalizeIotaAddress } from '@iota/iota-sdk/utils';
5+
46
export const TIMELOCK_MODULE = 'timelock';
7+
export const TIMELOCK_PACKAGE_ID = normalizeIotaAddress('0x2');
58
export const TIMELOCKED_STAKING_MODULE = 'timelocked_staking';
9+
export const TIMELOCKED_STAKING_PACKAGE_ID = normalizeIotaAddress('0x3');
610
export const TIMELOCK_IOTA_TYPE = `0x2::${TIMELOCK_MODULE}::TimeLock<0x2::balance::Balance<0x2::iota::IOTA>>`;
711
export const TIMELOCK_STAKED_TYPE = `0x3::${TIMELOCKED_STAKING_MODULE}::TimelockedStakedIota`;

apps/core/src/hooks/useGetTransaction.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import { useIotaClient } from '@iota/dapp-kit';
66
import { type IotaTransactionBlockResponse } from '@iota/iota-sdk/client';
77
import { type UseQueryResult, useQuery } from '@tanstack/react-query';
8-
import { useTransactionSummary } from './useTransactionSummary';
98

109
export function useGetTransaction(
1110
transactionId: string,
@@ -30,22 +29,3 @@ export function useGetTransaction(
3029
initialData: queryOptions?.initialData,
3130
});
3231
}
33-
34-
export function useGetTransactionWithSummary(
35-
transactionDigest: string,
36-
currentAddress: string,
37-
initialData?: IotaTransactionBlockResponse,
38-
recognizedPackagesList: string[] = [],
39-
) {
40-
const txResponse = useGetTransaction(transactionDigest, { retry: 8, initialData });
41-
42-
const { data: transaction } = txResponse;
43-
44-
const summary = useTransactionSummary({
45-
transaction,
46-
currentAddress,
47-
recognizedPackagesList,
48-
});
49-
50-
return { summary, ...txResponse };
51-
}
Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
11
// Copyright (c) 2024 IOTA Stiftung
22
// SPDX-License-Identifier: Apache-2.0
33

4-
import { IotaTransactionBlockResponse } from '@iota/iota-sdk/client';
5-
6-
export interface ExtendedTransaction {
7-
action: TransactionAction;
8-
timestamp?: number;
9-
state: TransactionState;
10-
raw: IotaTransactionBlockResponse;
11-
}
12-
134
export enum TransactionAction {
145
Send = 'Send',
156
Receive = 'Receive',
@@ -22,9 +13,3 @@ export enum TransactionAction {
2213
Migration = 'Migration',
2314
PersonalMessage = 'Personal Message',
2415
}
25-
26-
export enum TransactionState {
27-
Successful = 'successful',
28-
Failed = 'failed',
29-
Pending = 'pending',
30-
}

apps/core/src/utils/transaction/getTransactionAction.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@ import { TransactionAction } from '../../interfaces';
77
import { checkIfIsTimelockedStaking } from '../stake';
88
import { isMigrationTransaction, isUnlockTimelockedObjectTransaction } from '..';
99

10+
export const ACTION_LABELS: Record<TransactionAction, string> = {
11+
[TransactionAction.Send]: 'Sent',
12+
[TransactionAction.Receive]: 'Received',
13+
[TransactionAction.Transaction]: 'Transaction',
14+
[TransactionAction.Staked]: 'Stake',
15+
[TransactionAction.Unstaked]: 'Unstake',
16+
[TransactionAction.TimelockedStaked]: 'Stake Vesting',
17+
[TransactionAction.TimelockedUnstaked]: 'Unstake Vesting',
18+
[TransactionAction.TimelockedCollect]: 'Collect Vesting',
19+
[TransactionAction.Migration]: 'Migration',
20+
[TransactionAction.PersonalMessage]: 'Personal Message',
21+
};
22+
1023
export const getTransactionAction = (
1124
transaction: IotaTransactionBlockResponse,
1225
currentAddress?: string,
@@ -20,21 +33,27 @@ export const getTransactionAction = (
2033
} = checkIfIsTimelockedStaking(transaction?.events);
2134

2235
const isMigration = isMigrationTransaction(transaction.transaction);
23-
const isSupplyIncreaseVestingCollect = isUnlockTimelockedObjectTransaction(
24-
transaction.transaction,
25-
);
36+
const isVestingCollect = isUnlockTimelockedObjectTransaction(transaction.transaction);
37+
38+
// A coin transfer only has coin-related commands (no contract calls, publish or upgrade)
39+
const programmableTx = transaction.transaction?.data.transaction;
40+
const isCoinTransfer =
41+
programmableTx?.kind === 'ProgrammableTransaction' &&
42+
!programmableTx.transactions.some(
43+
(cmd) => 'MoveCall' in cmd || 'Publish' in cmd || 'Upgrade' in cmd,
44+
);
2645

2746
if (isMigration) {
2847
return TransactionAction.Migration;
29-
} else if (isSupplyIncreaseVestingCollect) {
48+
} else if (isVestingCollect) {
3049
return TransactionAction.TimelockedCollect;
3150
} else if (stakeTypeTransaction) {
3251
return isTimelockedStaking ? TransactionAction.TimelockedStaked : TransactionAction.Staked;
3352
} else if (unstakeTypeTransaction) {
3453
return isTimelockedUnstaking
3554
? TransactionAction.TimelockedUnstaked
3655
: TransactionAction.Unstaked;
37-
} else if (sender) {
56+
} else if (sender && isCoinTransfer) {
3857
return sender === currentAddress ? TransactionAction.Send : TransactionAction.Receive;
3958
} else {
4059
return TransactionAction.Transaction;

apps/core/src/utils/transaction/isUnlockTimelockedObjectTransaction.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,36 @@ import type {
66
IotaTransactionBlockResponse,
77
MoveCallIotaTransaction,
88
} from '@iota/iota-sdk/client';
9-
import { TIMELOCK_MODULE } from '../..';
9+
import {
10+
TIMELOCK_MODULE,
11+
TIMELOCK_PACKAGE_ID,
12+
TIMELOCKED_STAKING_MODULE,
13+
TIMELOCKED_STAKING_PACKAGE_ID,
14+
} from '../..';
1015

1116
export function isUnlockTimelockedObjectTransaction(
1217
transaction: IotaTransactionBlockResponse['transaction'],
1318
): boolean {
1419
if (!transaction || transaction.data.transaction.kind !== 'ProgrammableTransaction')
1520
return false;
16-
const moveCallTxs = transaction.data.transaction.transactions
17-
.filter(isMoveCall)
18-
.filter((tx) => tx.MoveCall.module === TIMELOCK_MODULE);
19-
const isUnlockTimelockedObject =
20-
moveCallTxs.length > 0 && moveCallTxs.every((tx) => tx.MoveCall.function === 'unlock');
21-
return isUnlockTimelockedObject;
21+
const moveCallTxs = transaction.data.transaction.transactions.filter(isMoveCall);
22+
23+
// Unlock timelocked objects: function unlock or unlock_with_clock
24+
const hasTimelockUnlock = moveCallTxs.some(
25+
(tx) =>
26+
tx.MoveCall.package === TIMELOCK_PACKAGE_ID &&
27+
tx.MoveCall.module === TIMELOCK_MODULE &&
28+
(tx.MoveCall.function === 'unlock' || tx.MoveCall.function === 'unlock_with_clock'),
29+
);
30+
31+
// Re-stake timelocked objects
32+
const hasTimelockedStaking = moveCallTxs.some(
33+
(tx) =>
34+
tx.MoveCall.package === TIMELOCKED_STAKING_PACKAGE_ID &&
35+
tx.MoveCall.module === TIMELOCKED_STAKING_MODULE,
36+
);
37+
38+
return hasTimelockUnlock || hasTimelockedStaking;
2239
}
2340

2441
function isMoveCall(

apps/explorer/src/components/activity/TransactionsActivityTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export function TransactionsActivityTable({
6969
<PlaceholderTable
7070
rowCount={limit}
7171
rowHeight="16px"
72-
colHeadings={['Digest', 'Sender', 'Txns', 'Gas', 'Time']}
72+
colHeadings={['Type', 'Sender', 'Txns', 'Gas', 'Time']}
7373
/>
7474
) : (
7575
<TableCard

apps/explorer/src/components/transaction-blocks-for-address/TransactionBlocksForAddress.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export function TransactionBlocksForAddress({
129129
<PlaceholderTable
130130
rowCount={DEFAULT_TRANSACTIONS_LIMIT}
131131
rowHeight="16px"
132-
colHeadings={['Digest', 'Sender', 'Txns', 'Gas', 'Time']}
132+
colHeadings={['Type', 'Sender', 'Txns', 'Gas', 'Time']}
133133
/>
134134
) : (
135135
<div>

apps/explorer/src/components/transactions/TransactionsForAddress.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export function TransactionsForAddressTable({
5353
<PlaceholderTable
5454
rowCount={limit}
5555
rowHeight="16px"
56-
colHeadings={['Digest', 'Sender', 'Txns', 'Gas', 'Time']}
56+
colHeadings={['Type', 'Sender', 'Txns', 'Gas', 'Time']}
5757
/>
5858
<Placeholder width="w-full" height="h-5" />
5959
</div>
@@ -123,6 +123,7 @@ export function TransactionsForAddress({ address }: TransactionsForAddressProps)
123123
showEffects: true,
124124
showInput: true,
125125
showBalanceChanges: true,
126+
showEvents: true,
126127
},
127128
cursor,
128129
limit,

apps/explorer/src/hooks/useGetTransactionBlocks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export function useGetTransactionBlocks(
3434
showEffects: true,
3535
showInput: true,
3636
showBalanceChanges: true,
37+
showEvents: true,
3738
},
3839
}),
3940
initialPageParam: null,

0 commit comments

Comments
 (0)