UNPKG

@openocean.finance/widget-sdk

Version:

OpenOcean Any-to-Any Cross-Chain-Swap SDK

83 lines 3.43 kB
import { encodeFunctionData } from 'viem'; import { sendTransaction } from 'viem/actions'; import { getAction } from 'viem/utils'; import { isNativeTokenAddress } from '../../utils/isZeroAddress.js'; import { approveAbi } from './abi.js'; import { getAllowance } from './getAllowance.js'; import { getMaxPriorityFeePerGas } from './utils.js'; export const setAllowance = async (client, tokenAddress, contractAddress, amount, executionOptions, returnPopulatedTransaction) => { const data = encodeFunctionData({ abi: approveAbi, functionName: 'approve', args: [contractAddress, amount], }); if (returnPopulatedTransaction) { return data; } let transactionRequest = { to: tokenAddress, data, maxPriorityFeePerGas: client.account?.type === 'local' ? await getMaxPriorityFeePerGas(client) : undefined, }; if (executionOptions?.updateTransactionRequestHook) { const customizedTransactionRequest = await executionOptions.updateTransactionRequestHook({ requestType: 'approve', ...transactionRequest, }); transactionRequest = { ...transactionRequest, ...customizedTransactionRequest, }; } return getAction(client, sendTransaction, 'sendTransaction')({ to: transactionRequest.to, account: client.account, data: transactionRequest.data, gas: transactionRequest.gas, gasPrice: transactionRequest.gasPrice, maxFeePerGas: transactionRequest.maxFeePerGas, maxPriorityFeePerGas: transactionRequest.maxPriorityFeePerGas, }); }; /** * Set approval for a certain token and amount. * @param request - The approval request * @param request.walletClient - The Viem wallet client used to send the transaction * @param request.token - The token for which to set the allowance * @param request.spenderAddress - The address of the spender * @param request.amount - The amount of tokens to approve * @returns Returns Hash or nothing */ export const setTokenAllowance = async ({ walletClient, token, spenderAddress, amount, }) => { // native token don't need approval if (isNativeTokenAddress(token.address)) { return; } const approvedAmount = await getAllowance(token.chainId, token.address, walletClient.account.address, spenderAddress); if (amount > approvedAmount) { const approveTx = await setAllowance(walletClient, token.address, spenderAddress, amount); return approveTx; } }; /** * Revoke approval for a certain token. * @param request - The revoke request * @param request.walletClient - The Viem wallet client used to send the transaction * @param request.token - The token for which to revoke the allowance * @param request.spenderAddress - The address of the spender * @returns Returns Hash or nothing */ export const revokeTokenApproval = async ({ walletClient, token, spenderAddress, }) => { // native token don't need approval if (isNativeTokenAddress(token.address)) { return; } const approvedAmount = await getAllowance(token.chainId, token.address, walletClient.account.address, spenderAddress); if (approvedAmount > 0) { const approveTx = await setAllowance(walletClient, token.address, spenderAddress, 0n); return approveTx; } }; //# sourceMappingURL=setAllowance.js.map