@osiris-ai/turnkey-sdk
Version:
Osiris Turnkey SDK
231 lines (181 loc) • 5.8 kB
Markdown
# @osiris-ai/turnkey-sdk
A minimal TypeScript SDK for interacting with the Turnkey API to create, manage, and sign with crypto wallets using API key authentication.
## Features
- 🔐 **Secure API Key Authentication** - Uses Turnkey's API key stamper for request signing
- 🏦 **Wallet Management** - Create wallets, list wallets, and manage wallet accounts
- ✍️ **Transaction Signing** - Sign raw payloads, multiple payloads, and transactions
- 📝 **Full TypeScript Support** - Comprehensive type definitions for all API interactions
- 🚀 **Lightweight** - Minimal dependencies with tree-shakeable exports
## Installation
```bash
npm install @osiris-ai/turnkey-sdk
```
## Quick Start
```typescript
import { TurnkeySDK } from '@osiris-ai/turnkey-sdk';
const sdk = new TurnkeySDK({
organizationId: 'your-organization-id',
apiPublicKey: 'your-api-public-key',
apiPrivateKey: 'your-api-private-key',
baseUrl: 'https://api.turnkey.com'
});
// List wallets
const wallets = await sdk.listWallets({
organizationId: 'your-organization-id'
});
// Sign a raw payload
const signature = await sdk.signRawPayload({
type: 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2',
timestampMs: Date.now().toString(),
organizationId: 'your-organization-id',
parameters: {
signWith: 'your-private-key-id',
payload: 'your-hex-payload',
encoding: 'PAYLOAD_ENCODING_HEXADECIMAL',
hashFunction: 'HASH_FUNCTION_KECCAK256'
}
});
```
## API Reference
### Configuration
```typescript
interface TurnkeyConfig {
organizationId: string; // Your Turnkey organization ID
apiPublicKey: string; // Your API public key
apiPrivateKey: string; // Your API private key
baseUrl: string; // Turnkey API base URL
}
```
### Wallet Management
#### `listWallets(request: ListWalletsRequest): Promise<ListWalletsResponse>`
Lists all wallets in an organization.
```typescript
const wallets = await sdk.listWallets({
organizationId: 'your-organization-id'
});
```
#### `listWalletAccounts(request: ListWalletAccountsRequest): Promise<ListWalletAccountsResponse>`
Lists all accounts in a specific wallet.
```typescript
const accounts = await sdk.listWalletAccounts({
organizationId: 'your-organization-id',
walletId: 'your-wallet-id',
paginationOptions: {
limit: '10',
before: '',
after: ''
}
});
```
#### `createWallet(request: CreateWalletRequest): Promise<CreateWalletResponse>`
Creates a new wallet (sub-organization) with specified accounts.
```typescript
const wallet = await sdk.createWallet({
subOrganizationName: 'my-wallet',
rootUsers: [{
userName: 'wallet-admin',
apiKeys: [{
apiKeyName: 'admin-key',
publicKey: 'your-public-key',
curveType: 'API_KEY_CURVE_P256'
}],
authenticators: [],
oauthProviders: []
}],
rootQuorumThreshold: 1,
wallet: {
walletName: 'my-wallet',
accounts: [{
pathFormat: 'PATH_FORMAT_BIP32',
path: "m/44'/60'/0'/0/0",
curve: 'CURVE_SECP256K1',
addressFormat: 'ADDRESS_FORMAT_ETHEREUM'
}],
mnemonicLength: 12
}
});
```
#### `addWalletAccount(request: AddWalletAccountsRequest): Promise<AddWalletAccountsResponse>`
Adds new accounts to an existing wallet.
```typescript
const result = await sdk.addWalletAccount({
type: 'ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS',
timestampMs: Date.now().toString(),
organizationId: 'your-organization-id',
parameters: {
walletId: 'your-wallet-id',
accounts: [{
curve: 'CURVE_SECP256K1',
pathFormat: 'PATH_FORMAT_BIP32',
path: "m/44'/60'/0'/0/1",
addressFormat: 'ADDRESS_FORMAT_ETHEREUM'
}]
}
});
```
### Signing Operations
#### `signRawPayload(request: SignRawPayloadRequest): Promise<SignRawPayloadResponse>`
Signs a single raw payload.
```typescript
const signature = await sdk.signRawPayload({
type: 'ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2',
timestampMs: Date.now().toString(),
organizationId: 'your-organization-id',
parameters: {
signWith: 'your-private-key-id',
payload: '0x1234567890abcdef',
encoding: 'PAYLOAD_ENCODING_HEXADECIMAL',
hashFunction: 'HASH_FUNCTION_KECCAK256'
}
});
```
#### `signRawPayloads(request: SignRawPayloadsRequest): Promise<SignRawPayloadsResponse>`
Signs multiple raw payloads in a single request.
```typescript
const signatures = await sdk.signRawPayloads({
type: 'ACTIVITY_TYPE_SIGN_RAW_PAYLOADS',
timestampMs: Date.now().toString(),
organizationId: 'your-organization-id',
parameters: {
signWith: 'your-private-key-id',
payloads: ['0x1234567890abcdef', '0xfedcba0987654321'],
encoding: 'PAYLOAD_ENCODING_HEXADECIMAL',
hashFunction: 'HASH_FUNCTION_KECCAK256'
}
});
```
#### `signTransaction(request: SignTransactionRequest): Promise<SignTransactionResponse>`
Signs a transaction.
```typescript
const signedTx = await sdk.signTransaction({
type: 'ACTIVITY_TYPE_SIGN_TRANSACTION_V2',
timestampMs: Date.now().toString(),
organizationId: 'your-organization-id',
parameters: {
signWith: 'your-private-key-id',
unsignedTransaction: '0x...',
type: 'TRANSACTION_TYPE_ETHEREUM'
}
});
```
## Error Handling
The SDK includes built-in error handling for common scenarios:
```typescript
try {
const result = await sdk.signRawPayloads(request);
} catch (error) {
console.error('Signing failed:', error.message);
}
```
## Requirements
- Node.js 18.0.0 or higher
- TypeScript 5.0 or higher (for development)
## Peer Dependencies
- `@noble/curves` ^1.9.2 (optional) - For cryptographic operations
- `viem` ^2.30.1 (optional) - For Ethereum utilities
## License
MIT
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Support
For issues and questions, please open an issue on the GitHub repository.