@openocean.finance/widget-sdk
Version:
OpenOcean Any-to-Any Cross-Chain-Swap SDK
83 lines • 3.43 kB
JavaScript
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