/* * Example: Key Derivation from Existing Mnemonic * Demonstrates nostr_derive_keys_from_mnemonic() */ #include #include #include "nostr_core.h" int main() { printf("=== NOSTR Key Derivation from Mnemonic Example ===\n\n"); // Initialize the library if (nostr_init() != NOSTR_SUCCESS) { fprintf(stderr, "Failed to initialize NOSTR library\n"); return 1; } // Use a well-known test mnemonic const char* test_mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; printf("Using test mnemonic: %s\n\n", test_mnemonic); // Derive keys for multiple accounts for (int account = 0; account < 3; account++) { unsigned char private_key[NOSTR_PRIVATE_KEY_SIZE]; unsigned char public_key[NOSTR_PUBLIC_KEY_SIZE]; int result = nostr_derive_keys_from_mnemonic(test_mnemonic, account, private_key, public_key); if (result != NOSTR_SUCCESS) { fprintf(stderr, "Failed to derive keys for account %d: %s\n", account, nostr_strerror(result)); continue; } // Convert to bech32 format char nsec[NOSTR_BECH32_KEY_SIZE]; char npub[NOSTR_BECH32_KEY_SIZE]; nostr_key_to_bech32(private_key, "nsec", nsec); nostr_key_to_bech32(public_key, "npub", npub); // Display results for this account printf("Account %d (m/44'/1237'/%d'/0/0):\n", account, account); printf(" nsec: %s\n", nsec); printf(" npub: %s\n", npub); printf("\n"); } // Cleanup nostr_cleanup(); printf("✓ Example completed successfully!\n"); printf("💡 The same mnemonic always produces the same keys (deterministic)\n"); return 0; }