snackmoney-testing
Version:
A CLI tool for sending USDC payments on Twitter and Farcaster using x402.
147 lines (145 loc) • 5.12 kB
JavaScript
#!/usr/bin/env node
import { Logger } from './chunk-TQEXMNGL.js';
import axios from 'axios';
import { privateKeyToAccount } from 'viem/accounts';
import { withPaymentInterceptor, decodeXPaymentResponse } from 'x402-axios';
async function batchPay(cmd) {
const privateKey = process.env.PRIVATE_KEY;
const baseURL = "https://api.snack.money";
const endpointPath = "/payments/batch-pay";
if (!privateKey || !endpointPath) {
Logger.error("Missing required environment variables");
process.exit(1);
}
const { identity, receivers } = cmd;
const allowedIdentities = ["twitter", "farcaster"];
if (!allowedIdentities.includes(identity.toLowerCase())) {
Logger.error("receiver_identity must be either 'twitter' or 'farcaster'");
process.exit(1);
}
let parsedReceivers;
try {
parsedReceivers = JSON.parse(receivers);
if (!Array.isArray(parsedReceivers)) {
throw new Error("Receivers must be an array");
}
} catch (e) {
Logger.error(
// eslint-disable-next-line prettier/prettier
`receivers must be a valid JSON array, e.g. '[{"username":"jrsarath","name":"Sarath Singh","amount":0.5}]'`
);
process.exit(1);
}
const account = privateKeyToAccount(privateKey);
const api = withPaymentInterceptor(axios.create({ baseURL }), account);
try {
const response = await api.post(endpointPath, {
currency: "USDC",
type: "social-network",
sender_username: "snackmoney-agent-x402",
receiver_identity: identity,
receivers: parsedReceivers
});
Logger.log("response", response.data);
const paymentResponse = decodeXPaymentResponse(
// eslint-disable-next-line prettier/prettier
response.headers["x-payment-response"]
);
Logger.log(paymentResponse);
} catch (error) {
Logger.error("error", error);
}
}
async function confirmReward(cmd) {
const privateKey = process.env.PRIVATE_KEY;
const baseURL = "https://api.snack.money";
const endpointPath = "/rewards/confirm-distribution";
if (!privateKey || !endpointPath) {
Logger.error("Missing required environment variables");
process.exit(1);
}
const { orderId } = cmd;
const account = privateKeyToAccount(privateKey);
const api = withPaymentInterceptor(axios.create({ baseURL }), account);
try {
const response = await api.post(`${endpointPath}/${orderId}`);
Logger.log("response", JSON.stringify(response.data, null, 2));
} catch (error) {
Logger.error("error", error);
}
}
async function createReward(cmd) {
const privateKey = process.env.PRIVATE_KEY;
const baseURL = "https://api.snack.money";
const endpointPath = "/rewards/create-distribution";
if (!privateKey || !endpointPath) {
Logger.error("Missing required environment variables");
process.exit(1);
}
const { platform, contentId, budget } = cmd;
const allowedPlatforms = ["twitter", "farcaster"];
if (!allowedPlatforms.includes(platform.toLowerCase())) {
Logger.error("platform must be either 'twitter' or 'farcaster'");
process.exit(1);
}
const parsedBudget = parseFloat(budget);
if (isNaN(parsedBudget)) {
Logger.error("budget must be a valid number, e.g., 0.01");
process.exit(1);
}
const account = privateKeyToAccount(privateKey);
const api = withPaymentInterceptor(axios.create({ baseURL }), account);
try {
const response = await api.post(endpointPath, {
budget: parsedBudget,
platform,
content_id: contentId
});
Logger.log("response", JSON.stringify(response.data, null, 2));
} catch (error) {
Logger.error("error", error);
}
}
async function pay(cmd) {
const privateKey = process.env.PRIVATE_KEY;
const baseURL = "https://api.snack.money";
const endpointPath = "/payments/pay";
if (!privateKey || !endpointPath) {
Logger.error("Missing required environment variables");
process.exit(1);
}
const { identity, username, amount } = cmd;
const allowedIdentities = ["twitter", "farcaster"];
if (!allowedIdentities.includes(identity.toLowerCase())) {
Logger.error("receiver_identity must be either 'twitter' or 'farcaster'");
process.exit(1);
}
const parsedAmount = parseFloat(amount);
if (isNaN(parsedAmount)) {
Logger.error("Amount must be a valid number, e.g., 0.01");
process.exit(1);
}
const account = privateKeyToAccount(privateKey);
const api = withPaymentInterceptor(axios.create({ baseURL }), account);
try {
const response = await api.post(endpointPath, {
amount: parsedAmount,
currency: "USDC",
type: "social-network",
sender_username: "snackmoney-agent-x402",
receiver_username: username,
receiver_identity: identity
});
Logger.log("response", response.data);
const paymentResponse = decodeXPaymentResponse(
// eslint-disable-next-line prettier/prettier
response.headers["x-payment-response"]
);
Logger.log(paymentResponse);
} catch (error) {
Logger.error("error", error);
}
}
export { batchPay, confirmReward, createReward, pay };
//# sourceMappingURL=main.js.map
//# sourceMappingURL=main.js.map