// // SolanaTests.swift // OS Vault // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // import XCTest import SolanaSwift @testable import OSVaultKit final class SolanaTests: XCTestCase { // Public BIP-44 test vector: the all-"abandon" mnemonic at // m/44'/501'/0'/0' (bip44Change) — the Phantom/Solflare default. let vectorMnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" func testDerivationIsDeterministicAndPhantomPath() async throws { let first = try await SolanaService.deriveKeyPair(mnemonic: vectorMnemonic, network: .mainnet) let second = try await SolanaService.deriveKeyPair(mnemonic: vectorMnemonic, network: .devnet) // Cluster must not change the derivation; the keypair is path-only. XCTAssertEqual(first.publicKey.base58EncodedString, second.publicKey.base58EncodedString) XCTAssertEqual(first.secretKey.count, 64) XCTAssertTrue(SolanaService.validate(address: first.publicKey.base58EncodedString)) } func testAddressValidation() { XCTAssertTrue(SolanaService.validate(address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")) XCTAssertFalse(SolanaService.validate(address: "0x9858EfFD232B4033E47d90003D41EC34EcaEda94")) XCTAssertFalse(SolanaService.validate(address: "not-an-address")) XCTAssertFalse(SolanaService.validate(address: "")) } func testAmountParsing() { XCTAssertEqual(SolanaService.parseSOL("1"), 1_000_000_000) XCTAssertEqual(SolanaService.parseSOL("0.000000001"), 1) XCTAssertNil(SolanaService.parseSOL("0.0000000001")) // sub-lamport XCTAssertEqual(SolanaService.parseUSDC("12.5"), 12_500_000) XCTAssertEqual(SolanaService.formatSOL(1_500_000_000), "1.5") } }