@unchainedshop/plugins 3.1.11 → 3.1.13
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.
- package/lib/accounts/google-oauth.d.ts +4 -0
- package/lib/accounts/google-oauth.d.ts.map +1 -0
- package/lib/accounts/google-oauth.js +145 -0
- package/lib/accounts/google-oauth.js.map +1 -0
- package/lib/accounts/linkedin-oauth.d.ts +4 -0
- package/lib/accounts/linkedin-oauth.d.ts.map +1 -0
- package/lib/accounts/linkedin-oauth.js +82 -0
- package/lib/accounts/linkedin-oauth.js.map +1 -0
- package/lib/files/gridfs/gridfs-adapter.d.ts +3 -0
- package/lib/files/gridfs/gridfs-adapter.d.ts.map +1 -0
- package/lib/files/gridfs/gridfs-adapter.js +97 -0
- package/lib/files/gridfs/gridfs-adapter.js.map +1 -0
- package/lib/files/gridfs/gridfs-webhook.d.ts +11 -0
- package/lib/files/gridfs/gridfs-webhook.d.ts.map +1 -0
- package/lib/files/gridfs/gridfs-webhook.js +84 -0
- package/lib/files/gridfs/gridfs-webhook.js.map +1 -0
- package/lib/files/minio/minio-adapter.d.ts +6 -0
- package/lib/files/minio/minio-adapter.d.ts.map +1 -0
- package/lib/files/minio/minio-adapter.js +181 -0
- package/lib/files/minio/minio-adapter.js.map +1 -0
- package/lib/files/minio/minio-webhook.d.ts +2 -0
- package/lib/files/minio/minio-webhook.d.ts.map +1 -0
- package/lib/files/minio/minio-webhook.js +33 -0
- package/lib/files/minio/minio-webhook.js.map +1 -0
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts +9 -0
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts.map +1 -0
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js +17 -0
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js.map +1 -0
- package/lib/payment/cryptopay/denote-amount.d.ts +25 -0
- package/lib/payment/cryptopay/denote-amount.d.ts.map +1 -0
- package/lib/payment/cryptopay/denote-amount.js +31 -0
- package/lib/payment/cryptopay/denote-amount.js.map +1 -0
- package/lib/payment/cryptopay/derive-btc-address.d.ts +3 -0
- package/lib/payment/cryptopay/derive-btc-address.d.ts.map +1 -0
- package/lib/payment/cryptopay/derive-btc-address.js +39 -0
- package/lib/payment/cryptopay/derive-btc-address.js.map +1 -0
- package/lib/payment/cryptopay/derive-eth-address.d.ts +3 -0
- package/lib/payment/cryptopay/derive-eth-address.d.ts.map +1 -0
- package/lib/payment/cryptopay/derive-eth-address.js +32 -0
- package/lib/payment/cryptopay/derive-eth-address.js.map +1 -0
- package/lib/payment/cryptopay/handle-webhook.d.ts +26 -0
- package/lib/payment/cryptopay/handle-webhook.d.ts.map +1 -0
- package/lib/payment/cryptopay/handle-webhook.js +61 -0
- package/lib/payment/cryptopay/handle-webhook.js.map +1 -0
- package/lib/payment/cryptopay/middleware.d.ts +2 -0
- package/lib/payment/cryptopay/middleware.d.ts.map +1 -0
- package/lib/payment/cryptopay/middleware.js +75 -0
- package/lib/payment/cryptopay/middleware.js.map +1 -0
- package/lib/payment/cryptopay/module/configureCryptopayModule.d.ts +25 -0
- package/lib/payment/cryptopay/module/configureCryptopayModule.d.ts.map +1 -0
- package/lib/payment/cryptopay/module/configureCryptopayModule.js +75 -0
- package/lib/payment/cryptopay/module/configureCryptopayModule.js.map +1 -0
- package/lib/payment/datatrans-v2/middleware.d.ts +2 -0
- package/lib/payment/datatrans-v2/middleware.d.ts.map +1 -0
- package/lib/payment/datatrans-v2/middleware.js +68 -0
- package/lib/payment/datatrans-v2/middleware.js.map +1 -0
- package/lib/payment/payrexx/middleware.d.ts +2 -0
- package/lib/payment/payrexx/middleware.d.ts.map +1 -0
- package/lib/payment/payrexx/middleware.js +86 -0
- package/lib/payment/payrexx/middleware.js.map +1 -0
- package/lib/payment/postfinance-checkout/middleware.d.ts +2 -0
- package/lib/payment/postfinance-checkout/middleware.d.ts.map +1 -0
- package/lib/payment/postfinance-checkout/middleware.js +38 -0
- package/lib/payment/postfinance-checkout/middleware.js.map +1 -0
- package/lib/payment/saferpay/middleware.d.ts +2 -0
- package/lib/payment/saferpay/middleware.d.ts.map +1 -0
- package/lib/payment/saferpay/middleware.js +57 -0
- package/lib/payment/saferpay/middleware.js.map +1 -0
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.d.ts +10 -0
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.d.ts.map +1 -0
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.js +24 -0
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.js.map +1 -0
- package/lib/payment/stripe/middleware.d.ts +6 -0
- package/lib/payment/stripe/middleware.d.ts.map +1 -0
- package/lib/payment/stripe/middleware.js +114 -0
- package/lib/payment/stripe/middleware.js.map +1 -0
- package/lib/payment/stripe/stripe.js +1 -1
- package/lib/payment/stripe/stripe.js.map +1 -1
- package/lib/plugins-index.d.ts +48 -0
- package/lib/plugins-index.d.ts.map +1 -0
- package/lib/plugins-index.js +107 -0
- package/lib/plugins-index.js.map +1 -0
- package/package.json +28 -28
- package/src/payment/stripe/stripe.ts +1 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import https from 'https';
|
|
2
|
+
import http from 'http';
|
|
3
|
+
import { Readable } from 'stream';
|
|
4
|
+
import { URL } from 'url';
|
|
5
|
+
import { FileAdapter, FileDirector, buildHashedFilename, resolveExpirationDate, } from '@unchainedshop/file-upload';
|
|
6
|
+
import { log, LogLevel } from '@unchainedshop/logger';
|
|
7
|
+
import mimeType from 'mime-types';
|
|
8
|
+
import { Client } from 'minio';
|
|
9
|
+
import { AssumeRoleProvider } from 'minio/dist/esm/AssumeRoleProvider.mjs';
|
|
10
|
+
import { expiryOffsetInMs } from '@unchainedshop/file-upload/put-expiration.js';
|
|
11
|
+
const { MINIO_ACCESS_KEY, MINIO_REGION, MINIO_STS_ENDPOINT, MINIO_SECRET_KEY, MINIO_ENDPOINT, MINIO_BUCKET_NAME, MINIO_UPLOAD_PREFIX, NODE_ENV, AMAZON_S3_SESSION_TOKEN, } = process.env;
|
|
12
|
+
let client;
|
|
13
|
+
export async function connectToMinio() {
|
|
14
|
+
if (!MINIO_ENDPOINT || !MINIO_BUCKET_NAME) {
|
|
15
|
+
log('Please configure Minio/S3 by providing MINIO_ENDPOINT & MINIO_BUCKET_NAME to use upload features', { level: LogLevel.Error });
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const resolvedUrl = new URL(MINIO_ENDPOINT);
|
|
20
|
+
const minioClient = new Client({
|
|
21
|
+
endPoint: resolvedUrl.hostname,
|
|
22
|
+
useSSL: resolvedUrl.protocol === 'https:',
|
|
23
|
+
port: parseInt(resolvedUrl.port, 10) || undefined,
|
|
24
|
+
region: MINIO_REGION,
|
|
25
|
+
sessionToken: AMAZON_S3_SESSION_TOKEN,
|
|
26
|
+
accessKey: MINIO_ACCESS_KEY,
|
|
27
|
+
secretKey: MINIO_SECRET_KEY,
|
|
28
|
+
});
|
|
29
|
+
// eslint-disable-next-line
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
if (NODE_ENV === 'development')
|
|
32
|
+
minioClient?.traceOn(process.stdout);
|
|
33
|
+
if (MINIO_STS_ENDPOINT) {
|
|
34
|
+
const ap = new AssumeRoleProvider({
|
|
35
|
+
stsEndpoint: MINIO_STS_ENDPOINT,
|
|
36
|
+
accessKey: MINIO_ACCESS_KEY,
|
|
37
|
+
secretKey: MINIO_SECRET_KEY,
|
|
38
|
+
});
|
|
39
|
+
// eslint-disable-next-line
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
await minioClient.setCredentialsProvider(ap);
|
|
42
|
+
}
|
|
43
|
+
return minioClient;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
log(`Exception while creating Minio client: ${error.message}`, {
|
|
47
|
+
level: LogLevel.Error,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const generateMinioPath = (directoryName, fileName) => {
|
|
53
|
+
const prefix = MINIO_UPLOAD_PREFIX || '';
|
|
54
|
+
return [prefix, directoryName, fileName].filter(Boolean).join('/');
|
|
55
|
+
};
|
|
56
|
+
const generateMinioUrl = (directoryName, hashedFilename) => {
|
|
57
|
+
return `${MINIO_ENDPOINT}/${MINIO_BUCKET_NAME}/${generateMinioPath(directoryName, hashedFilename)}`;
|
|
58
|
+
};
|
|
59
|
+
connectToMinio().then(function setClient(c) {
|
|
60
|
+
client = c;
|
|
61
|
+
});
|
|
62
|
+
const createHttpDownloadStream = async (fileUrl, headers) => {
|
|
63
|
+
const { href, protocol } = new URL(fileUrl);
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
try {
|
|
66
|
+
if (protocol === 'http:') {
|
|
67
|
+
http.get(href, { headers }, resolve);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
https.get(href, { headers }, resolve);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
reject(e);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const getObjectStats = async (fileName) => {
|
|
79
|
+
if (!client)
|
|
80
|
+
throw new Error('Minio not connected, check env variables');
|
|
81
|
+
return client.statObject(MINIO_BUCKET_NAME, fileName);
|
|
82
|
+
};
|
|
83
|
+
const bufferToStream = (buffer) => {
|
|
84
|
+
const stream = new Readable();
|
|
85
|
+
stream.push(buffer);
|
|
86
|
+
stream.push(null);
|
|
87
|
+
return stream;
|
|
88
|
+
};
|
|
89
|
+
export const MinioAdapter = {
|
|
90
|
+
key: 'shop.unchained.file-upload-plugin.minio',
|
|
91
|
+
label: 'Uploads files into an S3 bucket using minio',
|
|
92
|
+
version: '1.1.0',
|
|
93
|
+
...FileAdapter,
|
|
94
|
+
async createSignedURL(directoryName, fileName) {
|
|
95
|
+
if (!client)
|
|
96
|
+
throw new Error('Minio not connected, check env variables');
|
|
97
|
+
const expiryDate = resolveExpirationDate();
|
|
98
|
+
const _id = buildHashedFilename(directoryName, fileName, expiryDate);
|
|
99
|
+
const url = await client.presignedPutObject(MINIO_BUCKET_NAME, generateMinioPath(directoryName, _id), expiryOffsetInMs() / 1000);
|
|
100
|
+
return {
|
|
101
|
+
_id,
|
|
102
|
+
directoryName,
|
|
103
|
+
expiryDate,
|
|
104
|
+
fileName,
|
|
105
|
+
type: mimeType.lookup(fileName),
|
|
106
|
+
putURL: url,
|
|
107
|
+
url: generateMinioUrl(directoryName, _id),
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
async removeFiles(files) {
|
|
111
|
+
if (!client)
|
|
112
|
+
throw new Error('Minio not connected, check env variables');
|
|
113
|
+
const fileIds = files.map(({ path, _id }) => {
|
|
114
|
+
return `${path}/${_id}`;
|
|
115
|
+
});
|
|
116
|
+
await client.removeObjects(MINIO_BUCKET_NAME, fileIds);
|
|
117
|
+
},
|
|
118
|
+
async uploadFileFromStream(directoryName, rawFile) {
|
|
119
|
+
if (!client)
|
|
120
|
+
throw new Error('Minio not connected, check env variables');
|
|
121
|
+
let stream;
|
|
122
|
+
let fileName;
|
|
123
|
+
if (rawFile instanceof Promise) {
|
|
124
|
+
const { filename: fname, createReadStream } = await rawFile;
|
|
125
|
+
fileName = fname;
|
|
126
|
+
stream = createReadStream();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
fileName = rawFile.filename;
|
|
130
|
+
stream = bufferToStream(Buffer.from(rawFile.buffer, 'base64'));
|
|
131
|
+
}
|
|
132
|
+
const _id = buildHashedFilename(directoryName, fileName, new Date());
|
|
133
|
+
const type = mimeType.lookup(fileName) || (await Promise.resolve(rawFile)).mimetype;
|
|
134
|
+
const metaData = {
|
|
135
|
+
'Content-Type': type,
|
|
136
|
+
};
|
|
137
|
+
await client.putObject(MINIO_BUCKET_NAME, generateMinioPath(directoryName, _id), stream, undefined, metaData);
|
|
138
|
+
const { size } = await getObjectStats(generateMinioPath(directoryName, _id));
|
|
139
|
+
return {
|
|
140
|
+
_id,
|
|
141
|
+
directoryName,
|
|
142
|
+
expiryDate: null,
|
|
143
|
+
fileName,
|
|
144
|
+
size,
|
|
145
|
+
type,
|
|
146
|
+
url: generateMinioUrl(directoryName, _id),
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
async uploadFileFromURL(directoryName, { fileLink, fileName: fname, fileId, headers }) {
|
|
150
|
+
if (!client)
|
|
151
|
+
throw new Error('Minio not connected, check env variables');
|
|
152
|
+
const { href } = new URL(fileLink);
|
|
153
|
+
const fileName = fname || href.split('/').pop();
|
|
154
|
+
const hashedFilename = buildHashedFilename(directoryName, fileName, new Date());
|
|
155
|
+
const stream = await createHttpDownloadStream(fileLink, headers);
|
|
156
|
+
const type = mimeType.lookup(fileName) || stream.headers['content-type'];
|
|
157
|
+
const metaData = {
|
|
158
|
+
'Content-Type': type,
|
|
159
|
+
};
|
|
160
|
+
await client.putObject(MINIO_BUCKET_NAME, generateMinioPath(directoryName, hashedFilename), stream, undefined, metaData);
|
|
161
|
+
const { size } = await getObjectStats(generateMinioPath(directoryName, hashedFilename));
|
|
162
|
+
return {
|
|
163
|
+
_id: fileId || hashedFilename,
|
|
164
|
+
directoryName,
|
|
165
|
+
expiryDate: null,
|
|
166
|
+
fileName,
|
|
167
|
+
size,
|
|
168
|
+
type,
|
|
169
|
+
url: generateMinioUrl(directoryName, hashedFilename),
|
|
170
|
+
};
|
|
171
|
+
},
|
|
172
|
+
async createDownloadStream(file) {
|
|
173
|
+
if (!client)
|
|
174
|
+
throw new Error('Minio not connected, check env variables');
|
|
175
|
+
const stream = await client.getObject(MINIO_BUCKET_NAME, generateMinioPath(file.path, file._id));
|
|
176
|
+
return stream;
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
FileDirector.registerAdapter(MinioAdapter);
|
|
180
|
+
export default MinioAdapter;
|
|
181
|
+
//# sourceMappingURL=minio-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minio-adapter.js","sourceRoot":"","sources":["../../../src/files/minio/minio-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minio-webhook.d.ts","sourceRoot":"","sources":["../../../src/files/minio/minio-webhook.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,uCAwBxB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { log, LogLevel } from '@unchainedshop/logger';
|
|
2
|
+
const { MINIO_WEBHOOK_AUTH_TOKEN } = process.env;
|
|
3
|
+
const isAuthorized = ({ authorization = '' }) => {
|
|
4
|
+
const [type, token] = authorization.split(' ');
|
|
5
|
+
return type === 'Bearer' && token === MINIO_WEBHOOK_AUTH_TOKEN;
|
|
6
|
+
};
|
|
7
|
+
export const minioHandler = async (req, res) => {
|
|
8
|
+
try {
|
|
9
|
+
if (req.method === 'POST' && req.body) {
|
|
10
|
+
const { headers } = req;
|
|
11
|
+
const { Records = [], EventName } = req.body;
|
|
12
|
+
if (EventName === 's3:ObjectCreated:Put' && isAuthorized(headers)) {
|
|
13
|
+
const [{ s3 }] = Records;
|
|
14
|
+
const { object } = s3;
|
|
15
|
+
const { size, contentType: type } = object;
|
|
16
|
+
const [fileId] = object.key.split('.');
|
|
17
|
+
const { services } = req.unchainedContext;
|
|
18
|
+
await services.files.linkFile({ fileId, type, size }, req.unchainedContext);
|
|
19
|
+
res.writeHead(200);
|
|
20
|
+
res.end();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
res.writeHead(404);
|
|
25
|
+
res.end();
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
log(e.message, { level: LogLevel.Error });
|
|
29
|
+
res.writeHead(503);
|
|
30
|
+
res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=minio-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minio-webhook.js","sourceRoot":"","sources":["../../../src/files/minio/minio-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAEjD,MAAM,YAAY,GAAG,CAAC,EAAE,aAAa,GAAG,EAAE,EAAE,EAAE,EAAE;IAC9C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,wBAAwB,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC7C,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;YACxB,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAC7C,IAAI,SAAS,KAAK,sBAAsB,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC;gBACzB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;gBACtB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,gBAAgB,CAAC;gBAC1C,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC5E,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;QACH,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AppleTransaction } from '../db/AppleTransactionsCollection.js';
|
|
2
|
+
export interface AppleTransactionsModule {
|
|
3
|
+
findTransactionById: (transactionIdentifier: string) => Promise<AppleTransaction>;
|
|
4
|
+
createTransaction: (doc: AppleTransaction) => Promise<string | null>;
|
|
5
|
+
}
|
|
6
|
+
export declare const configureAppleTransactionsModule: ({ db }: {
|
|
7
|
+
db: any;
|
|
8
|
+
}) => Promise<AppleTransactionsModule>;
|
|
9
|
+
//# sourceMappingURL=configureAppleTransactionsModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configureAppleTransactionsModule.d.ts","sourceRoot":"","sources":["../../../../src/payment/apple-iap/module/configureAppleTransactionsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA+B,MAAM,sCAAsC,CAAC;AAErG,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,CAAC,qBAAqB,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAElF,iBAAiB,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtE;AAED,eAAO,MAAM,gCAAgC;;MAAmB,OAAO,CAAC,uBAAuB,CAgB9F,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AppleTransactionsCollection } from '../db/AppleTransactionsCollection.js';
|
|
2
|
+
export const configureAppleTransactionsModule = async ({ db }) => {
|
|
3
|
+
const AppleTransactions = await AppleTransactionsCollection(db);
|
|
4
|
+
return {
|
|
5
|
+
findTransactionById: async (transactionIdentifier) => {
|
|
6
|
+
return AppleTransactions.findOne({ _id: transactionIdentifier });
|
|
7
|
+
},
|
|
8
|
+
createTransaction: async (doc) => {
|
|
9
|
+
await AppleTransactions.insertOne({
|
|
10
|
+
...doc,
|
|
11
|
+
created: new Date(),
|
|
12
|
+
});
|
|
13
|
+
return doc._id;
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=configureAppleTransactionsModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configureAppleTransactionsModule.js","sourceRoot":"","sources":["../../../../src/payment/apple-iap/module/configureAppleTransactionsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAQrG,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,EAAoC,EAAE;IACjG,MAAM,iBAAiB,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAEhE,OAAO;QACL,mBAAmB,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE;YACnD,OAAO,iBAAiB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/B,MAAM,iBAAiB,CAAC,SAAS,CAAC;gBAChC,GAAG,GAAG;gBACN,OAAO,EAAE,IAAI,IAAI,EAAE;aACpB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,GAAG,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a cryptocurrency amount from its smallest unit (e.g., wei, satoshi) to a normalized value
|
|
3
|
+
* with 9 decimal places of precision.
|
|
4
|
+
*
|
|
5
|
+
* This function handles the denomination of cryptocurrency amounts by converting from the
|
|
6
|
+
* blockchain's native smallest units (like wei for Ethereum which is 10^-18 ETH, or satoshi for Bitcoin
|
|
7
|
+
* which is 10^-8 BTC) to a standardized format with 9 decimal places for consistent handling across
|
|
8
|
+
* different cryptocurrencies.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} amountAsString - The amount in the cryptocurrency's smallest unit (e.g., wei, satoshi)
|
|
11
|
+
* represented as a string to handle large numbers
|
|
12
|
+
* @param {number} decimals - The number of decimal places used by the cryptocurrency
|
|
13
|
+
* (e.g., 18 for Ethereum, 8 for Bitcoin)
|
|
14
|
+
* @returns {number} The converted amount with 9 decimal places of precision
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Convert 1 ETH in wei (1000000000000000000) to normalized format
|
|
18
|
+
* denoteAmount("1000000000000000000", 18)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Convert 1 BTC in satoshi (100000000) to normalized format
|
|
22
|
+
* denoteAmount("100000000", 8)
|
|
23
|
+
*/
|
|
24
|
+
export default function denoteAmount(amountAsString: string, decimals: number): bigint;
|
|
25
|
+
//# sourceMappingURL=denote-amount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"denote-amount.d.ts","sourceRoot":"","sources":["../../../src/payment/cryptopay/denote-amount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAK5E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a cryptocurrency amount from its smallest unit (e.g., wei, satoshi) to a normalized value
|
|
3
|
+
* with 9 decimal places of precision.
|
|
4
|
+
*
|
|
5
|
+
* This function handles the denomination of cryptocurrency amounts by converting from the
|
|
6
|
+
* blockchain's native smallest units (like wei for Ethereum which is 10^-18 ETH, or satoshi for Bitcoin
|
|
7
|
+
* which is 10^-8 BTC) to a standardized format with 9 decimal places for consistent handling across
|
|
8
|
+
* different cryptocurrencies.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} amountAsString - The amount in the cryptocurrency's smallest unit (e.g., wei, satoshi)
|
|
11
|
+
* represented as a string to handle large numbers
|
|
12
|
+
* @param {number} decimals - The number of decimal places used by the cryptocurrency
|
|
13
|
+
* (e.g., 18 for Ethereum, 8 for Bitcoin)
|
|
14
|
+
* @returns {number} The converted amount with 9 decimal places of precision
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // Convert 1 ETH in wei (1000000000000000000) to normalized format
|
|
18
|
+
* denoteAmount("1000000000000000000", 18)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Convert 1 BTC in satoshi (100000000) to normalized format
|
|
22
|
+
* denoteAmount("100000000", 8)
|
|
23
|
+
*/
|
|
24
|
+
export default function denoteAmount(amountAsString, decimals) {
|
|
25
|
+
if (decimals <= 9)
|
|
26
|
+
return BigInt(amountAsString); // No conversion needed if decimals are 9 or less
|
|
27
|
+
const exponent = BigInt(decimals) - 9n;
|
|
28
|
+
const amount = BigInt(amountAsString);
|
|
29
|
+
return amount / 10n ** exponent; // Denote to 9 decimals
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=denote-amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"denote-amount.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/denote-amount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,cAAsB,EAAE,QAAgB;IAC3E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,iDAAiD;IACnG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACtC,OAAO,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,CAAC,uBAAuB;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-btc-address.d.ts","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-btc-address.ts"],"names":[],"mappings":"yBAkBgB,SAAI,EAAE,UAAK;AAA3B,wBA6BE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { HDKey } from '@scure/bip32';
|
|
2
|
+
import { NETWORK, p2wpkh, TEST_NETWORK } from '@scure/btc-signer';
|
|
3
|
+
// const resolvePath = (prefix) => {
|
|
4
|
+
// if (prefix === 'x') return `m/44'/0'`;
|
|
5
|
+
// if (prefix === 'y') return `m/49'/0'`;
|
|
6
|
+
// if (prefix === 'z') return `m/84'/0'`;
|
|
7
|
+
// if (prefix === 't') return `m/44'/1'`;
|
|
8
|
+
// if (prefix === 'u') return `m/49'/1'`;
|
|
9
|
+
// if (prefix === 'v') return `m/84'/1'`;
|
|
10
|
+
// return `m`;
|
|
11
|
+
// };
|
|
12
|
+
const resolveNetwork = (prefix) => {
|
|
13
|
+
if (['x', 'y', 'z'].includes(prefix))
|
|
14
|
+
return NETWORK;
|
|
15
|
+
return TEST_NETWORK;
|
|
16
|
+
};
|
|
17
|
+
export default (xpub, index) => {
|
|
18
|
+
const prefix = xpub.slice(0, 1);
|
|
19
|
+
if (prefix !== 'z' && prefix !== 'v')
|
|
20
|
+
throw new Error('Cryptopay only supports native segwit (zpub/vpub) extended key format for BTC');
|
|
21
|
+
const hardenedMaster = HDKey.fromExtendedKey(xpub, prefix === 'z'
|
|
22
|
+
? {
|
|
23
|
+
public: 0x04b24746, // zpub public
|
|
24
|
+
private: 0x04b2430c, // zpriv private
|
|
25
|
+
}
|
|
26
|
+
: {
|
|
27
|
+
public: 0x045f1cf6,
|
|
28
|
+
private: 0x045f18bc,
|
|
29
|
+
});
|
|
30
|
+
hardenedMaster.wipePrivateData(); // Neuter
|
|
31
|
+
const child = hardenedMaster.deriveChild(0).deriveChild(index);
|
|
32
|
+
// We don't need this AFAIK:
|
|
33
|
+
// const derivationPath = resolvePath(prefix);
|
|
34
|
+
// const child = hardenedMaster.derive(`${derivationPath}/0/${btcDerivationNumber}`);
|
|
35
|
+
const network = resolveNetwork(prefix);
|
|
36
|
+
const pubKey = p2wpkh(child.publicKey /* hex.decode( as string)*/, network);
|
|
37
|
+
return pubKey.address;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=derive-btc-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-btc-address.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-btc-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,oCAAoC;AACpC,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAC3C,gBAAgB;AAChB,KAAK;AAEL,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,EAAE;IAChC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IACrD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAClC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IAEnG,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAC1C,IAAI,EACJ,MAAM,KAAK,GAAG;QACZ,CAAC,CAAC;YACE,MAAM,EAAE,UAAU,EAAE,cAAc;YAClC,OAAO,EAAE,UAAU,EAAE,gBAAgB;SACtC;QACH,CAAC,CAAC;YACE,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,UAAU;SACpB,CACN,CAAC;IACF,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,SAAS;IAE3C,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE/D,4BAA4B;IAC5B,8CAA8C;IAC9C,qFAAqF;IAErF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;IAE5E,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-eth-address.d.ts","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-eth-address.ts"],"names":[],"mappings":"yBAwBgB,SAAI,EAAE,UAAK;AAA3B,wBAaE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { HDKey } from '@scure/bip32';
|
|
2
|
+
import { keccak_256 } from '@noble/hashes/sha3';
|
|
3
|
+
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
4
|
+
function getChecksumAddress(address) {
|
|
5
|
+
const chars = address.split('');
|
|
6
|
+
const expanded = new Uint8Array(40);
|
|
7
|
+
for (let i = 0; i < 40; i++) {
|
|
8
|
+
expanded[i] = chars[i].charCodeAt(0);
|
|
9
|
+
}
|
|
10
|
+
const hashed = keccak_256(expanded);
|
|
11
|
+
for (let i = 0; i < 40; i += 2) {
|
|
12
|
+
if (hashed[i >> 1] >> 4 >= 8) {
|
|
13
|
+
chars[i] = chars[i].toUpperCase();
|
|
14
|
+
}
|
|
15
|
+
if ((hashed[i >> 1] & 0x0f) >= 8) {
|
|
16
|
+
chars[i + 1] = chars[i + 1].toUpperCase();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return '0x' + chars.join('');
|
|
20
|
+
}
|
|
21
|
+
export default (xpub, index) => {
|
|
22
|
+
const hardenedMaster = HDKey.fromExtendedKey(xpub);
|
|
23
|
+
hardenedMaster.wipePrivateData(); // Neuter
|
|
24
|
+
const child = hardenedMaster.deriveChild(0).deriveChild(index);
|
|
25
|
+
// ETH Address (secp256k1 + keccak_256 + checksum)
|
|
26
|
+
const childSigningKey = secp256k1.ProjectivePoint.fromHex(child.publicKey).toRawBytes(false);
|
|
27
|
+
const address = Buffer.from(keccak_256(childSigningKey.slice(1)))
|
|
28
|
+
.toString('hex')
|
|
29
|
+
.substring(24);
|
|
30
|
+
return getChecksumAddress(address);
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=derive-eth-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-eth-address.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/derive-eth-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,SAAS,kBAAkB,CAAC,OAAO;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACnD,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,SAAS;IAE3C,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE/D,kDAAkD;IAClD,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9D,QAAQ,CAAC,KAAK,CAAC;SACf,SAAS,CAAC,EAAE,CAAC,CAAC;IAEjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Context } from '@unchainedshop/api';
|
|
2
|
+
import { CryptopayModule } from './module.js';
|
|
3
|
+
export default function handleWebhook({ secret, wallet, price, ping, }: {
|
|
4
|
+
secret: string;
|
|
5
|
+
wallet?: {
|
|
6
|
+
address: string;
|
|
7
|
+
blockHeight: number;
|
|
8
|
+
amount: string;
|
|
9
|
+
contract?: string;
|
|
10
|
+
decimals?: number;
|
|
11
|
+
currencyCode: string;
|
|
12
|
+
};
|
|
13
|
+
price?: {
|
|
14
|
+
baseCurrency: string;
|
|
15
|
+
token: string;
|
|
16
|
+
rate: number;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
};
|
|
19
|
+
ping?: {
|
|
20
|
+
blockHeight: number;
|
|
21
|
+
currencyCode: string;
|
|
22
|
+
};
|
|
23
|
+
}, context: Context & {
|
|
24
|
+
modules: CryptopayModule;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=handle-webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-webhook.d.ts","sourceRoot":"","sources":["../../../src/payment/cryptopay/handle-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,wBAA8B,aAAa,CACzC,EACE,MAAM,EACN,MAAM,EACN,KAAK,EACL,IAAI,GACL,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,CAAC,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH,EACD,OAAO,EAAE,OAAO,GAAG;IACjB,OAAO,EAAE,eAAe,CAAC;CAC1B,iBA+DF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createLogger } from '@unchainedshop/logger';
|
|
2
|
+
import { OrderStatus } from '@unchainedshop/core-orders';
|
|
3
|
+
const { CRYPTOPAY_SECRET, CRYPTOPAY_MAX_RATE_AGE = '360' } = process.env;
|
|
4
|
+
const logger = createLogger('unchained:core-payment:cryptopay');
|
|
5
|
+
export default async function handleWebhook({ secret, wallet, price, ping, }, context) {
|
|
6
|
+
const { modules, services } = context;
|
|
7
|
+
if (secret !== CRYPTOPAY_SECRET) {
|
|
8
|
+
logger.warn(`webhook called with invalid secret`);
|
|
9
|
+
throw new Error('Secret invalid');
|
|
10
|
+
}
|
|
11
|
+
if (wallet) {
|
|
12
|
+
const { address, blockHeight, amount, contract, decimals, currencyCode } = wallet;
|
|
13
|
+
logger.debug('webhook received wallet data', wallet);
|
|
14
|
+
const { orderPaymentId } = await modules.cryptopay.updateWalletAddress({
|
|
15
|
+
address,
|
|
16
|
+
blockHeight,
|
|
17
|
+
amount,
|
|
18
|
+
contract,
|
|
19
|
+
decimals,
|
|
20
|
+
currencyCode,
|
|
21
|
+
});
|
|
22
|
+
const orderPayment = orderPaymentId &&
|
|
23
|
+
(await modules.orders.payments.findOrderPayment({
|
|
24
|
+
orderPaymentId,
|
|
25
|
+
}));
|
|
26
|
+
if (orderPayment) {
|
|
27
|
+
// Try to process order to next status
|
|
28
|
+
// TODO: Not sure if it's correct to use processOrder here if status is PENDING!
|
|
29
|
+
const order = await modules.orders.findOrder({ orderId: orderPayment.orderId });
|
|
30
|
+
if (order.status === null) {
|
|
31
|
+
await services.orders.checkoutOrder(order._id, {});
|
|
32
|
+
}
|
|
33
|
+
else if (order.status === OrderStatus.PENDING) {
|
|
34
|
+
await services.orders.processOrder(order, {});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new Error('Already processed');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (price) {
|
|
42
|
+
logger.debug('webhook received price data', price);
|
|
43
|
+
const { baseCurrency, token, rate, timestamp } = price;
|
|
44
|
+
const timestampDate = new Date(timestamp);
|
|
45
|
+
const expiresAt = new Date(new Date().getTime() + parseInt(CRYPTOPAY_MAX_RATE_AGE, 10) * 1000);
|
|
46
|
+
const rateData = {
|
|
47
|
+
baseCurrency,
|
|
48
|
+
quoteCurrency: token,
|
|
49
|
+
rate,
|
|
50
|
+
expiresAt,
|
|
51
|
+
timestamp: timestampDate,
|
|
52
|
+
};
|
|
53
|
+
await modules.products.prices.rates.updateRates([rateData]);
|
|
54
|
+
}
|
|
55
|
+
if (ping) {
|
|
56
|
+
logger.debug('webhook received ping data', ping);
|
|
57
|
+
const { blockHeight, currencyCode } = ping;
|
|
58
|
+
await modules.cryptopay.updateMostRecentBlock(currencyCode, blockHeight);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=handle-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-webhook.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/handle-webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/payment/cryptopay/middleware.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,gBAAgB,uCA0E5B,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createLogger } from '@unchainedshop/logger';
|
|
2
|
+
import { OrderStatus } from '@unchainedshop/core-orders';
|
|
3
|
+
const { CRYPTOPAY_SECRET, CRYPTOPAY_MAX_RATE_AGE = '360' } = process.env;
|
|
4
|
+
const logger = createLogger('unchained:core-payment:cryptopay');
|
|
5
|
+
export const cryptopayHandler = async (req, res) => {
|
|
6
|
+
const resolvedContext = req.unchainedContext;
|
|
7
|
+
const modules = resolvedContext.modules;
|
|
8
|
+
if (req.method === 'POST') {
|
|
9
|
+
try {
|
|
10
|
+
const { secret, price, wallet, ping } = req.body;
|
|
11
|
+
if (secret !== CRYPTOPAY_SECRET) {
|
|
12
|
+
logger.warn(`Cryptopay Plugin: Invalid Cryptopay Secret provided`);
|
|
13
|
+
throw new Error('Secret invalid');
|
|
14
|
+
}
|
|
15
|
+
if (wallet) {
|
|
16
|
+
const { address, blockHeight, amount, contract, decimals, currency } = wallet;
|
|
17
|
+
const { orderPaymentId } = await modules.cryptopay.updateWalletAddress({
|
|
18
|
+
addressId: address,
|
|
19
|
+
blockHeight,
|
|
20
|
+
amount,
|
|
21
|
+
contract,
|
|
22
|
+
decimals,
|
|
23
|
+
currency,
|
|
24
|
+
});
|
|
25
|
+
const orderPayment = orderPaymentId &&
|
|
26
|
+
(await modules.orders.payments.findOrderPayment({
|
|
27
|
+
orderPaymentId,
|
|
28
|
+
}));
|
|
29
|
+
if (orderPayment) {
|
|
30
|
+
// Try to process order to next status
|
|
31
|
+
// TODO: Not sure if it's correct to use processOrder here if status is PENDING!
|
|
32
|
+
const order = await modules.orders.findOrder({ orderId: orderPayment.orderId });
|
|
33
|
+
if (order.status === null) {
|
|
34
|
+
await modules.orders.checkout(order._id, {}, resolvedContext);
|
|
35
|
+
}
|
|
36
|
+
else if (order.status === OrderStatus.PENDING) {
|
|
37
|
+
await modules.orders.processOrder(order, {}, resolvedContext);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error('Already processed');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (price) {
|
|
45
|
+
const { baseCurrency, token, rate, timestamp } = price;
|
|
46
|
+
const timestampDate = new Date(timestamp);
|
|
47
|
+
const expiresAt = new Date(new Date().getTime() + parseInt(CRYPTOPAY_MAX_RATE_AGE, 10) * 1000);
|
|
48
|
+
const rateData = {
|
|
49
|
+
baseCurrency,
|
|
50
|
+
quoteCurrency: token,
|
|
51
|
+
rate,
|
|
52
|
+
expiresAt,
|
|
53
|
+
timestamp: timestampDate,
|
|
54
|
+
};
|
|
55
|
+
logger.verbose(`update rate ${JSON.stringify(price)}, ${JSON.stringify(rateData)}`);
|
|
56
|
+
await resolvedContext.modules.products.prices.rates.updateRates([rateData]);
|
|
57
|
+
}
|
|
58
|
+
if (ping) {
|
|
59
|
+
const { blockHeight, currency } = ping;
|
|
60
|
+
await modules.cryptopay.updateMostRecentBlock(currency, blockHeight);
|
|
61
|
+
}
|
|
62
|
+
res.writeHead(200);
|
|
63
|
+
res.end(JSON.stringify({ success: true }));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
res.writeHead(500);
|
|
68
|
+
res.end(JSON.stringify({ success: false, error: e.message }));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
res.writeHead(404);
|
|
73
|
+
res.end(JSON.stringify({ success: false }));
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/payment/cryptopay/middleware.ts"],"names":[],"mappings":"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"}
|