ai-payments
Version:
A TypeScript library for AI payments functionality
76 lines • 2.93 kB
JavaScript
import { createWalletClient, http, publicActions } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { base, baseSepolia } from 'viem/chains';
import { createPaymentHeader } from 'x402/client';
import { processPriceToAtomicAmount } from 'x402/shared';
export var PaymentMethods;
(function (PaymentMethods) {
PaymentMethods["USDC_BASE_SEPOLIA"] = "USDC_BASE_SEPOLIA";
PaymentMethods["USDC_BASE_MAINNET"] = "USDC_BASE_MAINNET";
})(PaymentMethods || (PaymentMethods = {}));
export function getChainFromPaymentMethod(paymentMethod) {
switch (paymentMethod) {
case PaymentMethods.USDC_BASE_SEPOLIA:
return baseSepolia;
case PaymentMethods.USDC_BASE_MAINNET:
return base;
default:
throw new Error(`Unsupported payment method: ${paymentMethod}`);
}
}
export function getNetworkFromChain(chain) {
const networkName = chain.name.toLowerCase().replace(/\s+/g, '-');
switch (networkName) {
case 'base-sepolia':
return 'base-sepolia';
case 'base':
return 'base';
default:
throw new Error(`Unsupported network: ${networkName}`);
}
}
/**
* Sign a transaction for payment
*
* @param amount - Payment amount in USD
* @param sellerWalletAddress - Wallet address to receive payment
* @param buyerWalletAddress - Buyer's wallet private key (without 0x prefix)
* @param resource - Resource URI being paid for
* @param paymentMethod - Payment method to use
* @returns Payment header string or error message
*/
export async function signTransaction(amount, sellerWalletAddress, buyerWalletAddress, resource, paymentMethod) {
try {
const privateKey = `0x${buyerWalletAddress}`;
const chain = getChainFromPaymentMethod(paymentMethod);
const wallet = createWalletClient({
chain,
transport: http(),
account: privateKeyToAccount(privateKey),
}).extend(publicActions);
const atomicAmountForAsset = processPriceToAtomicAmount(amount, getNetworkFromChain(chain));
if ('error' in atomicAmountForAsset) {
throw new Error(atomicAmountForAsset.error);
}
const { maxAmountRequired, asset } = atomicAmountForAsset;
const paymentDetails = {
scheme: 'exact',
network: getNetworkFromChain(chain),
maxAmountRequired,
resource,
description: 'Payment for order',
mimeType: 'application/json',
payTo: sellerWalletAddress,
maxTimeoutSeconds: 300,
asset: asset.address,
outputSchema: undefined,
extra: asset?.eip712,
};
const paymentHeader = await createPaymentHeader(wallet, 1, paymentDetails);
return paymentHeader;
}
catch (error) {
return error.message;
}
}
//# sourceMappingURL=utils.js.map