@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
78 lines • 3.12 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.
*/
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