├── ergo-payment-portal ├── .gitignore ├── resources │ ├── GitHub.png │ ├── ergo_logo.png │ ├── favicon.ico │ ├── ergo-erg-logo.svg │ ├── logo_telegram.svg │ ├── sigmausd.svg │ ├── ergo_card.svg │ ├── dApps.svg │ └── Spin-1.5s-94px.svg ├── src │ ├── bootstrap.js │ ├── ergo-related │ │ ├── compiler.js │ │ ├── rest.js │ │ ├── serializer.js │ │ └── explorer.js │ ├── parseUtils.js │ ├── pay.html │ ├── styles.css │ ├── voucher.html │ ├── index.html │ ├── about.html │ └── index.js ├── webpack.config.js ├── package.json └── README.md ├── .gitignore ├── monitor-vouchers ├── monitor-payment-server.zip ├── package.json ├── README.md ├── monitor-payment-server.js └── package-lock.json ├── README.md └── LICENSE /ergo-payment-portal/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ergo-payment-portal/dist/ 2 | ergo-payment-portal/node_modules/ 3 | monitor-vouchers/node_modules/ 4 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/GitHub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThierryM1212/ergo-pay/HEAD/ergo-payment-portal/resources/GitHub.png -------------------------------------------------------------------------------- /ergo-payment-portal/resources/ergo_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThierryM1212/ergo-pay/HEAD/ergo-payment-portal/resources/ergo_logo.png -------------------------------------------------------------------------------- /ergo-payment-portal/resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThierryM1212/ergo-pay/HEAD/ergo-payment-portal/resources/favicon.ico -------------------------------------------------------------------------------- /monitor-vouchers/monitor-payment-server.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThierryM1212/ergo-pay/HEAD/monitor-vouchers/monitor-payment-server.zip -------------------------------------------------------------------------------- /ergo-payment-portal/src/bootstrap.js: -------------------------------------------------------------------------------- 1 | // A dependency graph that contains any wasm must all be imported 2 | // asynchronously. This `bootstrap.js` file does the single async import, so 3 | // that no one else needs to worry about it again. 4 | import("./index.js") 5 | .catch(e => console.error("Error importing `index.js`:", e)); 6 | -------------------------------------------------------------------------------- /monitor-vouchers/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monitor-vouchers", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha" 8 | }, 9 | "author": "ThierryM1212", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@coinbarn/ergo-ts": "^0.3.0", 13 | "ergo-lib-wasm-nodejs": "^0.14.0", 14 | "express": "^4.17.1", 15 | "node-fetch": "^3.1.0" 16 | }, 17 | "type": "module" 18 | } 19 | -------------------------------------------------------------------------------- /ergo-payment-portal/webpack.config.js: -------------------------------------------------------------------------------- 1 | const CopyWebpackPlugin = require("copy-webpack-plugin"); 2 | const path = require('path'); 3 | 4 | module.exports = { 5 | entry: "./src/bootstrap.js", 6 | output: { 7 | path: path.resolve(__dirname, "dist"), 8 | filename: "bootstrap.js", 9 | }, 10 | mode: "development", 11 | plugins: [ 12 | new CopyWebpackPlugin([ 13 | { from: 'resources/', to: 'resources/' }, 14 | { from: 'src/'}, 15 | 16 | ]) 17 | ], 18 | }; 19 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/ergo-related/compiler.js: -------------------------------------------------------------------------------- 1 | export async function compileErgoTree(contract, symbols) { 2 | const exec = require('child_process').exec; 3 | const childProcess = exec('java -cp C:\\Users\\thier\\Ergo\\ErgoScriptCompiler\\target\\scala-2.12\\ErgoScriptCompiler-assembly-0.1.jar Compile '+contract+' '+symbols, function(err, stdout, stderr) { 4 | if (err) { 5 | console.log(err) 6 | } 7 | console.log(stdout) 8 | return stdout; 9 | }); 10 | return childProcess; 11 | } -------------------------------------------------------------------------------- /ergo-payment-portal/src/ergo-related/rest.js: -------------------------------------------------------------------------------- 1 | export async function post(url, body = {}, apiKey = '') { 2 | return await fetch(url, { 3 | method: 'POST', 4 | headers: { 5 | Accept: 'application/json', 6 | 'Content-Type': 'application/json', 7 | api_key: apiKey, 8 | }, 9 | body: JSON.stringify(body), 10 | }); 11 | } 12 | export async function get(url, apiKey = '') { 13 | return await fetch(url, { 14 | headers: { 15 | Accept: 'application/json', 16 | 'Content-Type': 'application/json', 17 | api_key: apiKey, 18 | }, 19 | }).then(res => res.json()); 20 | } 21 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/parseUtils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import JSONBigInt from 'json-bigint'; 3 | 4 | export function parseUnsignedTx(str) { 5 | let json = JSONBigInt.parse(str); 6 | return { 7 | id: json.id, 8 | inputs: json.inputs, 9 | dataInputs: json.dataInputs, 10 | outputs: json.outputs.map(output => (parseUtxo(output))), 11 | }; 12 | } 13 | export function parseUtxo(json) { 14 | return { 15 | boxId: json.boxId, 16 | value: json.value.toString(), 17 | ergoTree: json.ergoTree, 18 | assets: json.assets.map(asset => ({ 19 | tokenId: asset.tokenId, 20 | amount: asset.amount.toString(), 21 | })), 22 | additionalRegisters: json.additionalRegisters, 23 | creationHeight: json.creationHeight, 24 | transactionId: json.transactionId, 25 | index: json.index 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /ergo-payment-portal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ergo-token-minter", 3 | "version": "0.1.0", 4 | "description": "Ergo token minter using Ergo wallet dApp Connector (SAFEW, Nautilus or Yoroi wallet)", 5 | "main": "index.js", 6 | "bin": { 7 | "ergo-token-minter": ".bin/ergo-token-minter.js" 8 | }, 9 | "scripts": { 10 | "build": "webpack --config webpack.config.js", 11 | "start": "webpack-dev-server", 12 | "buildstatic": "webpack ./src/bootstrap.js --output-filename=bootstrap.js --mode=development" 13 | }, 14 | "devDependencies": { 15 | "copy-webpack-plugin": "^5.0.0", 16 | "ergo-lib-wasm-browser": "0.14.0-alpha-a3940fc", 17 | "html-webpack-plugin": "^4.5.2", 18 | "json-bigint": "^1.0.0", 19 | "webpack": "^4.29.3", 20 | "webpack-cli": "^3.1.0", 21 | "webpack-dev-server": "^3.1.5" 22 | }, 23 | "dependencies": { 24 | "@coinbarn/ergo-ts": "^0.3.0", 25 | "jquery": "^3.6.0", 26 | "qrcode": "^1.4.4", 27 | "sweetalert2": "^11.1.10", 28 | "text-decoding": "^1.0.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /monitor-vouchers/README.md: -------------------------------------------------------------------------------- 1 | Server for monitoring Ergo payment received from ErgoPay dApp 2 | 3 | Tested with nodejs v16.12.0 4 | 5 | # Installation and start 6 | 7 | > npm install
8 | > node monitor-payment-server.js 9 | 10 | # Usage 11 | You can get the json list of the payments received to the ERG address 9xxxxxxxxxxxxxxxxxx, from the ErgoPay dApp requesting the following URL: 12 | http://localhost:3030?address=9xxxxxxxxxxxxxxxxxx 13 | 14 | It is intended to be deployed along with the application for which you want to integrate the Ergo or SigUSD payments or the code could be integrated in your website / application. 15 | 16 | Sample json returned: 17 | 18 | ```json 19 | [ 20 | { 21 | "ref": "d10f610a-29f7-4180-ad6f-e37419ffdedd", 22 | "amountERG": "0.0010", 23 | "amountSIGUSD": "1.00" 24 | }, 25 | { 26 | "ref": "d10f610a-29f7-4180-ad6f-e37419ffdedc", 27 | "amountERG": "0.2500", 28 | "amountSIGUSD": "0.00" 29 | }, 30 | { 31 | "ref": "REF 7685-32", 32 | "amountERG": "0.0990", 33 | "amountSIGUSD": "0.00" 34 | }, 35 | { 36 | "ref": "REF 7685-32", 37 | "amountERG": "0.0950", 38 | "amountSIGUSD": "0.00" 39 | } 40 | ] 41 | ``` 42 | -------------------------------------------------------------------------------- /ergo-payment-portal/README.md: -------------------------------------------------------------------------------- 1 | # Ergo Payment portal 2 | 3 | ## Introduction 4 | 5 | dApp to ease Ergo and SigUSD payment integration using dApp connector. 6 | Written in javascript with bootstrap v4. 7 | 8 | It can be tried at https://thierrym1212.github.io/paymentportal/index.html 9 | 10 | ## Installation 11 | 12 | > git clone https://github.com/ThierryM1212/ergo-pay.git
13 | > cd ergo-pay/ergo-payment-portal
14 | > npm install
15 | > npm start
16 |
17 | http://localhost:8080 18 | 19 | ## Build static page 20 | 21 | This allows to deploy a static webpage for example in apache. 22 | 23 | > npm run buildstatic 24 | 25 |
The static website is generated in the ./dist folder 26 | 27 |
In the generated bootstrap.js remove two rows to avoid error loading the wasm (for me at line 270): 28 | ```javascript 29 | /******/ } else if(typeof WebAssembly.instantiateStreaming === 'function') { 30 | /******/ promise = WebAssembly.instantiateStreaming(req, importObject); 31 | ``` 32 | 33 | ## Disable the fee 34 | 35 | Uncomment the proper section in index.js 36 | ```javascript 37 | const MIN_ERG_FEE = 0.001; 38 | const MIN_FEE_SIGUSD = 0.01; 39 | const FEE_PERCENT = 0.001; // 0.1% 40 | //const MIN_ERG_FEE = 0; 41 | //const MIN_FEE_SIGUSD = 0; 42 | //const FEE_PERCENT = 0; 43 | ``` -------------------------------------------------------------------------------- /ergo-payment-portal/resources/ergo-erg-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | Group 16 9 | Created with Sketch. 10 | 11 | 12 | 13 | 14 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/ergo-related/serializer.js: -------------------------------------------------------------------------------- 1 | import {Serializer} from "@coinbarn/ergo-ts"; 2 | 3 | let ergolib = import('ergo-lib-wasm-browser') 4 | 5 | export async function encodeNum(n, isInt = false) { 6 | if (isInt) return (await ergolib).Constant.from_i32(n).encode_to_base16() 7 | else return (await ergolib).Constant.from_i64((await ergolib).I64.from_str(n)).encode_to_base16() 8 | } 9 | 10 | export async function decodeNum(n, isInt = false) { 11 | if (isInt) return (await ergolib).Constant.decode_from_base16(n).to_i32() 12 | else return (await ergolib).Constant.decode_from_base16(n).to_i64().to_str() 13 | 14 | } 15 | 16 | export async function encodeHex(reg) { 17 | return (await ergolib).Constant.from_byte_array(Buffer.from(reg, 'hex')).encode_to_base16() 18 | } 19 | 20 | export async function encodeStr(str) { 21 | return encodeHex(Serializer.stringToHex(str)) 22 | } 23 | 24 | function toHexString(byteArray) { 25 | return Array.from(byteArray, function(byte) { 26 | return ('0' + (byte & 0xFF).toString(16)).slice(-2); 27 | }).join('') 28 | } 29 | 30 | export async function decodeString(encoded) { 31 | return Serializer.stringFromHex(toHexString((await ergolib).Constant.decode_from_base16(encoded).to_byte_array())) 32 | } 33 | 34 | export function ergToNano(erg) { 35 | if (erg === undefined) return 0 36 | if (erg.startsWith('.')) return parseInt(erg.slice(1) + '0'.repeat(9 - erg.length + 1)) 37 | let parts = erg.split('.') 38 | if (parts.length === 1) parts.push('') 39 | if (parts[1].length > 9) return 0 40 | return parseInt(parts[0] + parts[1] + '0'.repeat(9 - parts[1].length)) 41 | } 42 | 43 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/logo_telegram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Artboard 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/ergo-related/explorer.js: -------------------------------------------------------------------------------- 1 | import { get } from './rest'; 2 | 3 | export const trueAddress = '4MQyML64GnzMxZgm'; // dummy address to get unsigned tx from node, we only care about the boxes though in this case 4 | export const explorerApi = 'https://api.ergoplatform.com/api/v0'; 5 | export const explorerV1Api = 'https://api.ergoplatform.com/api/v1'; 6 | 7 | async function getRequest(url) { 8 | return get(explorerApi + url).then(res => { 9 | return { data: res }; 10 | }); 11 | } 12 | 13 | async function getRequestV1(url) { 14 | return get(explorerV1Api + url).then(res => { 15 | return { data: res }; 16 | }); 17 | } 18 | 19 | export async function currentHeight() { 20 | return getRequest('/blocks?limit=1') 21 | .then(res => res.data) 22 | .then(res => res.items[0].height); 23 | } 24 | 25 | export function unspentBoxesFor(address) { 26 | return getRequest(`/transactions/boxes/byAddress/unspent/${address}`).then( 27 | (res) => res.data 28 | ); 29 | } 30 | 31 | export function boxById(id) { 32 | return getRequest(`/transactions/boxes/${id}`).then((res) => res.data); 33 | } 34 | 35 | export function txById(id) { 36 | return getRequest(`/transactions/${id}`).then((res) => res.data); 37 | } 38 | 39 | export async function getSpendingTx(boxId) { 40 | const data = getRequest(`/transactions/boxes/${boxId}`); 41 | return data 42 | .then((res) => res.data) 43 | .then((res) => res.spentTransactionId) 44 | .catch((_) => null); 45 | } 46 | 47 | export function getUnconfirmedTxsFor(addr) { 48 | return getRequest( 49 | `/transactions/unconfirmed/byAddress/${addr}` 50 | ) 51 | .then((res) => res.data) 52 | .then((res) => res.items); 53 | } 54 | 55 | export function getTokenBox(addr) { 56 | return getRequest( 57 | `/assets/${addr}/issuingBox` 58 | ) 59 | .then((res) => res.data[0]) 60 | } 61 | 62 | export function getBalanceFor(addr, token = null) { 63 | return getRequest( 64 | `/addresses/${addr}` 65 | ) 66 | .then((res) => res.data) 67 | .then((res) => res.transactions) 68 | .then(res => { 69 | if (!token) return res.confirmedBalance; 70 | let tok = res.confirmedTokensBalance.filter(tok => tok.tokenId === token); 71 | if (tok.length === 0) return 0; 72 | else return tok[0].amount; 73 | }); 74 | } 75 | 76 | export async function getBoxesForAdress(addr) { 77 | return getRequestV1( 78 | `/boxes/byAddress/${addr}` 79 | ).then(res => res.data.items); 80 | 81 | } 82 | 83 | export async function getSenderAddress(txId) { 84 | return getRequestV1( 85 | `/transactions/${txId}` 86 | ).then(res => res.data.inputs[0].address); 87 | } 88 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ergo Payment Portal 2 | 3 | This project intends to ease Ergo and SigUSD payments integration.
4 | It provides a webpage allowing to generate URL to request Ergo payments to be proceed with Yoroi dApp connector.
5 | Those URLs can be generated by any website to request a payment in Ergo or SigUSD, it can includes a reference so when the payment is received the website is notified of which payment has been received.
6 | 7 | The main project is ergo-payment-portal, allowing to process the payment, generate payment URLs and monitor the vouchers.
8 | The monitor-vouchers project is a small nodejs interface allowing to get the vouchers in json from an http request in order to automate the payment processing.
9 | The main app (dApp) ergo-payment-portal is distributed as a static webpage and does not allow such automation.
10 | 11 | # Why should I use it ? 12 | 13 | You can integrate a FREE payment interface in your website or application, processing payment with 0 fee and no refund can be executed by a third party. 14 | 15 | # How to integrate it ? 16 | 17 | ## Option 1: Use the deployed Ergo Pay at: https://thierrym1212.github.io/paymentportal/ 18 | 19 | In this option you do not deploy a personal Ergo payment portal, and will support the fee of the deployed dApp (0.1% min or 0.001 ERG or 0.01 SigUSD).
20 | You can monitor the payment through the https://thierrym1212.github.io/paymentportal/voucher.html page or automate it using the monitor-vouchers nodejs script.
21 |
22 | You need to:
23 | - create an Ergo wallet to get an ERG address
24 | - create links in your website or application to the payment portal:
25 | https://thierrym1212.github.io/paymentportal/pay.html?address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG¤cy=ERG&amount=5&ref=Account_17889569
26 | ``` 27 | URL parameters are: 28 | address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG 29 | currency=ERG 30 | amount=5 31 | ref=Account_17889569 32 | ``` 33 |
34 | address needs to be a valid ERG address
35 | currency needs to be ERG or SIGUSD
36 | amount needs to be > 0.1 for ERG and > 0.01 for SigUSG
37 | ref is optional, it can be any string up to 40 ascii char
38 |
39 | - monitor the payments at https://thierrym1212.github.io/paymentportal/voucher.html?address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG
40 | You will see the payment received until you move the fund in any transaction. 41 | 42 | ## Option 2: Deploy your own Ergo payment portal 43 | 44 | - Checkout the ergo-payment-portal project and follow the readme to build a static page 45 | - Integrate the static page generated in the dist folder in your application / website, setting the dApp fees to 0 46 | - Integrate ergo payments like for option 1 47 | - Additionnally, to automate the payment processing in your website/application, you can run the monitor-vouchers project included in this repository in order to get the json list of payments received with their reference. 48 | 49 | This alows you to handle your own payment portal direct from customers. 50 | 51 | 52 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/sigmausd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 48 | 51 | 54 | 57 | 60 | 64 | 65 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 86 | 90 | 94 | 95 | 96 | 97 | 102 | 103 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/pay.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | Ergo Payment Portal 11 | 12 | 13 | 14 | 37 | 38 | 41 | 42 |
43 |
44 |
45 |
46 | 47 |
48 | 49 |
50 | 51 |
52 |
53 | 54 |
55 | 56 |
57 | 58 |
59 | 61 |
62 | 63 |
64 | 65 |
66 | 67 |
68 |
69 | 70 |
71 | 73 |
74 |
75 |
76 | 77 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/ergo_card.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | ergo_card 21 | 45 | 47 | 52 | 60 | 68 | 72 | 76 | 80 | 84 | 89 | 90 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 109 | 111 | 112 | 114 | ergo_card 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/dApps.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | dapps 21 | 45 | 47 | 50 | 54 | 58 | 59 | 65 | 73 | 77 | 78 | 79 | 84 | 95 | dApps 106 | 107 | 109 | 110 | 112 | dapps 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/styles.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: Helvetica, sans-serif; 3 | } 4 | 5 | label { 6 | font-weight: bold; 7 | } 8 | 9 | .mb-3 { 10 | align-items: center; 11 | } 12 | 13 | .card { 14 | background-color: #e2e3e5; 15 | } 16 | 17 | .param { 18 | color:rgba( 0, 0, 0 ); 19 | } 20 | 21 | .payment-ref { 22 | text-size-adjust: 50%; 23 | } 24 | 25 | .amount-erg { 26 | color: #5ac47e; 27 | text-align: end; 28 | } 29 | 30 | .amount-sigusd { 31 | color: #5ac47e; 32 | text-align: end; 33 | } 34 | 35 | .token-id { 36 | font-family: "Lucida Console", "Courier New", monospace; 37 | } 38 | 39 | .footer { 40 | position: absolute; 41 | bottom: 0; 42 | height: 60px; 43 | width: 100%; 44 | background: #e2e3e5; 45 | color: #03000a; 46 | text-align: center; 47 | display:flex; 48 | } 49 | 50 | .footer2 { 51 | height: 60px; 52 | width: 100%; 53 | background: #e2e3e5; 54 | color: #03000a; 55 | text-align: center; 56 | display:flex; 57 | } 58 | 59 | /* Table Styles */ 60 | 61 | .table-wrapper{ 62 | margin: 10px 70px 70px; 63 | box-shadow: 0px 35px 50px rgba( 0, 0, 0, 0.2 ); 64 | } 65 | 66 | .fl-table { 67 | border-radius: 5px; 68 | font-size: 12px; 69 | font-weight: normal; 70 | border: none; 71 | border-collapse: collapse; 72 | width: 100%; 73 | max-width: 100%; 74 | white-space: nowrap; 75 | background-color: white; 76 | } 77 | 78 | .fl-table td, .fl-table th { 79 | text-align: left; 80 | padding: 8px; 81 | } 82 | 83 | .fl-table th { 84 | text-align: center; 85 | padding: 8px; 86 | } 87 | 88 | .fl-table td { 89 | border-right: 1px solid #f8f8f8; 90 | font-size: 12px; 91 | } 92 | 93 | .fl-table thead th { 94 | color: #ffffff; 95 | background: #446381; 96 | } 97 | 98 | 99 | .fl-table thead th:nth-child(odd) { 100 | color: #ffffff; 101 | background: #324960; 102 | } 103 | 104 | .fl-table tr:nth-child(even) { 105 | background: #F8F8F8; 106 | } 107 | 108 | /* Responsive */ 109 | 110 | @media (max-width: 767px) { 111 | .fl-table { 112 | display: block; 113 | width: 100%; 114 | } 115 | .table-wrapper:before{ 116 | content: "Scroll horizontally >"; 117 | display: block; 118 | text-align: right; 119 | font-size: 11px; 120 | color: white; 121 | padding: 0 0 10px; 122 | } 123 | .fl-table thead, .fl-table tbody, .fl-table thead th { 124 | display: block; 125 | } 126 | .fl-table thead th:last-child{ 127 | border-bottom: none; 128 | } 129 | .fl-table thead { 130 | float: left; 131 | } 132 | .fl-table tbody { 133 | width: auto; 134 | position: relative; 135 | overflow-x: auto; 136 | } 137 | .fl-table td, .fl-table th { 138 | padding: 20px .625em .625em .625em; 139 | height: 60px; 140 | vertical-align: middle; 141 | box-sizing: border-box; 142 | overflow-x: hidden; 143 | overflow-y: auto; 144 | width: 120px; 145 | font-size: 13px; 146 | text-overflow: ellipsis; 147 | } 148 | .fl-table thead th { 149 | text-align: left; 150 | border-bottom: 1px solid #f7f7f9; 151 | } 152 | .fl-table tbody tr { 153 | display: table-cell; 154 | } 155 | .fl-table tbody tr:nth-child(odd) { 156 | background: none; 157 | } 158 | .fl-table tr:nth-child(even) { 159 | background: transparent; 160 | } 161 | .fl-table tr td:nth-child(odd) { 162 | background: #F8F8F8; 163 | border-right: 1px solid #E6E4E4; 164 | } 165 | .fl-table tr td:nth-child(even) { 166 | border-right: 1px solid #E6E4E4; 167 | } 168 | .fl-table tbody td { 169 | display: block; 170 | text-align: left; 171 | } 172 | } 173 | 174 | /* HIDE RADIO */ 175 | [type=radio] { 176 | position: absolute; 177 | opacity: 0; 178 | width: 0; 179 | height: 0; 180 | } 181 | 182 | /* IMAGE STYLES */ 183 | [type=radio] + img { 184 | cursor: pointer; 185 | } 186 | 187 | /* CHECKED STYLES */ 188 | [type=radio]:checked + img { 189 | outline: 2px solid rgb(86, 155, 235); 190 | } 191 | 192 | 193 | /* TEXT AREA */ 194 | .blue-border-focus .form-control:focus { 195 | border: 1px solid #3a536d; 196 | box-shadow: 0 0 0 0.2rem rgba(29, 182, 182, 0.25); 197 | } 198 | -------------------------------------------------------------------------------- /monitor-vouchers/monitor-payment-server.js: -------------------------------------------------------------------------------- 1 | import {Serializer} from "@coinbarn/ergo-ts"; 2 | let ergolib = import('ergo-lib-wasm-nodejs'); 3 | import express from 'express'; 4 | import fetch from 'node-fetch'; 5 | 6 | const NANOERG_TO_ERG = 1000000000; 7 | const APP_PORT = 3030; 8 | const explorerV1Api = 'https://api.ergoplatform.com/api/v1'; 9 | const PP_REF = "Ergo Payment Portal"; 10 | const SIGUSD_TOKENID = "03faf2cb329f2e90d6d23b58d91bbb6c046aa143261cc21f52fbe2824bfcbf04"; 11 | const app = express(); 12 | const DEFAULT_LIMIT = "100"; 13 | 14 | // Get the boxes for the given address and returns the list of payment coming from "Ergo Payment Portal" with the reference and amounts 15 | // http://localhost:3030?address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG&limit=500 16 | 17 | app.get('/', async function (req, res) { 18 | console.log("Request received:", req.query); 19 | var limit = DEFAULT_LIMIT; 20 | var ref = undefined; 21 | if ("limit" in req.query) { 22 | limit = req.query.limit; 23 | } 24 | if ("ref" in req.query) { 25 | ref = req.query.ref; 26 | } 27 | 28 | const boxes = await getBoxesForAdress(req.query.address, limit); 29 | var response = []; 30 | if (boxes.length > 0) { 31 | const voucherList = await extractVoucherList(boxes); 32 | for (var i in voucherList) { 33 | var myJson = {}; 34 | myJson["ref"] = voucherList[i][0]; 35 | myJson["amountERG"] = voucherList[i][1]; 36 | myJson["amountSIGUSD"] = (parseFloat(voucherList[i][2])/100).toFixed(2); 37 | myJson["senderAddress"] = voucherList[i][3]; 38 | if(ref === undefined || myJson["ref"] === ref) { 39 | response.push(myJson); 40 | } 41 | } 42 | } 43 | res.send(response); 44 | }) 45 | console.log("Ergo Pay monitor server running on port: " + APP_PORT); 46 | console.log("Sample URL: http://localhost:"+ APP_PORT +"?address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG&limit=200&ref=my_payment_ref"); 47 | app.listen(APP_PORT); 48 | 49 | async function extractVoucherList (boxes) { 50 | var voucherList = []; 51 | for (var i in boxes) { 52 | if ("R4" in boxes[i].additionalRegisters 53 | && "R5" in boxes[i].additionalRegisters) { 54 | if (boxes[i].additionalRegisters.R4.sigmaType == 'Coll[SByte]' 55 | && boxes[i].additionalRegisters.R5.sigmaType == 'Coll[SByte]') { 56 | const appRef = await decodeString(boxes[i].additionalRegisters.R5.serializedValue); 57 | if (appRef == PP_REF ) { 58 | const txId = boxes[i].transactionId; 59 | const senderAddress = await getSenderAddress(txId); 60 | const paymentRef = await decodeString(boxes[i].additionalRegisters.R4.serializedValue); 61 | const amountERG = (parseInt(boxes[i].value) / NANOERG_TO_ERG).toFixed(4); 62 | var amountSIGUSD = 0; 63 | for (var j in boxes[i].assets) { 64 | if (boxes[i].assets[j].tokenId == SIGUSD_TOKENID) { 65 | amountSIGUSD += boxes[i].assets[j].amount; 66 | } 67 | } 68 | voucherList.push([paymentRef,amountERG,amountSIGUSD,senderAddress]); 69 | } 70 | } 71 | } 72 | } 73 | return voucherList.reverse(); 74 | } 75 | 76 | async function getRequestV1(url) { 77 | return get(explorerV1Api + url).then(res => { 78 | return { data: res }; 79 | }); 80 | } 81 | 82 | async function getBoxesForAdress(addr, limit) { 83 | return getRequestV1( 84 | `/boxes/byAddress/${addr}?limit=${limit}` 85 | ).then(res => res.data.items); 86 | } 87 | 88 | async function getSenderAddress(txId) { 89 | return getRequestV1( 90 | `/transactions/${txId}` 91 | ).then(res => res.data.inputs[0].address); 92 | } 93 | 94 | function toHexString(byteArray) { 95 | return Array.from(byteArray, function(byte) { 96 | return ('0' + (byte & 0xFF).toString(16)).slice(-2); 97 | }).join('') 98 | } 99 | 100 | async function decodeString(encoded) { 101 | return Serializer.stringFromHex(toHexString((await ergolib).Constant.decode_from_base16(encoded).to_byte_array())) 102 | } 103 | 104 | async function get(url, apiKey = '') { 105 | console.log("getting... ", url) 106 | return await fetch(url, { 107 | headers: { 108 | Accept: 'application/json', 109 | 'Content-Type': 'application/json', 110 | api_key: apiKey, 111 | }, 112 | }).then(res => res.json()) 113 | .catch(e => console.log(e)); 114 | } 115 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/voucher.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | Ergo Payment Portal 11 | 14 | 15 | 16 | 17 | 33 | 34 | 37 | 38 | 72 | 73 |
74 |
75 |
76 | 77 |
78 | 79 |
80 | 81 |
82 | 83 |
84 | 85 |
86 |
87 |
88 | 89 | 105 | 106 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /ergo-payment-portal/resources/Spin-1.5s-94px.svg: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | Ergo Payment Portal 11 | 12 | 13 | 14 | 30 | 31 | 34 | 35 |
36 |
37 |
38 |
39 | 40 |
41 | 42 |
43 | 44 |
45 | 47 |
48 | 49 |
50 | 51 |
52 | 60 | 61 | 62 | 70 |
71 |
72 | 73 |
74 | 75 |
76 | 77 |
78 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 89 |
90 | 91 | 97 | 98 | 104 | 105 | 111 | 112 | 114 |
115 |
116 |
117 |
118 |
119 | 120 | 121 | 137 | 138 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | Ergo Payment Portal 11 | 12 | 13 | 14 | 30 | 31 |
32 |
33 |

What is Ergo Payment Portal ?

34 |

This dApp intends to ease Ergo payments for small businesses and personal usage. It provides 36 | a way to integrate Ergo or SigUSD payments in other applications, allowing to request a payment from 37 | an URL.

38 |
39 | 40 |

How does it works ?

41 |

A seller can create an URL to the payment portal in order 42 | to receive a payment. This URL 43 | includes the address for the payment, the currency (ERG or SigUSD), the amount and a customizable reference 44 | for the seller. 45 |

46 |

The buyer is redirected to the payment page buy clicking on the link, he is invited to 47 | sign the transaction to proceed the payment, the sample link following suggests a donation of 1 ERG for this dApp. 48 |

49 | https://thierrym1212.github.io/paymentportal/pay.html?
51 |   address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG &
52 |   currency=ERG &
53 |   amount=1 &
54 |   ref=Donation_to_Ergo_Payment_Portal 55 |
56 | 57 |

Once the transaction is confirmed, the Voucher page allows 58 | the seller to view the list of received payments.

59 | 60 | https://thierrym1212.github.io/paymentportal/voucher.html?address=9ew97YCt7zQDwmLsytMAWGj2kockM11PFCnRvT2cz9LQaaB7uPG 62 | 63 |

And additional tool "monitor-vouchers" is included in the git repository in order to be 64 | able to monitor the 65 | received payments in an automated way retreiving a json file. 66 |

67 |
68 | 69 |

How can I proceed a payment ?

70 |

You need to install a Chrome extension extension configure an ergo wallet with some ERGs:

71 |

- SAFEW

72 |

- Nautilus

73 |

- Yoroi

74 |

The application will propose you to connect your the wallet when loading.

75 |

Only one wallet extension with dApp connector needs to be enabled in your browser.

76 |
77 | 78 |

How the dApp is working ?

79 |

The application is distributed as a static webpage and is executed in your browser.

80 |

The transactions are sent to your wallet dApp connector so you can review and sign them. 81 |

82 |

Once validated with the wallet dApp connector a transaction is sent to the blockchain, it 83 | cannot be cancelled or reverted. Review it carefully. 84 |

85 |
86 | 87 |

How to integrate the Ergo and/or SigUSD payments in my website ?

88 |

You will need to generate a valid payment link to the Ergo Payment portal from your 89 | website in order to use the deployed dApp. You can use the "reference" field in order to store up to 40 90 | ascii characters, to identify the payment once received.

91 |

The application is opensource, it can be cloned, adapted to your need and ran as a 92 | static webpage on your web server, with no dApp fee.

93 |

The received payments can be monitored using the Voucher page of the dApp or in an 94 | automated way 95 | running the voucher-monitor tool provided with the application

96 |
97 | 98 |

What is the fee ?

99 |

The application currently deployed here has a 0.1% fee with a mininimum of 0.001 ERG or 100 | 0.01 SigUSD, 101 | the fee is removed from the amount sent by the buyer and so is paid "by the seller".

102 |

The "buyer" will pay only the Ergo transaction fee additionnally to the amount requested 103 | to proceed the transaction.

104 |

The application is opensource and can be installed as a static webpage, it is possible 105 | to configure the fee to 0.

106 |

To integrate the ergo payment in your website, you could deploy this dApp on your server 107 | and set the fee to 0.

108 |
109 | 110 |

Why I don't have the pleasure to accept the RGPD or the cookies to use the dApp ?

111 |

The application does not use cookies and does not store or manipulate personal data on 112 | server side. It is delivered as a static webpage running in your browser.

113 |
114 | 115 |

Where can I review the application ?

116 |

The code of the application is hosted on gihub: Github repository

118 |
119 | 120 |

What if I find a bug ?

121 |

Please create an issue in the gihub project, or 123 | better, a pull request.

124 |
125 | 126 |
127 | 128 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /ergo-payment-portal/src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | import * as wasm from "ergo-lib-wasm-browser"; 3 | import JSONBigInt from 'json-bigint'; 4 | import { parseUnsignedTx } from "./parseUtils"; 5 | import { decodeString } from "./ergo-related/serializer"; 6 | import { currentHeight, getBoxesForAdress, getSenderAddress } from './ergo-related/explorer'; 7 | import Swal from 'sweetalert2' 8 | import { TextEncoder } from 'text-decoding'; 9 | 10 | 11 | const NANOERG_TO_ERG = 1000000000; 12 | const MIN_ERG_BOX_VALUE = 0.001 * NANOERG_TO_ERG; 13 | const SIGUSD_TOKENID = "03faf2cb329f2e90d6d23b58d91bbb6c046aa143261cc21f52fbe2824bfcbf04"; 14 | const MIN_ERG_FEE = 0.001; 15 | const MIN_FEE_SIGUSD = 0.01; 16 | const FEE_PERCENT = 0.001; // 0.1% 17 | //const MIN_ERG_FEE = 0; 18 | //const MIN_FEE_SIGUSD = 0; 19 | //const FEE_PERCENT = 0; 20 | const PP_REF = "Ergo Payment Portal"; // stored in R5 register to identify the box of this dApp 21 | const feeAddress = "9hDPCYffeTEAcShngRGNMJsWddCUQLpNzAqwM9hQyx2w6qubmab"; 22 | 23 | async function setStatus(msg, type) { 24 | const status = document.getElementById("status"); 25 | status.innerHTML = msg; 26 | status.className = "alert alert-" + type; 27 | } 28 | 29 | async function logErrorStatus(e, msg) { 30 | const s = msg + `: ${JSON.stringify(e)}`; 31 | console.error(s, e); 32 | setStatus(s, "danger"); 33 | } 34 | 35 | function computeFee(currency, amount) { 36 | // Compute dApp fee taken paid by the seller 37 | var minFee = MIN_ERG_FEE; // min Erg fee 38 | if (currency == 'SIGUSD') { 39 | minFee = MIN_FEE_SIGUSD; // min SIGUSD fee 40 | }; 41 | var feeFloat = minFee; 42 | if (feeFloat < amount * FEE_PERCENT) { // 0.1% 43 | feeFloat = amount * FEE_PERCENT; 44 | }; 45 | return feeFloat; 46 | } 47 | 48 | function triggerWaitAlert(msg, html) { 49 | Swal.fire({ 50 | title: msg, 51 | html: html, 52 | allowOutsideClick: true, 53 | showConfirmButton: false, 54 | imageUrl: '../resources/Spin-1.5s-94px.svg', 55 | onBeforeOpen: () => { 56 | Swal.showLoading() 57 | }, 58 | }); 59 | } 60 | 61 | async function connectErgoWallet(ergAddress, currency, amount, ref) { 62 | triggerWaitAlert("Connection to the wallet..."); 63 | 64 | ergo_request_read_access().then(function (access_granted) { 65 | const connectWalletButton = document.getElementById("connect-wallet"); 66 | if (!access_granted) { 67 | console.log("ergo access refused"); 68 | setStatus("Wallet access denied", "warning") 69 | connectWalletButton.onclick = connectErgoWallet; 70 | } else { 71 | console.log("ergo access given"); 72 | setStatus("Wallet connected", "secondary"); 73 | triggerWaitAlert("Retrieving " + currency + " balance..."); 74 | 75 | if (currency == "ERG") { 76 | ergo.get_balance().then(async function (result) { 77 | const walletAmount = parseFloat(parseFloat(result) / parseFloat(NANOERG_TO_ERG)).toFixed(3); 78 | connectWalletButton.innerText = "Balance: " + walletAmount + " ERG"; 79 | Swal.close(); 80 | }); 81 | } else { 82 | ergo.get_utxos("1000000000000", SIGUSD_TOKENID).then(async function (result) { 83 | var amountUSD = 0; 84 | for (var i in result) { 85 | for (var j in result[i].assets) { 86 | if (result[i].assets[j].tokenId == SIGUSD_TOKENID) { 87 | amountUSD += parseInt(result[i].assets[j].amount); 88 | } 89 | } 90 | } 91 | const walletAmount = parseFloat(parseFloat(amountUSD) / parseFloat(100)).toFixed(2); 92 | connectWalletButton.innerText = "Balance: " + walletAmount + " SigUSD"; 93 | Swal.close(); 94 | }); 95 | }; 96 | }; 97 | }); 98 | } 99 | 100 | function getAmountFloat(currency, amountStr) { 101 | try { 102 | const amountFloat = parseFloat(amountStr); 103 | } catch (e) { 104 | logErrorStatus(e, "Invalid Amount"); 105 | return null; 106 | }; 107 | const amountFloat = parseFloat(amountStr); 108 | if ((amountFloat <= 0.0999 && currency == 'ERG') || (amountFloat <= 0.999 && currency == 'SIGUSD')) { 109 | setStatus("Amount too small, mininum 0.1 ERG or 1 SIGUSD", "danger"); 110 | return null; 111 | } 112 | return amountFloat; 113 | } 114 | 115 | function copyURL() { 116 | /* Get the text field */ 117 | var copyText = document.getElementById("payment-url"); 118 | copyText.select(); 119 | copyText.setSelectionRange(0, 99999); /* For mobile devices */ 120 | navigator.clipboard.writeText(copyText.value); 121 | copyText.onclick = null; 122 | Swal.fire({ 123 | icon: 'success', 124 | title: 'Payment URL copied to clipboard', 125 | timer: 1000, 126 | showConfirmButton: false 127 | }); 128 | 129 | } 130 | 131 | async function generatePaymentURL(event) { 132 | // prevent submit 133 | event.preventDefault(event); 134 | const tokenForm = document.getElementById("token-form"); 135 | // run the form validation 136 | tokenForm.reportValidity(); 137 | if (!tokenForm.checkValidity()) { 138 | console.log("validation error"); 139 | return false; 140 | }; 141 | var generatedURL = window.location.protocol + '//' + window.location.host; 142 | for (const part of window.location.pathname.split('/')){ 143 | if (part !== "" && part !== "/") { 144 | if (!part.includes(".htm")) { 145 | generatedURL = generatedURL + "/" + part 146 | } 147 | } 148 | } 149 | generatedURL = generatedURL + "/pay.html?"; 150 | const address = document.getElementById("address").value; 151 | if (address.length != 51 && address.charAt(0) != '9') { 152 | setStatus("Invalid ERG address", "danger"); 153 | return null; 154 | }; 155 | generatedURL += "address=" + address; 156 | const currency = document.querySelector('input[name="currency"]:checked').value; 157 | generatedURL += "¤cy=" + currency; 158 | const amount = document.getElementById("amount").value; 159 | const amountFloat = getAmountFloat(currency, amount); 160 | if (amountFloat == null || amountFloat == undefined) { 161 | return null; 162 | }; 163 | generatedURL += "&amount=" + amount; 164 | const ref = document.getElementById("ref").value; 165 | if (ref != null && ref != "") { 166 | generatedURL += "&ref=" + encodeURIComponent(ref); 167 | } 168 | var paymentURLElem = document.getElementById("payment-url"); 169 | paymentURLElem.value = generatedURL; 170 | paymentURLElem.onclick = copyURL; 171 | const fee = computeFee(currency, amountFloat); 172 | document.getElementById("fee").value = fee.toString() + " " + currency; 173 | var QRCode = require('qrcode') 174 | var canvas = document.getElementById('canvas') 175 | QRCode.toCanvas(canvas, generatedURL, function (error) { 176 | if (error) console.error(error) 177 | console.log('success!'); 178 | }); 179 | var res = document.getElementsByClassName("result"); 180 | for (var i in res) { 181 | res[i].removeAttribute("hidden"); 182 | }; 183 | 184 | setStatus("Payment URL generated for address " + address, "secondary"); 185 | } 186 | 187 | async function loadVoucherPage(ergAddress) { 188 | const boxes = await getBoxesForAdress(ergAddress); 189 | const container = document.getElementById("container"); 190 | const csvArea = document.getElementById("csvArea"); 191 | const jsonArea = document.getElementById("jsonArea"); 192 | var csv = '"Payment reference","Amount ERG","Amount SigUSD","Sender address"\n'; 193 | var jSonList = []; 194 | 195 | if (boxes.length > 0) { 196 | const voucherList = await extractVoucherList(boxes); 197 | 198 | for (var i in voucherList) { 199 | var html_row = "
" + voucherList[i][0] + "
"; 200 | html_row += "
" + voucherList[i][1] + "
"; 201 | html_row += "
" + formatTokenAmount(voucherList[i][2], 2) + "
"; 202 | html_row += "
" + formatLongString(voucherList[i][3], 10) + "
"; 203 | var e = document.createElement('tr'); 204 | e.innerHTML = html_row; 205 | container.appendChild(e); 206 | csv += '"' + voucherList[i].join('","') + '"\n'; 207 | var myJson = {}; 208 | myJson["ref"] = voucherList[i][0]; 209 | myJson["amountERG"] = voucherList[i][1]; 210 | myJson["amountSIGUSD"] = (parseFloat(voucherList[i][2]) / 100).toFixed(2); 211 | myJson["senderAddress"] = voucherList[i][3]; 212 | jSonList.push(myJson); 213 | } 214 | csvArea.value = csv; 215 | jsonArea.value = JSON.stringify(jSonList, null, 2); 216 | } 217 | } 218 | 219 | async function extractVoucherList(boxes) { 220 | var voucherList = []; 221 | for (var i in boxes) { 222 | if ("R4" in boxes[i].additionalRegisters 223 | && "R5" in boxes[i].additionalRegisters) { 224 | if (boxes[i].additionalRegisters.R4.sigmaType == 'Coll[SByte]' 225 | && boxes[i].additionalRegisters.R5.sigmaType == 'Coll[SByte]') { 226 | const appRef = await decodeString(boxes[i].additionalRegisters.R5.serializedValue); 227 | if (appRef == PP_REF) { 228 | const txId = boxes[i].transactionId; 229 | const senderAddress = await getSenderAddress(txId); 230 | const paymentRef = await decodeString(boxes[i].additionalRegisters.R4.serializedValue); 231 | const amountERG = (parseInt(boxes[i].value) / NANOERG_TO_ERG).toFixed(4); 232 | var amountSIGUSD = 0; 233 | for (var j in boxes[i].assets) { 234 | if (boxes[i].assets[j].tokenId == SIGUSD_TOKENID) { 235 | amountSIGUSD += boxes[i].assets[j].amount; 236 | } 237 | } 238 | voucherList.push([paymentRef, amountERG, amountSIGUSD, senderAddress]); 239 | } 240 | } 241 | } 242 | } 243 | return voucherList; 244 | } 245 | 246 | function loadPaymentPage(ergAddress, currency, amount, ref) { 247 | const addressElem = document.getElementById("address"); 248 | addressElem.value = ergAddress; 249 | const assetElem = document.getElementById("asset-label"); 250 | assetElem.innerText = currency.toUpperCase(); 251 | const amountElem = document.getElementById("amount"); 252 | amountElem.value = amount; 253 | const refElem = document.getElementById("ref"); 254 | refElem.value = ref; 255 | const sendButton = document.getElementById("send-transaction"); 256 | sendButton.onclick = sendTransaction; 257 | } 258 | 259 | async function sendTransaction() { 260 | triggerWaitAlert("Getting inputs for the transaction..."); 261 | const creationHeight = await currentHeight(); 262 | const address = document.getElementById("address").value; 263 | const currency = document.getElementById("asset-label").innerText.toUpperCase(); 264 | const amountFloat = parseFloat(document.getElementById("amount").value); 265 | const ref = document.getElementById("ref").value; 266 | const changeAddress = await ergo.get_change_address(); 267 | 268 | const feeFloat = computeFee(currency, amountFloat); 269 | //console.log("inputs:", address, currency, amountFloat, ref, feeFloat); 270 | 271 | // Prepare total ergs and/or SIGUSD to send 272 | var globalNanoErgsToSendInt = BigInt(Math.round(amountFloat * NANOERG_TO_ERG)); 273 | var tokens = new wasm.Tokens(); 274 | if (currency == 'SIGUSD') { 275 | if (feeFloat > 0) { 276 | globalNanoErgsToSendInt = BigInt(2 * MIN_ERG_BOX_VALUE); 277 | } else { 278 | globalNanoErgsToSendInt = BigInt(MIN_ERG_BOX_VALUE); 279 | }; 280 | tokens.add(new wasm.Token( 281 | wasm.TokenId.from_str(SIGUSD_TOKENID), 282 | wasm.TokenAmount.from_i64(wasm.I64.from_str(Math.round((amountFloat * 100)).toString())) 283 | )); 284 | }; 285 | 286 | // Get the input boxes from the connected wallet 287 | const utxos = await getAllUtxos(); 288 | const selector = new wasm.SimpleBoxSelector(); 289 | const globalNanoErgsToSend = wasm.BoxValue.from_i64(wasm.I64.from_str(globalNanoErgsToSendInt.toString())); 290 | let boxSelection = {}; 291 | try { 292 | boxSelection = selector.select( 293 | wasm.ErgoBoxes.from_boxes_json(utxos), 294 | wasm.BoxValue.from_i64(globalNanoErgsToSend.as_i64().checked_add(wasm.TxBuilder.SUGGESTED_TX_FEE().as_i64())), 295 | tokens); 296 | } catch (e) { 297 | let msg = "[Wallet] Error: " 298 | if (JSON.stringify(e).includes("BoxValue out of bounds")) { 299 | msg = msg + "Increase the Erg amount to process the transaction. " 300 | } 301 | logErrorStatus(e, msg); 302 | Swal.close(); 303 | return null; 304 | } 305 | //console.log('boxSelection: ', boxSelection.boxes().len()); 306 | 307 | // Prepare the output boxes 308 | const outputCandidates = wasm.ErgoBoxCandidates.empty(); 309 | 310 | // Build the seller output box 311 | var ergsStr = Math.round((amountFloat - feeFloat) * NANOERG_TO_ERG).toString(); 312 | var ergsAmountBoxValue = wasm.BoxValue.from_i64(wasm.I64.from_str(ergsStr)); 313 | var sellerTokenAmount = 0; 314 | if (currency == 'SIGUSD') { 315 | ergsAmountBoxValue = wasm.BoxValue.from_i64(wasm.I64.from_str(MIN_ERG_BOX_VALUE.toString())); 316 | }; 317 | //console.log('ergsStr', ergsStr); 318 | const sellerBoxBuilder = new wasm.ErgoBoxCandidateBuilder( 319 | ergsAmountBoxValue, 320 | wasm.Contract.pay_to_address(wasm.Address.from_base58(address)), 321 | creationHeight); 322 | if (currency == 'SIGUSD') { 323 | sellerTokenAmount = Math.round((amountFloat - feeFloat) * 100); 324 | sellerBoxBuilder.add_token( 325 | wasm.TokenId.from_str("03faf2cb329f2e90d6d23b58d91bbb6c046aa143261cc21f52fbe2824bfcbf04"), 326 | wasm.TokenAmount.from_i64(wasm.I64.from_str(BigInt(sellerTokenAmount).toString()) 327 | )); 328 | } 329 | // Add the registers 330 | // R4 provided in input by the seller to identify the transaction from the generated link 331 | // R5 as a reference of the payment portal 332 | const byteArray = new TextEncoder().encode(ref); 333 | const encodedRef = new Uint8Array(byteArray.buffer); 334 | sellerBoxBuilder.set_register_value(4, wasm.Constant.from_byte_array(encodedRef)); 335 | const ppRegister = new TextEncoder().encode(PP_REF); 336 | const encodedPpRegister = new Uint8Array(ppRegister.buffer); 337 | sellerBoxBuilder.set_register_value(5, wasm.Constant.from_byte_array(encodedPpRegister)); 338 | //console.log('R4:', new TextDecoder().decode(sellerBoxBuilder.register_value(4).to_byte_array())); 339 | //console.log('R5:', new TextDecoder().decode(sellerBoxBuilder.register_value(5).to_byte_array())); 340 | try { 341 | outputCandidates.add(sellerBoxBuilder.build()); 342 | } catch (e) { 343 | console.log(`building error: ${e}`); 344 | Swal.close(); 345 | throw e; 346 | } 347 | 348 | // Build the fee output box 349 | if (feeFloat > 0) { 350 | const feeStrNano = Math.round((feeFloat * NANOERG_TO_ERG)).toString(); 351 | var feeAmountBoxValue = wasm.BoxValue.from_i64(wasm.I64.from_str(feeStrNano)); 352 | if (currency == 'SIGUSD') { 353 | feeAmountBoxValue = wasm.BoxValue.from_i64(wasm.I64.from_str(MIN_ERG_BOX_VALUE.toString())); 354 | }; 355 | const feeBoxBuilder = new wasm.ErgoBoxCandidateBuilder( 356 | feeAmountBoxValue, 357 | wasm.Contract.pay_to_address(wasm.Address.from_base58(feeAddress)), 358 | creationHeight); 359 | if (currency == 'SIGUSD') { 360 | const feeNanoErgToSend = Math.round((feeFloat) * 100); 361 | feeBoxBuilder.add_token( 362 | wasm.TokenId.from_str("03faf2cb329f2e90d6d23b58d91bbb6c046aa143261cc21f52fbe2824bfcbf04"), 363 | wasm.TokenAmount.from_i64(wasm.I64.from_str(feeNanoErgToSend.toString()) 364 | )); 365 | } 366 | try { 367 | outputCandidates.add(feeBoxBuilder.build()); 368 | } catch (e) { 369 | console.log(`building error: ${e}`); 370 | Swal.close(); 371 | throw e; 372 | } 373 | } 374 | 375 | // Create the transaction 376 | const txBuilder = wasm.TxBuilder.new( 377 | boxSelection, 378 | outputCandidates, 379 | creationHeight, 380 | wasm.TxBuilder.SUGGESTED_TX_FEE(), 381 | wasm.Address.from_base58(changeAddress), 382 | wasm.BoxValue.SAFE_USER_MIN()); 383 | const dataInputs = new wasm.DataInputs(); 384 | txBuilder.set_data_inputs(dataInputs); 385 | const tx = parseUnsignedTx(txBuilder.build().to_json()); 386 | //console.log(`tx: ${JSONBigInt.stringify(tx)}`); 387 | 388 | const correctTx = parseUnsignedTx(wasm.UnsignedTransaction.from_json(JSONBigInt.stringify(tx)).to_json()); 389 | // Put back complete selected inputs in the same order 390 | correctTx.inputs = correctTx.inputs.map(box => { 391 | //console.log(`box: ${JSONBigInt.stringify(box)}`); 392 | const fullBoxInfo = utxos.find(utxo => utxo.boxId === box.boxId); 393 | return { 394 | ...fullBoxInfo, 395 | extension: {} 396 | }; 397 | }); 398 | //console.log(`correctTx: ${JSONBigInt.stringify(correctTx)}`); 399 | 400 | // Send transaction for signing 401 | setStatus("Awaiting transaction signing", "secondary"); 402 | 403 | triggerWaitAlert('Awaiting transaction signing', 'Please review the transaction shown in the wallet and sign it to process the payment.
The transactions on blockchain cannot be reverted nor cancelled.'); 404 | 405 | processTx(correctTx).then(txId => { 406 | Swal.close(); 407 | console.log('[txId]', txId); 408 | if (txId) { 409 | displayTxId(txId); 410 | Swal.fire({ 411 | title: 'Transaction successfully sent, waiting for it reaches the explorer', 412 | icon: 'success', 413 | timer: 10000, 414 | timerProgressBar: true 415 | }); 416 | } 417 | }); 418 | return false; 419 | 420 | } 421 | 422 | async function getAllUtxos() { 423 | const filteredUtxos = []; 424 | const utxos = await ergo.get_utxos(); 425 | for (const utxo of utxos) { 426 | try { 427 | wasm.ErgoBox.from_json(JSONBigInt.stringify(utxo)); 428 | filteredUtxos.push(utxo); 429 | } catch (e) { 430 | logErrorStatus(e, "[getAllUtxos] UTxO failed parsing:"); 431 | return null; 432 | } 433 | } 434 | return filteredUtxos; 435 | } 436 | 437 | async function signTx(txToBeSigned) { 438 | try { 439 | return await ergo.sign_tx(txToBeSigned); 440 | } catch (e) { 441 | logErrorStatus(e, "[signTx] Error"); 442 | return null; 443 | } 444 | } 445 | 446 | async function submitTx(txToBeSubmitted) { 447 | try { 448 | return await ergo.submit_tx(txToBeSubmitted); 449 | } catch (e) { 450 | logErrorStatus(e, "[submitTx] Error"); 451 | return null; 452 | } 453 | } 454 | 455 | async function processTx(txToBeProcessed) { 456 | const msg = s => { 457 | console.log('[processTx]', s); 458 | setStatus(s, "secondary"); 459 | }; 460 | const signedTx = await signTx(txToBeProcessed); 461 | if (!signedTx) { 462 | console.error(`No signed transaction found`); 463 | return null; 464 | } 465 | msg("Transaction signed - awaiting submission"); 466 | const txId = await submitTx(signedTx); 467 | if (!txId) { 468 | console.log(`No submitted tx ID`); 469 | return null; 470 | } 471 | msg("Transaction submitted "); 472 | return txId; 473 | } 474 | 475 | function displayTxId(txId) { 476 | const status = document.getElementById("status"); 477 | const cr = document.createElement("br"); 478 | const txTracker = document.createElement("a"); 479 | txTracker.appendChild(document.createTextNode(`View transaction in explorer: ${txId}`)); 480 | txTracker.href = `https://explorer.ergoplatform.com/en/transactions/${txId}`; 481 | txTracker.target = "_blank" 482 | status.appendChild(cr); 483 | status.appendChild(txTracker); 484 | status.className = "alert alert-secondary"; 485 | } 486 | 487 | // return formatted token amount like 6,222,444.420 488 | // amountInt: number of token as provided in utxo (to be divided by 10^decimals) 489 | // decimalsInt: number of decimals of te token 490 | export function formatTokenAmount(amountInt, decimalsInt) { 491 | if (decimalsInt > 0) { 492 | const numberAmount = (Number(amountInt) / Number(Math.pow(10, parseInt(decimalsInt)))).toFixed(parseInt(decimalsInt)); 493 | var str = numberAmount.toString().split("."); 494 | str[0] = str[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); 495 | return str.join("."); 496 | } else { 497 | return amountInt.replace(/\B(?=(\d{3})+(?!\d))/g, ",");; 498 | } 499 | } 500 | 501 | export function formatLongString(str, num) { 502 | if (str.length > 2 * num) { 503 | return str.substring(0, num) + "..." + str.substring(str.length - num, str.length); 504 | } else { 505 | return str; 506 | } 507 | } 508 | 509 | // INIT page 510 | const currentLocation = window.location; 511 | if (currentLocation.toString().includes("pay.html")) { 512 | const queryString = window.location.search; 513 | const urlParams = new URLSearchParams(queryString); 514 | var parameterValid = true; 515 | // ERG address 516 | const address = urlParams.get('address'); 517 | if (address != null && address.length != 51 && address.charAt(0) != '9') { 518 | setStatus("Invalid ERG address", "danger"); 519 | parameterValid = false; 520 | }; 521 | // Currency 522 | const currency = urlParams.get('currency').toUpperCase(); 523 | if (currency != 'ERG' && currency != 'SIGUSD') { 524 | setStatus("Invalid currency parameter '" + currency + "': Only ERG or SIGUSD are accepted", "danger"); 525 | parameterValid = false; 526 | }; 527 | // Amount 528 | const amount = urlParams.get('amount'); 529 | const amountFloat = getAmountFloat(currency, amount); 530 | console.log("amountFloat", amountFloat); 531 | if (amountFloat == null || isNaN(amountFloat)) { 532 | setStatus("Invalid amount parameter: " + amount, "danger"); 533 | parameterValid = false; 534 | }; 535 | // Reference, optional 536 | const ref = urlParams.get('ref'); 537 | if (parameterValid) { 538 | loadPaymentPage(address, currency, amount, ref); 539 | if (typeof ergo_request_read_access === "undefined") { 540 | var msg = "dApp connector not found, to use an ergo wallet extension "; 541 | msg += 'SAFEW.'; 542 | setStatus(msg, "warning"); 543 | const sendButton = document.getElementById("send-transaction"); 544 | sendButton.disabled = true; 545 | } else { 546 | console.log("Yorio ergo dApp found"); 547 | window.addEventListener("ergo_wallet_disconnected", function (event) { 548 | const connectWalletButton = document.getElementById("connect-wallet"); 549 | connectWalletButton.value = "Connect wallet"; 550 | connectWalletButton.onclick = connectErgoWallet; 551 | setStatus("Ergo wallet disconnected", "warning"); 552 | const container = document.getElementById("main"); 553 | container.addAttribute("hidden"); 554 | }); 555 | connectErgoWallet(address, currency, amount, ref); 556 | } 557 | } 558 | } else if (currentLocation.toString().includes("voucher.html")) { 559 | const queryString = window.location.search; 560 | const urlParams = new URLSearchParams(queryString); 561 | const ergAddress = urlParams.get('address'); 562 | if (ergAddress == null) { 563 | setStatus("Provide the ERG address to monitor", "secondary"); 564 | } else { 565 | if (ergAddress.length != 51 || ergAddress.charAt(0) != '9') { 566 | setStatus("Invalid ERG address", "danger"); 567 | } else { 568 | setStatus("List of the received payments from " + PP_REF + " for address " + ergAddress + "", "secondary"); 569 | document.getElementById("result").removeAttribute("hidden"); 570 | loadVoucherPage(ergAddress); 571 | } 572 | } 573 | } 574 | else { // generate URL page 575 | const generateButton = document.getElementById("generate-url"); 576 | generateButton.onclick = generatePaymentURL; 577 | setStatus("Provide the inputs for the payment request URL", "secondary"); 578 | }; 579 | 580 | 581 | 582 | 583 | 584 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /monitor-vouchers/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monitor-vouchers", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "monitor-vouchers", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@coinbarn/ergo-ts": "^0.3.0", 13 | "ergo-lib-wasm-nodejs": "^0.14.0", 14 | "express": "^4.17.1", 15 | "node-fetch": "^3.1.0" 16 | } 17 | }, 18 | "node_modules/@coinbarn/ergo-ts": { 19 | "version": "0.3.0", 20 | "resolved": "https://registry.npmjs.org/@coinbarn/ergo-ts/-/ergo-ts-0.3.0.tgz", 21 | "integrity": "sha512-AacoG+j7k4I542cC2zQtYZm2X2LVT2QGIOg08muhdsvrppnf5Jhgta3JNGlryZKkGAkBrR8w5SkVfubaZCRdBw==", 22 | "dependencies": { 23 | "@root/encoding": "^1.0.1", 24 | "array.prototype.flat": "^1.2.2", 25 | "axios": "0.19.0", 26 | "blakejs": "^1.1.0", 27 | "bn.js": "^4.11.8", 28 | "bs58": "^4.0.1", 29 | "elliptic": "^6.4.1", 30 | "secure-random": "1.1.2" 31 | } 32 | }, 33 | "node_modules/@root/encoding": { 34 | "version": "1.0.1", 35 | "resolved": "https://registry.npmjs.org/@root/encoding/-/encoding-1.0.1.tgz", 36 | "integrity": "sha512-OaEub02ufoU038gy6bsNHQOjIn8nUjGiLcaRmJ40IUykneJkIW5fxDqKxQx48cszuNflYldsJLPPXCrGfHs8yQ==" 37 | }, 38 | "node_modules/accepts": { 39 | "version": "1.3.7", 40 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 41 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 42 | "dependencies": { 43 | "mime-types": "~2.1.24", 44 | "negotiator": "0.6.2" 45 | }, 46 | "engines": { 47 | "node": ">= 0.6" 48 | } 49 | }, 50 | "node_modules/array-flatten": { 51 | "version": "1.1.1", 52 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 53 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 54 | }, 55 | "node_modules/array.prototype.flat": { 56 | "version": "1.2.5", 57 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", 58 | "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", 59 | "dependencies": { 60 | "call-bind": "^1.0.2", 61 | "define-properties": "^1.1.3", 62 | "es-abstract": "^1.19.0" 63 | }, 64 | "engines": { 65 | "node": ">= 0.4" 66 | }, 67 | "funding": { 68 | "url": "https://github.com/sponsors/ljharb" 69 | } 70 | }, 71 | "node_modules/axios": { 72 | "version": "0.19.0", 73 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", 74 | "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", 75 | "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", 76 | "dependencies": { 77 | "follow-redirects": "1.5.10", 78 | "is-buffer": "^2.0.2" 79 | } 80 | }, 81 | "node_modules/base-x": { 82 | "version": "3.0.9", 83 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 84 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 85 | "dependencies": { 86 | "safe-buffer": "^5.0.1" 87 | } 88 | }, 89 | "node_modules/blakejs": { 90 | "version": "1.1.1", 91 | "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", 92 | "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" 93 | }, 94 | "node_modules/bn.js": { 95 | "version": "4.12.0", 96 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 97 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 98 | }, 99 | "node_modules/body-parser": { 100 | "version": "1.19.0", 101 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 102 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 103 | "dependencies": { 104 | "bytes": "3.1.0", 105 | "content-type": "~1.0.4", 106 | "debug": "2.6.9", 107 | "depd": "~1.1.2", 108 | "http-errors": "1.7.2", 109 | "iconv-lite": "0.4.24", 110 | "on-finished": "~2.3.0", 111 | "qs": "6.7.0", 112 | "raw-body": "2.4.0", 113 | "type-is": "~1.6.17" 114 | }, 115 | "engines": { 116 | "node": ">= 0.8" 117 | } 118 | }, 119 | "node_modules/brorand": { 120 | "version": "1.1.0", 121 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 122 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 123 | }, 124 | "node_modules/bs58": { 125 | "version": "4.0.1", 126 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 127 | "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", 128 | "dependencies": { 129 | "base-x": "^3.0.2" 130 | } 131 | }, 132 | "node_modules/bytes": { 133 | "version": "3.1.0", 134 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 135 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 136 | "engines": { 137 | "node": ">= 0.8" 138 | } 139 | }, 140 | "node_modules/call-bind": { 141 | "version": "1.0.2", 142 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 143 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 144 | "dependencies": { 145 | "function-bind": "^1.1.1", 146 | "get-intrinsic": "^1.0.2" 147 | }, 148 | "funding": { 149 | "url": "https://github.com/sponsors/ljharb" 150 | } 151 | }, 152 | "node_modules/content-disposition": { 153 | "version": "0.5.3", 154 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 155 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 156 | "dependencies": { 157 | "safe-buffer": "5.1.2" 158 | }, 159 | "engines": { 160 | "node": ">= 0.6" 161 | } 162 | }, 163 | "node_modules/content-type": { 164 | "version": "1.0.4", 165 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 166 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 167 | "engines": { 168 | "node": ">= 0.6" 169 | } 170 | }, 171 | "node_modules/cookie": { 172 | "version": "0.4.0", 173 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 174 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 175 | "engines": { 176 | "node": ">= 0.6" 177 | } 178 | }, 179 | "node_modules/cookie-signature": { 180 | "version": "1.0.6", 181 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 182 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 183 | }, 184 | "node_modules/data-uri-to-buffer": { 185 | "version": "4.0.0", 186 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 187 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", 188 | "engines": { 189 | "node": ">= 12" 190 | } 191 | }, 192 | "node_modules/debug": { 193 | "version": "2.6.9", 194 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 195 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 196 | "dependencies": { 197 | "ms": "2.0.0" 198 | } 199 | }, 200 | "node_modules/define-properties": { 201 | "version": "1.1.3", 202 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 203 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 204 | "dependencies": { 205 | "object-keys": "^1.0.12" 206 | }, 207 | "engines": { 208 | "node": ">= 0.4" 209 | } 210 | }, 211 | "node_modules/depd": { 212 | "version": "1.1.2", 213 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 214 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 215 | "engines": { 216 | "node": ">= 0.6" 217 | } 218 | }, 219 | "node_modules/destroy": { 220 | "version": "1.0.4", 221 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 222 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 223 | }, 224 | "node_modules/ee-first": { 225 | "version": "1.1.1", 226 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 227 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 228 | }, 229 | "node_modules/elliptic": { 230 | "version": "6.5.4", 231 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 232 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 233 | "dependencies": { 234 | "bn.js": "^4.11.9", 235 | "brorand": "^1.1.0", 236 | "hash.js": "^1.0.0", 237 | "hmac-drbg": "^1.0.1", 238 | "inherits": "^2.0.4", 239 | "minimalistic-assert": "^1.0.1", 240 | "minimalistic-crypto-utils": "^1.0.1" 241 | } 242 | }, 243 | "node_modules/elliptic/node_modules/inherits": { 244 | "version": "2.0.4", 245 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 246 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 247 | }, 248 | "node_modules/encodeurl": { 249 | "version": "1.0.2", 250 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 251 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 252 | "engines": { 253 | "node": ">= 0.8" 254 | } 255 | }, 256 | "node_modules/ergo-lib-wasm-nodejs": { 257 | "version": "0.14.0", 258 | "resolved": "https://registry.npmjs.org/ergo-lib-wasm-nodejs/-/ergo-lib-wasm-nodejs-0.14.0.tgz", 259 | "integrity": "sha512-vspQ5NOxvsbVewZoiiu0D8fs8sJQR5BDTbUAWnZW5At+DGdvq7dYgQTSAR86zJB1BDi0H6/fEckyA5hieuXoBA==" 260 | }, 261 | "node_modules/es-abstract": { 262 | "version": "1.19.1", 263 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", 264 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", 265 | "dependencies": { 266 | "call-bind": "^1.0.2", 267 | "es-to-primitive": "^1.2.1", 268 | "function-bind": "^1.1.1", 269 | "get-intrinsic": "^1.1.1", 270 | "get-symbol-description": "^1.0.0", 271 | "has": "^1.0.3", 272 | "has-symbols": "^1.0.2", 273 | "internal-slot": "^1.0.3", 274 | "is-callable": "^1.2.4", 275 | "is-negative-zero": "^2.0.1", 276 | "is-regex": "^1.1.4", 277 | "is-shared-array-buffer": "^1.0.1", 278 | "is-string": "^1.0.7", 279 | "is-weakref": "^1.0.1", 280 | "object-inspect": "^1.11.0", 281 | "object-keys": "^1.1.1", 282 | "object.assign": "^4.1.2", 283 | "string.prototype.trimend": "^1.0.4", 284 | "string.prototype.trimstart": "^1.0.4", 285 | "unbox-primitive": "^1.0.1" 286 | }, 287 | "engines": { 288 | "node": ">= 0.4" 289 | }, 290 | "funding": { 291 | "url": "https://github.com/sponsors/ljharb" 292 | } 293 | }, 294 | "node_modules/es-to-primitive": { 295 | "version": "1.2.1", 296 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 297 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 298 | "dependencies": { 299 | "is-callable": "^1.1.4", 300 | "is-date-object": "^1.0.1", 301 | "is-symbol": "^1.0.2" 302 | }, 303 | "engines": { 304 | "node": ">= 0.4" 305 | }, 306 | "funding": { 307 | "url": "https://github.com/sponsors/ljharb" 308 | } 309 | }, 310 | "node_modules/escape-html": { 311 | "version": "1.0.3", 312 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 313 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 314 | }, 315 | "node_modules/etag": { 316 | "version": "1.8.1", 317 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 318 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 319 | "engines": { 320 | "node": ">= 0.6" 321 | } 322 | }, 323 | "node_modules/express": { 324 | "version": "4.17.1", 325 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 326 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 327 | "dependencies": { 328 | "accepts": "~1.3.7", 329 | "array-flatten": "1.1.1", 330 | "body-parser": "1.19.0", 331 | "content-disposition": "0.5.3", 332 | "content-type": "~1.0.4", 333 | "cookie": "0.4.0", 334 | "cookie-signature": "1.0.6", 335 | "debug": "2.6.9", 336 | "depd": "~1.1.2", 337 | "encodeurl": "~1.0.2", 338 | "escape-html": "~1.0.3", 339 | "etag": "~1.8.1", 340 | "finalhandler": "~1.1.2", 341 | "fresh": "0.5.2", 342 | "merge-descriptors": "1.0.1", 343 | "methods": "~1.1.2", 344 | "on-finished": "~2.3.0", 345 | "parseurl": "~1.3.3", 346 | "path-to-regexp": "0.1.7", 347 | "proxy-addr": "~2.0.5", 348 | "qs": "6.7.0", 349 | "range-parser": "~1.2.1", 350 | "safe-buffer": "5.1.2", 351 | "send": "0.17.1", 352 | "serve-static": "1.14.1", 353 | "setprototypeof": "1.1.1", 354 | "statuses": "~1.5.0", 355 | "type-is": "~1.6.18", 356 | "utils-merge": "1.0.1", 357 | "vary": "~1.1.2" 358 | }, 359 | "engines": { 360 | "node": ">= 0.10.0" 361 | } 362 | }, 363 | "node_modules/fetch-blob": { 364 | "version": "3.1.3", 365 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", 366 | "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", 367 | "funding": [ 368 | { 369 | "type": "github", 370 | "url": "https://github.com/sponsors/jimmywarting" 371 | }, 372 | { 373 | "type": "paypal", 374 | "url": "https://paypal.me/jimmywarting" 375 | } 376 | ], 377 | "dependencies": { 378 | "web-streams-polyfill": "^3.0.3" 379 | }, 380 | "engines": { 381 | "node": "^12.20 || >= 14.13" 382 | } 383 | }, 384 | "node_modules/finalhandler": { 385 | "version": "1.1.2", 386 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 387 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 388 | "dependencies": { 389 | "debug": "2.6.9", 390 | "encodeurl": "~1.0.2", 391 | "escape-html": "~1.0.3", 392 | "on-finished": "~2.3.0", 393 | "parseurl": "~1.3.3", 394 | "statuses": "~1.5.0", 395 | "unpipe": "~1.0.0" 396 | }, 397 | "engines": { 398 | "node": ">= 0.8" 399 | } 400 | }, 401 | "node_modules/follow-redirects": { 402 | "version": "1.5.10", 403 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 404 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 405 | "dependencies": { 406 | "debug": "=3.1.0" 407 | }, 408 | "engines": { 409 | "node": ">=4.0" 410 | } 411 | }, 412 | "node_modules/follow-redirects/node_modules/debug": { 413 | "version": "3.1.0", 414 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 415 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 416 | "dependencies": { 417 | "ms": "2.0.0" 418 | } 419 | }, 420 | "node_modules/formdata-polyfill": { 421 | "version": "4.0.10", 422 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 423 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 424 | "dependencies": { 425 | "fetch-blob": "^3.1.2" 426 | }, 427 | "engines": { 428 | "node": ">=12.20.0" 429 | } 430 | }, 431 | "node_modules/forwarded": { 432 | "version": "0.2.0", 433 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 434 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 435 | "engines": { 436 | "node": ">= 0.6" 437 | } 438 | }, 439 | "node_modules/fresh": { 440 | "version": "0.5.2", 441 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 442 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 443 | "engines": { 444 | "node": ">= 0.6" 445 | } 446 | }, 447 | "node_modules/function-bind": { 448 | "version": "1.1.1", 449 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 450 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 451 | }, 452 | "node_modules/get-intrinsic": { 453 | "version": "1.1.1", 454 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 455 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 456 | "dependencies": { 457 | "function-bind": "^1.1.1", 458 | "has": "^1.0.3", 459 | "has-symbols": "^1.0.1" 460 | }, 461 | "funding": { 462 | "url": "https://github.com/sponsors/ljharb" 463 | } 464 | }, 465 | "node_modules/get-symbol-description": { 466 | "version": "1.0.0", 467 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 468 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 469 | "dependencies": { 470 | "call-bind": "^1.0.2", 471 | "get-intrinsic": "^1.1.1" 472 | }, 473 | "engines": { 474 | "node": ">= 0.4" 475 | }, 476 | "funding": { 477 | "url": "https://github.com/sponsors/ljharb" 478 | } 479 | }, 480 | "node_modules/has": { 481 | "version": "1.0.3", 482 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 483 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 484 | "dependencies": { 485 | "function-bind": "^1.1.1" 486 | }, 487 | "engines": { 488 | "node": ">= 0.4.0" 489 | } 490 | }, 491 | "node_modules/has-bigints": { 492 | "version": "1.0.1", 493 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 494 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", 495 | "funding": { 496 | "url": "https://github.com/sponsors/ljharb" 497 | } 498 | }, 499 | "node_modules/has-symbols": { 500 | "version": "1.0.2", 501 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 502 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", 503 | "engines": { 504 | "node": ">= 0.4" 505 | }, 506 | "funding": { 507 | "url": "https://github.com/sponsors/ljharb" 508 | } 509 | }, 510 | "node_modules/has-tostringtag": { 511 | "version": "1.0.0", 512 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 513 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 514 | "dependencies": { 515 | "has-symbols": "^1.0.2" 516 | }, 517 | "engines": { 518 | "node": ">= 0.4" 519 | }, 520 | "funding": { 521 | "url": "https://github.com/sponsors/ljharb" 522 | } 523 | }, 524 | "node_modules/hash.js": { 525 | "version": "1.1.7", 526 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 527 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 528 | "dependencies": { 529 | "inherits": "^2.0.3", 530 | "minimalistic-assert": "^1.0.1" 531 | } 532 | }, 533 | "node_modules/hmac-drbg": { 534 | "version": "1.0.1", 535 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 536 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 537 | "dependencies": { 538 | "hash.js": "^1.0.3", 539 | "minimalistic-assert": "^1.0.0", 540 | "minimalistic-crypto-utils": "^1.0.1" 541 | } 542 | }, 543 | "node_modules/http-errors": { 544 | "version": "1.7.2", 545 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 546 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 547 | "dependencies": { 548 | "depd": "~1.1.2", 549 | "inherits": "2.0.3", 550 | "setprototypeof": "1.1.1", 551 | "statuses": ">= 1.5.0 < 2", 552 | "toidentifier": "1.0.0" 553 | }, 554 | "engines": { 555 | "node": ">= 0.6" 556 | } 557 | }, 558 | "node_modules/iconv-lite": { 559 | "version": "0.4.24", 560 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 561 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 562 | "dependencies": { 563 | "safer-buffer": ">= 2.1.2 < 3" 564 | }, 565 | "engines": { 566 | "node": ">=0.10.0" 567 | } 568 | }, 569 | "node_modules/inherits": { 570 | "version": "2.0.3", 571 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 572 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 573 | }, 574 | "node_modules/internal-slot": { 575 | "version": "1.0.3", 576 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 577 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 578 | "dependencies": { 579 | "get-intrinsic": "^1.1.0", 580 | "has": "^1.0.3", 581 | "side-channel": "^1.0.4" 582 | }, 583 | "engines": { 584 | "node": ">= 0.4" 585 | } 586 | }, 587 | "node_modules/ipaddr.js": { 588 | "version": "1.9.1", 589 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 590 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 591 | "engines": { 592 | "node": ">= 0.10" 593 | } 594 | }, 595 | "node_modules/is-bigint": { 596 | "version": "1.0.4", 597 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 598 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 599 | "dependencies": { 600 | "has-bigints": "^1.0.1" 601 | }, 602 | "funding": { 603 | "url": "https://github.com/sponsors/ljharb" 604 | } 605 | }, 606 | "node_modules/is-boolean-object": { 607 | "version": "1.1.2", 608 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 609 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 610 | "dependencies": { 611 | "call-bind": "^1.0.2", 612 | "has-tostringtag": "^1.0.0" 613 | }, 614 | "engines": { 615 | "node": ">= 0.4" 616 | }, 617 | "funding": { 618 | "url": "https://github.com/sponsors/ljharb" 619 | } 620 | }, 621 | "node_modules/is-buffer": { 622 | "version": "2.0.5", 623 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 624 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", 625 | "funding": [ 626 | { 627 | "type": "github", 628 | "url": "https://github.com/sponsors/feross" 629 | }, 630 | { 631 | "type": "patreon", 632 | "url": "https://www.patreon.com/feross" 633 | }, 634 | { 635 | "type": "consulting", 636 | "url": "https://feross.org/support" 637 | } 638 | ], 639 | "engines": { 640 | "node": ">=4" 641 | } 642 | }, 643 | "node_modules/is-callable": { 644 | "version": "1.2.4", 645 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 646 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", 647 | "engines": { 648 | "node": ">= 0.4" 649 | }, 650 | "funding": { 651 | "url": "https://github.com/sponsors/ljharb" 652 | } 653 | }, 654 | "node_modules/is-date-object": { 655 | "version": "1.0.5", 656 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 657 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 658 | "dependencies": { 659 | "has-tostringtag": "^1.0.0" 660 | }, 661 | "engines": { 662 | "node": ">= 0.4" 663 | }, 664 | "funding": { 665 | "url": "https://github.com/sponsors/ljharb" 666 | } 667 | }, 668 | "node_modules/is-negative-zero": { 669 | "version": "2.0.1", 670 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 671 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", 672 | "engines": { 673 | "node": ">= 0.4" 674 | }, 675 | "funding": { 676 | "url": "https://github.com/sponsors/ljharb" 677 | } 678 | }, 679 | "node_modules/is-number-object": { 680 | "version": "1.0.6", 681 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", 682 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", 683 | "dependencies": { 684 | "has-tostringtag": "^1.0.0" 685 | }, 686 | "engines": { 687 | "node": ">= 0.4" 688 | }, 689 | "funding": { 690 | "url": "https://github.com/sponsors/ljharb" 691 | } 692 | }, 693 | "node_modules/is-regex": { 694 | "version": "1.1.4", 695 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 696 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 697 | "dependencies": { 698 | "call-bind": "^1.0.2", 699 | "has-tostringtag": "^1.0.0" 700 | }, 701 | "engines": { 702 | "node": ">= 0.4" 703 | }, 704 | "funding": { 705 | "url": "https://github.com/sponsors/ljharb" 706 | } 707 | }, 708 | "node_modules/is-shared-array-buffer": { 709 | "version": "1.0.1", 710 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", 711 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", 712 | "funding": { 713 | "url": "https://github.com/sponsors/ljharb" 714 | } 715 | }, 716 | "node_modules/is-string": { 717 | "version": "1.0.7", 718 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 719 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 720 | "dependencies": { 721 | "has-tostringtag": "^1.0.0" 722 | }, 723 | "engines": { 724 | "node": ">= 0.4" 725 | }, 726 | "funding": { 727 | "url": "https://github.com/sponsors/ljharb" 728 | } 729 | }, 730 | "node_modules/is-symbol": { 731 | "version": "1.0.4", 732 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 733 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 734 | "dependencies": { 735 | "has-symbols": "^1.0.2" 736 | }, 737 | "engines": { 738 | "node": ">= 0.4" 739 | }, 740 | "funding": { 741 | "url": "https://github.com/sponsors/ljharb" 742 | } 743 | }, 744 | "node_modules/is-weakref": { 745 | "version": "1.0.1", 746 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", 747 | "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", 748 | "dependencies": { 749 | "call-bind": "^1.0.0" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/ljharb" 753 | } 754 | }, 755 | "node_modules/media-typer": { 756 | "version": "0.3.0", 757 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 758 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 759 | "engines": { 760 | "node": ">= 0.6" 761 | } 762 | }, 763 | "node_modules/merge-descriptors": { 764 | "version": "1.0.1", 765 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 766 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 767 | }, 768 | "node_modules/methods": { 769 | "version": "1.1.2", 770 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 771 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 772 | "engines": { 773 | "node": ">= 0.6" 774 | } 775 | }, 776 | "node_modules/mime": { 777 | "version": "1.6.0", 778 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 779 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 780 | "bin": { 781 | "mime": "cli.js" 782 | }, 783 | "engines": { 784 | "node": ">=4" 785 | } 786 | }, 787 | "node_modules/mime-db": { 788 | "version": "1.51.0", 789 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 790 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 791 | "engines": { 792 | "node": ">= 0.6" 793 | } 794 | }, 795 | "node_modules/mime-types": { 796 | "version": "2.1.34", 797 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 798 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 799 | "dependencies": { 800 | "mime-db": "1.51.0" 801 | }, 802 | "engines": { 803 | "node": ">= 0.6" 804 | } 805 | }, 806 | "node_modules/minimalistic-assert": { 807 | "version": "1.0.1", 808 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 809 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 810 | }, 811 | "node_modules/minimalistic-crypto-utils": { 812 | "version": "1.0.1", 813 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 814 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 815 | }, 816 | "node_modules/ms": { 817 | "version": "2.0.0", 818 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 819 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 820 | }, 821 | "node_modules/negotiator": { 822 | "version": "0.6.2", 823 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 824 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 825 | "engines": { 826 | "node": ">= 0.6" 827 | } 828 | }, 829 | "node_modules/node-fetch": { 830 | "version": "3.1.0", 831 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", 832 | "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", 833 | "dependencies": { 834 | "data-uri-to-buffer": "^4.0.0", 835 | "fetch-blob": "^3.1.2", 836 | "formdata-polyfill": "^4.0.10" 837 | }, 838 | "engines": { 839 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 840 | }, 841 | "funding": { 842 | "type": "opencollective", 843 | "url": "https://opencollective.com/node-fetch" 844 | } 845 | }, 846 | "node_modules/object-inspect": { 847 | "version": "1.11.0", 848 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 849 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", 850 | "funding": { 851 | "url": "https://github.com/sponsors/ljharb" 852 | } 853 | }, 854 | "node_modules/object-keys": { 855 | "version": "1.1.1", 856 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 857 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 858 | "engines": { 859 | "node": ">= 0.4" 860 | } 861 | }, 862 | "node_modules/object.assign": { 863 | "version": "4.1.2", 864 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 865 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 866 | "dependencies": { 867 | "call-bind": "^1.0.0", 868 | "define-properties": "^1.1.3", 869 | "has-symbols": "^1.0.1", 870 | "object-keys": "^1.1.1" 871 | }, 872 | "engines": { 873 | "node": ">= 0.4" 874 | }, 875 | "funding": { 876 | "url": "https://github.com/sponsors/ljharb" 877 | } 878 | }, 879 | "node_modules/on-finished": { 880 | "version": "2.3.0", 881 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 882 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 883 | "dependencies": { 884 | "ee-first": "1.1.1" 885 | }, 886 | "engines": { 887 | "node": ">= 0.8" 888 | } 889 | }, 890 | "node_modules/parseurl": { 891 | "version": "1.3.3", 892 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 893 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 894 | "engines": { 895 | "node": ">= 0.8" 896 | } 897 | }, 898 | "node_modules/path-to-regexp": { 899 | "version": "0.1.7", 900 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 901 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 902 | }, 903 | "node_modules/proxy-addr": { 904 | "version": "2.0.7", 905 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 906 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 907 | "dependencies": { 908 | "forwarded": "0.2.0", 909 | "ipaddr.js": "1.9.1" 910 | }, 911 | "engines": { 912 | "node": ">= 0.10" 913 | } 914 | }, 915 | "node_modules/qs": { 916 | "version": "6.7.0", 917 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 918 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 919 | "engines": { 920 | "node": ">=0.6" 921 | } 922 | }, 923 | "node_modules/range-parser": { 924 | "version": "1.2.1", 925 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 926 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 927 | "engines": { 928 | "node": ">= 0.6" 929 | } 930 | }, 931 | "node_modules/raw-body": { 932 | "version": "2.4.0", 933 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 934 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 935 | "dependencies": { 936 | "bytes": "3.1.0", 937 | "http-errors": "1.7.2", 938 | "iconv-lite": "0.4.24", 939 | "unpipe": "1.0.0" 940 | }, 941 | "engines": { 942 | "node": ">= 0.8" 943 | } 944 | }, 945 | "node_modules/safe-buffer": { 946 | "version": "5.1.2", 947 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 948 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 949 | }, 950 | "node_modules/safer-buffer": { 951 | "version": "2.1.2", 952 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 953 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 954 | }, 955 | "node_modules/secure-random": { 956 | "version": "1.1.2", 957 | "resolved": "https://registry.npmjs.org/secure-random/-/secure-random-1.1.2.tgz", 958 | "integrity": "sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ==" 959 | }, 960 | "node_modules/send": { 961 | "version": "0.17.1", 962 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 963 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 964 | "dependencies": { 965 | "debug": "2.6.9", 966 | "depd": "~1.1.2", 967 | "destroy": "~1.0.4", 968 | "encodeurl": "~1.0.2", 969 | "escape-html": "~1.0.3", 970 | "etag": "~1.8.1", 971 | "fresh": "0.5.2", 972 | "http-errors": "~1.7.2", 973 | "mime": "1.6.0", 974 | "ms": "2.1.1", 975 | "on-finished": "~2.3.0", 976 | "range-parser": "~1.2.1", 977 | "statuses": "~1.5.0" 978 | }, 979 | "engines": { 980 | "node": ">= 0.8.0" 981 | } 982 | }, 983 | "node_modules/send/node_modules/ms": { 984 | "version": "2.1.1", 985 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 986 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 987 | }, 988 | "node_modules/serve-static": { 989 | "version": "1.14.1", 990 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 991 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 992 | "dependencies": { 993 | "encodeurl": "~1.0.2", 994 | "escape-html": "~1.0.3", 995 | "parseurl": "~1.3.3", 996 | "send": "0.17.1" 997 | }, 998 | "engines": { 999 | "node": ">= 0.8.0" 1000 | } 1001 | }, 1002 | "node_modules/setprototypeof": { 1003 | "version": "1.1.1", 1004 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1005 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1006 | }, 1007 | "node_modules/side-channel": { 1008 | "version": "1.0.4", 1009 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1010 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1011 | "dependencies": { 1012 | "call-bind": "^1.0.0", 1013 | "get-intrinsic": "^1.0.2", 1014 | "object-inspect": "^1.9.0" 1015 | }, 1016 | "funding": { 1017 | "url": "https://github.com/sponsors/ljharb" 1018 | } 1019 | }, 1020 | "node_modules/statuses": { 1021 | "version": "1.5.0", 1022 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1023 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1024 | "engines": { 1025 | "node": ">= 0.6" 1026 | } 1027 | }, 1028 | "node_modules/string.prototype.trimend": { 1029 | "version": "1.0.4", 1030 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 1031 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 1032 | "dependencies": { 1033 | "call-bind": "^1.0.2", 1034 | "define-properties": "^1.1.3" 1035 | }, 1036 | "funding": { 1037 | "url": "https://github.com/sponsors/ljharb" 1038 | } 1039 | }, 1040 | "node_modules/string.prototype.trimstart": { 1041 | "version": "1.0.4", 1042 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 1043 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 1044 | "dependencies": { 1045 | "call-bind": "^1.0.2", 1046 | "define-properties": "^1.1.3" 1047 | }, 1048 | "funding": { 1049 | "url": "https://github.com/sponsors/ljharb" 1050 | } 1051 | }, 1052 | "node_modules/toidentifier": { 1053 | "version": "1.0.0", 1054 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1055 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 1056 | "engines": { 1057 | "node": ">=0.6" 1058 | } 1059 | }, 1060 | "node_modules/type-is": { 1061 | "version": "1.6.18", 1062 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1063 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1064 | "dependencies": { 1065 | "media-typer": "0.3.0", 1066 | "mime-types": "~2.1.24" 1067 | }, 1068 | "engines": { 1069 | "node": ">= 0.6" 1070 | } 1071 | }, 1072 | "node_modules/unbox-primitive": { 1073 | "version": "1.0.1", 1074 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 1075 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 1076 | "dependencies": { 1077 | "function-bind": "^1.1.1", 1078 | "has-bigints": "^1.0.1", 1079 | "has-symbols": "^1.0.2", 1080 | "which-boxed-primitive": "^1.0.2" 1081 | }, 1082 | "funding": { 1083 | "url": "https://github.com/sponsors/ljharb" 1084 | } 1085 | }, 1086 | "node_modules/unpipe": { 1087 | "version": "1.0.0", 1088 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1089 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1090 | "engines": { 1091 | "node": ">= 0.8" 1092 | } 1093 | }, 1094 | "node_modules/utils-merge": { 1095 | "version": "1.0.1", 1096 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1097 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1098 | "engines": { 1099 | "node": ">= 0.4.0" 1100 | } 1101 | }, 1102 | "node_modules/vary": { 1103 | "version": "1.1.2", 1104 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1105 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1106 | "engines": { 1107 | "node": ">= 0.8" 1108 | } 1109 | }, 1110 | "node_modules/web-streams-polyfill": { 1111 | "version": "3.2.0", 1112 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 1113 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==", 1114 | "engines": { 1115 | "node": ">= 8" 1116 | } 1117 | }, 1118 | "node_modules/which-boxed-primitive": { 1119 | "version": "1.0.2", 1120 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1121 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1122 | "dependencies": { 1123 | "is-bigint": "^1.0.1", 1124 | "is-boolean-object": "^1.1.0", 1125 | "is-number-object": "^1.0.4", 1126 | "is-string": "^1.0.5", 1127 | "is-symbol": "^1.0.3" 1128 | }, 1129 | "funding": { 1130 | "url": "https://github.com/sponsors/ljharb" 1131 | } 1132 | } 1133 | }, 1134 | "dependencies": { 1135 | "@coinbarn/ergo-ts": { 1136 | "version": "0.3.0", 1137 | "resolved": "https://registry.npmjs.org/@coinbarn/ergo-ts/-/ergo-ts-0.3.0.tgz", 1138 | "integrity": "sha512-AacoG+j7k4I542cC2zQtYZm2X2LVT2QGIOg08muhdsvrppnf5Jhgta3JNGlryZKkGAkBrR8w5SkVfubaZCRdBw==", 1139 | "requires": { 1140 | "@root/encoding": "^1.0.1", 1141 | "array.prototype.flat": "^1.2.2", 1142 | "axios": "0.19.0", 1143 | "blakejs": "^1.1.0", 1144 | "bn.js": "^4.11.8", 1145 | "bs58": "^4.0.1", 1146 | "elliptic": "^6.4.1", 1147 | "secure-random": "1.1.2" 1148 | } 1149 | }, 1150 | "@root/encoding": { 1151 | "version": "1.0.1", 1152 | "resolved": "https://registry.npmjs.org/@root/encoding/-/encoding-1.0.1.tgz", 1153 | "integrity": "sha512-OaEub02ufoU038gy6bsNHQOjIn8nUjGiLcaRmJ40IUykneJkIW5fxDqKxQx48cszuNflYldsJLPPXCrGfHs8yQ==" 1154 | }, 1155 | "accepts": { 1156 | "version": "1.3.7", 1157 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 1158 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 1159 | "requires": { 1160 | "mime-types": "~2.1.24", 1161 | "negotiator": "0.6.2" 1162 | } 1163 | }, 1164 | "array-flatten": { 1165 | "version": "1.1.1", 1166 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1167 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 1168 | }, 1169 | "array.prototype.flat": { 1170 | "version": "1.2.5", 1171 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", 1172 | "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", 1173 | "requires": { 1174 | "call-bind": "^1.0.2", 1175 | "define-properties": "^1.1.3", 1176 | "es-abstract": "^1.19.0" 1177 | } 1178 | }, 1179 | "axios": { 1180 | "version": "0.19.0", 1181 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", 1182 | "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", 1183 | "requires": { 1184 | "follow-redirects": "1.5.10", 1185 | "is-buffer": "^2.0.2" 1186 | } 1187 | }, 1188 | "base-x": { 1189 | "version": "3.0.9", 1190 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 1191 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 1192 | "requires": { 1193 | "safe-buffer": "^5.0.1" 1194 | } 1195 | }, 1196 | "blakejs": { 1197 | "version": "1.1.1", 1198 | "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz", 1199 | "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==" 1200 | }, 1201 | "bn.js": { 1202 | "version": "4.12.0", 1203 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1204 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1205 | }, 1206 | "body-parser": { 1207 | "version": "1.19.0", 1208 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 1209 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 1210 | "requires": { 1211 | "bytes": "3.1.0", 1212 | "content-type": "~1.0.4", 1213 | "debug": "2.6.9", 1214 | "depd": "~1.1.2", 1215 | "http-errors": "1.7.2", 1216 | "iconv-lite": "0.4.24", 1217 | "on-finished": "~2.3.0", 1218 | "qs": "6.7.0", 1219 | "raw-body": "2.4.0", 1220 | "type-is": "~1.6.17" 1221 | } 1222 | }, 1223 | "brorand": { 1224 | "version": "1.1.0", 1225 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 1226 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 1227 | }, 1228 | "bs58": { 1229 | "version": "4.0.1", 1230 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 1231 | "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", 1232 | "requires": { 1233 | "base-x": "^3.0.2" 1234 | } 1235 | }, 1236 | "bytes": { 1237 | "version": "3.1.0", 1238 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 1239 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 1240 | }, 1241 | "call-bind": { 1242 | "version": "1.0.2", 1243 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1244 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1245 | "requires": { 1246 | "function-bind": "^1.1.1", 1247 | "get-intrinsic": "^1.0.2" 1248 | } 1249 | }, 1250 | "content-disposition": { 1251 | "version": "0.5.3", 1252 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 1253 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 1254 | "requires": { 1255 | "safe-buffer": "5.1.2" 1256 | } 1257 | }, 1258 | "content-type": { 1259 | "version": "1.0.4", 1260 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1261 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1262 | }, 1263 | "cookie": { 1264 | "version": "0.4.0", 1265 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 1266 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 1267 | }, 1268 | "cookie-signature": { 1269 | "version": "1.0.6", 1270 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1271 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 1272 | }, 1273 | "data-uri-to-buffer": { 1274 | "version": "4.0.0", 1275 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", 1276 | "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" 1277 | }, 1278 | "debug": { 1279 | "version": "2.6.9", 1280 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1281 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1282 | "requires": { 1283 | "ms": "2.0.0" 1284 | } 1285 | }, 1286 | "define-properties": { 1287 | "version": "1.1.3", 1288 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1289 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1290 | "requires": { 1291 | "object-keys": "^1.0.12" 1292 | } 1293 | }, 1294 | "depd": { 1295 | "version": "1.1.2", 1296 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1297 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1298 | }, 1299 | "destroy": { 1300 | "version": "1.0.4", 1301 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1302 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1303 | }, 1304 | "ee-first": { 1305 | "version": "1.1.1", 1306 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1307 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1308 | }, 1309 | "elliptic": { 1310 | "version": "6.5.4", 1311 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 1312 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 1313 | "requires": { 1314 | "bn.js": "^4.11.9", 1315 | "brorand": "^1.1.0", 1316 | "hash.js": "^1.0.0", 1317 | "hmac-drbg": "^1.0.1", 1318 | "inherits": "^2.0.4", 1319 | "minimalistic-assert": "^1.0.1", 1320 | "minimalistic-crypto-utils": "^1.0.1" 1321 | }, 1322 | "dependencies": { 1323 | "inherits": { 1324 | "version": "2.0.4", 1325 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1326 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1327 | } 1328 | } 1329 | }, 1330 | "encodeurl": { 1331 | "version": "1.0.2", 1332 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1333 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1334 | }, 1335 | "ergo-lib-wasm-nodejs": { 1336 | "version": "0.14.0", 1337 | "resolved": "https://registry.npmjs.org/ergo-lib-wasm-nodejs/-/ergo-lib-wasm-nodejs-0.14.0.tgz", 1338 | "integrity": "sha512-vspQ5NOxvsbVewZoiiu0D8fs8sJQR5BDTbUAWnZW5At+DGdvq7dYgQTSAR86zJB1BDi0H6/fEckyA5hieuXoBA==" 1339 | }, 1340 | "es-abstract": { 1341 | "version": "1.19.1", 1342 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", 1343 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", 1344 | "requires": { 1345 | "call-bind": "^1.0.2", 1346 | "es-to-primitive": "^1.2.1", 1347 | "function-bind": "^1.1.1", 1348 | "get-intrinsic": "^1.1.1", 1349 | "get-symbol-description": "^1.0.0", 1350 | "has": "^1.0.3", 1351 | "has-symbols": "^1.0.2", 1352 | "internal-slot": "^1.0.3", 1353 | "is-callable": "^1.2.4", 1354 | "is-negative-zero": "^2.0.1", 1355 | "is-regex": "^1.1.4", 1356 | "is-shared-array-buffer": "^1.0.1", 1357 | "is-string": "^1.0.7", 1358 | "is-weakref": "^1.0.1", 1359 | "object-inspect": "^1.11.0", 1360 | "object-keys": "^1.1.1", 1361 | "object.assign": "^4.1.2", 1362 | "string.prototype.trimend": "^1.0.4", 1363 | "string.prototype.trimstart": "^1.0.4", 1364 | "unbox-primitive": "^1.0.1" 1365 | } 1366 | }, 1367 | "es-to-primitive": { 1368 | "version": "1.2.1", 1369 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1370 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1371 | "requires": { 1372 | "is-callable": "^1.1.4", 1373 | "is-date-object": "^1.0.1", 1374 | "is-symbol": "^1.0.2" 1375 | } 1376 | }, 1377 | "escape-html": { 1378 | "version": "1.0.3", 1379 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1380 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1381 | }, 1382 | "etag": { 1383 | "version": "1.8.1", 1384 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1385 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1386 | }, 1387 | "express": { 1388 | "version": "4.17.1", 1389 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 1390 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 1391 | "requires": { 1392 | "accepts": "~1.3.7", 1393 | "array-flatten": "1.1.1", 1394 | "body-parser": "1.19.0", 1395 | "content-disposition": "0.5.3", 1396 | "content-type": "~1.0.4", 1397 | "cookie": "0.4.0", 1398 | "cookie-signature": "1.0.6", 1399 | "debug": "2.6.9", 1400 | "depd": "~1.1.2", 1401 | "encodeurl": "~1.0.2", 1402 | "escape-html": "~1.0.3", 1403 | "etag": "~1.8.1", 1404 | "finalhandler": "~1.1.2", 1405 | "fresh": "0.5.2", 1406 | "merge-descriptors": "1.0.1", 1407 | "methods": "~1.1.2", 1408 | "on-finished": "~2.3.0", 1409 | "parseurl": "~1.3.3", 1410 | "path-to-regexp": "0.1.7", 1411 | "proxy-addr": "~2.0.5", 1412 | "qs": "6.7.0", 1413 | "range-parser": "~1.2.1", 1414 | "safe-buffer": "5.1.2", 1415 | "send": "0.17.1", 1416 | "serve-static": "1.14.1", 1417 | "setprototypeof": "1.1.1", 1418 | "statuses": "~1.5.0", 1419 | "type-is": "~1.6.18", 1420 | "utils-merge": "1.0.1", 1421 | "vary": "~1.1.2" 1422 | } 1423 | }, 1424 | "fetch-blob": { 1425 | "version": "3.1.3", 1426 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", 1427 | "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", 1428 | "requires": { 1429 | "web-streams-polyfill": "^3.0.3" 1430 | } 1431 | }, 1432 | "finalhandler": { 1433 | "version": "1.1.2", 1434 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1435 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1436 | "requires": { 1437 | "debug": "2.6.9", 1438 | "encodeurl": "~1.0.2", 1439 | "escape-html": "~1.0.3", 1440 | "on-finished": "~2.3.0", 1441 | "parseurl": "~1.3.3", 1442 | "statuses": "~1.5.0", 1443 | "unpipe": "~1.0.0" 1444 | } 1445 | }, 1446 | "follow-redirects": { 1447 | "version": "1.5.10", 1448 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 1449 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 1450 | "requires": { 1451 | "debug": "=3.1.0" 1452 | }, 1453 | "dependencies": { 1454 | "debug": { 1455 | "version": "3.1.0", 1456 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1457 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1458 | "requires": { 1459 | "ms": "2.0.0" 1460 | } 1461 | } 1462 | } 1463 | }, 1464 | "formdata-polyfill": { 1465 | "version": "4.0.10", 1466 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 1467 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 1468 | "requires": { 1469 | "fetch-blob": "^3.1.2" 1470 | } 1471 | }, 1472 | "forwarded": { 1473 | "version": "0.2.0", 1474 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1475 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1476 | }, 1477 | "fresh": { 1478 | "version": "0.5.2", 1479 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1480 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1481 | }, 1482 | "function-bind": { 1483 | "version": "1.1.1", 1484 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1485 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1486 | }, 1487 | "get-intrinsic": { 1488 | "version": "1.1.1", 1489 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1490 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1491 | "requires": { 1492 | "function-bind": "^1.1.1", 1493 | "has": "^1.0.3", 1494 | "has-symbols": "^1.0.1" 1495 | } 1496 | }, 1497 | "get-symbol-description": { 1498 | "version": "1.0.0", 1499 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1500 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1501 | "requires": { 1502 | "call-bind": "^1.0.2", 1503 | "get-intrinsic": "^1.1.1" 1504 | } 1505 | }, 1506 | "has": { 1507 | "version": "1.0.3", 1508 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1509 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1510 | "requires": { 1511 | "function-bind": "^1.1.1" 1512 | } 1513 | }, 1514 | "has-bigints": { 1515 | "version": "1.0.1", 1516 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 1517 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" 1518 | }, 1519 | "has-symbols": { 1520 | "version": "1.0.2", 1521 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1522 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 1523 | }, 1524 | "has-tostringtag": { 1525 | "version": "1.0.0", 1526 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1527 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1528 | "requires": { 1529 | "has-symbols": "^1.0.2" 1530 | } 1531 | }, 1532 | "hash.js": { 1533 | "version": "1.1.7", 1534 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1535 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1536 | "requires": { 1537 | "inherits": "^2.0.3", 1538 | "minimalistic-assert": "^1.0.1" 1539 | } 1540 | }, 1541 | "hmac-drbg": { 1542 | "version": "1.0.1", 1543 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1544 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1545 | "requires": { 1546 | "hash.js": "^1.0.3", 1547 | "minimalistic-assert": "^1.0.0", 1548 | "minimalistic-crypto-utils": "^1.0.1" 1549 | } 1550 | }, 1551 | "http-errors": { 1552 | "version": "1.7.2", 1553 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1554 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1555 | "requires": { 1556 | "depd": "~1.1.2", 1557 | "inherits": "2.0.3", 1558 | "setprototypeof": "1.1.1", 1559 | "statuses": ">= 1.5.0 < 2", 1560 | "toidentifier": "1.0.0" 1561 | } 1562 | }, 1563 | "iconv-lite": { 1564 | "version": "0.4.24", 1565 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1566 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1567 | "requires": { 1568 | "safer-buffer": ">= 2.1.2 < 3" 1569 | } 1570 | }, 1571 | "inherits": { 1572 | "version": "2.0.3", 1573 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1574 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1575 | }, 1576 | "internal-slot": { 1577 | "version": "1.0.3", 1578 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1579 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1580 | "requires": { 1581 | "get-intrinsic": "^1.1.0", 1582 | "has": "^1.0.3", 1583 | "side-channel": "^1.0.4" 1584 | } 1585 | }, 1586 | "ipaddr.js": { 1587 | "version": "1.9.1", 1588 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1589 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1590 | }, 1591 | "is-bigint": { 1592 | "version": "1.0.4", 1593 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1594 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1595 | "requires": { 1596 | "has-bigints": "^1.0.1" 1597 | } 1598 | }, 1599 | "is-boolean-object": { 1600 | "version": "1.1.2", 1601 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1602 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1603 | "requires": { 1604 | "call-bind": "^1.0.2", 1605 | "has-tostringtag": "^1.0.0" 1606 | } 1607 | }, 1608 | "is-buffer": { 1609 | "version": "2.0.5", 1610 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 1611 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 1612 | }, 1613 | "is-callable": { 1614 | "version": "1.2.4", 1615 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 1616 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" 1617 | }, 1618 | "is-date-object": { 1619 | "version": "1.0.5", 1620 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1621 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1622 | "requires": { 1623 | "has-tostringtag": "^1.0.0" 1624 | } 1625 | }, 1626 | "is-negative-zero": { 1627 | "version": "2.0.1", 1628 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1629 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 1630 | }, 1631 | "is-number-object": { 1632 | "version": "1.0.6", 1633 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", 1634 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", 1635 | "requires": { 1636 | "has-tostringtag": "^1.0.0" 1637 | } 1638 | }, 1639 | "is-regex": { 1640 | "version": "1.1.4", 1641 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1642 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1643 | "requires": { 1644 | "call-bind": "^1.0.2", 1645 | "has-tostringtag": "^1.0.0" 1646 | } 1647 | }, 1648 | "is-shared-array-buffer": { 1649 | "version": "1.0.1", 1650 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", 1651 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" 1652 | }, 1653 | "is-string": { 1654 | "version": "1.0.7", 1655 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1656 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1657 | "requires": { 1658 | "has-tostringtag": "^1.0.0" 1659 | } 1660 | }, 1661 | "is-symbol": { 1662 | "version": "1.0.4", 1663 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1664 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1665 | "requires": { 1666 | "has-symbols": "^1.0.2" 1667 | } 1668 | }, 1669 | "is-weakref": { 1670 | "version": "1.0.1", 1671 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", 1672 | "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", 1673 | "requires": { 1674 | "call-bind": "^1.0.0" 1675 | } 1676 | }, 1677 | "media-typer": { 1678 | "version": "0.3.0", 1679 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1680 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1681 | }, 1682 | "merge-descriptors": { 1683 | "version": "1.0.1", 1684 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1685 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1686 | }, 1687 | "methods": { 1688 | "version": "1.1.2", 1689 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1690 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1691 | }, 1692 | "mime": { 1693 | "version": "1.6.0", 1694 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1695 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1696 | }, 1697 | "mime-db": { 1698 | "version": "1.51.0", 1699 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1700 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 1701 | }, 1702 | "mime-types": { 1703 | "version": "2.1.34", 1704 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1705 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1706 | "requires": { 1707 | "mime-db": "1.51.0" 1708 | } 1709 | }, 1710 | "minimalistic-assert": { 1711 | "version": "1.0.1", 1712 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1713 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1714 | }, 1715 | "minimalistic-crypto-utils": { 1716 | "version": "1.0.1", 1717 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1718 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1719 | }, 1720 | "ms": { 1721 | "version": "2.0.0", 1722 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1723 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1724 | }, 1725 | "negotiator": { 1726 | "version": "0.6.2", 1727 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1728 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1729 | }, 1730 | "node-fetch": { 1731 | "version": "3.1.0", 1732 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", 1733 | "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", 1734 | "requires": { 1735 | "data-uri-to-buffer": "^4.0.0", 1736 | "fetch-blob": "^3.1.2", 1737 | "formdata-polyfill": "^4.0.10" 1738 | } 1739 | }, 1740 | "object-inspect": { 1741 | "version": "1.11.0", 1742 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 1743 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" 1744 | }, 1745 | "object-keys": { 1746 | "version": "1.1.1", 1747 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1748 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1749 | }, 1750 | "object.assign": { 1751 | "version": "4.1.2", 1752 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1753 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1754 | "requires": { 1755 | "call-bind": "^1.0.0", 1756 | "define-properties": "^1.1.3", 1757 | "has-symbols": "^1.0.1", 1758 | "object-keys": "^1.1.1" 1759 | } 1760 | }, 1761 | "on-finished": { 1762 | "version": "2.3.0", 1763 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1764 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1765 | "requires": { 1766 | "ee-first": "1.1.1" 1767 | } 1768 | }, 1769 | "parseurl": { 1770 | "version": "1.3.3", 1771 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1772 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1773 | }, 1774 | "path-to-regexp": { 1775 | "version": "0.1.7", 1776 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1777 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1778 | }, 1779 | "proxy-addr": { 1780 | "version": "2.0.7", 1781 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1782 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1783 | "requires": { 1784 | "forwarded": "0.2.0", 1785 | "ipaddr.js": "1.9.1" 1786 | } 1787 | }, 1788 | "qs": { 1789 | "version": "6.7.0", 1790 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1791 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1792 | }, 1793 | "range-parser": { 1794 | "version": "1.2.1", 1795 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1796 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1797 | }, 1798 | "raw-body": { 1799 | "version": "2.4.0", 1800 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1801 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1802 | "requires": { 1803 | "bytes": "3.1.0", 1804 | "http-errors": "1.7.2", 1805 | "iconv-lite": "0.4.24", 1806 | "unpipe": "1.0.0" 1807 | } 1808 | }, 1809 | "safe-buffer": { 1810 | "version": "5.1.2", 1811 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1812 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1813 | }, 1814 | "safer-buffer": { 1815 | "version": "2.1.2", 1816 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1817 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1818 | }, 1819 | "secure-random": { 1820 | "version": "1.1.2", 1821 | "resolved": "https://registry.npmjs.org/secure-random/-/secure-random-1.1.2.tgz", 1822 | "integrity": "sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ==" 1823 | }, 1824 | "send": { 1825 | "version": "0.17.1", 1826 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1827 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1828 | "requires": { 1829 | "debug": "2.6.9", 1830 | "depd": "~1.1.2", 1831 | "destroy": "~1.0.4", 1832 | "encodeurl": "~1.0.2", 1833 | "escape-html": "~1.0.3", 1834 | "etag": "~1.8.1", 1835 | "fresh": "0.5.2", 1836 | "http-errors": "~1.7.2", 1837 | "mime": "1.6.0", 1838 | "ms": "2.1.1", 1839 | "on-finished": "~2.3.0", 1840 | "range-parser": "~1.2.1", 1841 | "statuses": "~1.5.0" 1842 | }, 1843 | "dependencies": { 1844 | "ms": { 1845 | "version": "2.1.1", 1846 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1847 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1848 | } 1849 | } 1850 | }, 1851 | "serve-static": { 1852 | "version": "1.14.1", 1853 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1854 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1855 | "requires": { 1856 | "encodeurl": "~1.0.2", 1857 | "escape-html": "~1.0.3", 1858 | "parseurl": "~1.3.3", 1859 | "send": "0.17.1" 1860 | } 1861 | }, 1862 | "setprototypeof": { 1863 | "version": "1.1.1", 1864 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1865 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1866 | }, 1867 | "side-channel": { 1868 | "version": "1.0.4", 1869 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1870 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1871 | "requires": { 1872 | "call-bind": "^1.0.0", 1873 | "get-intrinsic": "^1.0.2", 1874 | "object-inspect": "^1.9.0" 1875 | } 1876 | }, 1877 | "statuses": { 1878 | "version": "1.5.0", 1879 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1880 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1881 | }, 1882 | "string.prototype.trimend": { 1883 | "version": "1.0.4", 1884 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 1885 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 1886 | "requires": { 1887 | "call-bind": "^1.0.2", 1888 | "define-properties": "^1.1.3" 1889 | } 1890 | }, 1891 | "string.prototype.trimstart": { 1892 | "version": "1.0.4", 1893 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 1894 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 1895 | "requires": { 1896 | "call-bind": "^1.0.2", 1897 | "define-properties": "^1.1.3" 1898 | } 1899 | }, 1900 | "toidentifier": { 1901 | "version": "1.0.0", 1902 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1903 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1904 | }, 1905 | "type-is": { 1906 | "version": "1.6.18", 1907 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1908 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1909 | "requires": { 1910 | "media-typer": "0.3.0", 1911 | "mime-types": "~2.1.24" 1912 | } 1913 | }, 1914 | "unbox-primitive": { 1915 | "version": "1.0.1", 1916 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 1917 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 1918 | "requires": { 1919 | "function-bind": "^1.1.1", 1920 | "has-bigints": "^1.0.1", 1921 | "has-symbols": "^1.0.2", 1922 | "which-boxed-primitive": "^1.0.2" 1923 | } 1924 | }, 1925 | "unpipe": { 1926 | "version": "1.0.0", 1927 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1928 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1929 | }, 1930 | "utils-merge": { 1931 | "version": "1.0.1", 1932 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1933 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1934 | }, 1935 | "vary": { 1936 | "version": "1.1.2", 1937 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1938 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1939 | }, 1940 | "web-streams-polyfill": { 1941 | "version": "3.2.0", 1942 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", 1943 | "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" 1944 | }, 1945 | "which-boxed-primitive": { 1946 | "version": "1.0.2", 1947 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1948 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1949 | "requires": { 1950 | "is-bigint": "^1.0.1", 1951 | "is-boolean-object": "^1.1.0", 1952 | "is-number-object": "^1.0.4", 1953 | "is-string": "^1.0.5", 1954 | "is-symbol": "^1.0.3" 1955 | } 1956 | } 1957 | } 1958 | } 1959 | --------------------------------------------------------------------------------