@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
101 lines • 4.21 kB
JavaScript
"use strict";
/**
* @purpose Simplified cancelRental instruction wrapper
*
* Thin convenience wrapper around Codama-generated cancelRental instruction.
* Cancels an active rental with an optional delay.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.cancelRental = cancelRental;
const kit_1 = require("@solana/kit");
const instructions_1 = require("../generated/codama/instructions");
const config_1 = require("../utils/config");
const signer_1 = require("../utils/signer");
const srsly_1 = require("../pda/srsly");
const token_1 = require("../pda/token");
const instructions_2 = require("../utils/instructions");
const duration_1 = require("../params/duration");
const config_2 = require("../accounts/config");
const contract_1 = require("../accounts/contract");
/**
* Cancel an active rental and refund the borrower for unused time.
* Takes effect immediately or after a delay set by `cancelDelay`.
*
* @param params - Cancellation parameters (borrower, contract, cancelDelay)
* @param config - Optional SDK configuration overrides
* @returns Kit instruction (or web3.js if PublicKey in config)
*
* @example
* ```typescript
* // Default cancellation (uses contract's cancelDelayMin)
* const ix = await cancelRental({
* borrower: borrowerWallet,
* contract: contractAddress
* });
*
* // Instant cancellation
* const ix2 = await cancelRental({
* borrower: borrowerWallet,
* contract: contractAddress,
* cancelDelay: 0
* });
*
* // Cancel after 12 hours
* const ix3 = await cancelRental({
* borrower: borrowerWallet,
* contract: contractAddress,
* cancelDelay: { hours: 12 }
* });
* ```
*/
async function cancelRental(params, config) {
// Merge config
const finalConfig = (0, config_1.mergeConfig)(config);
// Validate required params
if (!params.borrower) {
throw new Error('borrower is required');
}
if (!params.contract) {
throw new Error('contract is required');
}
// Convert borrower to transaction signer
const borrowerSigner = (0, signer_1.toTransactionSigner)(params.borrower);
// Get atlasMint from on-chain config
const configAccount = await (0, config_2.fetchConfig)(finalConfig.rpcUrl);
const atlasMint = configAccount.data.atlasMint;
const addresses = (0, config_1.getAddresses)(config);
const programAddress = (0, kit_1.address)(addresses.srsly);
// Fetch contract to get fleet
const contractAccount = await (0, contract_1.fetchContract)(params.contract, finalConfig.rpcUrl);
const fleet = contractAccount.data.fleet;
// Derive active rental PDA (no more slot logic)
const rentalState = await (0, srsly_1.deriveActiveRental)(params.contract);
// Derive contract token account (ATA of contract PDA)
const contractAddress = (0, kit_1.address)(params.contract);
const contractTokenAccount = await (0, token_1.deriveAssociatedTokenAccount)(contractAddress, atlasMint);
// Convert duration to seconds (supports { hours: 1 }, { days: 1 }, etc.)
// Default to contract's cancelDelayMin if not specified
const cancelDelay = params.cancelDelay !== undefined
? BigInt((0, duration_1.convertDuration)(params.cancelDelay))
: contractAccount.data.cancelDelayMin;
// Resolve contract thread (system_program::ID means no thread configured)
const thread = (0, kit_1.address)(contractAccount.data.thread);
const hasThread = thread !== '11111111111111111111111111111111';
// Call Codama-generated instruction
// Note: Codama auto-derives config, borrowerState, borrowerTokenAccount, rentalAuthority
const kitInstruction = await (0, instructions_1.getCancelRentalInstructionAsync)({
mint: atlasMint,
borrower: borrowerSigner,
rentalState,
contractTokenAccount,
contract: contractAddress,
fleet: (0, kit_1.address)(fleet),
...(hasThread && { contractThread: thread }),
cancelDelay,
}, { programAddress });
return (0, instructions_2.prepareInstructions)(kitInstruction, {
computeUnits: params.computeUnits,
PublicKey: finalConfig.PublicKey,
});
}
//# sourceMappingURL=cancelRental.js.map