Skip to content

Commit

Permalink
get route optiminized
Browse files Browse the repository at this point in the history
  • Loading branch information
marxeille committed Jul 5, 2024
1 parent 2913811 commit 086dc9a
Showing 1 changed file with 122 additions and 74 deletions.
196 changes: 122 additions & 74 deletions packages/mobile/src/screens/universal-swap/handler/src/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,112 @@ const splitOnce = (s: string, seperator: string) => {
return [s.slice(0, i), s.slice(i + 1)];
};

const handleOraichainToOraichain = (): SwapRoute => {
return { swapRoute: "", universalSwapType: "oraichain-to-oraichain" };
};

const handleOraichainToOther = (toToken: TokenItemType): SwapRoute => {
if (cosmosTokens.some((t) => t.chainId === toToken.chainId)) {
return { swapRoute: "", universalSwapType: "oraichain-to-cosmos" };
}
return { swapRoute: "", universalSwapType: "oraichain-to-evm" };
};

const handleCosmosToOthers = (
fromToken: TokenItemType,
toToken: TokenItemType,
destReceiver: string,
receiverOnOrai?: string
): SwapRoute => {
let swapRoute = "";
const finalDestReceiver = getFinalDestReceiver(toToken, destReceiver);
const toDenom = getToDenom(toToken, destReceiver);
const dstChannel = getDstChannel(toToken);

if (fromToken.chainId == "noble-1") {
swapRoute = parseToIbcWasmMemo(finalDestReceiver, dstChannel, toDenom);
} else {
swapRoute = parseToIbcHookMemo(
receiverOnOrai,
finalDestReceiver,
dstChannel,
toDenom
);
}

return { swapRoute, universalSwapType: "cosmos-to-others" };
};

const handleOthersToOraichain = (
fromToken: TokenItemType,
toToken: TokenItemType,
destReceiver: string
): SwapRoute => {
if (
["0x38"].includes(fromToken.chainId) &&
["milky-token", "kawaii-islands"].includes(fromToken.coinGeckoId)
) {
return { swapRoute: "", universalSwapType: "other-networks-to-oraichain" };
}

if (fromToken.coinGeckoId === toToken.coinGeckoId) {
return {
swapRoute: parseToIbcWasmMemo(destReceiver, "", ""),
universalSwapType: "other-networks-to-oraichain",
};
}

const toDenom = getToDenom(toToken, destReceiver);
return {
swapRoute: parseToIbcWasmMemo(destReceiver, "", toDenom),
universalSwapType: "other-networks-to-oraichain",
};
};

const handleRemainingCases = (
fromToken: TokenItemType,
toToken: TokenItemType,
destReceiver: string
): SwapRoute => {
const finalDestReceiver = getFinalDestReceiver(toToken, destReceiver);
const toDenom = getToDenom(toToken, destReceiver);
const dstChannel = getDstChannel(toToken);

const toTokenOnOraichain = getTokenOnOraichain(toToken.coinGeckoId);
if (!toTokenOnOraichain) {
return {
swapRoute: "",
universalSwapType: "other-networks-to-oraichain",
};
}

return {
swapRoute: parseToIbcWasmMemo(finalDestReceiver, dstChannel, toDenom),
universalSwapType: "other-networks-to-oraichain",
};
};

const getFinalDestReceiver = (
toToken: TokenItemType,
destReceiver: string
): string => {
let receiverPrefix = "";
if (isEthAddress(destReceiver)) receiverPrefix = toToken.prefix;
return receiverPrefix + destReceiver;
};

const getToDenom = (toToken: TokenItemType, destReceiver: string): string => {
let receiverPrefix = "";
if (isEthAddress(destReceiver)) receiverPrefix = toToken.prefix;
return receiverPrefix + parseTokenInfoRawDenom(toToken);
};

const getDstChannel = (toToken: TokenItemType): string => {
return toToken.chainId === "Oraichain"
? ""
: ibcInfos["Oraichain"][toToken.chainId].channel;
};

export class UniversalSwapHelper {
// evm swap helpers
static isSupportedNoPoolSwapEvm = (coingeckoId: CoinGeckoId) => {
Expand Down Expand Up @@ -331,99 +437,41 @@ export class UniversalSwapHelper {
destReceiver?: string,
receiverOnOrai?: string
): SwapRoute => {
if (!fromToken || !toToken || !destReceiver)
if (!fromToken || !toToken || !destReceiver) {
return {
swapRoute: "",
universalSwapType: "other-networks-to-oraichain",
};
// this is the simplest case. Both tokens on the same Oraichain network => simple swap with to token denom
}

if (fromToken.chainId === "Oraichain" && toToken.chainId === "Oraichain") {
return { swapRoute: "", universalSwapType: "oraichain-to-oraichain" };
return handleOraichainToOraichain();
}
// we dont need to have any swapRoute for this case

if (fromToken.chainId === "Oraichain") {
if (cosmosTokens.some((t) => t.chainId === toToken.chainId))
return { swapRoute: "", universalSwapType: "oraichain-to-cosmos" };
return { swapRoute: "", universalSwapType: "oraichain-to-evm" };
return handleOraichainToOther(toToken);
}
// TODO: support 1-step swap for kwt
if (
fromToken.chainId === "kawaii_6886-1" ||
fromToken.chainId === "0x1ae6"
) {

if (["kawaii_6886-1", "0x1ae6"].includes(fromToken.chainId)) {
throw new Error(
`chain id ${fromToken.chainId} is currently not supported in universal swap`
);
}

let receiverPrefix = "";
if (isEthAddress(destReceiver)) receiverPrefix = toToken.prefix;
const toDenom = receiverPrefix + parseTokenInfoRawDenom(toToken);
const finalDestReceiver = receiverPrefix + destReceiver;
// we get ibc channel that transfers toToken from Oraichain to the toToken chain
const dstChannel =
toToken.chainId == "Oraichain"
? ""
: ibcInfos["Oraichain"][toToken.chainId].channel;

// cosmos to others case where from token is a cosmos token
// we have 2 cases: 1) Cosmos to Oraichain, 2) Cosmos to cosmos or evm

if (cosmosTokens.some((t) => t.chainId === fromToken.chainId)) {
let swapRoute = "";
// if from chain is noble, use ibc wasm instead of ibc hooks
if (fromToken.chainId == "noble-1") {
swapRoute = parseToIbcWasmMemo(finalDestReceiver, dstChannel, toDenom);
} else {
swapRoute = parseToIbcHookMemo(
receiverOnOrai,
finalDestReceiver,
dstChannel,
toDenom
);
}

return { swapRoute, universalSwapType: "cosmos-to-others" };
return handleCosmosToOthers(
fromToken,
toToken,
destReceiver,
receiverOnOrai
);
}

if (toToken.chainId === "Oraichain") {
// if from token is 0x38 & to token chain id is Oraichain & from token is kawaii or milky
if (
["0x38"].includes(fromToken.chainId) &&
["milky-token", "kawaii-islands"].includes(fromToken.coinGeckoId)
)
return {
swapRoute: "",
universalSwapType: "other-networks-to-oraichain",
};
// if to token chain id is Oraichain, then we dont need to care about ibc msg case
// first case, two tokens are the same, only different in network => simple swap
if (fromToken.coinGeckoId === toToken.coinGeckoId)
return {
swapRoute: parseToIbcWasmMemo(destReceiver, "", ""),
universalSwapType: "other-networks-to-oraichain",
};
// if they are not the same then we set dest denom
return {
swapRoute: parseToIbcWasmMemo(destReceiver, "", toDenom),
universalSwapType: "other-networks-to-oraichain",
};
return handleOthersToOraichain(fromToken, toToken, destReceiver);
}
// the remaining cases where we have to process ibc msg

// getTokenOnOraichain is called to get the ibc denom / cw20 denom on Oraichain so that we can create an ibc msg using it
// TODO: no need to use to token on Oraichain. Can simply use the swapRoute token directly. Fix this requires fixing the logic on ibc wasm as well
const toTokenOnOraichain = getTokenOnOraichain(toToken.coinGeckoId);
if (!toTokenOnOraichain)
return {
swapRoute: "",
universalSwapType: "other-networks-to-oraichain",
};

return {
swapRoute: parseToIbcWasmMemo(finalDestReceiver, dstChannel, toDenom),
universalSwapType: "other-networks-to-oraichain",
};
return handleRemainingCases(fromToken, toToken, destReceiver);
};

static addOraiBridgeRoute = (
Expand Down

0 comments on commit 086dc9a

Please sign in to comment.