diff --git a/src/utils/stellar-address.utils.ts b/src/utils/stellar-address.utils.ts new file mode 100644 index 0000000..12dd071 --- /dev/null +++ b/src/utils/stellar-address.utils.ts @@ -0,0 +1,5 @@ +import { StrKey } from "stellar-sdk"; + +export function isValidStellarPublicKey(address: unknown): address is string { + return typeof address === "string" && StrKey.isValidEd25519PublicKey(address); +} diff --git a/tests/unit/stellar-address.test.ts b/tests/unit/stellar-address.test.ts new file mode 100644 index 0000000..b9a5676 --- /dev/null +++ b/tests/unit/stellar-address.test.ts @@ -0,0 +1,30 @@ +import { Keypair, StrKey } from "stellar-sdk"; + +import { isValidStellarPublicKey } from "../../src/utils/stellar-address.utils"; + +describe("isValidStellarPublicKey", () => { + it("returns true for a valid Stellar ed25519 public key", () => { + expect(isValidStellarPublicKey(Keypair.random().publicKey())).toBe(true); + }); + + it("returns false for malformed G-addresses", () => { + expect(isValidStellarPublicKey("GABC")).toBe(false); + expect( + isValidStellarPublicKey( + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + ), + ).toBe(false); + }); + + it("returns false for non-public-key StrKey values", () => { + const contractId = StrKey.encodeContract(Buffer.alloc(32, 1)); + + expect(isValidStellarPublicKey(contractId)).toBe(false); + }); + + it("returns false for non-string values", () => { + expect(isValidStellarPublicKey(null)).toBe(false); + expect(isValidStellarPublicKey(undefined)).toBe(false); + expect(isValidStellarPublicKey(123)).toBe(false); + }); +});