diff --git a/docs/html/assets/search.js b/docs/html/assets/search.js index fc670d14..181fe0d8 100644 --- a/docs/html/assets/search.js +++ b/docs/html/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/html/functions/constructGetDeltaPrice.html b/docs/html/functions/constructGetDeltaPrice.html index b9edd606..3c997406 100644 --- a/docs/html/functions/constructGetDeltaPrice.html +++ b/docs/html/functions/constructGetDeltaPrice.html @@ -1 +1 @@ -constructGetDeltaPrice | @paraswap/sdk

Function constructGetDeltaPrice

+constructGetDeltaPrice | @paraswap/sdk

Function constructGetDeltaPrice

diff --git a/docs/html/index.html b/docs/html/index.html index 7e26266b..4a01bb9b 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -16,7 +16,7 @@
  import { constructSimpleSDK } from '@paraswap/sdk';
import axios from 'axios';

// construct minimal SDK with fetcher only
const paraSwapMin = constructSimpleSDK({chainId: 1, axios});
// or
const paraSwapMin = constructSimpleSDK({chainId: 1, fetch: window.fetch, version: '5'});

const ETH = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F';

async function swapExample() {
// or any other signer/provider
const signer: JsonRpcSigner = ethers.Wallet.fromMnmemonic('__your_mnemonic__');
const senderAddress = signer.address;

const priceRoute = await paraSwapMin.swap.getRate({
srcToken: ETH,
destToken: DAI,
amount: srcAmount,
userAddress: senderAddress,
side: SwapSide.SELL,
});

const txParams = await paraSwapMin.swap.buildTx(
{
srcToken,
destToken,
srcAmount,
destAmount,
priceRoute,
userAddress: senderAddress,
partner: referrer,
}
);

const transaction = {
...txParams,
gasPrice: '0x' + new BigNumber(txParams.gasPrice).toString(16),
gasLimit: '0x' + new BigNumber(5000000).toString(16),
value: '0x' + new BigNumber(txParams.value).toString(16),
};

const txr = await signer.sendTransaction(transaction);
}
-

If optional providerOptions is provided as the second parameter, then the resulting SDK will also be able to approve Tokens for swap.

+

If optional providerOptions is provided as the second parameter, then the resulting SDK will also be able to approve Tokens for swap, sign Orders, etc.

  // with ethers@5
const providerOptionsEtherV5 = {
ethersProviderOrSigner: provider, // JsonRpcProvider
EthersContract: ethers.Contract,
account: senderAddress,
};

// with ethers@6
const providerOptionsEtherV6 = {
ethersV6ProviderOrSigner: provider, // JsonRpcProvider
EthersV6Contract: ethers.Contract,
account: senderAddress,
};

// or with viem (from wagmi or standalone)
const providerOptionsViem = {
viemClient, // made with createWalletClient()
account: senderAddress,
};

// or with web3.js
const providerOptionsWeb3 = {
web3, // new Web3(...) instance
account: senderAddress,
};

const paraSwap = constructSimpleSDK({chainId: 1, axios}, providerOptionsEtherV5);

// approve token through sdk
const txHash = await paraSwap.approveToken(amountInWei, DAI);

// await tx somehow
await provider.waitForTransaction(txHash);
@@ -28,11 +28,63 @@
import { constructPartialSDK, constructFetchFetcher, constructGetRate, constructGetBalances } from '@paraswap/sdk';

const fetcher = constructFetchFetcher(window.fetch);

const minParaSwap = constructPartialSDK({
chainId: 1,
fetcher,
}, constructGetRate, constructGetBalances);

const priceRoute = await minParaSwap.getRate(params);
const allowance = await minParaSwap.getAllowance(userAddress, tokenAddress);
+

The easiest way to make a trade is to rely on Quote method that communicates with /quote API endpoint

-
import axios from 'axios';
import { ethers } from 'ethersV5';
import { constructSimpleSDK } from '@paraswap/sdk';

const ethersProvider = new ethers.providers.Web3Provider(window.ethereum);

const accounts = await ethersProvider.listAccounts();
const account = accounts[0]!;
const signer = ethersProvider.getSigner(account);

const simpleSDK = constructSimpleSDK(
{ chainId: 1, axios },
{
ethersProviderOrSigner: signer,
EthersContract: ethers.Contract,
account,
}
);

const amount = '1000000000000'; // wei
const Token1 = '0x1234...'
const Token2 = '0xabcde...'

const quote = await simpleSDK.quote.getQuote({
srcToken: Token1,
destToken: Token2,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 18,
mode: 'all', // Delta quote if possible, with fallback to Market price
side: 'SELL',
// partner: "..." // if available
});

if ('delta' in quote) {
const deltaPrice = quote.delta;

const DeltaContract = await simpleSDK.delta.getDeltaContract();

// or sign a Permit1 or Permit2 TransferFrom for DeltaContract
await simpleSDK.delta.approveTokenForDelta(amount, Token1);

const slippagePercent = 0.5;
const destAmountAfterSlippage = BigInt(
// get rid of exponential notation

+(+deltaPrice.destAmount * (1 - slippagePercent / 100)).toFixed(0)
// get rid of decimals
).toString(10);

const deltaAuction = await simpleSDK.delta.submitDeltaOrder({
deltaPrice,
owner: account,
// beneficiary: anotherAccount, // if need to send destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
destAmount: destAmountAfterSlippage, // minimum acceptable destAmount
});

// poll if necessary
const auction = await simpleSDK.delta.getDeltaOrderById(deltaAuction.id);
if (auction?.status === 'EXECUTED') {
console.log('Auction was executed');
}
} else {
console.log(
`Delta Quote failed: ${quote.fallbackReason.errorType} - ${quote.fallbackReason.details}`
);
const priceRoute = quote.market;

const TokenTransferProxy = await simpleSDK.swap.getSpender();

// or sign a Permit1 or Permit2 TransferFrom for TokenTransferProxy
const approveTxHash = simpleSDK.swap.approveToken(amount, Token1);

const txParams = await simpleSDK.swap.buildTx({
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
slippage: 250, // 2.5%
priceRoute,
userAddress: account,
// partner: '...' // if available
});

const swapTx = await signer.sendTransaction(txParams);
} +
import axios from 'axios';
import { ethers } from 'ethersV5';
import { constructSimpleSDK } from '@paraswap/sdk';

const ethersProvider = new ethers.providers.Web3Provider(window.ethereum);

const accounts = await ethersProvider.listAccounts();
const account = accounts[0]!;
const signer = ethersProvider.getSigner(account);

const simpleSDK = constructSimpleSDK(
{ chainId: 1, axios },
{
ethersProviderOrSigner: signer,
EthersContract: ethers.Contract,
account,
}
);

const amount = '1000000000000'; // wei
const Token1 = '0x1234...'
const Token2 = '0xabcde...'

const quote = await simpleSDK.quote.getQuote({
srcToken: Token1, // Native token (ETH) is only supported in mode: 'market'
destToken: Token2,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 18,
mode: 'all', // Delta quote if possible, with fallback to Market price
side: 'SELL', // Delta mode only supports side: SELL currenly
// partner: "..." // if available
});

if ('delta' in quote) {
const deltaPrice = quote.delta;

const DeltaContract = await simpleSDK.delta.getDeltaContract();

// or sign a Permit1 or Permit2 TransferFrom for DeltaContract
await simpleSDK.delta.approveTokenForDelta(amount, Token1);

const slippagePercent = 0.5;
const destAmountAfterSlippage = BigInt(
// get rid of exponential notation

+(+deltaPrice.destAmount * (1 - slippagePercent / 100)).toFixed(0)
// get rid of decimals
).toString(10);

const deltaAuction = await simpleSDK.delta.submitDeltaOrder({
deltaPrice,
owner: account,
// beneficiary: anotherAccount, // if need to send the output destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
destAmount: destAmountAfterSlippage, // minimum acceptable destAmount
});

// poll if necessary
const auction = await simpleSDK.delta.getDeltaOrderById(deltaAuction.id);
if (auction?.status === 'EXECUTED') {
console.log('Auction was executed');
}
} else {
console.log(
`Delta Quote failed: ${quote.fallbackReason.errorType} - ${quote.fallbackReason.details}`
);
const priceRoute = quote.market;

const TokenTransferProxy = await simpleSDK.swap.getSpender();

// or sign a Permit1 or Permit2 TransferFrom for TokenTransferProxy
const approveTxHash = simpleSDK.swap.approveToken(amount, Token1);

const txParams = await simpleSDK.swap.buildTx({
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
slippage: 250, // 2.5%
priceRoute,
userAddress: account,
// partner: '...' // if available
});

const swapTx = await signer.sendTransaction(txParams);
}
-

The ParaSwap class is exposed for backwards compatibility with previous versions of the SDK.

+

ParaSwap Delta is an intent-based protocol that enables a ParaSwap user to make gasless swaps where multiple agents compete to execute the trade at the best price possible. +This way the user doesn't need to make a transaction themselve but only to sign a Delta Order.

+

After getting deltaPrice from /quote endpoint, there are additional steps to sign the Order and wait for its execution.

+
const amount = '1000000000000'; // wei
const Token1 = '0x1234...'
const Token2 = '0xabcde...'

const quote = await simpleSDK.quote.getQuote({
srcToken: Token1, // Native token (ETH) is only supported in mode: 'market'
destToken: Token2,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 18,
mode: 'delta' // or mode: 'all'
// partner: "..." // if available
})

// if used mode: 'all'
if ('delta' in quote) {
const deltaPrice = quote.delta;
}

// if used mode: 'delta'
const deltaPrice = quote.delta; +
+ +
const approveTxHash = await simpleSDK.delta.approveTokenForDelta(amount, Token1);
+
+ +

Alternatively sign Permit (DAI or Permit1) or Permit2 TransferFrom with DeltaContract as the verifyingContract

+
const DeltaContract = await simpleSDK.delta.getDeltaContract();

// values depend on the Permit type and the srcToken
const signature = await signer._signTypedData(domain, types, message); +
+ +

See more on accepted Permit variants in ParaSwap documentation

+
// calculate acceptable destAmount
const slippagePercent = 0.5;
const destAmountAfterSlippage = (
+deltaPrice.destAmount *
(1 - slippagePercent / 100)
).toString(10);

const signableOrderData = await simpleSDK.delta.buildDeltaOrder({
deltaPrice,
owner: account,
// beneficiary: anotherAccount, // if need to send the output destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
destAmount: destAmountAfterSlippage, // minimum acceptable destAmount
// partner: "..." // if available
});

const signature = await simpleSDK.delta.signDeltaOrder(signableOrderData);

const deltaAuction = await simpleSDK.delta.postDeltaOrder({
// partner: "..." // if available
// partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill
order: signableOrderData.data,
signature,
}); +
+ +

As an option the buildDeltaOrder + signDeltaOrder + signDeltaOrder can be combined into one SDK call with the following code

+
const deltaAuction = await simpleSDK.delta.submitDeltaOrder({
deltaPrice,
owner: account,
// beneficiary: anotherAccount, // if need to send output destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
// partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
destAmount: destAmountAfterSlippage, // minimum acceptable destAmount
}); +
+ +

This allows to simplify the flow at the expense of control over the Order signing.

+

A portion of destToken will be collected as a partner fee if partner parameter is provided to buildDeltaOrder (and submitDeltaOrder). The partnerFee itself is deltaPrice.partnerFee

+

To examine the default partnerFee parameters ({partnerAddress: Address, partnerFee: number, takeSurplus: boolean}), you can call getPartnerFee method. These parameters are then encoded in Order.partnerAndFee field.

+
const partnerFeeResponse = await simpleSDK.delta.getPartnerFee({ partner });
+
+ +

Alternatively, you can supply your own partnerFee parameters that will be encoded in Order.partnerAndFee field

+
const signableOrderData = await simpleSDK.delta.buildDeltaOrder({
deltaPrice,
owner: account,
// beneficiary: anotherAccount, // if need to send the output destToken to another account
// permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract
// partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
destAmount: destAmountAfterSlippage, // minimum acceptable destAmount
partnerAddress: '0x1234...',
partnerFee: 0.12,
takeSurplus: true,
}); +
+ +
// poll if necessary
const auction = await simpleSDK.delta.getDeltaOrderById(deltaAuction.id);
if (auction?.status === 'EXECUTED') {
console.log('Auction was executed');
} +
+ +
+

Unlike the Delta Order, a Market swap requires the user themselves to submit a Swap transaction

+
const amount = '1000000000000'; // wei
const Token1 = '0x1234...'
const Token2 = '0xabcde...'

const quote = await simpleSDK.quote.getQuote({
srcToken: Token1, // Native token (ETH) is only supported in mode: 'market'
destToken: Token2,
amount,
userAddress: account,
srcDecimals: 18,
destDecimals: 18,
mode: 'market'
// partner: "..." // if available
})

// if used mode: 'all'
if ('market' in quote) {
const priceRoute = quote.market;
}

// if used mode: 'market'
const priceRoute = quote.market; +
+ +
const approveTxHash = simpleSDK.swap.approveToken(amount, DAI_TOKEN);
+
+ +

Alternatively sign Permit (DAI or Permit1) or Permit2 TransferFrom with TokenTransferProxy as the verifyingContract

+
const TokenTransferProxy = await simpleSDK.swap.getSpender();

// values depend on the Permit type and the srcToken
const signature = await signer._signTypedData(domain, types, message); +
+ +

See more on accepted Permit variants in ParaSwap documentation

+
const txParams = await simpleSDK.swap.buildTx({
srcToken: Token1,
destToken: Token2,
srcAmount: amount,
slippage: 250, // 2.5%
// can pass `destAmount` (adjusted for slippage) instead of `slippage`
priceRoute,
userAddress: account,
// partner: '...' // if available
// receiver: '0x123ae...' // if need to send the output destToken to another account
});

const swapTxHash = await signer.sendTransaction(txParams); +
+ +
+

The ParaSwap class is exposed for backwards compatibility with previous versions of the SDK.

import { ParaSwap } from '@paraswap/sdk';
import axios from 'axios';
import Web3 from 'web3';

const web3Provider = new Web3(window.ethereum);
const account = '__user_address__';

const paraswap = new ParaSwap({chainId: 1, web3Provider, account, axios});
@@ -48,4 +100,4 @@

Refer to SDK API documentation for detailed documentation on the methods provided in this SDK.

To run yarn test it is necessary to provide PROVIDER_URL=<mainnet_rpc_url> environment variable. If it is necessary to run tests against a different API endpoint, provide API_URL=url_to_API environment variable.

-
+
diff --git a/docs/html/media/DELTA.md b/docs/html/media/DELTA.md index 5cee9647..907b0f12 100644 --- a/docs/html/media/DELTA.md +++ b/docs/html/media/DELTA.md @@ -64,7 +64,7 @@ const slippagePercent = 0.5; (1 - slippagePercent / 100) ).toString(10); -const signableOrderData = await deltaSDK.buildDeltaOrder({ +const deltaAuction = await deltaSDK.submitDeltaOrder({ deltaPrice, owner: account, // beneficiary: anotherAccount, // if need to send destToken to another account diff --git a/docs/html/media/delta.ts b/docs/html/media/delta.ts new file mode 100644 index 00000000..5a10b733 --- /dev/null +++ b/docs/html/media/delta.ts @@ -0,0 +1,127 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import axios from 'axios'; +import { ethers, Wallet } from 'ethersV5'; +import { + constructPartialSDK, + constructEthersContractCaller, + constructAxiosFetcher, + constructAllDeltaOrdersHandlers, +} from '..'; + +const fetcher = constructAxiosFetcher(axios); + +const provider = ethers.getDefaultProvider(1); +const signer = Wallet.createRandom().connect(provider); +const account = signer.address; +const contractCaller = constructEthersContractCaller({ + ethersProviderOrSigner: provider, + EthersContract: ethers.Contract, +}); + +// type AdaptersFunctions & ApproveTokenFunctions +const deltaSDK = constructPartialSDK( + { + chainId: 1, + fetcher, + contractCaller, + }, + constructAllDeltaOrdersHandlers +); + +const DAI_TOKEN = '0x6b175474e89094c44da98b954eedeac495271d0f'; +const PSP_TOKEN = '0xcafe001067cdef266afb7eb5a286dcfd277f3de5'; + +async function simpleDeltaFlow() { + const amount = '1000000000000'; // wei + + const deltaPrice = await deltaSDK.getDeltaPrice({ + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + // partner: "..." // if available + }); + + const DeltaContract = await deltaSDK.getDeltaContract(); + + // or sign a Permit1 or Permit2 TransferFrom for DeltaContract + const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN); + await tx.wait(); + + const slippagePercent = 0.5; + const destAmountAfterSlippage = BigInt( + // get rid of exponential notation + + +(+deltaPrice.destAmount * (1 - slippagePercent / 100)).toFixed(0) + // get rid of decimals + ).toString(10); + + const deltaAuction = await deltaSDK.submitDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + }); + + // poll if necessary + const auction = await deltaSDK.getDeltaOrderById(deltaAuction.id); + if (auction?.status === 'EXECUTED') { + console.log('Auction was executed'); + } +} +async function manualDeltaFlow() { + const amount = '1000000000000'; // wei + + const deltaPrice = await deltaSDK.getDeltaPrice({ + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + // partner: "..." // if available + }); + + const DeltaContract = await deltaSDK.getDeltaContract(); + + // or sign a Permit1 or Permit2 TransferFrom for DeltaContract + const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN); + await tx.wait(); + + const slippagePercent = 0.5; + const destAmountAfterSlippage = ( + +deltaPrice.destAmount * + (1 - slippagePercent / 100) + ).toString(10); + + const signableOrderData = await deltaSDK.buildDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + }); + + const signature = await deltaSDK.signDeltaOrder(signableOrderData); + + const deltaAuction = await deltaSDK.postDeltaOrder({ + // partner: "..." // if available + order: signableOrderData.data, + signature, + }); + + // poll if necessary + const auction = await deltaSDK.getDeltaOrderById(deltaAuction.id); + if (auction?.status === 'EXECUTED') { + console.log('Auction was executed'); + } +} diff --git a/docs/html/media/passed_tests.png b/docs/html/media/passed_tests.png index cdf08a6e..287d24e4 100644 Binary files a/docs/html/media/passed_tests.png and b/docs/html/media/passed_tests.png differ diff --git a/docs/html/types/DeltaPrice.html b/docs/html/types/DeltaPrice.html index 628f8441..4edb7956 100644 --- a/docs/html/types/DeltaPrice.html +++ b/docs/html/types/DeltaPrice.html @@ -1 +1 @@ -DeltaPrice | @paraswap/sdk

Type Alias DeltaPrice

DeltaPrice: {
    destAmount: string;
    destAmountBeforeFee: string;
    destToken: string;
    destUSD: string;
    destUSDBeforeFee: string;
    gasCost: string;
    gasCostBeforeFee: string;
    gasCostUSD: string;
    gasCostUSDBeforeFee: string;
    partner: string;
    partnerFee: number;
    srcAmount: string;
    srcToken: string;
    srcUSD: string;
}
+DeltaPrice | @paraswap/sdk

Type Alias DeltaPrice

DeltaPrice: {
    destAmount: string;
    destAmountBeforeFee: string;
    destToken: string;
    destUSD: string;
    destUSDBeforeFee: string;
    gasCost: string;
    gasCostBeforeFee: string;
    gasCostUSD: string;
    gasCostUSDBeforeFee: string;
    hmac: string;
    partner: string;
    partnerFee: number;
    srcAmount: string;
    srcToken: string;
    srcUSD: string;
}
diff --git a/docs/html/types/GetDeltaPriceFunctions.html b/docs/html/types/GetDeltaPriceFunctions.html index 5f131653..2548cc59 100644 --- a/docs/html/types/GetDeltaPriceFunctions.html +++ b/docs/html/types/GetDeltaPriceFunctions.html @@ -1 +1 @@ -GetDeltaPriceFunctions | @paraswap/sdk

Type Alias GetDeltaPriceFunctions

GetDeltaPriceFunctions: {
    getDeltaPrice: GetDeltaPrice;
}
+GetDeltaPriceFunctions | @paraswap/sdk

Type Alias GetDeltaPriceFunctions

GetDeltaPriceFunctions: {
    getDeltaPrice: GetDeltaPrice;
}
diff --git a/docs/html/types/_internal_.GetDeltaPrice.html b/docs/html/types/_internal_.GetDeltaPrice.html index 5a3ad524..885c0f37 100644 --- a/docs/html/types/_internal_.GetDeltaPrice.html +++ b/docs/html/types/_internal_.GetDeltaPrice.html @@ -1 +1 @@ -GetDeltaPrice | @paraswap/sdk

Type Alias GetDeltaPrice

GetDeltaPrice: ((options: DeltaPriceParams, signal?: AbortSignal) => Promise<DeltaPrice>)
+GetDeltaPrice | @paraswap/sdk

Type Alias GetDeltaPrice

GetDeltaPrice: ((options: DeltaPriceParams, signal?: AbortSignal) => Promise<DeltaPrice>)
diff --git a/docs/md/-internal-/type-aliases/GetDeltaPrice.md b/docs/md/-internal-/type-aliases/GetDeltaPrice.md index 439916e5..29b44241 100644 --- a/docs/md/-internal-/type-aliases/GetDeltaPrice.md +++ b/docs/md/-internal-/type-aliases/GetDeltaPrice.md @@ -20,4 +20,4 @@ ## Defined in -[src/methods/delta/getDeltaPrice.ts:49](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L49) +[src/methods/delta/getDeltaPrice.ts:50](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L50) diff --git a/docs/md/README.md b/docs/md/README.md index cc10cad6..b7e966e4 100644 --- a/docs/md/README.md +++ b/docs/md/README.md @@ -83,7 +83,7 @@ Can be created by providing `chainId` and either `axios` or `window.fetch` (or a } ``` -If optional `providerOptions` is provided as the second parameter, then the resulting SDK will also be able to approve Tokens for swap. +If optional `providerOptions` is provided as the second parameter, then the resulting SDK will also be able to approve Tokens for swap, sign Orders, etc. ```ts // with ethers@5 @@ -159,6 +159,7 @@ const minParaSwap = constructPartialSDK({ const priceRoute = await minParaSwap.getRate(params); const allowance = await minParaSwap.getAllowance(userAddress, tokenAddress); ``` +-------------- ### Basic usage @@ -189,14 +190,14 @@ const Token1 = '0x1234...' const Token2 = '0xabcde...' const quote = await simpleSDK.quote.getQuote({ - srcToken: Token1, + srcToken: Token1, // Native token (ETH) is only supported in mode: 'market' destToken: Token2, amount, userAddress: account, srcDecimals: 18, destDecimals: 18, mode: 'all', // Delta quote if possible, with fallback to Market price - side: 'SELL', + side: 'SELL', // Delta mode only supports side: SELL currenly // partner: "..." // if available }); @@ -219,7 +220,7 @@ if ('delta' in quote) { const deltaAuction = await simpleSDK.delta.submitDeltaOrder({ deltaPrice, owner: account, - // beneficiary: anotherAccount, // if need to send destToken to another account + // beneficiary: anotherAccount, // if need to send the output destToken to another account // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract srcToken: Token1, destToken: Token2, @@ -257,7 +258,226 @@ if ('delta' in quote) { } ``` -#### For Delta protocol usage refer to [DELTA.md](_media/DELTA.md) +### Delta Order handling + +#### A more detailed overview of the Trade Flow, Delta Order variant. + +**ParaSwap Delta** is an intent-based protocol that enables a ParaSwap user to make gasless swaps where multiple agents compete to execute the trade at the best price possible. +This way the user doesn't need to make a transaction themselve but only to sign a Delta Order. + +After getting **deltaPrice** from **/quote** endpoint, there are additional steps to sign the Order and wait for its execution. + +### 1. Get deltaPrice from /quote + +```ts +const amount = '1000000000000'; // wei +const Token1 = '0x1234...' +const Token2 = '0xabcde...' + +const quote = await simpleSDK.quote.getQuote({ + srcToken: Token1, // Native token (ETH) is only supported in mode: 'market' + destToken: Token2, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + mode: 'delta' // or mode: 'all' + // partner: "..." // if available +}) + +// if used mode: 'all' +if ('delta' in quote) { + const deltaPrice = quote.delta; +} + +// if used mode: 'delta' +const deltaPrice = quote.delta; +``` + +### 2. Approve srcToken for DeltaContract + +```ts +const approveTxHash = await simpleSDK.delta.approveTokenForDelta(amount, Token1); +``` + +Alternatively sign Permit (DAI or Permit1) or Permit2 TransferFrom with DeltaContract as the verifyingContract + +```ts +const DeltaContract = await simpleSDK.delta.getDeltaContract(); + +// values depend on the Permit type and the srcToken +const signature = await signer._signTypedData(domain, types, message); +``` + +See more on accepted Permit variants in [ParaSwap documentation](https://developers.paraswap.network/api/paraswap-delta/build-and-sign-a-delta-order#supported-permits) + +### 3. Sign and submit a Delta Order + +```ts +// calculate acceptable destAmount +const slippagePercent = 0.5; + const destAmountAfterSlippage = ( + +deltaPrice.destAmount * + (1 - slippagePercent / 100) + ).toString(10); + +const signableOrderData = await simpleSDK.delta.buildDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send the output destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + srcToken: Token1, + destToken: Token2, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + // partner: "..." // if available +}); + +const signature = await simpleSDK.delta.signDeltaOrder(signableOrderData); + +const deltaAuction = await simpleSDK.delta.postDeltaOrder({ + // partner: "..." // if available + // partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill + order: signableOrderData.data, + signature, +}); +``` + +#### 3.a. + +As an option the `buildDeltaOrder + signDeltaOrder + signDeltaOrder` can be combined into one SDK call with the following code + +```ts +const deltaAuction = await simpleSDK.delta.submitDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send output destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + // partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill + srcToken: Token1, + destToken: Token2, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount +}); +``` + +This allows to simplify the flow at the expense of control over the Order signing. + +#### 3.b adding partner fee + +A portion of destToken will be collected as a partner fee if `partner` parameter is provided to `buildDeltaOrder` (and `submitDeltaOrder`). The `partnerFee` itself is `deltaPrice.partnerFee` + +To examine the default partnerFee parameters (`{partnerAddress: Address, partnerFee: number, takeSurplus: boolean}`), you can call `getPartnerFee` method. These parameters are then encoded in Order.partnerAndFee field. + +```ts +const partnerFeeResponse = await simpleSDK.delta.getPartnerFee({ partner }); +``` + +Alternatively, you can supply your own partnerFee parameters that will be encoded in Order.partnerAndFee field + +```ts +const signableOrderData = await simpleSDK.delta.buildDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send the output destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + // partiallyFillabel: true, // allow the Order to be partially filled as opposed to fill-or-kill + srcToken: Token1, + destToken: Token2, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + partnerAddress: '0x1234...', + partnerFee: 0.12, + takeSurplus: true, +}); +``` + +### 4. Wait for Delta Order execution + +```ts +// poll if necessary +const auction = await simpleSDK.delta.getDeltaOrderById(deltaAuction.id); +if (auction?.status === 'EXECUTED') { + console.log('Auction was executed'); +} +``` + +#### A more detailed example of Delta Order usage can be found in [examples/delta](_media/delta.ts) + +#### For more Delta protocol usage refer to [DELTA.md](_media/DELTA.md) +------------ + +### Market Swap handling + +#### A more detailed overview of the Trade Flow, Market variant. + +Unlike the Delta Order, a Market swap requires the user themselves to submit a Swap transaction + +### 1. Get Market priceRoute from /quote + +```ts +const amount = '1000000000000'; // wei +const Token1 = '0x1234...' +const Token2 = '0xabcde...' + +const quote = await simpleSDK.quote.getQuote({ + srcToken: Token1, // Native token (ETH) is only supported in mode: 'market' + destToken: Token2, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + mode: 'market' + // partner: "..." // if available +}) + +// if used mode: 'all' +if ('market' in quote) { + const priceRoute = quote.market; +} + +// if used mode: 'market' +const priceRoute = quote.market; +``` + +### 2. Approve srcToken for TokenTransferProxy + +```ts +const approveTxHash = simpleSDK.swap.approveToken(amount, DAI_TOKEN); +``` + +Alternatively sign Permit (DAI or Permit1) or Permit2 TransferFrom with TokenTransferProxy as the verifyingContract + +```ts +const TokenTransferProxy = await simpleSDK.swap.getSpender(); + +// values depend on the Permit type and the srcToken +const signature = await signer._signTypedData(domain, types, message); +``` + +See more on accepted Permit variants in [ParaSwap documentation](https://developers.paraswap.network/api/build-parameters-for-transaction) + +### 3. Send Swap transaction + +```ts +const txParams = await simpleSDK.swap.buildTx({ + srcToken: Token1, + destToken: Token2, + srcAmount: amount, + slippage: 250, // 2.5% + // can pass `destAmount` (adjusted for slippage) instead of `slippage` + priceRoute, + userAddress: account, + // partner: '...' // if available + // receiver: '0x123ae...' // if need to send the output destToken to another account +}); + +const swapTxHash = await signer.sendTransaction(txParams); +``` + +#### See more details on `buildTx` parameters in [ParaSwap documentation](https://developers.paraswap.network/api/build-parameters-for-transaction) + +------------------------ ### Legacy The `ParaSwap` class is exposed for backwards compatibility with previous versions of the SDK. diff --git a/docs/md/_media/DELTA.md b/docs/md/_media/DELTA.md index 5cee9647..907b0f12 100644 --- a/docs/md/_media/DELTA.md +++ b/docs/md/_media/DELTA.md @@ -64,7 +64,7 @@ const slippagePercent = 0.5; (1 - slippagePercent / 100) ).toString(10); -const signableOrderData = await deltaSDK.buildDeltaOrder({ +const deltaAuction = await deltaSDK.submitDeltaOrder({ deltaPrice, owner: account, // beneficiary: anotherAccount, // if need to send destToken to another account diff --git a/docs/md/_media/delta.ts b/docs/md/_media/delta.ts new file mode 100644 index 00000000..5a10b733 --- /dev/null +++ b/docs/md/_media/delta.ts @@ -0,0 +1,127 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import axios from 'axios'; +import { ethers, Wallet } from 'ethersV5'; +import { + constructPartialSDK, + constructEthersContractCaller, + constructAxiosFetcher, + constructAllDeltaOrdersHandlers, +} from '..'; + +const fetcher = constructAxiosFetcher(axios); + +const provider = ethers.getDefaultProvider(1); +const signer = Wallet.createRandom().connect(provider); +const account = signer.address; +const contractCaller = constructEthersContractCaller({ + ethersProviderOrSigner: provider, + EthersContract: ethers.Contract, +}); + +// type AdaptersFunctions & ApproveTokenFunctions +const deltaSDK = constructPartialSDK( + { + chainId: 1, + fetcher, + contractCaller, + }, + constructAllDeltaOrdersHandlers +); + +const DAI_TOKEN = '0x6b175474e89094c44da98b954eedeac495271d0f'; +const PSP_TOKEN = '0xcafe001067cdef266afb7eb5a286dcfd277f3de5'; + +async function simpleDeltaFlow() { + const amount = '1000000000000'; // wei + + const deltaPrice = await deltaSDK.getDeltaPrice({ + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + // partner: "..." // if available + }); + + const DeltaContract = await deltaSDK.getDeltaContract(); + + // or sign a Permit1 or Permit2 TransferFrom for DeltaContract + const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN); + await tx.wait(); + + const slippagePercent = 0.5; + const destAmountAfterSlippage = BigInt( + // get rid of exponential notation + + +(+deltaPrice.destAmount * (1 - slippagePercent / 100)).toFixed(0) + // get rid of decimals + ).toString(10); + + const deltaAuction = await deltaSDK.submitDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + }); + + // poll if necessary + const auction = await deltaSDK.getDeltaOrderById(deltaAuction.id); + if (auction?.status === 'EXECUTED') { + console.log('Auction was executed'); + } +} +async function manualDeltaFlow() { + const amount = '1000000000000'; // wei + + const deltaPrice = await deltaSDK.getDeltaPrice({ + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + amount, + userAddress: account, + srcDecimals: 18, + destDecimals: 18, + // partner: "..." // if available + }); + + const DeltaContract = await deltaSDK.getDeltaContract(); + + // or sign a Permit1 or Permit2 TransferFrom for DeltaContract + const tx = await deltaSDK.approveTokenForDelta(amount, DAI_TOKEN); + await tx.wait(); + + const slippagePercent = 0.5; + const destAmountAfterSlippage = ( + +deltaPrice.destAmount * + (1 - slippagePercent / 100) + ).toString(10); + + const signableOrderData = await deltaSDK.buildDeltaOrder({ + deltaPrice, + owner: account, + // beneficiary: anotherAccount, // if need to send destToken to another account + // permit: "0x1234...", // if signed a Permit1 or Permit2 TransferFrom for DeltaContract + srcToken: DAI_TOKEN, + destToken: PSP_TOKEN, + srcAmount: amount, + destAmount: destAmountAfterSlippage, // minimum acceptable destAmount + }); + + const signature = await deltaSDK.signDeltaOrder(signableOrderData); + + const deltaAuction = await deltaSDK.postDeltaOrder({ + // partner: "..." // if available + order: signableOrderData.data, + signature, + }); + + // poll if necessary + const auction = await deltaSDK.getDeltaOrderById(deltaAuction.id); + if (auction?.status === 'EXECUTED') { + console.log('Auction was executed'); + } +} diff --git a/docs/md/_media/passed_tests.png b/docs/md/_media/passed_tests.png index cdf08a6e..287d24e4 100644 Binary files a/docs/md/_media/passed_tests.png and b/docs/md/_media/passed_tests.png differ diff --git a/docs/md/functions/constructGetDeltaPrice.md b/docs/md/functions/constructGetDeltaPrice.md index ae2e7569..1816d12d 100644 --- a/docs/md/functions/constructGetDeltaPrice.md +++ b/docs/md/functions/constructGetDeltaPrice.md @@ -18,4 +18,4 @@ ## Defined in -[src/methods/delta/getDeltaPrice.ts:58](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L58) +[src/methods/delta/getDeltaPrice.ts:59](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L59) diff --git a/docs/md/type-aliases/DeltaPrice.md b/docs/md/type-aliases/DeltaPrice.md index 914299bf..e9a3cd06 100644 --- a/docs/md/type-aliases/DeltaPrice.md +++ b/docs/md/type-aliases/DeltaPrice.md @@ -46,6 +46,10 @@ > **gasCostUSDBeforeFee**: `string` +### hmac + +> **hmac**: `string` + ### partner > **partner**: `string` diff --git a/docs/md/type-aliases/GetDeltaPriceFunctions.md b/docs/md/type-aliases/GetDeltaPriceFunctions.md index 2ef95df5..30ad9312 100644 --- a/docs/md/type-aliases/GetDeltaPriceFunctions.md +++ b/docs/md/type-aliases/GetDeltaPriceFunctions.md @@ -16,4 +16,4 @@ ## Defined in -[src/methods/delta/getDeltaPrice.ts:54](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L54) +[src/methods/delta/getDeltaPrice.ts:55](https://github.com/paraswap/paraswap-sdk/blob/master/src/methods/delta/getDeltaPrice.ts#L55)