@wuwei-labs/srsly
v3.0.0-beta.19
Published
TypeScript SDK for SRSLY
Maintainers
Readme
@wuwei-labs/srsly
Simplified TypeScript SDK for SRSLY
Status: 🚧 Beta - Under active development
What is this?
This is a simplified TypeScript SDK for SRSLY. It's a thin convenience wrapper around Codama-generated TypeScript clients, focusing on simplicity and maintainability.
Key Differences from @wuwei-labs/srsly
Simpler (80% less code)
- Old: 4,000+ lines of custom abstractions
- New: ~800 lines of thin wrappers
Clearer Purpose
- Old: Framework with fluent APIs, factories, builders
- New: Convenience wrapper around Codama
Easier Configuration
- Old: Fluent selectors, chainable configs, network modules
- New: Simple global config + optional overrides
Better Maintenance
- Old: Complex abstractions break when Codama updates
- New: Thin wrappers adapt easily to Codama changes
Installation
pnpm add @wuwei-labs/srslyQuick Start
With @solana/kit (default)
import { setSdkConfig, createContract } from '@wuwei-labs/srsly';
// Set global config once
setSdkConfig({ network: 'atlasnet' });
// Create a contract - returns @solana/kit instruction
const instruction = await createContract({
owner: walletAddress, // string address
fleet: fleetAddress,
ownerProfile: profileAddress,
gameId: gameAddress,
rate: 100, // 100 ATLAS per payment
durationMax: { days: 30 },
paymentsFreq: '@daily'
});With @solana/web3.js
import { PublicKey } from '@solana/web3.js';
import { setSdkConfig, createContract } from '@wuwei-labs/srsly';
// Set global config with PublicKey constructor
setSdkConfig({
network: 'mainnet-beta',
PublicKey // Enable web3.js mode
});
// Create a contract - returns web3.js TransactionInstruction
const instruction = await createContract({
owner: keypair, // Accepts web3.js Keypair
fleet: fleetPubkey, // Accepts web3.js PublicKey
ownerProfile: profilePubkey,
gameId: gamePubkey,
rate: 100,
durationMax: { days: 30 },
paymentsFreq: '@daily'
});
// instruction.keys[0].pubkey is a PublicKey instanceConfiguration
Basic Configuration
import { setSdkConfig, getSdkConfig, clearSdkConfig } from '@wuwei-labs/srsly';
// Set global config
setSdkConfig({
network: 'atlasnet' | 'mainnet-beta' | 'localnet',
rpcUrl: 'https://custom-rpc.com', // Optional
programId: 'custom-program-id', // Optional
commitment: 'confirmed', // Optional
PublicKey: PublicKey // Optional for web3.js mode
});
// Get current config
const config = getSdkConfig();
// Clear config (reset to defaults)
clearSdkConfig();
// Override per-call
const ix = await createContract(params, {
rpcUrl: 'https://temporary-rpc.com'
});Network Addresses
The SDK provides centralized address management for different networks:
import { getAddresses, ATLASNET_ADDRESSES, MAINNET_ADDRESSES } from '@wuwei-labs/srsly';
// Get addresses for current network (from global config)
const addresses = getAddresses();
console.log(addresses.atlasMint); // ATLAS token mint
console.log(addresses.sage); // SAGE program
console.log(addresses.srsly); // SRSLY program
// Override for specific network
const mainnetAddrs = getAddresses({ network: 'mainnet-beta' });
// Custom SRSLY program
const customAddrs = getAddresses({ programId: 'MyCustomSRSLY...' });
console.log(customAddrs.srsly); // 'MyCustomSRSLY...'
// Direct access to network addresses
console.log(ATLASNET_ADDRESSES); // All atlasnet addresses
console.log(MAINNET_ADDRESSES); // All mainnet addressesAvailable Networks:
'atlasnet'- Star Atlas testnet (default)'mainnet-beta'- Solana mainnet / Star Atlas production'localnet'- Local development
Network Addresses:
srsly- SRSLY rental programsage- Star Atlas SAGE programatlasMint- ATLAS token mintprofileFaction- Profile Faction programgameId- Star Atlas game ID
## API Reference
### Instructions
- `createContract(params, config?)` - Create a rental contract
- `closeContract(params, config?)` - Close a rental contract
- `acceptRental(params, config?)` - Accept a rental
- `cancelRental(params, config?)` - Cancel a rental
- _(More to come)_
### Parameters
All instruction params accept:
- **Signers**: String addresses, web3.js Keypairs, or @solana/kit signers
- **Addresses**: String addresses or web3.js PublicKeys
- **Rates**: Numbers (ATLAS) or objects `{ atlas: 1.5 }` or `{ stardust: 150_000_000 }`
- **Durations**: Objects `{ days: 7 }`, `{ hours: 24 }`, `{ weeks: 2 }`, etc.
- **Schedules**: Strings `'@daily'`, `'@hourly'`, or cron expressions
### Return Types
- **Without PublicKey in config**: Returns @solana/kit instruction
- **With PublicKey in config**: Returns web3.js TransactionInstruction
### Discount Authorization
The SDK provides a `createDiscount` helper for server-side discount authorization. This is useful when an affiliate wants to offer discounts to borrowers.
#### Server-side
```typescript
import { setSdkConfig, createDiscount } from '@wuwei-labs/srsly';
// Can be set once globally (e.g., at app startup)
setSdkConfig({ rpcUrl: 'https://your-rpc-url.com' });
const discountAuth = await createDiscount({
address: 'AFFILIATE_MEMBER_PDA',
discount: 10, // 10% discount
expirySlots: 1000, // ~6-7 minutes from now
discountAuthority: serverKeypair,
});
// Already JSON-safe - return directly via API
return discountAuth;Client-side
import { acceptRental } from '@wuwei-labs/srsly';
// Pass directly from server response - no deserialization needed
const ix = await acceptRental({
borrower: wallet,
contract: contractAddress,
duration: { days: 7 },
discountAuth: response.discountAuth,
referrer: affiliateMemberAddress,
});Development Status
- ✅ Core config system
- ✅ Centralized address management
- ✅ Signer handling (web3.js + kit)
- ✅ web3.js conversion
- ✅ Parameter converters (amount, duration, schedule)
- ✅ First instruction:
createContract - 🚧 Additional contract instructions
- 🚧 Rental instructions
- 🚧 Other instructions
- 🚧 Tests
Migration from @wuwei-labs/srsly
Coming soon - see migration guide once this package reaches 1.0.0.
Contributing
This package is currently in beta. Please report issues on GitHub.
License
ISC
