dedust-io / sdk

DeDust Protocol 2.0 SDK
https://docs.dedust.io
Apache License 2.0
58 stars 15 forks source link

Swap Jetton to Ton #8

Open kasahh opened 3 months ago

kasahh commented 3 months ago

I am trying to swap jetton to ton programmatically using the "Swapping Jettons" example here: https://docs.dedust.io/docs/swaps. For some reasons it doesn't work and I have no idea why. 0.3Ton gets sent out and 0.2999Ton is immediately returned.

This is my code:

const tonClient = new TonClient4({ endpoint: "https://mainnet-v4.tonhubapi.com" });

const publicKey = keyPair.publicKey;
const privateKey = keyPair.secretKey;

const walletContract = tonClient.open(
    WalletContractV4.create({
        workchain: 0,
        publicKey,
    }),
)

const sender = walletContract.sender(privateKey)

const JETTON_ADDRESS = Address.parse('EQBlqsm144Dq6SjbPI4jjZvA1hqTIP3CvHovbIfW_t-SCALE');

const factory = tonClient.open(Factory.createFromAddress(MAINNET_FACTORY_ADDR));

const jettonRoot = tonClient.open(JettonRoot.createFromAddress(JETTON_ADDRESS));
const jettonWallet = tonClient.open(await jettonRoot.getWallet(sender.address));

const jettonVault = tonClient.open(await factory.getJettonVault(JETTON_ADDRESS));
const TON = Asset.native();
const JETTON = Asset.jetton(JETTON_ADDRESS);
const pool = tonClient.open(await factory.getPool(PoolType.VOLATILE, [JETTON, TON]));

if ((await pool.getReadinessStatus()) !== ReadinessStatus.READY) {
    throw new Error("Pool (TON, JETTON) does not exist.");
}

const amountIn = BigInt(Math.floor(jettonIn)); // 50 SCALE

await jettonWallet.sendTransfer(sender, toNano(0.3), {
amount: amountIn,
destination: jettonVault.address,
responseAddress: sender.address, // return gas to user
forwardAmount: toNano(gasAmount),
forwardPayload: VaultJetton.createSwapPayload({ poolAddress: pool.address }),
});

`

This is the transaction on chain: https://tonviewer.com/transaction/b229c7b02616f8b698fa1efa602fb89070f9fd77fa7c49fde6c11d00d01f0d8e

ybzy-xkd commented 3 months ago

Have you found a solution?

kasahh commented 3 months ago

No I didn't, I settled for the python version

ybzy-xkd commented 3 months ago

I also encountered this problem and was returned inexplicably.

ncsft commented 3 months ago

Debug variable sender.address, u will be surprised Then change const jettonWallet = tonClient.open(await jettonRoot.getWallet(sender.address)); to const jettonWallet = tonClient.open(await jettonRoot.getWallet(walletContract.address));

laptrinhbockchain commented 4 weeks ago

Debug variable sender.address, u will be surprised

It worked after changing: const jettonWallet = tonClient.open(await jettonRoot.getWallet(sender.address)); to const jettonWallet = tonClient.open(await jettonRoot.getWallet(walletContract.address)); Thank you!

jessepinkman9900 commented 3 weeks ago

i solved this by ensuring forward_amount < attached_amount

await jettonWallet.sendTransfer(
    sender,
    toNano("0.3"), // attached_amount
    {
      amount: tokenInAmount,
      destination: vault.address,
      responseAddress: wallet.address, // return gas
      forwardAmount: toNano("0.25"), // forward_amount has to be less than attached_amount
      forwardPayload: VaultJetton.createSwapPayload({
        poolAddress: pool.address,
        limit: minAmountOut,
      }),
    },
  );