Skip to content

Commit

Permalink
Merge pull request #553 from enkryptcom/feat/fail-dropped-jupiter-tra…
Browse files Browse the repository at this point in the history
…nsactions

feat: fail dropped jupiter transactions
  • Loading branch information
kvhnuke authored Dec 4, 2024
2 parents 7f0f6c3 + 216798b commit 021167d
Show file tree
Hide file tree
Showing 16 changed files with 238 additions and 135 deletions.
7 changes: 7 additions & 0 deletions packages/extension/src/libs/activity-state/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class ActivityState {
this.getActivityId(options),
);
}

async updateActivity(
activity: Activity,
options: ActivityOptions,
Expand All @@ -75,24 +76,29 @@ class ActivityState {
});
await this.setActivitiesById(clone, this.getActivityId(options));
}

async setCacheTime(options: ActivityOptions): Promise<void> {
await this.#storage.set(this.getActivityCacheId(options), {
[STORAGE_KEY]: new Date().getTime(),
});
}

async getCacheTime(options: ActivityOptions): Promise<number> {
const cacheTime: Record<string, number> = await this.#storage.get(
this.getActivityCacheId(options),
);
if (!cacheTime || !cacheTime[STORAGE_KEY]) return 0;
return cacheTime[STORAGE_KEY];
}

async getAllActivities(options: ActivityOptions): Promise<Activity[]> {
return this.getActivitiesById(this.getActivityId(options));
}

async deleteAllActivities(options: ActivityOptions): Promise<void> {
this.setActivitiesById([], this.getActivityId(options));
}

private async setActivitiesById(
activities: Activity[],
id: string,
Expand All @@ -101,6 +107,7 @@ class ActivityState {
[STORAGE_KEY]: activities,
});
}

private async getActivitiesById(id: string): Promise<Activity[]> {
const allStates: Record<string, Activity[]> = await this.#storage.get(id);
if (!allStates || !allStates[STORAGE_KEY]) return [];
Expand Down
44 changes: 28 additions & 16 deletions packages/extension/src/providers/solana/libs/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,48 @@ class API implements ProviderAPIInterface {
return getSolAddress(pubkey);
}

async init(): Promise<void> {}
async init(): Promise<void> { }

/**
* Returns null if the transaction hasn't been received by the node
* or has been dropped
*/
async getTransactionStatus(hash: string): Promise<SOLRawInfo | null> {
return this.web3
.getTransaction(hash, {
maxSupportedTransactionVersion: 0,
commitment: 'confirmed',
})
.then(tx => {
if (!tx) return null;
const retVal: SOLRawInfo = {
blockNumber: tx.slot,
timestamp: tx.blockTime,
transactionHash: hash,
status: tx.meta?.err ? false : true,
};
return retVal;
});
const tx = await this.web3.getTransaction(hash, {
maxSupportedTransactionVersion: 0,
commitment: 'confirmed',
})

if (!tx) {
// Transaction hasn't been picked up by the node
// (maybe it's too soon, or maybe node is behind, or maybe it's been dropped)
return null;
}

const retVal: SOLRawInfo = {
blockNumber: tx.slot,
timestamp: tx.blockTime,
transactionHash: hash,
status: tx.meta?.err ? false : true,
};

return retVal;
}

async getBalance(pubkey: string): Promise<string> {
const balance = await this.web3.getBalance(
new PublicKey(this.getAddress(pubkey)),
);
return numberToHex(balance);
}

async broadcastTx(rawtx: string): Promise<boolean> {
return this.web3
.sendRawTransaction(hexToBuffer(rawtx))
.then(() => true)
.catch(() => false);
}

getTokenInfo = async (contractAddress: string): Promise<SPLTokenInfo> => {
interface TokenDetails {
address: string;
Expand Down
15 changes: 8 additions & 7 deletions packages/extension/src/types/activity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ enum ActivityStatus {
pending = 'pending',
success = 'success',
failed = 'failed',
dropped = 'dropped',
}

enum ActivityType {
Expand All @@ -121,13 +122,13 @@ interface Activity {
status: ActivityStatus;
type: ActivityType;
rawInfo?:
| EthereumRawInfo
| SubstrateRawInfo
| SubscanExtrinsicInfo
| BTCRawInfo
| SwapRawInfo
| KadenaRawInfo
| SOLRawInfo;
| EthereumRawInfo
| SubstrateRawInfo
| SubscanExtrinsicInfo
| BTCRawInfo
| SwapRawInfo
| KadenaRawInfo
| SOLRawInfo;
}

export {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
<p>
<span
class="network-activity__transaction-info-status"
:class="{ error: activity.status === ActivityStatus.failed }"
:class="{
error: activity.status === ActivityStatus.failed,
dropped: activity.status === ActivityStatus.dropped,
}"
>{{ status }}</span
>
<transaction-timer
Expand Down Expand Up @@ -86,7 +89,10 @@
<p>
<span
class="network-activity__transaction-info-status"
:class="{ error: activity.status === ActivityStatus.failed }"
:class="{
error: activity.status === ActivityStatus.failed,
dropped: activity.status === ActivityStatus.dropped,
}"
>{{ status }}</span
>
<transaction-timer
Expand Down Expand Up @@ -242,30 +248,32 @@ onMounted(() => {
if (
props.activity.status === ActivityStatus.success &&
props.activity.isIncoming
)
) {
status.value =
props.activity.type === ActivityType.transaction ? 'Received' : 'Swapped';
else if (
} else if (
props.activity.status === ActivityStatus.success &&
!props.activity.isIncoming
)
) {
status.value =
props.activity.type === ActivityType.transaction ? 'Sent' : 'Swapped';
else if (
} else if (
props.activity.status === ActivityStatus.pending &&
props.activity.isIncoming
)
) {
status.value =
props.activity.type === ActivityType.transaction
? 'Receiving'
: 'Swapping';
else if (
} else if (
props.activity.status === ActivityStatus.pending &&
!props.activity.isIncoming
)
) {
status.value =
props.activity.type === ActivityType.transaction ? 'Sending' : 'Swapping';
else {
} else if (props.activity.status === ActivityStatus.dropped) {
status.value = 'Dropped';
} else {
status.value = 'Failed';
}
});
Expand Down Expand Up @@ -335,6 +343,9 @@ onMounted(() => {
.error {
color: @error;
}
.dropped {
/* TODO: Consider different color */
}
}
}
Expand Down
Loading

0 comments on commit 021167d

Please sign in to comment.