-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpg_bitcoin_address--2.0--2.1.sql
136 lines (108 loc) · 4.61 KB
/
pg_bitcoin_address--2.0--2.1.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
\echo Execute "CREATE EXTENSION pg_bitcoin_address;" to use this extension. \quit
--
-- Encoding/decoding functions
--
CREATE FUNCTION blech32_encode(hrp text, bit varying) RETURNS text
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE COST 10
AS 'MODULE_PATHNAME', 'pg_blech32_encode';
CREATE FUNCTION blech32m_encode(hrp text, bit varying) RETURNS text
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE COST 10
AS 'MODULE_PATHNAME', 'pg_blech32m_encode';
CREATE FUNCTION blech32_decode(text) RETURNS bit varying
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE COST 10
AS 'MODULE_PATHNAME', 'pg_blech32_decode';
CREATE FUNCTION blech32m_decode(text) RETURNS bit varying
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE COST 10
AS 'MODULE_PATHNAME', 'pg_blech32m_decode';
CREATE FUNCTION blech32_hrp(text) RETURNS text
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE COST 10
AS 'MODULE_PATHNAME', 'pg_blech32_hrp';
--
-- Constructor/accessor functions
--
CREATE FUNCTION bitcoin_address(hrp text, version integer, program bytea, blech boolean) RETURNS bitcoin_address
LANGUAGE c IMMUTABLE PARALLEL SAFE
AS 'MODULE_PATHNAME', 'pg_bitcoin_address';
CREATE FUNCTION is_blech32(bitcoin_address) RETURNS boolean
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE
AS 'MODULE_PATHNAME', 'pg_bitcoin_address_is_blech32';
CREATE FUNCTION program_size(bitcoin_address) RETURNS integer
LANGUAGE c IMMUTABLE STRICT PARALLEL SAFE
AS 'MODULE_PATHNAME', 'pg_bitcoin_address_program_size';
--
-- Convenience functions
--
CREATE OR REPLACE FUNCTION is_mainnet(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN CASE
WHEN is_segwit(address) THEN NOT is_blech32(address) AND hrp(address) = 'bc'
ELSE program_size(address) = 20 AND version(address) IN (0, 5)
END;
CREATE OR REPLACE FUNCTION is_testnet(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN CASE
WHEN is_segwit(address) THEN NOT is_blech32(address) AND hrp(address) = 'tb'
ELSE program_size(address) = 20 AND version(address) IN (111, 196)
END;
CREATE FUNCTION is_liquidv1(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN CASE
WHEN is_segwit(address) THEN hrp(address) = CASE WHEN is_blech32(address) THEN 'lq' ELSE 'ex' END
ELSE version(address) = ANY(CASE program_size(address)
WHEN 20 THEN ARRAY[57, 39]
WHEN 54 THEN ARRAY[12]
END) IS TRUE
END;
CREATE FUNCTION is_liquidtestnet(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN CASE
WHEN is_segwit(address) THEN hrp(address) = CASE WHEN is_blech32(address) THEN 'tlq' ELSE 'tex' END
ELSE version(address) = ANY(CASE program_size(address)
WHEN 20 THEN ARRAY[36, 19]
WHEN 54 THEN ARRAY[23]
END) IS TRUE
END;
CREATE OR REPLACE FUNCTION is_p2pkh(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN NOT is_segwit(address) AND version(address) = ANY(CASE program_size(address)
WHEN 20 THEN ARRAY[0, 111, 57, 36]
WHEN 54 THEN CASE get_byte(program(address), 0)
WHEN 57 THEN ARRAY[12]
WHEN 36 THEN ARRAY[23]
END
END) IS TRUE;
CREATE OR REPLACE FUNCTION is_p2sh(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN NOT is_segwit(address) AND version(address) = ANY(CASE program_size(address)
WHEN 20 THEN ARRAY[5, 196, 39, 19]
WHEN 54 THEN CASE get_byte(program(address), 0)
WHEN 39 THEN ARRAY[12]
WHEN 19 THEN ARRAY[23]
END
END) IS TRUE;
CREATE OR REPLACE FUNCTION is_p2wpkh(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN is_segwit(address) AND version(address) = 0 AND
program_size(address) = CASE WHEN is_blech32(address) THEN 53 ELSE 20 END;
CREATE OR REPLACE FUNCTION is_p2wsh(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN is_segwit(address) AND version(address) = 0 AND
program_size(address) = CASE WHEN is_blech32(address) THEN 65 ELSE 32 END;
CREATE OR REPLACE FUNCTION is_p2tr(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN is_segwit(address) AND version(address) = 1 AND
program_size(address) = CASE WHEN is_blech32(address) THEN 65 ELSE 32 END;
CREATE FUNCTION is_blinding(address bitcoin_address) RETURNS boolean
IMMUTABLE STRICT PARALLEL SAFE
RETURN CASE
WHEN is_segwit(address) THEN program_size(address) = ANY(CASE version(address)
WHEN 0 THEN ARRAY[53, 65]
WHEN 1 THEN ARRAY[65]
END) IS TRUE
ELSE version(address) IN (12, 23) AND program_size(address) = 54
END;
--
-- Convenience domains
--
CREATE DOMAIN liquidv1_address AS bitcoin_address CHECK (is_liquidv1(VALUE));
CREATE DOMAIN liquidtestnet_address AS bitcoin_address CHECK (is_liquidtestnet(VALUE));