Skip to main content

Configuration

This guide covers configuring the L{CORE} SDK for development and connecting to City-Chain networks.

SDK Configuration​

Basic Initialization​

import { LCore } from '@locale/lcore-sdk';

const lcore = new LCore({
// Required: Your API key (get from dashboard.locale.cash)
apiKey: process.env.LCORE_API_KEY,

// Required: Target network environment
network: 'testnet',
});

Configuration Options​

interface LCoreConfig {
// Authentication
apiKey?: string; // API key for authenticated requests

// Network
network: 'testnet' | 'mainnet'; // Target network environment
rpcEndpoint?: string; // Custom RPC endpoint (optional)

// Timeouts
timeout?: number; // Request timeout in milliseconds (default: 30000)
retries?: number; // Number of retry attempts (default: 3)

// Logging
debug?: boolean; // Enable debug logging (default: false)
}

Python Configuration​

from lcore_sdk import LCore

lcore = LCore(
api_key=os.environ.get('LCORE_API_KEY'),
network='testnet',
debug=True # Enable for troubleshooting
)

Environment Variables​

Create a .env file in your project root:

# Required for authenticated API calls
LCORE_API_KEY=your-api-key-here

# Target network environment
LCORE_NETWORK=testnet

# Optional: Custom endpoints
LCORE_RPC_ENDPOINT=https://custom-rpc.example.com
LCORE_API_ENDPOINT=https://api.locale.cash

# Optional: Debugging
LCORE_DEBUG=true

Loading Environment Variables​

TypeScript (with dotenv):

import 'dotenv/config';
import { LCore } from '@locale/lcore-sdk';

const lcore = new LCore({
apiKey: process.env.LCORE_API_KEY,
network: (process.env.LCORE_NETWORK as 'testnet' | 'mainnet') || 'testnet',
});

Python:

from dotenv import load_dotenv
import os

load_dotenv()

lcore = LCore(
api_key=os.environ.get('LCORE_API_KEY'),
network=os.environ.get('LCORE_NETWORK', 'testnet')
)

Available Networks​

NetworkDescriptionUse Case
testnetArbitrum SepoliaDevelopment and testing
mainnetArbitrum OneProduction

Network-Specific Configuration​

// Development
const devConfig = {
apiKey: process.env.LCORE_API_KEY,
network: 'testnet',
debug: true,
};

// Production
const prodConfig = {
apiKey: process.env.LCORE_API_KEY,
network: 'mainnet',
debug: false,
timeout: 60000, // Longer timeout for production
};

Device Configuration​

When registering devices, you'll configure device-specific settings:

const deviceConfig = {
type: DeviceType.ENVIRONMENTAL_SENSOR,
manufacturer: 'SensorCorp',
model: 'ENV-100',

// Location
location: {
lat: 39.0997,
lng: -94.5786,
altitude: 250, // Optional: meters above sea level
},

// Custom metadata
metadata: {
installDate: '2024-01-15',
serialNumber: 'SN-12345',
calibrationDate: '2024-01-10',
},
};

const device = await lcore.devices.register(deviceConfig);

Stream Configuration​

Configure data streams for your devices:

const streamConfig = {
deviceId: device.id,
dataType: 'air_quality',

// Data collection interval (seconds)
interval: 60,

// Data schema (JSON Schema format)
schema: {
type: 'object',
properties: {
pm25: { type: 'number' },
pm10: { type: 'number' },
temperature: { type: 'number' },
humidity: { type: 'number' },
},
required: ['pm25', 'pm10'],
},

// Optional: Transform rules
transformRules: [
{
name: 'celsius-to-fahrenheit',
input: 'temperature',
output: 'temperature_f',
operation: (value) => (value * 9/5) + 32,
},
],
};

const stream = await lcore.streams.create(streamConfig);

Attestation Configuration​

Configure how attestations are created:

const attestationConfig = {
streamId: stream.id,

// Time range for attestation
fromTimestamp: Date.now() - 3600000, // 1 hour ago
toTimestamp: Date.now(),

// Aggregation method
aggregation: 'average', // 'average', 'sum', 'min', 'max', 'count'

// Optional: Include raw data hash
includeDataHash: true,
};

const attestation = await lcore.attest(attestationConfig);

Production Encryption Configuration​

For production deployments with data privacy requirements, you need to configure encryption. This is handled at the infrastructure level, not in the SDK.

See Encryption Key Configuration for:

  • Generating encryption keypairs
  • Configuring INPUT encryption (device data privacy)
  • Configuring OUTPUT encryption (query response privacy)
  • Key baking requirements for Cartesi

For a complete understanding of the encryption architecture, see Encryption Architecture.

Wallet Configuration (For Self-Hosted)​

If you're running your own attestation infrastructure, configure wallet access:

# attestor/.env

# Wallet for submitting attestations to chain
MNEMONIC=your twelve word mnemonic phrase here

# Or use private key directly
PRIVATE_KEY=0x...
Security

Never commit wallet credentials to version control. Use environment variables or secure secret management.

Configuration Validation​

The SDK validates configuration on initialization:

try {
const lcore = new LCore({
apiKey: process.env.LCORE_API_KEY,
cityChainId: 'invalid-network', // Will throw
});
} catch (error) {
if (error instanceof ConfigurationError) {
console.error('Invalid configuration:', error.message);
}
}

Configuration Best Practices​

  1. Use environment variables for sensitive data (API keys, mnemonics)
  2. Create separate configs for development, staging, and production
  3. Validate early - check configuration at application startup
  4. Use TypeScript for type-safe configuration
  5. Document your config - keep .env.example updated

Example: Multi-Environment Setup​

// config/index.ts
type Environment = 'development' | 'staging' | 'production';

const configs: Record<Environment, LCoreConfig> = {
development: {
apiKey: process.env.LCORE_API_KEY,
network: 'testnet',
debug: true,
},
staging: {
apiKey: process.env.LCORE_API_KEY,
network: 'testnet',
debug: false,
},
production: {
apiKey: process.env.LCORE_API_KEY,
network: 'mainnet',
debug: false,
timeout: 60000,
},
};

const env = (process.env.NODE_ENV || 'development') as Environment;
export const config = configs[env];

Cartesi Configuration​

If you're building Cartesi-based attestation applications, see the Cartesi Quickstart for initial setup and configuration options.

Next Steps​