UNPKG

@wuwei-labs/srsly

Version:
73 lines 2.82 kB
/** * @purpose Discount authorization helper for server-side signing * @module utils/discountAuth * * Convenience wrapper that fetches member nonce + vault automatically, * then delegates to slyvault's createDiscountAuth for signing. */ import { address, createKeyPairSignerFromBytes } from '@solana/kit'; import { createDiscountAuth as slyvaultCreateDiscountAuth, fetchMember, } from '@wuwei-labs/slyvault'; import { getRpcUrl, mergeConfig } from './config'; /** * Sign and serialize a discount authorization. Server-side helper that * lets a designated authority pre-grant a fee discount, which the holder * can later attach to a vault deposit to redeem. * * @param params - Discount parameters * @param config - Optional SDK configuration overrides * @returns SerializedDiscountAuth ready for JSON API response * * @example * ```typescript * // Server-side: create discount for a borrower * const auth = await createDiscount({ * memberAddress: 'AFFILIATE_MEMBER_PDA', * contextKey: borrowerWallet, * discountBps: 500, // 5% * expirySeconds: 300, // 5 minutes * discountAuthority: process.env.DISCOUNT_KEY, // JSON keypair string * }); * * // Return via API — all fields are JSON-safe strings/numbers * res.json(auth); * ``` */ export async function createDiscount(params, config) { const finalConfig = mergeConfig(config); const rpcUrl = getRpcUrl(finalConfig); // Fetch member to get nonce + vault const memberAddr = address(params.memberAddress); const member = await fetchMember(memberAddr, rpcUrl); // Resolve discount authority signer const discountAuthority = await resolveAuthority(params.discountAuthority); // Compute expiry as unix timestamp const now = Math.floor(Date.now() / 1000); const expiresAt = BigInt(now + params.expirySeconds); return slyvaultCreateDiscountAuth({ contextKey: address(params.contextKey), memberNonce: member.data.nonce, discountBps: params.discountBps, expiresAt, vault: member.data.vault, discountAuthority, }); } async function resolveAuthority(authority) { if (typeof authority === 'string') { const bytes = JSON.parse(authority); if (!Array.isArray(bytes) || bytes.length !== 64) { throw new Error('Invalid keypair: expected JSON array of 64 bytes'); } return createKeyPairSignerFromBytes(new Uint8Array(bytes)); } if (authority instanceof Uint8Array) { return createKeyPairSignerFromBytes(authority); } if (Array.isArray(authority)) { return createKeyPairSignerFromBytes(new Uint8Array(authority)); } return authority; } // Re-export for convenience export { deserializeDiscountAuth } from '@wuwei-labs/slyvault'; //# sourceMappingURL=discountAuth.js.map