import {
PaymentRequest,
PaymentResponse,
Transaction,
PrivateKey,
P2PKH,
Beef,
MerklePath
} from '@bsv/sdk';
// Pattern: Subscription payment
function createSubscriptionPaymentRequest(
recipientAddress: string,
monthlyAmount: number,
months: number,
subscriptionId: string
): PaymentRequest {
return {
network: 'mainnet',
outputs: [
{
script: new P2PKH().lock(recipientAddress).toHex(),
satoshis: monthlyAmount * months,
description: `${months}-month subscription`
}
],
creationTimestamp: Date.now(),
expirationTimestamp: Date.now() + (24 * 3600 * 1000), // 24 hours
memo: `Subscription payment for ${months} months`,
merchantData: JSON.stringify({
type: 'subscription',
subscriptionId,
months,
monthlyAmount,
startDate: Date.now()
})
};
}
// Pattern: Tipping / donation
function createTipPaymentRequest(
creatorAddress: string,
suggestedAmounts: number[],
creatorName: string,
contentId: string
): PaymentRequest {
// Use first suggested amount as default
const defaultAmount = suggestedAmounts[0];
return {
network: 'mainnet',
outputs: [
{
script: new P2PKH().lock(creatorAddress).toHex(),
satoshis: defaultAmount,
description: `Tip for ${creatorName}`
}
],
creationTimestamp: Date.now(),
memo: `Support ${creatorName}`,
merchantData: JSON.stringify({
type: 'tip',
creatorName,
contentId,
suggestedAmounts
})
};
}
// Pattern: Split payment
function createSplitPaymentRequest(
recipients: Array<{ address: string; amount: number; name: string }>,
orderId: string,
description: string
): PaymentRequest {
return {
network: 'mainnet',
outputs: recipients.map(recipient => ({
script: new P2PKH().lock(recipient.address).toHex(),
satoshis: recipient.amount,
description: `Payment to ${recipient.name}`
})),
creationTimestamp: Date.now(),
expirationTimestamp: Date.now() + (3600 * 1000),
memo: description,
merchantData: JSON.stringify({
type: 'split',
orderId,
recipients: recipients.map(r => ({ name: r.name, amount: r.amount }))
})
};
}
// Pattern: Conditional payment with refund address
function createConditionalPaymentRequest(
merchantAddress: string,
amount: number,
refundAddress: string,
condition: string,
orderId: string
): PaymentRequest {
return {
network: 'mainnet',
outputs: [
{
script: new P2PKH().lock(merchantAddress).toHex(),
satoshis: amount,
description: 'Conditional payment'
}
],
creationTimestamp: Date.now(),
expirationTimestamp: Date.now() + (7 * 24 * 3600 * 1000), // 7 days
memo: `Conditional payment: ${condition}`,
merchantData: JSON.stringify({
type: 'conditional',
orderId,
condition,
refundAddress,
terms: 'Refund if condition not met within 7 days'
})
};
}
// Pattern: Batch payment processing
class BatchPaymentProcessor {
/**
* Process multiple payments efficiently
*/
static async processPaymentBatch(
payments: Array<{
request: PaymentRequest;
orderId: string;
}>
): Promise<Array<{ orderId: string; success: boolean; txid?: string; error?: string }>> {
const results: Array<any> = [];
for (const payment of payments) {
try {
// Verify payment request is valid
if (payment.request.expirationTimestamp &&
Date.now() > payment.request.expirationTimestamp) {
results.push({
orderId: payment.orderId,
success: false,
error: 'Payment request expired'
});
continue;
}
// Process payment
// (In real implementation, would create transaction and broadcast)
const txid = 'mock_txid_' + payment.orderId;
results.push({
orderId: payment.orderId,
success: true,
txid
});
} catch (e) {
results.push({
orderId: payment.orderId,
success: false,
error: e.message
});
}
}
return results;
}
}
// Usage examples
const subscriptionRequest = createSubscriptionPaymentRequest(
'1MerchantAddr...',
1000,
12,
'SUB-123'
);
const tipRequest = createTipPaymentRequest(
'1CreatorAddr...',
[100, 500, 1000, 5000],
'Alice Creator',
'article-xyz'
);
const splitRequest = createSplitPaymentRequest(
[
{ address: '1Merchant...', amount: 7000, name: 'Merchant' },
{ address: '1Platform...', amount: 2000, name: 'Platform' },
{ address: '1Charity...', amount: 1000, name: 'Charity' }
],
'ORDER-999',
'Split payment for order'
);
const conditionalRequest = createConditionalPaymentRequest(
'1Merchant...',
10000,
'1Refund...',
'Product delivered within 7 days',
'ORDER-888'
);