UNPKG

@wuwei-labs/srsly

Version:
78 lines 3.12 kB
"use strict"; /** * @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. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.deserializeDiscountAuth = void 0; exports.createDiscount = createDiscount; const kit_1 = require("@solana/kit"); const slyvault_1 = require("@wuwei-labs/slyvault"); const config_1 = require("./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); * ``` */ async function createDiscount(params, config) { const finalConfig = (0, config_1.mergeConfig)(config); const rpcUrl = (0, config_1.getRpcUrl)(finalConfig); // Fetch member to get nonce + vault const memberAddr = (0, kit_1.address)(params.memberAddress); const member = await (0, slyvault_1.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 (0, slyvault_1.createDiscountAuth)({ contextKey: (0, kit_1.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 (0, kit_1.createKeyPairSignerFromBytes)(new Uint8Array(bytes)); } if (authority instanceof Uint8Array) { return (0, kit_1.createKeyPairSignerFromBytes)(authority); } if (Array.isArray(authority)) { return (0, kit_1.createKeyPairSignerFromBytes)(new Uint8Array(authority)); } return authority; } // Re-export for convenience var slyvault_2 = require("@wuwei-labs/slyvault"); Object.defineProperty(exports, "deserializeDiscountAuth", { enumerable: true, get: function () { return slyvault_2.deserializeDiscountAuth; } }); //# sourceMappingURL=discountAuth.js.map