Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
3429cbf
check state of the first transfer in the array
toddkao Jul 14, 2025
ccc3d33
Merge pull request #1477 from skip-mev/staging
codingki Jul 15, 2025
235c26a
Merge pull request #1474 from skip-mev/FRE-1997
codingki Jul 15, 2025
9fd9720
executeMultipleRoutes
codingki Jul 15, 2025
201cd74
Merge pull request #1478 from skip-mev/kiki/fre-2009-gor-create-execu…
codingki Jul 15, 2025
67cdb5f
reuseable createValidAddressLIst
codingki Jul 16, 2025
08a3f4e
Merge pull request #1486 from skip-mev/reusable-createValidAddressList
codingki Jul 16, 2025
e3a6e04
add ReceiveGasOnDestination component
toddkao Jul 18, 2025
ee3bff5
add handling custom border radius
toddkao Jul 18, 2025
4b1c0f9
gor state
codingki Jul 18, 2025
e78fbd4
simplify state
toddkao Jul 18, 2025
ffc05af
Update SwapPage.tsx
toddkao Jul 18, 2025
9fbdd62
Merge branch 'add-ReceiveGasOnDestination-component' into gor-state
toddkao Jul 18, 2025
d02d459
add showing question mark icon in swap page telling user that they wi…
toddkao Jul 18, 2025
488e01b
add logic for swap-out
toddkao Jul 18, 2025
26afb98
add calling route a third time
toddkao Jul 18, 2025
cafc1fe
rename field as gasOnReceiveAsset
toddkao Jul 18, 2025
004741a
add using mainRoute and feeRoute and having the top level route being…
toddkao Jul 18, 2025
e2f64e5
improve fetching concurrency
codingki Jul 20, 2025
a191eb9
render the route source amount in instead of firstOperation
toddkao Jul 21, 2025
63aa781
Update route.ts
toddkao Jul 22, 2025
890d37d
move logic to execution page
codingki Jul 22, 2025
5639e8e
remove div
codingki Jul 22, 2025
dae4b88
Merge pull request #1498 from skip-mev/gor-state-2
codingki Jul 22, 2025
b46f72a
Merge pull request #1493 from skip-mev/gor-state
codingki Jul 22, 2025
58d5ee4
implement routes to execution pages
codingki Jul 22, 2025
fb178fa
Merge pull request #1499 from skip-mev/implement-routes-to-execution-…
codingki Jul 22, 2025
159d1ac
Add status integration for multiple routes (#1495)
toddkao Jul 23, 2025
cda9f58
sum up total sourceToken from relatedRoutes and mainRoute
toddkao Jul 23, 2025
e0e60d6
Merge branch 'gas-on-receive' of https://github.com/skip-mev/skip-go …
toddkao Jul 23, 2025
3b420f1
add onTransactionTracked callback
toddkao Jul 23, 2025
a1e1239
addresses logic
codingki Jul 23, 2025
8c41515
Merge pull request #1502 from skip-mev/addresses-logic
codingki Jul 23, 2025
05f4b4a
integrate address and execute route/multi route
codingki Jul 23, 2025
133393b
update GasOnReceive returning null logic, update early return polling…
toddkao Jul 24, 2025
adfd55b
fix useTxHistory logic
toddkao Jul 24, 2025
6fd1f62
fix bug and improvements
codingki Jul 24, 2025
17c2523
remove gas route in settings drawer
codingki Jul 24, 2025
90f89cd
reduce fee route amount
codingki Jul 24, 2025
3978c41
Merge branch 'staging' into gas-on-receive
toddkao Jul 24, 2025
316586b
FRE-2057 fix lifecycle tracking getting stuck if mainRoute completes …
toddkao Jul 24, 2025
8bca41c
Update updateRelatedRoutes to properly check for the status of the co…
toddkao Jul 24, 2025
37ecf50
fix updateRelatedRoutes to not update feeRoute to pending when transa…
toddkao Jul 24, 2025
9084b70
enable evm dest, dynamic fee route, adjust slippage
codingki Jul 25, 2025
1cd644a
add isMultiRoutes for noble tx
codingki Jul 25, 2025
c55cf7c
Merge pull request #1504 from skip-mev/enable-evm-dest,-dynamic-fee-r…
codingki Jul 26, 2025
feffad4
prettier
codingki Jul 28, 2025
8449765
fix destination amount decimals
codingki Jul 28, 2025
e4eed27
dont refetch
codingki Jul 28, 2025
c9b5d60
fix show state
codingki Jul 28, 2025
1955286
improve without usdAmountOut
codingki Jul 28, 2025
da19d96
update registries
codingki Jul 28, 2025
2d221a4
update design of GasOnReceive
toddkao Jul 28, 2025
9934316
Merge pull request #1507 from skip-mev/FRE-2073
codingki Jul 29, 2025
85ec6aa
add analytics for gas on receive
toddkao Jul 28, 2025
70c0a0b
add is destination fee balance available
codingki Jul 29, 2025
6a60a6c
Merge pull request #1508 from skip-mev/FRE-2058
codingki Jul 29, 2025
171483b
fix loading state
codingki Jul 29, 2025
ba71a82
Merge pull request #1506 from skip-mev/fix-loading-state
codingki Jul 29, 2025
1d25737
Update styling (#1510)
toddkao Jul 29, 2025
520016a
update GasOnReceive text color to either be warning or lowContrast
toddkao Jul 29, 2025
5a18570
Update gasOnReceive.ts
toddkao Jul 29, 2025
b922c67
Merge branch 'gas-on-receive' into FRE-2083
toddkao Jul 29, 2025
4cbce88
Merge pull request #1512 from skip-mev/FRE-2083
codingki Jul 29, 2025
7970620
add showing + (feeAsset) in SwapExecutionPageRouteSimpleRow
toddkao Jul 29, 2025
fd7bc2d
Merge branch 'gas-on-receive' of https://github.com/skip-mev/skip-go …
toddkao Jul 29, 2025
cd67ccd
gor amounts fix
codingki Jul 29, 2025
652b5a0
rename variable
codingki Jul 29, 2025
727fb30
Merge pull request #1513 from skip-mev/gor-amounts-fix
codingki Jul 29, 2025
7d96edc
Fix flickering text when toggling gas top-up (#1511)
toddkao Jul 29, 2025
7e7d6b3
[FRE-2075] Show transferAssetRelease of failed gasRoutes (#1514)
toddkao Jul 29, 2025
e12c730
remove console log
codingki Jul 29, 2025
bdd3089
changeset
codingki Jul 29, 2025
794c166
Merge pull request #1515 from skip-mev/gor--cleanup-remove-console-log
codingki Jul 29, 2025
961ac10
fix evm gor bugs
toddkao Jul 29, 2025
ba19c60
update to patch relatedRoutes directly from within client library
toddkao Jul 30, 2025
b79f6b2
Update subscribeToRouteStatus.ts
toddkao Jul 30, 2025
ad6da75
Merge branch 'gas-on-receive' into evm-source-gor-fix
toddkao Jul 30, 2025
be6f2a6
Update subscribeToRouteStatus.ts
toddkao Jul 30, 2025
41c6a36
remove console logs and unused import
toddkao Jul 30, 2025
3ee79f0
evm gor refactor
toddkao Jul 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/smooth-hornets-attack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@skip-go/client": minor
"@skip-go/widget": minor
---

Gas on receive & executeMultipleRoutes
2 changes: 1 addition & 1 deletion packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"@protobufs/gogoproto": "0.0.10",
"@protobufs/google": "0.0.10",
"@types/keccak": "3.0.4",
"chain-registry": "^2.0.18",
"chain-registry": "^2.0.31",
"eslint-plugin-esm": "^0.8.1",
"eslint-plugin-import": "^2.31.0",
"minimatch": "^9.0.3",
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/codegen/chains.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion packages/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ export type { TxStatusResponse } from "./api/postTransactionStatus";

export { executeRoute } from "./public-functions/executeRoute";
export type { ExecuteRouteOptions } from "./public-functions/executeRoute";
export { executeMultipleRoutes } from "./public-functions/executeMultipleRoutes";
export type { ExecuteMultipleRoutesOptions } from "./public-functions/executeMultipleRoutes";

export { getSigningStargateClient } from "./public-functions/getSigningStargateClient";
export type { getSigningStargateClientProps } from "./public-functions/getSigningStargateClient";
Expand All @@ -43,7 +45,7 @@ export { getEVMGasAmountForMessage } from "./public-functions/getEvmGasAmountFor
export { validateCosmosGasBalance } from "./public-functions/validateCosmosGasBalance";

export { subscribeToRouteStatus } from "./public-functions/subscribeToRouteStatus";
export type { RouteDetails, TransactionDetails, RouteStatus } from "./public-functions/subscribeToRouteStatus";
export type { RouteDetails, TransactionDetails, RouteStatus, TransactionStatus } from "./public-functions/subscribeToRouteStatus";
export type { TransferEventStatus } from "./utils/clientType"

export type { SkipClientOptions } from "./state/clientState";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { fromBase64 } from "@cosmjs/encoding";
import type { SignCosmosMessageAminoOptions } from "src/types/client-types";

export const signCosmosMessageAmino = async (
options: SignCosmosMessageAminoOptions,
options: SignCosmosMessageAminoOptions
): Promise<TxRawType> => {
const {
signer,
Expand All @@ -24,20 +24,31 @@ export const signCosmosMessageAmino = async (
} = options;

const accounts = await signer.getAccounts();
const accountFromSigner = accounts.find((account) => account.address === signerAddress);
const accountFromSigner = accounts.find(
(account) => account.address === signerAddress
);

if (!accountFromSigner) {
throw new Error("signCosmosMessageAmino: failed to retrieve account from signer");
throw new Error(
"signCosmosMessageAmino: failed to retrieve account from signer"
);
}

const messages = cosmosMsgs.map((cosmosMsg) => getEncodeObjectFromCosmosMessage(cosmosMsg));
const messages = cosmosMsgs.map((cosmosMsg) =>
getEncodeObjectFromCosmosMessage(cosmosMsg)
);

const signMode = SignMode.SIGN_MODE_LEGACY_AMINO_JSON;
const msgs = messages.map((msg) => ClientState.aminoTypes.toAmino(msg));

console.log("sign cosmos message amino", msgs, fee, signerChainId, "", accountNumber, sequence);

const signDoc = makeSignDoc(msgs, fee, signerChainId, "", accountNumber, sequence);
const signDoc = makeSignDoc(
msgs,
fee,
signerChainId,
"",
accountNumber,
sequence
);

const { signature, signed } = await signer.signAmino(signerAddress, signDoc);

Expand All @@ -54,7 +65,9 @@ export const signCosmosMessageAmino = async (
value: signedTxBody,
};

const signedTxBodyBytes = ClientState.registry.encode(signedTxBodyEncodeObject);
const signedTxBodyBytes = ClientState.registry.encode(
signedTxBodyEncodeObject
);

const signedGasLimit = Int53.fromString(signed.fee.gas).toNumber();
const signedSequence = Int53.fromString(signed.sequence).toNumber();
Expand All @@ -67,7 +80,7 @@ export const signCosmosMessageAmino = async (
signedGasLimit,
signed.fee.granter,
signed.fee.payer,
signMode,
signMode
);

return TxRaw.fromPartial({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export const executeEvmTransaction = async (
routeId,
options
});

const txHash = await extendedSigner.writeContract({
account: evmSigner.account,
address: requiredApproval.tokenContract as `0x${string}`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ export const validateEvmGasBalance = async ({
tx,
getFallbackGasAmount,
useUnlimitedApproval,
bypassApprovalCheck,
}: {
signer: WalletClient;
tx: EvmTx;
getFallbackGasAmount?: GetFallbackGasAmount;
useUnlimitedApproval?: boolean;
bypassApprovalCheck?: boolean;
}) => {
const chainId = tx?.chainId ?? "";
const skipAssets = (await ClientState.getSkipAssets({ chainId }))?.[chainId];
Expand Down Expand Up @@ -55,7 +57,7 @@ export const validateEvmGasBalance = async ({

const { requiredErc20Approvals } = tx;

if (requiredErc20Approvals) {
if (!bypassApprovalCheck &&requiredErc20Approvals) {
try {
await validateEvmTokenApproval({
requiredErc20Approvals,
Expand Down
63 changes: 44 additions & 19 deletions packages/client/src/private-functions/executeTransactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@ import { GAS_STATION_CHAIN_IDS } from "src/constants/constants";
import { venues } from "src/api/getVenues";
import { signCosmosTransaction } from "./cosmos/signCosmosTransaction";
import { signSvmTransaction } from "./svm/signSvmTransaction";
import { executeAndSubscribeToRouteStatus, updateRouteDetails } from "src/public-functions/subscribeToRouteStatus";
import { updateRouteDetails } from "src/public-functions/subscribeToRouteStatus";
import { submitTransaction } from "src/api/postSubmitTransaction";
import { getAccountNumberAndSequence } from "./getAccountNumberAndSequence";
import { getChainIdsFromTxs } from "./getChainIdsFromTxs";

export const executeTransactions = async (
options: ExecuteRouteOptions & { txs?: Tx[], routeId: string }
options: ExecuteRouteOptions & {
txs?: Tx[];
routeId: string;
isMultiRoutes?: boolean;
}
) => {
const {
txs,
Expand All @@ -30,6 +34,7 @@ export const executeTransactions = async (
trackTxPollingOptions,
batchSignTxs = true,
routeId,
isMultiRoutes,
} = options;

if (txs === undefined) {
Expand All @@ -40,13 +45,18 @@ export const executeTransactions = async (

const chainIds = getChainIdsFromTxs(txs);

const transactionDetails = txs.map(tx => {
const transactionDetails: {
chainId: string;
chainType: ChainType;
txHash?: string;
explorerLink?: string;
}[] = txs.map((tx) => {
if ("cosmosTx" in tx) {
return { chainId: tx.cosmosTx?.chainId }
return { chainId: tx.cosmosTx?.chainId, chainType: ChainType.Cosmos };
} else if ("evmTx" in tx) {
return { chainId: tx.evmTx?.chainId }
return { chainId: tx.evmTx?.chainId, chainType: ChainType.Evm };
} else if ("svmTx" in tx) {
return { chainId: tx.svmTx?.chainId }
return { chainId: tx.svmTx?.chainId, chainType: ChainType.Svm };
} else {
throw new Error("executeRoute error: invalid message type");
}
Expand Down Expand Up @@ -83,6 +93,7 @@ export const executeTransactions = async (
getCosmosPriorityFeeDenom: options.getCosmosPriorityFeeDenom,
options,
routeId,
isMultiRoutes,
});

const validateEnabledChainIds = async (chainId: string) => {
Expand All @@ -97,6 +108,7 @@ export const executeTransactions = async (
getCosmosPriorityFeeDenom: options.getCosmosPriorityFeeDenom,
options,
routeId,
isMultiRoutes,
});
};

Expand All @@ -119,19 +131,24 @@ export const executeTransactions = async (
await validateEnabledChainIds(tx.cosmosTx?.chainId ?? "");
const isAllowedToBatchSignTxsUpfront = await (async () => {
try {
const currentUserAddress = options.userAddresses.find((x) => x.chainId === tx.cosmosTx?.chainId)?.address;
const currentUserAddress = options.userAddresses.find(
(x) => x.chainId === tx.cosmosTx?.chainId
)?.address;
if (!currentUserAddress) {
return false;
}
const { accountNumber } = await getAccountNumberAndSequence(currentUserAddress, tx.cosmosTx?.chainId)
const { accountNumber } = await getAccountNumberAndSequence(
currentUserAddress,
tx.cosmosTx?.chainId
);
if (accountNumber) {
return true;
}
return false
return false;
} catch (_error) {
return false;
}
})()
})();

if (!isAllowedToBatchSignTxsUpfront) {
continue;
Expand All @@ -152,7 +169,12 @@ export const executeTransactions = async (
}
if ("svmTx" in tx) {
await validateEnabledChainIds(tx.svmTx?.chainId ?? "");
const signedTx = await signSvmTransaction({ tx, options, index: i, routeId });
const signedTx = await signSvmTransaction({
tx,
options,
index: i,
routeId,
});
if (!signedTx) {
throw new Error(`executeRoute error: signedTx is undefined`);
}
Expand Down Expand Up @@ -185,7 +207,7 @@ export const executeTransactions = async (
txResult = {
chainId: txSigned.chainId,
txHash: txResponse?.txHash ?? "",
explorerLink: txResponse?.explorerLink ?? '',
explorerLink: txResponse?.explorerLink ?? "",
};
// If the tx not signed we will execute the transaction normally
} else {
Expand All @@ -199,7 +221,12 @@ export const executeTransactions = async (
});
} else if ("evmTx" in tx) {
await validateEnabledChainIds(tx.evmTx?.chainId ?? "");
const txResponse = await executeEvmTransaction(tx, options, index, routeId);
const txResponse = await executeEvmTransaction(
tx,
options,
index,
routeId
);
txResult = {
chainId: tx?.evmTx?.chainId ?? "",
txHash: txResponse.transactionHash,
Expand All @@ -215,14 +242,12 @@ export const executeTransactions = async (
await onTransactionBroadcast?.({ ...txResult });

return txResult;
}
};

await executeAndSubscribeToRouteStatus({
transactionDetails: transactionDetails,
return {
transactionDetails,
executeTransaction,
routeId,
options
});
};
};

const EVM_GAS_AMOUNT = 150_000;
Expand Down
10 changes: 6 additions & 4 deletions packages/client/src/private-functions/validateGasBalances.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ export type ValidateGasBalancesProps = {
disabledChainIds?: string[];
// run gas validation for specific chainId
enabledChainIds?: string[];
useUnlimitedApproval?: boolean;
routeId: string;
options: ExecuteRouteOptions;
isMultiRoutes?: boolean;
} & Pick<SignerGetters, "getCosmosSigner" | "getEvmSigner">;

export const validateGasBalances = async ({
Expand All @@ -35,10 +35,10 @@ export const validateGasBalances = async ({
simulate,
disabledChainIds,
enabledChainIds,
useUnlimitedApproval,
getCosmosPriorityFeeDenom,
routeId,
options
options,
isMultiRoutes
}: ValidateGasBalancesProps) => {
const validateResult = await Promise.all(
txs.map(async (tx, i) => {
Expand Down Expand Up @@ -73,6 +73,7 @@ export const validateGasBalances = async ({
txIndex: i,
simulate,
getCosmosPriorityFeeDenom: getCosmosPriorityFeeDenom,
isMultiRoutes: isMultiRoutes,
});

return res;
Expand Down Expand Up @@ -111,7 +112,8 @@ export const validateGasBalances = async ({
tx: tx.evmTx,
signer,
getFallbackGasAmount,
useUnlimitedApproval,
useUnlimitedApproval: options?.useUnlimitedApproval,
bypassApprovalCheck: options?.bypassApprovalCheck,
});
return res;
} catch (e) {
Expand Down
Loading