Skip to content

Commit

Permalink
fix-dedust (#790)
Browse files Browse the repository at this point in the history
  • Loading branch information
PseudoElement authored Dec 26, 2024
2 parents f337826 + c5300df commit 8bf97fe
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 36 deletions.
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "rubic-sdk",
"version": "5.49.6",
"version": "5.49.7",
"description": "Simplify dApp creation",
"main": "lib/index.js",
"types": "lib/index.d.ts",
Expand Down Expand Up @@ -67,7 +67,8 @@
"analyze": "webpack --profile --json > stats.json && webpack-bundle-analyzer stats.json",
"docs": "yarn create-index && typedoc && yarn delete-index",
"publish": "yarn publish --access public",
"publish:alpha": "yarn publish --access public --tag alpha"
"publish:alpha": "yarn publish --access public --tag alpha",
"test:file": "jest -- __tests__/unit-tests/dedust"
},
"dependencies": {
"@1inch/limit-order-protocol-utils": "3.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { DlnOnChainProvider } from 'src/features/on-chain/calculation-manager/pr
import { PiteasProvider } from 'src/features/on-chain/calculation-manager/providers/aggregators/piteas/piteas-provider';

import { CoffeeSwapProvider } from '../providers/aggregators/coffee-swap/coffee-swap-on-chain-provider';
import { DedustOnChainProvider } from '../providers/aggregators/dedust/dedust-on-chain-provider';
import { LifiProvider } from '../providers/aggregators/lifi/lifi-provider';
import { NativeRouterProvider } from '../providers/aggregators/native-router/native-router-provider';
import { OdosOnChainProvider } from '../providers/aggregators/odos/odos-on-chain-provider';
Expand All @@ -28,7 +29,7 @@ export const AGGREGATORS_ON_CHAIN = {
ONE_INCH: OneInchProvider,
ZETA_SWAP: ZetaSwapProvider,
NATIVE_ROUTER: NativeRouterProvider,
// DEDUST: DedustOnChainProvider,
DEDUST: DedustOnChainProvider,
//STONFI: StonfiOnChainProvider,
COFFEE_SWAP: CoffeeSwapProvider,
SQUIDROUTER: SquidRouterOnChainProvider,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Address } from '@ton/core';
import { RubicSdkError } from 'src/common/errors';
import { PriceTokenAmount, Token } from 'src/common/tokens';
import { TonWeb3Pure } from 'src/core/blockchain/web3-pure/typed-web3-pure/ton-web3-pure/ton-web3-pure';
import { Injector } from 'src/core/injector/injector';
Expand All @@ -17,7 +18,7 @@ export class DedustApiService {
const fromRawAddress = from.isNative ? 'native' : `jetton:${fromAddresses.raw_form}`;
const toRawAddress = to.isNative ? 'native' : `jetton:${toAddresses.raw_form}`;

const [pools] = await Injector.httpClient.post<DedustPoolsResponse>(
const resp = await Injector.httpClient.post<DedustPoolsResponse>(
`${this.apiUrl}/routing/plan`,
{
from: fromRawAddress,
Expand All @@ -26,6 +27,11 @@ export class DedustApiService {
}
);

if (resp.length > 1) {
throw new RubicSdkError('Multihop swaps are forbidden in dedust.');
}
const pools = resp[0];

return pools.map(p => ({
amountOut: p.amountOut,
poolAddress: Address.parse(p.pool.address),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ export class DedustSwapService {
}

this.cacheStepsOnCalculation(pools);
console.log(
'%cDedust_TransitTokensCount',
'color: blue; font-size: 20px;',
pools.length - 1
);
const outputWeiAmountString = pools.at(-1)!.amountOut;

return outputWeiAmountString;
Expand Down Expand Up @@ -260,57 +265,64 @@ export class DedustSwapService {
const jettonRoot = this.tonClient.open(JettonRoot.createFromAddress(parsedAddress));
const jettonWallet = this.tonClient.open(await jettonRoot.getWallet(sender.address!));

const initParams = {
poolAddress: this.txSteps[0]!.poolAddress,
limit: BigInt(this.txSteps[0]!.amountOut),
next: {}
} as SwapStep;

const swapPayloadParams = this.makeSwapPayloadParams(
initParams,
initParams.next!,
this.txSteps,
slippage
);
const payloadParams = {} as SwapStep;
this.fillPayloadParams(this.txSteps, slippage, payloadParams);
console.log('%cDedust_Params', 'color: green; font-size: 20px;', payloadParams);

if (!this.checkSwapPayloadValid(payloadParams)) {
console.log(
'%cInvalid_swapPayloadParams',
'color: red; font-size: 20px;',
payloadParams
);
throw new RubicSdkError(
'Swap payload for dedust has empty `next` property or undefined `poolAddress`.'
);
}

await jettonWallet.sendTransfer(sender, toNano(DEDUST_GAS_NON_WEI), {
amount: BigInt(from.stringWeiAmount),
destination: jettonVault.address,
responseAddress: sender.address,
forwardAmount: toNano(0.15),
queryId: RUBIC_REF_NAME_FOR_DEDUST,
forwardPayload: VaultJetton.createSwapPayload(swapPayloadParams)
forwardPayload: VaultJetton.createSwapPayload(payloadParams)
});
}

private makeSwapPayloadParams(
payloadParams: SwapStep,
next: SwapStep,
txSteps: DedustTxStep[],
slippage: number
): SwapStep {
if (!txSteps.length) return payloadParams;
/**
* @param next on first iteration - it's payloadParams, then .next
* @param payloadParams
* @returns
*/
private fillPayloadParams(steps: DedustTxStep[], slippage: number, next: SwapStep): void {
if (!steps.length) return;

const step = txSteps[0]!;
const isFirstStep = txSteps.length === this.txSteps.length;
const step = steps[0]!;
const minAmountOut = BigInt(
new BigNumber(step.amountOut).multipliedBy(1 - slippage).toFixed(0)
);

if (isFirstStep) {
payloadParams.poolAddress = step.poolAddress;
payloadParams.limit = minAmountOut;
} else {
next.poolAddress = step.poolAddress;
next.limit = minAmountOut;
}
next.poolAddress = step.poolAddress;
next.limit = minAmountOut;

const slicedSteps = txSteps.slice(1);
if (slicedSteps.length && !isFirstStep) {
steps.shift();
if (steps.length) {
next.next = {} as SwapStep;
next = next.next;
}

return this.makeSwapPayloadParams(payloadParams, next, slicedSteps, slippage);
return this.fillPayloadParams(steps, slippage, next);
}

public checkSwapPayloadValid(payloadParams: SwapStep): boolean {
let next: SwapStep | undefined = payloadParams;
while (next) {
if (!next.poolAddress) return false;
if (next.next && !Object.keys(next.next).length) return false;
next = next.next;
}

return true;
}
}

0 comments on commit 8bf97fe

Please sign in to comment.