130 lines
4.3 KiB
JavaScript
130 lines
4.3 KiB
JavaScript
/**
|
|
* Salvium Network and Address Constants
|
|
*
|
|
* This module contains all address prefixes for Salvium across all network types
|
|
* and address formats (Legacy CryptoNote and CARROT).
|
|
*/
|
|
|
|
// Network types
|
|
export const NETWORK = {
|
|
MAINNET: 'mainnet',
|
|
TESTNET: 'testnet',
|
|
STAGENET: 'stagenet'
|
|
};
|
|
|
|
// Address types
|
|
export const ADDRESS_TYPE = {
|
|
STANDARD: 'standard',
|
|
INTEGRATED: 'integrated',
|
|
SUBADDRESS: 'subaddress'
|
|
};
|
|
|
|
// Address formats
|
|
export const ADDRESS_FORMAT = {
|
|
LEGACY: 'legacy', // CryptoNote style (SaLv...)
|
|
CARROT: 'carrot' // CARROT style (SC1...)
|
|
};
|
|
|
|
/**
|
|
* Address prefixes organized by network, format, and type
|
|
* Values are BigInt for handling large prefixes
|
|
*/
|
|
export const PREFIXES = {
|
|
[NETWORK.MAINNET]: {
|
|
[ADDRESS_FORMAT.LEGACY]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x3ef318n, text: 'SaLv' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0x55ef318n, text: 'SaLvi' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0xf5ef318n, text: 'SaLvs' }
|
|
},
|
|
[ADDRESS_FORMAT.CARROT]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x180c96n, text: 'SC1' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0x2ccc96n, text: 'SC1i' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0x314c96n, text: 'SC1s' }
|
|
}
|
|
},
|
|
[NETWORK.TESTNET]: {
|
|
[ADDRESS_FORMAT.LEGACY]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x15beb318n, text: 'SaLvT' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0xd055eb318n, text: 'SaLvTi' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0xa59eb318n, text: 'SaLvTs' }
|
|
},
|
|
[ADDRESS_FORMAT.CARROT]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x254c96n, text: 'SC1T' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0x1ac50c96n, text: 'SC1Ti' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0x3c54c96n, text: 'SC1Ts' }
|
|
}
|
|
},
|
|
[NETWORK.STAGENET]: {
|
|
[ADDRESS_FORMAT.LEGACY]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x149eb318n, text: 'SaLvS' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0xf343eb318n, text: 'SaLvSi' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0x2d47eb318n, text: 'SaLvSs' }
|
|
},
|
|
[ADDRESS_FORMAT.CARROT]: {
|
|
[ADDRESS_TYPE.STANDARD]: { prefix: 0x24cc96n, text: 'SC1S' },
|
|
[ADDRESS_TYPE.INTEGRATED]: { prefix: 0x1a848c96n, text: 'SC1Si' },
|
|
[ADDRESS_TYPE.SUBADDRESS]: { prefix: 0x384cc96n, text: 'SC1Ss' }
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Build a reverse lookup map from prefix value to address info
|
|
*/
|
|
export const PREFIX_MAP = new Map();
|
|
|
|
for (const [network, formats] of Object.entries(PREFIXES)) {
|
|
for (const [format, types] of Object.entries(formats)) {
|
|
for (const [type, info] of Object.entries(types)) {
|
|
PREFIX_MAP.set(info.prefix, {
|
|
network,
|
|
format,
|
|
type,
|
|
text: info.text
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get prefix info by prefix value
|
|
* @param {BigInt} prefix - The prefix value
|
|
* @returns {Object|null} - Address info or null if not found
|
|
*/
|
|
export function getPrefixInfo(prefix) {
|
|
return PREFIX_MAP.get(prefix) || null;
|
|
}
|
|
|
|
/**
|
|
* Get prefix for a specific address configuration
|
|
* @param {string} network - Network type (mainnet, testnet, stagenet)
|
|
* @param {string} format - Address format (legacy, carrot)
|
|
* @param {string} type - Address type (standard, integrated, subaddress)
|
|
* @returns {BigInt|null} - The prefix value or null if invalid
|
|
*/
|
|
export function getPrefix(network, format, type) {
|
|
return PREFIXES[network]?.[format]?.[type]?.prefix || null;
|
|
}
|
|
|
|
// Key sizes
|
|
export const KEY_SIZE = 32; // 32 bytes = 256 bits
|
|
export const CHECKSUM_SIZE = 4;
|
|
export const PAYMENT_ID_SIZE = 8; // For integrated addresses
|
|
|
|
// Address data sizes (without prefix)
|
|
export const ADDRESS_DATA_SIZE = {
|
|
[ADDRESS_TYPE.STANDARD]: KEY_SIZE * 2, // spend_key + view_key = 64 bytes
|
|
[ADDRESS_TYPE.INTEGRATED]: KEY_SIZE * 2 + PAYMENT_ID_SIZE, // + payment_id = 72 bytes
|
|
[ADDRESS_TYPE.SUBADDRESS]: KEY_SIZE * 2 // spend_key + view_key = 64 bytes
|
|
};
|
|
|
|
// Base58 alphabet (CryptoNote variant)
|
|
export const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
|
|
// Full block size for Base58 encoding (8 bytes -> 11 chars)
|
|
export const BASE58_FULL_BLOCK_SIZE = 8;
|
|
export const BASE58_FULL_ENCODED_BLOCK_SIZE = 11;
|
|
|
|
// Encoded block sizes for partial blocks
|
|
export const BASE58_ENCODED_BLOCK_SIZES = [0, 2, 3, 5, 6, 7, 9, 10, 11];
|