UNPKG

@wuwei-labs/srsly

Version:
101 lines 4.21 kB
"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