@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
73 lines • 2.82 kB
JavaScript
/**
* @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