UNPKG

svm-pay

Version:

A payment solution for SVM networks (Solana, Sonic SVM, Eclipse, s00n)

184 lines 6.32 kB
"use strict"; /** * SVM-Pay URL Scheme * * This file implements the URL scheme for SVM-Pay payment requests. * The scheme is based on Solana Pay but extended to support multiple SVM networks. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.parseURL = parseURL; exports.createTransferURL = createTransferURL; exports.createTransactionURL = createTransactionURL; exports.createURL = createURL; const types_1 = require("./types"); /** * URL scheme prefixes for each supported network */ const NETWORK_PREFIXES = { [types_1.SVMNetwork.SOLANA]: 'solana', [types_1.SVMNetwork.SONIC]: 'sonic', [types_1.SVMNetwork.ECLIPSE]: 'eclipse', [types_1.SVMNetwork.SOON]: 'soon' }; /** * Parse a payment URL into a PaymentRequest object * * @param url The payment URL to parse * @returns A PaymentRequest object */ function parseURL(url) { try { const parsedUrl = new URL(url); const protocol = parsedUrl.protocol.replace(':', ''); // Determine network from protocol let network; switch (protocol) { case NETWORK_PREFIXES[types_1.SVMNetwork.SOLANA]: network = types_1.SVMNetwork.SOLANA; break; case NETWORK_PREFIXES[types_1.SVMNetwork.SONIC]: network = types_1.SVMNetwork.SONIC; break; case NETWORK_PREFIXES[types_1.SVMNetwork.ECLIPSE]: network = types_1.SVMNetwork.ECLIPSE; break; case NETWORK_PREFIXES[types_1.SVMNetwork.SOON]: network = types_1.SVMNetwork.SOON; break; default: throw new Error(`Unsupported protocol: ${protocol}`); } // Get recipient from pathname (removing leading slash) const recipient = parsedUrl.pathname.substring(1); if (!recipient) { throw new Error('Missing recipient'); } // Parse query parameters const params = parsedUrl.searchParams; // Check if this is a transaction request if (params.has('link')) { const link = params.get('link'); const request = { type: types_1.RequestType.TRANSACTION, network, recipient, link, }; // Add optional parameters if (params.has('label')) request.label = params.get('label'); if (params.has('message')) request.message = params.get('message'); if (params.has('memo')) request.memo = params.get('memo'); // Parse references const references = params.getAll('reference'); if (references.length > 0) { request.references = references; } return request; } else { // This is a transfer request const amount = params.get('amount'); if (!amount) { throw new Error('Transfer request requires an amount parameter'); } const request = { type: types_1.RequestType.TRANSFER, network, recipient, amount, }; // Add optional parameters if (params.has('spl-token')) request.splToken = params.get('spl-token'); if (params.has('label')) request.label = params.get('label'); if (params.has('message')) request.message = params.get('message'); if (params.has('memo')) request.memo = params.get('memo'); // Parse references const references = params.getAll('reference'); if (references.length > 0) { request.references = references; } return request; } } catch (error) { throw new Error(`Invalid payment URL: ${error.message}`); } } /** * Create a payment URL from a TransferRequest * * @param request The TransferRequest to convert to a URL * @returns A payment URL string */ function createTransferURL(request) { const { network, recipient, amount, splToken, label, message, memo, references } = request; // Create URL with network protocol and recipient const url = new URL(`${NETWORK_PREFIXES[network]}:${recipient}`); // Add optional parameters if (amount) url.searchParams.append('amount', amount); if (splToken) url.searchParams.append('spl-token', splToken); if (label) url.searchParams.append('label', label); if (message) url.searchParams.append('message', message); if (memo) url.searchParams.append('memo', memo); // Add references if (references && references.length > 0) { references.forEach(reference => { url.searchParams.append('reference', reference); }); } return url.toString(); } /** * Create a payment URL from a TransactionRequest * * @param request The TransactionRequest to convert to a URL * @returns A payment URL string */ function createTransactionURL(request) { const { network, recipient, link, label, message, memo, references } = request; // Create URL with network protocol and recipient const url = new URL(`${NETWORK_PREFIXES[network]}:${recipient}`); // Add link parameter url.searchParams.append('link', link); // Add optional parameters if (label) url.searchParams.append('label', label); if (message) url.searchParams.append('message', message); if (memo) url.searchParams.append('memo', memo); // Add references if (references && references.length > 0) { references.forEach(reference => { url.searchParams.append('reference', reference); }); } return url.toString(); } /** * Create a payment URL from any PaymentRequest * * @param request The PaymentRequest to convert to a URL * @returns A payment URL string */ function createURL(request) { if (request.type === types_1.RequestType.TRANSFER) { return createTransferURL(request); } else { return createTransactionURL(request); } } //# sourceMappingURL=url-scheme.js.map