@reclaimprotocol/attestor-core 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +39 -0
  2. package/lib/avs/abis/avsDirectoryABI.d.ts +60 -0
  3. package/lib/avs/abis/avsDirectoryABI.js +344 -0
  4. package/lib/avs/abis/delegationABI.d.ts +126 -0
  5. package/lib/avs/abis/delegationABI.js +5 -0
  6. package/lib/avs/abis/registryABI.d.ts +136 -0
  7. package/lib/avs/abis/registryABI.js +729 -0
  8. package/lib/avs/client/create-claim-on-avs.d.ts +10 -0
  9. package/lib/avs/client/create-claim-on-avs.js +147 -0
  10. package/lib/avs/config.d.ts +7 -0
  11. package/lib/avs/config.js +24 -0
  12. package/lib/avs/contracts/ReclaimServiceManager.d.ts +697 -0
  13. package/lib/avs/contracts/ReclaimServiceManager.js +3 -0
  14. package/lib/avs/contracts/common.d.ts +21 -0
  15. package/lib/avs/contracts/common.js +3 -0
  16. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +888 -0
  17. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1174 -0
  18. package/lib/avs/contracts/factories/index.d.ts +1 -0
  19. package/lib/avs/contracts/factories/index.js +9 -0
  20. package/lib/avs/contracts/index.d.ts +3 -0
  21. package/lib/avs/contracts/index.js +30 -0
  22. package/lib/avs/tests/test.operator.d.ts +11 -0
  23. package/lib/avs/tests/test.operator.js +313 -0
  24. package/lib/avs/tests/utils.d.ts +2 -0
  25. package/lib/avs/tests/utils.js +50 -0
  26. package/lib/avs/types/index.d.ts +55 -0
  27. package/lib/avs/types/index.js +3 -0
  28. package/lib/avs/utils/contracts.d.ts +21 -0
  29. package/lib/avs/utils/contracts.js +38 -0
  30. package/lib/avs/utils/register.d.ts +27 -0
  31. package/lib/avs/utils/register.js +76 -0
  32. package/lib/avs/utils/tasks.d.ts +22 -0
  33. package/lib/avs/utils/tasks.js +45 -0
  34. package/lib/client/create-claim.d.ts +5 -0
  35. package/lib/client/create-claim.js +357 -0
  36. package/lib/client/index.d.ts +3 -0
  37. package/lib/client/index.js +20 -0
  38. package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +16 -0
  39. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +60 -0
  40. package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +25 -0
  41. package/lib/client/tunnels/make-rpc-tls-tunnel.js +135 -0
  42. package/lib/client/utils/attestor-pool.d.ts +6 -0
  43. package/lib/client/utils/attestor-pool.js +28 -0
  44. package/lib/client/utils/client-socket.d.ts +9 -0
  45. package/lib/client/utils/client-socket.js +77 -0
  46. package/lib/client/utils/message-handler.d.ts +4 -0
  47. package/lib/client/utils/message-handler.js +93 -0
  48. package/lib/config/index.d.ts +23 -0
  49. package/lib/config/index.js +35 -0
  50. package/lib/index.d.ts +9 -0
  51. package/lib/index.js +39 -0
  52. package/lib/proto/api.d.ts +414 -0
  53. package/lib/proto/api.js +2756 -0
  54. package/lib/providers/http/index.d.ts +3 -0
  55. package/lib/providers/http/index.js +472 -0
  56. package/lib/providers/http/utils.d.ts +44 -0
  57. package/lib/providers/http/utils.js +302 -0
  58. package/lib/providers/index.d.ts +4 -0
  59. package/lib/providers/index.js +11 -0
  60. package/lib/scripts/check-avs-registration.d.ts +1 -0
  61. package/lib/scripts/check-avs-registration.js +28 -0
  62. package/lib/scripts/generate-provider-types.d.ts +5 -0
  63. package/lib/scripts/generate-provider-types.js +82 -0
  64. package/lib/scripts/generate-receipt.d.ts +9 -0
  65. package/lib/scripts/generate-receipt.js +93 -0
  66. package/lib/scripts/register-avs-operator.d.ts +1 -0
  67. package/lib/scripts/register-avs-operator.js +6 -0
  68. package/lib/scripts/start-server.d.ts +1 -0
  69. package/lib/scripts/start-server.js +6 -0
  70. package/lib/scripts/verify-root-ca.d.ts +1 -0
  71. package/lib/scripts/verify-root-ca.js +51 -0
  72. package/lib/server/create-server.d.ts +7 -0
  73. package/lib/server/create-server.js +85 -0
  74. package/lib/server/handlers/claimTunnel.d.ts +2 -0
  75. package/lib/server/handlers/claimTunnel.js +55 -0
  76. package/lib/server/handlers/completeClaimOnChain.d.ts +2 -0
  77. package/lib/server/handlers/completeClaimOnChain.js +28 -0
  78. package/lib/server/handlers/createClaimOnChain.d.ts +2 -0
  79. package/lib/server/handlers/createClaimOnChain.js +31 -0
  80. package/lib/server/handlers/createTunnel.d.ts +2 -0
  81. package/lib/server/handlers/createTunnel.js +65 -0
  82. package/lib/server/handlers/disconnectTunnel.d.ts +2 -0
  83. package/lib/server/handlers/disconnectTunnel.js +10 -0
  84. package/lib/server/handlers/index.d.ts +4 -0
  85. package/lib/server/handlers/index.js +18 -0
  86. package/lib/server/handlers/init.d.ts +2 -0
  87. package/lib/server/handlers/init.js +21 -0
  88. package/lib/server/index.d.ts +4 -0
  89. package/lib/server/index.js +21 -0
  90. package/lib/server/socket.d.ts +11 -0
  91. package/lib/server/socket.js +95 -0
  92. package/lib/server/tunnels/make-tcp-tunnel.d.ts +20 -0
  93. package/lib/server/tunnels/make-tcp-tunnel.js +182 -0
  94. package/lib/server/utils/apm.d.ts +11 -0
  95. package/lib/server/utils/apm.js +39 -0
  96. package/lib/server/utils/assert-valid-claim-request.d.ts +29 -0
  97. package/lib/server/utils/assert-valid-claim-request.js +189 -0
  98. package/lib/server/utils/config-env.d.ts +1 -0
  99. package/lib/server/utils/config-env.js +7 -0
  100. package/lib/server/utils/generics.d.ts +22 -0
  101. package/lib/server/utils/generics.js +59 -0
  102. package/lib/server/utils/iso.d.ts +1 -0
  103. package/lib/server/utils/iso.js +260 -0
  104. package/lib/server/utils/keep-alive.d.ts +7 -0
  105. package/lib/server/utils/keep-alive.js +42 -0
  106. package/lib/server/utils/process-handshake.d.ts +13 -0
  107. package/lib/server/utils/process-handshake.js +179 -0
  108. package/lib/server/utils/verify-server-certificates.d.ts +7 -0
  109. package/lib/server/utils/verify-server-certificates.js +102 -0
  110. package/lib/tests/describe-with-server.d.ts +21 -0
  111. package/lib/tests/describe-with-server.js +67 -0
  112. package/lib/tests/mock-provider-server.d.ts +13 -0
  113. package/lib/tests/mock-provider-server.js +65 -0
  114. package/lib/tests/mocks.d.ts +4 -0
  115. package/lib/tests/mocks.js +23 -0
  116. package/lib/tests/test.claim-creation.d.ts +1 -0
  117. package/lib/tests/test.claim-creation.js +187 -0
  118. package/lib/tests/test.http-parser.d.ts +1 -0
  119. package/lib/tests/test.http-parser.js +118 -0
  120. package/lib/tests/test.http-provider-utils.d.ts +1 -0
  121. package/lib/tests/test.http-provider-utils.js +1932 -0
  122. package/lib/tests/test.http-provider.d.ts +1 -0
  123. package/lib/tests/test.http-provider.js +43 -0
  124. package/lib/tests/test.rpc-communication.d.ts +1 -0
  125. package/lib/tests/test.rpc-communication.js +64 -0
  126. package/lib/tests/test.rpc-tunnel.d.ts +1 -0
  127. package/lib/tests/test.rpc-tunnel.js +168 -0
  128. package/lib/tests/test.signatures.d.ts +1 -0
  129. package/lib/tests/test.signatures.js +24 -0
  130. package/lib/tests/test.tcp-tunnel.d.ts +1 -0
  131. package/lib/tests/test.tcp-tunnel.js +64 -0
  132. package/lib/tests/test.zk.d.ts +1 -0
  133. package/lib/tests/test.zk.js +169 -0
  134. package/lib/tests/utils.d.ts +12 -0
  135. package/lib/tests/utils.js +49 -0
  136. package/lib/types/claims.d.ts +64 -0
  137. package/lib/types/claims.js +3 -0
  138. package/lib/types/client.d.ts +136 -0
  139. package/lib/types/client.js +3 -0
  140. package/lib/types/general.d.ts +39 -0
  141. package/lib/types/general.js +3 -0
  142. package/lib/types/handlers.d.ts +10 -0
  143. package/lib/types/handlers.js +3 -0
  144. package/lib/types/index.d.ts +9 -0
  145. package/lib/types/index.js +26 -0
  146. package/lib/types/providers.d.ts +135 -0
  147. package/lib/types/providers.gen.d.ts +414 -0
  148. package/lib/types/providers.gen.js +14 -0
  149. package/lib/types/providers.js +3 -0
  150. package/lib/types/rpc.d.ts +35 -0
  151. package/lib/types/rpc.js +3 -0
  152. package/lib/types/signatures.d.ts +28 -0
  153. package/lib/types/signatures.js +3 -0
  154. package/lib/types/tunnel.d.ts +18 -0
  155. package/lib/types/tunnel.js +3 -0
  156. package/lib/types/zk.d.ts +16 -0
  157. package/lib/types/zk.js +3 -0
  158. package/lib/utils/benchmark.d.ts +1 -0
  159. package/lib/utils/benchmark.js +70 -0
  160. package/lib/utils/claims.d.ts +33 -0
  161. package/lib/utils/claims.js +112 -0
  162. package/lib/utils/env.d.ts +3 -0
  163. package/lib/utils/env.js +20 -0
  164. package/lib/utils/error.d.ts +27 -0
  165. package/lib/utils/error.js +43 -0
  166. package/lib/utils/generics.d.ts +112 -0
  167. package/lib/utils/generics.js +348 -0
  168. package/lib/utils/http-parser.d.ts +55 -0
  169. package/lib/utils/http-parser.js +249 -0
  170. package/lib/utils/index.d.ts +10 -0
  171. package/lib/utils/index.js +27 -0
  172. package/lib/utils/logger.d.ts +13 -0
  173. package/lib/utils/logger.js +100 -0
  174. package/lib/utils/prepare-packets.d.ts +16 -0
  175. package/lib/utils/prepare-packets.js +61 -0
  176. package/lib/utils/redactions.d.ts +41 -0
  177. package/lib/utils/redactions.js +111 -0
  178. package/lib/utils/retries.d.ts +12 -0
  179. package/lib/utils/retries.js +28 -0
  180. package/lib/utils/signatures/eth.d.ts +2 -0
  181. package/lib/utils/signatures/eth.js +33 -0
  182. package/lib/utils/signatures/index.d.ts +5 -0
  183. package/lib/utils/signatures/index.js +11 -0
  184. package/lib/utils/socket-base.d.ts +21 -0
  185. package/lib/utils/socket-base.js +89 -0
  186. package/lib/utils/tls.d.ts +2 -0
  187. package/lib/utils/tls.js +32 -0
  188. package/lib/utils/validation.d.ts +2 -0
  189. package/lib/utils/validation.js +46 -0
  190. package/lib/utils/ws.d.ts +12 -0
  191. package/lib/utils/ws.js +21 -0
  192. package/lib/utils/zk.d.ts +50 -0
  193. package/lib/utils/zk.js +282 -0
  194. package/lib/window-rpc/index.d.ts +3 -0
  195. package/lib/window-rpc/index.js +20 -0
  196. package/lib/window-rpc/setup-window-rpc.d.ts +5 -0
  197. package/lib/window-rpc/setup-window-rpc.js +239 -0
  198. package/lib/window-rpc/types.d.ts +184 -0
  199. package/lib/window-rpc/types.js +3 -0
  200. package/lib/window-rpc/utils.d.ts +13 -0
  201. package/lib/window-rpc/utils.js +76 -0
  202. package/lib/window-rpc/window-rpc-zk.d.ts +11 -0
  203. package/lib/window-rpc/window-rpc-zk.js +72 -0
  204. package/package.json +117 -0
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeTcpTunnel = void 0;
4
+ const dns_1 = require("dns");
5
+ const https_proxy_agent_1 = require("https-proxy-agent");
6
+ const net_1 = require("net");
7
+ const config_1 = require("src/config");
8
+ const iso_1 = require("src/server/utils/iso");
9
+ const utils_1 = require("src/utils");
10
+ const env_1 = require("src/utils/env");
11
+ const HTTPS_PROXY_URL = (0, env_1.getEnvVariable)('HTTPS_PROXY_URL');
12
+ /**
13
+ * Builds a TCP tunnel to the given host and port.
14
+ * If a geolocation is provided -- an HTTPS proxy is used
15
+ * to connect to the host.
16
+ *
17
+ * HTTPS proxy essentially creates an opaque tunnel to the
18
+ * host using the CONNECT method. Any data can be sent through
19
+ * this tunnel to the end host.
20
+ * https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT
21
+ *
22
+ * The tunnel also retains a transcript of all messages sent and received.
23
+ */
24
+ const makeTcpTunnel = async ({ onClose, onMessage, logger, ...opts }) => {
25
+ const transcript = [];
26
+ const socket = await connectTcp({ ...opts, logger });
27
+ socket.once('error', close);
28
+ socket.once('end', () => close(undefined));
29
+ socket.on('data', message => {
30
+ onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);
31
+ transcript.push({ sender: 'server', message });
32
+ });
33
+ return {
34
+ transcript,
35
+ createRequest: opts,
36
+ async write(data) {
37
+ transcript.push({ sender: 'client', message: data });
38
+ await new Promise((resolve, reject) => {
39
+ socket.write(data, err => {
40
+ if (err) {
41
+ reject(err);
42
+ }
43
+ else {
44
+ resolve();
45
+ }
46
+ });
47
+ });
48
+ },
49
+ close,
50
+ };
51
+ function close(error) {
52
+ if (socket.readableEnded) {
53
+ return;
54
+ }
55
+ logger.debug({ err: error }, 'closing socket');
56
+ socket.end(() => {
57
+ // Do nothing
58
+ });
59
+ onClose === null || onClose === void 0 ? void 0 : onClose(error);
60
+ onClose = undefined;
61
+ }
62
+ };
63
+ exports.makeTcpTunnel = makeTcpTunnel;
64
+ setDnsServers();
65
+ async function connectTcp({ host, port, geoLocation, logger }) {
66
+ let connectTimeout;
67
+ let socket;
68
+ try {
69
+ await new Promise(async (resolve, reject) => {
70
+ try {
71
+ // add a timeout to ensure the connection doesn't hang
72
+ // and cause our gateway to send out a 504
73
+ connectTimeout = setTimeout(() => reject(new utils_1.AttestorError('ERROR_NETWORK_ERROR', 'Server connection timed out')), config_1.CONNECTION_TIMEOUT_MS);
74
+ socket = await getSocket({
75
+ host,
76
+ port,
77
+ geoLocation,
78
+ logger
79
+ });
80
+ socket.once('connect', resolve);
81
+ socket.once('error', reject);
82
+ socket.once('end', () => (reject(new utils_1.AttestorError('ERROR_NETWORK_ERROR', 'connection closed'))));
83
+ }
84
+ catch (err) {
85
+ reject(err);
86
+ }
87
+ });
88
+ logger.debug({ addr: `${host}:${port}` }, 'connected');
89
+ return socket;
90
+ }
91
+ catch (err) {
92
+ socket === null || socket === void 0 ? void 0 : socket.end();
93
+ throw err;
94
+ }
95
+ finally {
96
+ clearTimeout(connectTimeout);
97
+ }
98
+ }
99
+ async function getSocket(opts) {
100
+ var _a;
101
+ const { logger } = opts;
102
+ try {
103
+ return await _getSocket(opts);
104
+ }
105
+ catch (err) {
106
+ // see if the proxy is blocking the connection
107
+ // due to their own arbitrary rules,
108
+ // if so -- we resolve hostname first &
109
+ // connect directly via address to
110
+ // avoid proxy knowing which host we're connecting to
111
+ if (!(err instanceof utils_1.AttestorError)
112
+ || ((_a = err.data) === null || _a === void 0 ? void 0 : _a.code) !== 403) {
113
+ throw err;
114
+ }
115
+ const addrs = await resolveHostnames(opts.host);
116
+ logger.info({ addrs, host: opts.host }, 'failed to connect due to restricted IP, trying via raw addr');
117
+ for (const addr of addrs) {
118
+ try {
119
+ return await _getSocket({ ...opts, host: addr });
120
+ }
121
+ catch (err) {
122
+ logger.error({ addr, err }, 'failed to connect to host');
123
+ }
124
+ }
125
+ throw err;
126
+ }
127
+ }
128
+ async function _getSocket({ host, port, geoLocation, logger }) {
129
+ const socket = new net_1.Socket();
130
+ if (geoLocation && !HTTPS_PROXY_URL) {
131
+ logger.warn({ geoLocation }, 'geoLocation provided but no proxy URL found');
132
+ geoLocation = '';
133
+ }
134
+ if (!geoLocation) {
135
+ socket.connect({ host, port, });
136
+ return socket;
137
+ }
138
+ if (!(0, iso_1.isValidCountryCode)(geoLocation)) {
139
+ throw utils_1.AttestorError.badRequest(`Geolocation "${geoLocation}" is invalid. Must be 2 letter ISO country code`, { geoLocation });
140
+ }
141
+ const agentUrl = HTTPS_PROXY_URL.replace('{{geoLocation}}', (geoLocation === null || geoLocation === void 0 ? void 0 : geoLocation.toLowerCase()) || '');
142
+ const agent = new https_proxy_agent_1.HttpsProxyAgent(agentUrl);
143
+ const waitForProxyRes = new Promise(resolve => {
144
+ // @ts-ignore
145
+ socket.once('proxyConnect', resolve);
146
+ });
147
+ const proxySocket = await agent.connect(
148
+ // ignore, because https-proxy-agent
149
+ // expects an http request object
150
+ // @ts-ignore
151
+ socket, { host, port, timeout: config_1.CONNECTION_TIMEOUT_MS });
152
+ const res = await waitForProxyRes;
153
+ if (res.statusCode !== 200) {
154
+ logger.error({ geoLocation, res }, 'Proxy geo location failed');
155
+ throw new utils_1.AttestorError('ERROR_PROXY_ERROR', `Proxy via geo location "${geoLocation}" failed with status code: ${res.statusCode}, message: ${res.statusText}`, {
156
+ code: res.statusCode,
157
+ message: res.statusText,
158
+ });
159
+ }
160
+ process.nextTick(() => {
161
+ // ensure connect event is emitted
162
+ // so it can be captured by the caller
163
+ proxySocket.emit('connect');
164
+ });
165
+ return proxySocket;
166
+ }
167
+ async function resolveHostnames(hostname) {
168
+ return new Promise((_resolve, reject) => {
169
+ (0, dns_1.resolve)(hostname, (err, addresses) => {
170
+ if (err) {
171
+ reject(new Error(`Could not resolve hostname: ${hostname}, ${err.message}`));
172
+ }
173
+ else {
174
+ _resolve(addresses);
175
+ }
176
+ });
177
+ });
178
+ }
179
+ function setDnsServers() {
180
+ (0, dns_1.setServers)(config_1.DNS_SERVERS);
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS10Y3AtdHVubmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90dW5uZWxzL21ha2UtdGNwLXR1bm5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBeUM7QUFDekMseURBQW1EO0FBRW5ELDZCQUE0QjtBQUM1Qix1Q0FBK0Q7QUFFL0QsOENBQXlEO0FBR3pELHFDQUF5QztBQUN6Qyx1Q0FBOEM7QUFFOUMsTUFBTSxlQUFlLEdBQUcsSUFBQSxvQkFBYyxFQUFDLGlCQUFpQixDQUFDLENBQUE7QUFLekQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxNQUFNLGFBQWEsR0FBaUQsS0FBSyxFQUFDLEVBQ2hGLE9BQU8sRUFDUCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsSUFBSSxFQUNQLEVBQUUsRUFBRTtJQUNKLE1BQU0sVUFBVSxHQUFzQyxFQUFFLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBRXBELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRyxPQUFPLENBQUMsQ0FBQTtRQUNwQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTztRQUNOLFVBQVU7UUFDVixhQUFhLEVBQUUsSUFBSTtRQUNuQixLQUFLLENBQUMsS0FBSyxDQUFD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
@@ -0,0 +1,11 @@
1
+ import { Agent } from 'elastic-apm-node';
2
+ /**
3
+ * Initialises the APM agent if required,
4
+ * and returns it.
5
+ * If ELASTIC_APM_SERVER_URL & ELASTIC_APM_SECRET_TOKEN
6
+ * are not set will return undefined
7
+ *
8
+ * Utilises the standard env variables mentioned
9
+ * here: https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html#custom-stack-advanced-configuration
10
+ */
11
+ export declare function getApm(): Agent | undefined;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getApm = getApm;
7
+ const elastic_apm_node_1 = __importDefault(require("elastic-apm-node"));
8
+ const env_1 = require("src/utils/env");
9
+ const logger_1 = require("src/utils/logger");
10
+ let apm;
11
+ /**
12
+ * Initialises the APM agent if required,
13
+ * and returns it.
14
+ * If ELASTIC_APM_SERVER_URL & ELASTIC_APM_SECRET_TOKEN
15
+ * are not set will return undefined
16
+ *
17
+ * Utilises the standard env variables mentioned
18
+ * here: https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html#custom-stack-advanced-configuration
19
+ */
20
+ function getApm() {
21
+ if (!(0, env_1.getEnvVariable)('ELASTIC_APM_SERVER_URL') || !(0, env_1.getEnvVariable)('ELASTIC_APM_SECRET_TOKEN')) {
22
+ logger_1.logger.info('ELASTIC_APM_SERVER_URL or ELASTIC_APM_SECRET_TOKEN no found in env APM agent not initialised');
23
+ return undefined;
24
+ }
25
+ if (!apm) {
26
+ const sampleRate = +((0, env_1.getEnvVariable)('ELASTIC_APM_SAMPLE_RATE')
27
+ || '0.1');
28
+ apm = elastic_apm_node_1.default.start({
29
+ serviceName: 'reclaim_attestor',
30
+ serviceVersion: '2.0.0',
31
+ transactionSampleRate: sampleRate,
32
+ instrumentIncomingHTTPRequests: false,
33
+ instrument: true,
34
+ });
35
+ logger_1.logger.info('initialised APM agent');
36
+ }
37
+ return apm;
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci91dGlscy9hcG0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFlQSx3QkFzQkM7QUFyQ0Qsd0VBQW9EO0FBQ3BELHVDQUE4QztBQUM5Qyw2Q0FBeUM7QUFFekMsSUFBSSxHQUFzQixDQUFBO0FBRTFCOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsTUFBTTtJQUNyQixJQUFHLENBQUMsSUFBQSxvQkFBYyxFQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFBLG9CQUFjLEVBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1FBQzdGLGVBQU0sQ0FBQyxJQUFJLENBQUMsOEZBQThGLENBQUMsQ0FBQTtRQUMzRyxPQUFPLFNBQVMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsSUFBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUNuQixJQUFBLG9CQUFjLEVBQUMseUJBQXlCLENBQUM7ZUFDdEMsS0FBSyxDQUNSLENBQUE7UUFDRCxHQUFHLEdBQUcsMEJBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsV0FBVyxFQUFFLGtCQUFrQjtZQUMvQixjQUFjLEVBQUUsT0FBTztZQUN2QixxQkFBcUIsRUFBRSxVQUFVO1lBQ2pDLDhCQUE4QixFQUFFLEtBQUs7WUFDckMsVUFBVSxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsZUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNYLENBQUMifQ==
@@ -0,0 +1,29 @@
1
+ import { ClaimTunnelRequest, InitRequest, ProviderClaimInfo } from 'src/proto/api';
2
+ import { IDecryptedTranscript, Logger, TCPSocketProperties, Transcript, ZKEngine } from 'src/types';
3
+ /**
4
+ * Asserts that the claim request is valid.
5
+ *
6
+ * 1. We begin by verifying the signature of the claim request.
7
+ * 2. Next, we produce the transcript of the TLS exchange
8
+ * from the proofs provided by the client.
9
+ * 3. We then pull the provider the client is trying to claim
10
+ * from
11
+ * 4. We then use the provider's verification function to verify
12
+ * whether the claim is valid.
13
+ *
14
+ * If any of these steps fail, we throw an error.
15
+ */
16
+ export declare function assertValidClaimRequest(request: ClaimTunnelRequest, metadata: InitRequest, logger: Logger): Promise<import("src/proto/api").ClaimRequestData>;
17
+ /**
18
+ * Verify that the transcript contains a valid claim
19
+ * for the provider.
20
+ */
21
+ export declare function assertValidProviderTranscript<T extends ProviderClaimInfo>(applData: Transcript<Uint8Array>, info: T): Promise<T>;
22
+ /**
23
+ * Verify that the transcript provided by the client
24
+ * matches the transcript of the tunnel, the server
25
+ * has created.
26
+ */
27
+ export declare function assertTranscriptsMatch(clientTranscript: ClaimTunnelRequest['transcript'], tunnelTranscript: TCPSocketProperties['transcript']): void;
28
+ export declare function decryptTranscript(transcript: ClaimTunnelRequest['transcript'], logger: Logger, zkEngine: ZKEngine, serverIV: Uint8Array, clientIV: Uint8Array): Promise<IDecryptedTranscript>;
29
+ export declare function getWithoutHeader(message: Uint8Array): Uint8Array;
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertValidClaimRequest = assertValidClaimRequest;
4
+ exports.assertValidProviderTranscript = assertValidProviderTranscript;
5
+ exports.assertTranscriptsMatch = assertTranscriptsMatch;
6
+ exports.decryptTranscript = decryptTranscript;
7
+ exports.getWithoutHeader = getWithoutHeader;
8
+ const tls_1 = require("@reclaimprotocol/tls");
9
+ const api_1 = require("src/proto/api");
10
+ const providers_1 = require("src/providers");
11
+ const generics_1 = require("src/server/utils/generics");
12
+ const process_handshake_1 = require("src/server/utils/process-handshake");
13
+ const utils_1 = require("src/utils");
14
+ const signatures_1 = require("src/utils/signatures");
15
+ /**
16
+ * Asserts that the claim request is valid.
17
+ *
18
+ * 1. We begin by verifying the signature of the claim request.
19
+ * 2. Next, we produce the transcript of the TLS exchange
20
+ * from the proofs provided by the client.
21
+ * 3. We then pull the provider the client is trying to claim
22
+ * from
23
+ * 4. We then use the provider's verification function to verify
24
+ * whether the claim is valid.
25
+ *
26
+ * If any of these steps fail, we throw an error.
27
+ */
28
+ async function assertValidClaimRequest(request, metadata, logger) {
29
+ var _a;
30
+ const { data, signatures: { requestSignature } = {}, zkEngine, fixedServerIV, fixedClientIV } = request;
31
+ if (!data) {
32
+ throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'No info provided on claim request');
33
+ }
34
+ if (!(requestSignature === null || requestSignature === void 0 ? void 0 : requestSignature.length)) {
35
+ throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'No signature provided on claim request');
36
+ }
37
+ // verify request signature
38
+ const serialisedReq = api_1.ClaimTunnelRequest
39
+ .encode({ ...request, signatures: undefined })
40
+ .finish();
41
+ const { verify: verifySig } = signatures_1.SIGNATURES[metadata.signatureType];
42
+ const verified = await verifySig(serialisedReq, requestSignature, data.owner);
43
+ if (!verified) {
44
+ throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'Invalid signature on claim request');
45
+ }
46
+ const receipt = await decryptTranscript(request.transcript, logger, zkEngine === api_1.ZKProofEngine.ZK_ENGINE_GNARK ? 'gnark' : 'snarkJS', fixedServerIV, fixedClientIV);
47
+ const reqHost = (_a = request.request) === null || _a === void 0 ? void 0 : _a.host;
48
+ if (receipt.hostname !== reqHost) {
49
+ throw new Error(`Expected server name ${reqHost}, got ${receipt.hostname}`);
50
+ }
51
+ // get all application data messages
52
+ const applData = (0, utils_1.extractApplicationDataFromTranscript)(receipt);
53
+ const newData = await assertValidProviderTranscript(applData, data);
54
+ if (newData !== data) {
55
+ logger.info({ newData }, 'updated claim info');
56
+ }
57
+ return newData;
58
+ }
59
+ /**
60
+ * Verify that the transcript contains a valid claim
61
+ * for the provider.
62
+ */
63
+ async function assertValidProviderTranscript(applData, info) {
64
+ var _a;
65
+ const providerName = info.provider;
66
+ const provider = providers_1.providers[providerName];
67
+ if (!provider) {
68
+ throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', `Unsupported provider: ${providerName}`);
69
+ }
70
+ const params = (0, generics_1.niceParseJsonObject)(info.parameters, 'params');
71
+ const ctx = (0, generics_1.niceParseJsonObject)(info.context, 'context');
72
+ (0, utils_1.assertValidateProviderParams)(providerName, params);
73
+ const rslt = await provider.assertValidProviderReceipt(applData, params);
74
+ const extractedParameters = (rslt === null || rslt === void 0 ? void 0 : rslt.extractedParameters) || {};
75
+ if (!Object.keys(extractedParameters).length) {
76
+ return info;
77
+ }
78
+ const newInfo = { ...info };
79
+ ctx.extractedParameters = extractedParameters;
80
+ ctx.providerHash = (0, utils_1.hashProviderParams)(params);
81
+ newInfo.context = (_a = (0, utils_1.canonicalStringify)(ctx)) !== null && _a !== void 0 ? _a : '';
82
+ return newInfo;
83
+ }
84
+ /**
85
+ * Verify that the transcript provided by the client
86
+ * matches the transcript of the tunnel, the server
87
+ * has created.
88
+ */
89
+ function assertTranscriptsMatch(clientTranscript, tunnelTranscript) {
90
+ const clientSends = (0, tls_1.concatenateUint8Arrays)(clientTranscript
91
+ .filter(m => m.sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT)
92
+ .map(m => m.message));
93
+ const tunnelSends = (0, tls_1.concatenateUint8Arrays)(tunnelTranscript
94
+ .filter(m => m.sender === 'client')
95
+ .map(m => m.message));
96
+ if (!(0, tls_1.areUint8ArraysEqual)(clientSends, tunnelSends)) {
97
+ throw utils_1.AttestorError.badRequest('Outgoing messages from client do not match the tunnel transcript');
98
+ }
99
+ const clientRecvs = (0, tls_1.concatenateUint8Arrays)(clientTranscript
100
+ .filter(m => m.sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER)
101
+ .map(m => m.message));
102
+ const tunnelRecvs = (0, tls_1.concatenateUint8Arrays)(tunnelTranscript
103
+ .filter(m => m.sender === 'server')
104
+ .map(m => m.message))
105
+ // We only need to compare the first N messages
106
+ // that the client claims to have received
107
+ // the rest are not relevant -- so even if they're
108
+ // not present in the tunnel transcript, it's fine
109
+ .slice(0, clientRecvs.length);
110
+ if (!(0, tls_1.areUint8ArraysEqual)(clientRecvs, tunnelRecvs)) {
111
+ throw utils_1.AttestorError.badRequest('Incoming messages from server do not match the tunnel transcript');
112
+ }
113
+ }
114
+ async function decryptTranscript(transcript, logger, zkEngine, serverIV, clientIV) {
115
+ const { tlsVersion, cipherSuite, hostname, nextMsgIndex } = await (0, process_handshake_1.processHandshake)(transcript, logger);
116
+ let clientRecordNumber = tlsVersion === 'TLS1_3' ? -1 : 0; // TLS 1.3 has already one record encrypted at this point
117
+ let serverRecordNumber = clientRecordNumber;
118
+ transcript = transcript.slice(nextMsgIndex);
119
+ const decryptedTranscript = [];
120
+ for (const [i, { sender, message, reveal: { zkReveal, directReveal } = {} }] of transcript.entries()) { //start with first message after last handshake message
121
+ await getDecryptedMessage(sender, message, directReveal, zkReveal, i);
122
+ }
123
+ return {
124
+ transcript: decryptedTranscript,
125
+ hostname: hostname,
126
+ tlsVersion: tlsVersion,
127
+ };
128
+ async function getDecryptedMessage(sender, message, directReveal, zkReveal, i) {
129
+ var _a, _b;
130
+ try {
131
+ const isServer = sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER;
132
+ const recordHeader = message.slice(0, 5);
133
+ const content = getWithoutHeader(message);
134
+ if (isServer) {
135
+ serverRecordNumber++;
136
+ }
137
+ else {
138
+ clientRecordNumber++;
139
+ }
140
+ let redacted = true;
141
+ let plaintext = undefined;
142
+ let plaintextLength;
143
+ if ((_a = directReveal === null || directReveal === void 0 ? void 0 : directReveal.key) === null || _a === void 0 ? void 0 : _a.length) {
144
+ const result = await (0, utils_1.decryptDirect)(directReveal, cipherSuite, recordHeader, tlsVersion, content);
145
+ plaintext = result.plaintext;
146
+ redacted = false;
147
+ plaintextLength = plaintext.length;
148
+ }
149
+ else if ((_b = zkReveal === null || zkReveal === void 0 ? void 0 : zkReveal.proofs) === null || _b === void 0 ? void 0 : _b.length) {
150
+ const result = await (0, utils_1.verifyZkPacket)({
151
+ ciphertext: content,
152
+ zkReveal,
153
+ logger,
154
+ cipherSuite,
155
+ zkEngine: zkEngine,
156
+ iv: sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_SERVER ? serverIV : clientIV,
157
+ recordNumber: isServer ? serverRecordNumber : clientRecordNumber
158
+ });
159
+ plaintext = result.redactedPlaintext;
160
+ redacted = false;
161
+ plaintextLength = plaintext.length;
162
+ }
163
+ else {
164
+ plaintext = content;
165
+ plaintextLength = plaintext.length;
166
+ }
167
+ decryptedTranscript.push({
168
+ sender: sender === api_1.TranscriptMessageSenderType.TRANSCRIPT_MESSAGE_SENDER_TYPE_CLIENT
169
+ ? 'client'
170
+ : 'server',
171
+ redacted,
172
+ message: plaintext,
173
+ recordHeader,
174
+ plaintextLength,
175
+ });
176
+ }
177
+ catch (error) {
178
+ throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', `error in handling packet at idx ${i}: ${error}`, {
179
+ packetIdx: i,
180
+ error: error,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ function getWithoutHeader(message) {
186
+ // strip the record header (xx 03 03 xx xx)
187
+ return message.slice(5);
188
+ }
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXZhbGlkLWNsYWltLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Fzc2VydC12YWxpZC1jbGFpbS1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLDBEQWtFQztBQU1ELHNFQWtDQztBQU9ELHdEQTJDQztBQUVELDhDQThGQztBQUVELDRDQUdDO0FBN1NELDhDQUc2QjtBQUM3Qix1Q0FNc0I7QUFDdEIsNkNBQXlDO0FBQ3pDLHdEQUErRDtBQUMvRCwwRUFBcUU7QUFTckUscUNBTWtCO0FBQ2xCLHFEQUFpRDtBQUVqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzVDLE9BQTJCLEVBQzNCLFFBQXFCLEVBQ3JCLE1BQWM7O0lBRWQsTUFBTSxFQUNMLElBQUksRUFDSixVQUFVLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsRUFDckMsUUFBUSxFQUNSLGFBQWEsRUFDYixhQUFhLEVBQ2IsR0FBRyxPQUFPLENBQUE7SUFDWCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUkscUJBQWEsQ0FDdEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxDQUNuQyxDQUFBO0lBQ0YsQ0FBQztJQUVELElBQUcsQ0FBQyxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLHFCQUFhLENBQ3RCLHFCQUFxQixFQUNyQix3Q0FBd0MsQ0FDeEMsQ0FBQTtJQUNGLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsTUFBTSxhQUFhLEdBQUcsd0JBQWtCO1NBQ3RDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUM3QyxNQUFNLEVBQUUsQ0FBQTtJQUNWLE1BQU0sRUFBRSxNQUFNLEVBQUUs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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dotenv_1 = require("dotenv");
4
+ const env_1 = require("src/utils/env");
5
+ const nodeEnv = (0, env_1.getEnvVariable)('NODE_ENV') || 'development';
6
+ (0, dotenv_1.config)({ path: `.env.${nodeEnv}` });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvY29uZmlnLWVudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUErQjtBQUMvQix1Q0FBOEM7QUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBQSxvQkFBYyxFQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQTtBQUMzRCxJQUFBLGVBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQSJ9
@@ -0,0 +1,22 @@
1
+ import { IncomingMessage } from 'http';
2
+ import { ServiceSignatureType } from 'src/proto/api';
3
+ /**
4
+ * Sign message using the PRIVATE_KEY env var.
5
+ */
6
+ export declare function signAsAttestor(data: Uint8Array | string, scheme: ServiceSignatureType): Uint8Array | Promise<Uint8Array>;
7
+ /**
8
+ * Obtain the address on chain, from the PRIVATE_KEY env var.
9
+ */
10
+ export declare function getAttestorAddress(scheme: ServiceSignatureType): string;
11
+ /**
12
+ * Nice parse JSON with a key.
13
+ * If the data is empty, returns an empty object.
14
+ * And if the JSON is invalid, throws a bad request error,
15
+ * with the key in the error message.
16
+ */
17
+ export declare function niceParseJsonObject(data: string, key: string): any;
18
+ /**
19
+ * Extract any initial messages sent via the query string,
20
+ * in the `messages` parameter.
21
+ */
22
+ export declare function getInitialMessagesFromQuery(req: IncomingMessage): import("src/proto/api").RPCMessage[];
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signAsAttestor = signAsAttestor;
4
+ exports.getAttestorAddress = getAttestorAddress;
5
+ exports.niceParseJsonObject = niceParseJsonObject;
6
+ exports.getInitialMessagesFromQuery = getInitialMessagesFromQuery;
7
+ const tls_1 = require("@reclaimprotocol/tls");
8
+ const api_1 = require("src/proto/api");
9
+ const utils_1 = require("src/utils");
10
+ const env_1 = require("src/utils/env");
11
+ const signatures_1 = require("src/utils/signatures");
12
+ const PRIVATE_KEY = (0, env_1.getEnvVariable)('PRIVATE_KEY');
13
+ /**
14
+ * Sign message using the PRIVATE_KEY env var.
15
+ */
16
+ function signAsAttestor(data, scheme) {
17
+ const { sign } = signatures_1.SIGNATURES[scheme];
18
+ return sign(typeof data === 'string' ? (0, tls_1.strToUint8Array)(data) : data, PRIVATE_KEY);
19
+ }
20
+ /**
21
+ * Obtain the address on chain, from the PRIVATE_KEY env var.
22
+ */
23
+ function getAttestorAddress(scheme) {
24
+ const { getAddress, getPublicKey } = signatures_1.SIGNATURES[scheme];
25
+ const publicKey = getPublicKey(PRIVATE_KEY);
26
+ return getAddress(publicKey);
27
+ }
28
+ /**
29
+ * Nice parse JSON with a key.
30
+ * If the data is empty, returns an empty object.
31
+ * And if the JSON is invalid, throws a bad request error,
32
+ * with the key in the error message.
33
+ */
34
+ function niceParseJsonObject(data, key) {
35
+ if (!data) {
36
+ return {};
37
+ }
38
+ try {
39
+ return JSON.parse(data);
40
+ }
41
+ catch (e) {
42
+ throw utils_1.AttestorError.badRequest(`Invalid JSON in ${key}: ${e.message}`);
43
+ }
44
+ }
45
+ /**
46
+ * Extract any initial messages sent via the query string,
47
+ * in the `messages` parameter.
48
+ */
49
+ function getInitialMessagesFromQuery(req) {
50
+ const url = new URL(req.url, 'http://localhost');
51
+ const messagesB64 = url.searchParams.get('messages');
52
+ if (!(messagesB64 === null || messagesB64 === void 0 ? void 0 : messagesB64.length)) {
53
+ return [];
54
+ }
55
+ const msgsBytes = Buffer.from(messagesB64, 'base64');
56
+ const msgs = api_1.RPCMessages.decode(msgsBytes);
57
+ return msgs.messages;
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2dlbmVyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBWUEsd0NBU0M7QUFLRCxnREFJQztBQVFELGtEQVlDO0FBTUQsa0VBVUM7QUFsRUQsOENBQXNEO0FBRXRELHVDQUFpRTtBQUNqRSxxQ0FBeUM7QUFDekMsdUNBQThDO0FBQzlDLHFEQUFpRDtBQUVqRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsYUFBYSxDQUFFLENBQUE7QUFFbEQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzdCLElBQXlCLEVBQ3pCLE1BQTRCO0lBRTVCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25DLE9BQU8sSUFBSSxDQUNWLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBQSxxQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ3ZELFdBQVcsQ0FDWCxDQUFBO0FBQ0YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBNEI7SUFDOUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyx1QkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMzQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsR0FBVztJQUM1RCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLHFCQUFhLENBQUMsVUFBVSxDQUM3QixtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDdEMsQ0FBQTtJQUNGLENBQUM7QUFDRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsR0FBb0I7SUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3BELElBQUcsQ0FBQyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxNQUFNLENBQUEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFBO0lBQ1YsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3BELE1BQU0sSUFBSSxHQUFHLGlCQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtBQUNyQixDQUFDIn0=
@@ -0,0 +1 @@
1
+ export declare function isValidCountryCode(countryCode: string): boolean;