@unspent/phi
Version:
a collection of anyone can spend contracts
154 lines (136 loc) • 5.45 kB
text/typescript
import { sanitizeAddress } from "./util.js";
describe(`Address sanitization`, () => {
test("Should noop on full cashaddr format", async () => {
const v = "bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm"
);
});
test("Should noop on capitalized full cashaddr format", async () => {
const v =
"bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm".toUpperCase();
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm"
);
});
test("Should sanitize prefix-less mainnet p2pkh format", async () => {
const v = "qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm"
);
});
test("Should sanitize prefix-less regtest p2sh format", async () => {
const v = "qpttdv3qg2usm4nm7talhxhl05mlhms3ys43u76rn0";
expect(await sanitizeAddress(v)).toBe(
"bchreg:qpttdv3qg2usm4nm7talhxhl05mlhms3ys43u76rn0"
);
});
test("Should sanitize 32 byte prefix-less p2sh format", async () => {
const v = "pwyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsh3sujgcr";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:pwyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsh3sujgcr"
);
});
test("Should sanitize 40 byte prefix-less p2sh format", async () => {
const v =
"qh3krj5607v3qlqh5c3wq3lrw3wnuxw0sp8dv0zugrrt5a3kj6ucysfz8kxwv2k53krr7n933jfsunqex2w82sl";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qh3krj5607v3qlqh5c3wq3lrw3wnuxw0sp8dv0zugrrt5a3kj6ucysfz8kxwv2k53krr7n933jfsunqex2w82sl"
);
});
test("Should sanitize 64 byte prefixed p2sh format", async () => {
const v =
"pref:plg0x333p4238k0qrc5ej7rzfw5g8e4a4r6vvzyrcy8j3s5k0en7calvclhw46hudk5flttj6ydvjc0pv3nchp52amk97tqa5zygg96mg7pj3lh8";
expect(await sanitizeAddress(v)).toBe(
"pref:plg0x333p4238k0qrc5ej7rzfw5g8e4a4r6vvzyrcy8j3s5k0en7calvclhw46hudk5flttj6ydvjc0pv3nchp52amk97tqa5zygg96mg7pj3lh8"
);
});
test("Should sanitize prefix-less p2sh format", async () => {
const v = "pq75zmtt8d84nqnxv8vx3wj06mmzlhjnwuwprm4szr";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:pq75zmtt8d84nqnxv8vx3wj06mmzlhjnwuwprm4szr"
);
});
test("Should sanitize prefix-less testnet p2sh format", async () => {
const v = "pq75zmtt8d84nqnxv8vx3wj06mmzlhjnwu2n8uh89l";
expect(await sanitizeAddress(v)).toBe(
"bchtest:pq75zmtt8d84nqnxv8vx3wj06mmzlhjnwu2n8uh89l"
);
});
test("Should sanitize prefix-less testnet p2pkh format", async () => {
const v = "qqq4z5f7esknjlq3rmrgasd0dpez2exrzceytksazk";
expect(await sanitizeAddress(v)).toBe(
"bchtest:qqq4z5f7esknjlq3rmrgasd0dpez2exrzceytksazk"
);
});
test("Should sanitize legacy P2PKH format", async () => {
const v = "112P8G7vPH5ifBjka5irr4zJgUUKdaK5hi";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qqqy9c5c8djjxcpg9uzy87h6junkpt6sw56vuw5jmm"
);
});
test("Should sanitize legacy P2PKH format", async () => {
const v = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qp3wjpa3tjlj042z2wv7hahsldgwhwy0rq9sywjpyy"
);
});
test("Should sanitize legacy P2PKH format (Internet Archive)", async () => {
const v = "1Archive1n2C579dMsAu3iC6tWzuQJz8dN";
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qpkpk5g6vvcxkc55u8fnjzkge4yp7anst5l36nlyg6"
);
});
test("Should sanitize legacy compressed Base58 P2PKH format", async () => {
const v = "1BzHQQrSFbqgKWyyKL1HbaHxSGZpRE8dSF"; //compressed
expect(await sanitizeAddress(v)).toBe(
"bitcoincash:qpugd2f954uhk9d9x3mzpl07gmu9nerwhg6c6dtmfp"
);
});
test("Should a error on legacy P2SH format", async () => {
try {
const v = "3N5i3Vs9UMyjYbBCFNQqU3ybSuDepX7oT3";
await sanitizeAddress(v);
} catch (e) {
expect(e).toEqual(
Error(
"Refusing to convert a legacy P2SH address (possibly segwit) to cashaddress"
)
);
}
});
test("Should throw on legacy P2SH testnet format", async () => {
try {
const v = "2NESaJWDZ2VvZfrPrx3spq8qdgGkkE4uZtY";
await sanitizeAddress(v);
} catch (e) {
expect(e).toEqual(
Error(
"Refusing to convert a legacy P2SH address (possibly segwit) to cashaddress"
)
);
}
});
test("Should throw on segwit addresses format", async () => {
expect.assertions(4);
// Mainnet P2WPKH: bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4
// Testnet P2WPKH: tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx
// Mainnet P2WSH: bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3
// Testnet P2WSH: tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7
const vectors = [
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4",
"tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx",
"bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3",
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
];
for (let v of vectors) {
try {
await sanitizeAddress(v);
} catch (e) {
expect(e).toEqual(
Error("Refusing to convert segwit P2SH address to cashaddress")
);
}
}
});
});