Skip to content

Commit

Permalink
Merge branch 'dev' of https://github.com/oraichain/oraiswap-v3-app in…
Browse files Browse the repository at this point in the history
…to dev
  • Loading branch information
haunv3 committed Jun 21, 2024
2 parents 12c143b + 2e8a1e3 commit 7fe7ca2
Show file tree
Hide file tree
Showing 5 changed files with 475 additions and 354 deletions.
24 changes: 3 additions & 21 deletions src/containers/NewPositionWrapper/NewPositionWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ import { VariantType } from 'notistack'
import React, { useEffect, useMemo, useRef, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { actions as walletActions } from '@store/reducers/wallet'
import { useParams } from 'react-router-dom'

export const ALL_FEE_TIERS_DATA: FeeTier[] = [
{ fee: 500000000, tick_spacing: 100 },
Expand All @@ -72,16 +71,13 @@ export const NewPositionWrapper: React.FC<IProps> = ({
initialFee
}) => {
const dispatch = useDispatch()
const { item1, item2, item3 } = useParams()
const tokens = useSelector(swapTokens)
const walletStatus = useSelector(status)
const allPools = useSelector(poolsArraySortedByFees)
const allPoolKeys = useSelector(poolKeys)
const poolsData = useSelector(pools)
const loadingTicksAndTickMaps = useSelector(isLoadingTicksAndTickMaps)
const walletAddress = useSelector(address)
// const isBalanceLoading = useSelector(balanceLoading)
// const loadingPoolKeys = useSelector(isLoadingPoolKeys)

const { success, inProgress } = useSelector(initPosition)
const { data: ticksData, loading: ticksLoading, hasError: hasTicksError } = useSelector(plotTicks)
Expand Down Expand Up @@ -111,20 +107,6 @@ export const NewPositionWrapper: React.FC<IProps> = ({
}
}, [tokenAIndex, tokenBIndex, allPools])

useEffect(() => {
if (item1 && item2 && item3) {
const tokenA = tokens.findIndex(token => token.symbol === item1)
const tokenB = tokens.findIndex(token => token.symbol === item2)
const fee = ALL_FEE_TIERS_DATA.findIndex(tier => tier.fee === Number(item3) * 1e10)
console.log("hereeeee", { tokenA, tokenB, fee, tokens })
if (tokenA !== -1 && tokenB !== -1 && fee !== -1) {
setTokenAIndex(tokenA)
setTokenBIndex(tokenB)
setFeeIndex(fee)
}
}
}, []);

useEffect(() => {
dispatch(poolsActions.getPoolKeys())
}, [walletStatus, walletAddress])
Expand Down Expand Up @@ -521,9 +503,9 @@ export const NewPositionWrapper: React.FC<IProps> = ({
return BigInt(0)
}

useEffect(() => {
onRefresh()
}, [tokenAIndex, tokenBIndex, feeIndex])
// useEffect(() => {
// onRefresh()
// }, [tokenAIndex, tokenBIndex, feeIndex])

const onRefresh = () => {
console.log('onRefresh ', { tokenAIndex, tokenBIndex, feeIndex })
Expand Down
93 changes: 90 additions & 3 deletions src/store/consts/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import {
} from '@wasm';
import { Token, TokenPriceData } from './static';
import { PoolWithPoolKey } from '@/sdk/OraiswapV3.types';
import { Coin } from '@cosmjs/proto-signing';

export const parse = (value: any) => {
if (isArray(value)) {
Expand Down Expand Up @@ -597,7 +598,7 @@ export const poolKeyToString = (poolKey: PoolKey): string => {
export const getTokenBalances = async (tokens: string[]) => {
const tokenBalances = await Promise.all(
tokens.map(async token => {
if (token !== 'orai') {
if (token !== 'orai' && !token.includes('ibc')) {
if (!SingletonOraiswapV3.dex) {
return { address: token, balance: 0n };
}
Expand All @@ -607,6 +608,9 @@ export const getTokenBalances = async (tokens: string[]) => {
});
return { address: token, balance: BigInt(balance) };
} else {
if (!SingletonOraiswapV3.dex) {
return { address: token, balance: 0n };
}
const balance = await SingletonOraiswapV3.queryBalance(
SingletonOraiswapV3.dex.sender,
token
Expand Down Expand Up @@ -944,12 +948,17 @@ export const deserializeTickmap = (serializedTickmap: string): Tickmap => {
export const calculateAmountInWithSlippage = (
amountOut: bigint,
sqrtPriceLimit: bigint,
xToY: boolean
xToY: boolean,
fee: bigint
): bigint => {
const price = +printBigint(sqrtPriceToPrice(sqrtPriceLimit), PRICE_SCALE);
const amountIn = xToY ? Number(amountOut) * price : Number(amountOut) / price;

return BigInt(Math.ceil(amountIn));
const amountInWithFee =
Number(amountIn) *
(Number(PERCENTAGE_DENOMINATOR) / (Number(PERCENTAGE_DENOMINATOR) - Number(fee)));

return BigInt(Math.ceil(amountInWithFee));
};

export const sqrtPriceToPrice = (sqrtPrice: SqrtPrice | bigint): bigint => {
Expand Down Expand Up @@ -1212,7 +1221,15 @@ export const positionList = async (ownerId: string): Promise<Position[]> => {
}));
};

export const isNativeToken = (token: string): boolean => {
return token === 'orai' || token.includes('ibc');
};

export const approveToken = async (token: string, amount: bigint): Promise<string> => {
if (isNativeToken(token)) {
return '';
}

const result = await SingletonOraiswapV3.approveToken(token, amount);
return result.transactionHash;
};
Expand All @@ -1231,6 +1248,25 @@ export const swapWithSlippageTx = async (
!xToY
);

if (isNativeToken(poolKey.token_x) || isNativeToken(poolKey.token_y)) {
const denom = xToY ? poolKey.token_x : poolKey.token_y;

const res = await SingletonOraiswapV3.dex.swap(
{
poolKey,
xToY,
amount: amount.toString(),
byAmountIn,
sqrtPriceLimit: sqrtPriceAfterSlippage.toString()
},
'auto',
'',
[{ denom, amount: amount.toString() }]
);

return res.transactionHash;
}

const res = await SingletonOraiswapV3.dex.swap({
poolKey,
xToY,
Expand All @@ -1257,3 +1293,54 @@ export const getBalance = async (address: string): Promise<bigint> => {
const balance = await SingletonOraiswapV3.queryBalance(address, 'orai');
return BigInt(balance);
};

export const createPositionWithNativeTx = async (
poolKey: PoolKey,
lowerTick: number,
upperTick: number,
liquidityDelta: bigint,
spotSqrtPrice: bigint,
slippageTolerance: bigint,
initialAmountX: bigint,
initialAmountY: bigint
): Promise<string> => {
const slippageLimitLower = calculateSqrtPriceAfterSlippage(
spotSqrtPrice,
Number(slippageTolerance),
false
);
const slippageLimitUpper = calculateSqrtPriceAfterSlippage(
spotSqrtPrice,
Number(slippageTolerance),
true
);

const token_x = poolKey.token_x;
const token_y = poolKey.token_y;

const fund: Coin[] = [];

if (isNativeToken(token_x)) {
fund.push({ denom: token_x, amount: initialAmountX.toString() });
}

if (isNativeToken(token_y)) {
fund.push({ denom: token_y, amount: initialAmountY.toString() });
}

const res = await SingletonOraiswapV3.dex.createPosition(
{
poolKey,
lowerTick,
upperTick,
liquidityDelta: liquidityDelta.toString(),
slippageLimitLower: slippageLimitLower.toString(),
slippageLimitUpper: slippageLimitUpper.toString()
},
'auto',
'',
fund
);

return res.transactionHash;
};
Loading

0 comments on commit 7fe7ca2

Please sign in to comment.