temp replace storage

This commit is contained in:
PhilReact 2024-10-29 15:57:27 +02:00
parent 93fb833df5
commit c9306493f0
20 changed files with 1901 additions and 1641 deletions

View File

@ -5,6 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/favicon.ico" /> <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Qortal Extension</title> <title>Qortal Extension</title>
</head> </head>
<body> <body>

420
package-lock.json generated
View File

@ -117,11 +117,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.24.2", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz",
"integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==",
"dependencies": { "dependencies": {
"@babel/highlight": "^7.24.2", "@babel/helper-validator-identifier": "^7.25.9",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0" "picocolors": "^1.0.0"
}, },
"engines": { "engines": {
@ -129,30 +130,30 @@
} }
}, },
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "7.24.1", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz",
"integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "7.24.1", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
"integrity": "sha512-F82udohVyIgGAY2VVj/g34TpFUG606rumIHjTfVbssPg2zTR7PuuEpZcX8JA6sgBfIYmJrFtWgPvHQuJamVqZQ==", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0", "@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.24.1", "@babel/code-frame": "^7.26.0",
"@babel/generator": "^7.24.1", "@babel/generator": "^7.26.0",
"@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-compilation-targets": "^7.25.9",
"@babel/helper-module-transforms": "^7.23.3", "@babel/helper-module-transforms": "^7.26.0",
"@babel/helpers": "^7.24.1", "@babel/helpers": "^7.26.0",
"@babel/parser": "^7.24.1", "@babel/parser": "^7.26.0",
"@babel/template": "^7.24.0", "@babel/template": "^7.25.9",
"@babel/traverse": "^7.24.1", "@babel/traverse": "^7.25.9",
"@babel/types": "^7.24.0", "@babel/types": "^7.26.0",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@ -177,29 +178,29 @@
} }
}, },
"node_modules/@babel/generator": { "node_modules/@babel/generator": {
"version": "7.24.1", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz",
"integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==",
"dev": true,
"dependencies": { "dependencies": {
"@babel/types": "^7.24.0", "@babel/parser": "^7.26.0",
"@babel/types": "^7.26.0",
"@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25", "@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1" "jsesc": "^3.0.2"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-compilation-targets": { "node_modules/@babel/helper-compilation-targets": {
"version": "7.23.6", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
"integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.23.5", "@babel/compat-data": "^7.25.9",
"@babel/helper-validator-option": "^7.23.5", "@babel/helper-validator-option": "^7.25.9",
"browserslist": "^4.22.2", "browserslist": "^4.24.0",
"lru-cache": "^5.1.1", "lru-cache": "^5.1.1",
"semver": "^6.3.1" "semver": "^6.3.1"
}, },
@ -216,62 +217,27 @@
"semver": "bin/semver.js" "semver": "bin/semver.js"
} }
}, },
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": { "node_modules/@babel/helper-module-imports": {
"version": "7.24.1", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
"integrity": "sha512-HfEWzysMyOa7xI5uQHc/OcZf67/jc+xe/RZlznWQHhbb8Pg1SkRdbK4yEi61aY8wxQA7PkSfoojtLQP/Kpe3og==", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
"dependencies": { "dependencies": {
"@babel/types": "^7.24.0" "@babel/traverse": "^7.25.9",
"@babel/types": "^7.25.9"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-module-transforms": { "node_modules/@babel/helper-module-transforms": {
"version": "7.23.3", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
"integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.25.9",
"@babel/helper-module-imports": "^7.22.15", "@babel/helper-validator-identifier": "^7.25.9",
"@babel/helper-simple-access": "^7.22.5", "@babel/traverse": "^7.25.9"
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/helper-validator-identifier": "^7.22.20"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -281,96 +247,59 @@
} }
}, },
"node_modules/@babel/helper-plugin-utils": { "node_modules/@babel/helper-plugin-utils": {
"version": "7.24.0", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
"integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-simple-access": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
"integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": { "node_modules/@babel/helper-string-parser": {
"version": "7.24.1", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-validator-option": { "node_modules/@babel/helper-validator-option": {
"version": "7.23.5", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
"integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.24.1", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
"integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/template": "^7.24.0", "@babel/template": "^7.25.9",
"@babel/traverse": "^7.24.1", "@babel/types": "^7.26.0"
"@babel/types": "^7.24.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.24.2",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz",
"integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.24.1", "version": "7.26.1",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz",
"integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==",
"dev": true, "dependencies": {
"@babel/types": "^7.26.0"
},
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@ -420,33 +349,28 @@
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.24.0", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
"integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
"dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.23.5", "@babel/code-frame": "^7.25.9",
"@babel/parser": "^7.24.0", "@babel/parser": "^7.25.9",
"@babel/types": "^7.24.0" "@babel/types": "^7.25.9"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.24.1", "version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
"integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
"dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.24.1", "@babel/code-frame": "^7.25.9",
"@babel/generator": "^7.24.1", "@babel/generator": "^7.25.9",
"@babel/helper-environment-visitor": "^7.22.20", "@babel/parser": "^7.25.9",
"@babel/helper-function-name": "^7.23.0", "@babel/template": "^7.25.9",
"@babel/helper-hoist-variables": "^7.22.5", "@babel/types": "^7.25.9",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.24.1",
"@babel/types": "^7.24.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"globals": "^11.1.0" "globals": "^11.1.0"
}, },
@ -455,13 +379,12 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.24.0", "version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
"integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.23.4", "@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.22.20", "@babel/helper-validator-identifier": "^7.25.9"
"to-fast-properties": "^2.0.0"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -1764,7 +1687,6 @@
"version": "0.3.5", "version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
"dev": true,
"dependencies": { "dependencies": {
"@jridgewell/set-array": "^1.2.1", "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/sourcemap-codec": "^1.4.10",
@ -1778,7 +1700,6 @@
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
} }
@ -1787,22 +1708,31 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": { "node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15", "version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
"devOptional": true
}, },
"node_modules/@jridgewell/trace-mapping": { "node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25", "version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"dependencies": { "dependencies": {
"@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14" "@jridgewell/sourcemap-codec": "^1.4.14"
@ -3729,6 +3659,7 @@
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": { "dependencies": {
"color-convert": "^1.9.0" "color-convert": "^1.9.0"
}, },
@ -3937,9 +3868,9 @@
} }
}, },
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.23.0", "version": "4.24.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -3956,10 +3887,10 @@
} }
], ],
"dependencies": { "dependencies": {
"caniuse-lite": "^1.0.30001587", "caniuse-lite": "^1.0.30001669",
"electron-to-chromium": "^1.4.668", "electron-to-chromium": "^1.5.41",
"node-releases": "^2.0.14", "node-releases": "^2.0.18",
"update-browserslist-db": "^1.0.13" "update-browserslist-db": "^1.1.1"
}, },
"bin": { "bin": {
"browserslist": "cli.js" "browserslist": "cli.js"
@ -3999,6 +3930,14 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/cac": { "node_modules/cac": {
"version": "6.7.14", "version": "6.7.14",
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@ -4045,9 +3984,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001599", "version": "1.0.30001674",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001674.tgz",
"integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", "integrity": "sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -4097,6 +4036,7 @@
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": { "dependencies": {
"ansi-styles": "^3.2.1", "ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
@ -4387,6 +4327,7 @@
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": { "dependencies": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@ -4394,7 +4335,8 @@
"node_modules/color-name": { "node_modules/color-name": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
}, },
"node_modules/combined-stream": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
@ -4554,11 +4496,11 @@
} }
}, },
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dependencies": { "dependencies": {
"ms": "2.1.2" "ms": "^2.1.3"
}, },
"engines": { "engines": {
"node": ">=6.0" "node": ">=6.0"
@ -4753,9 +4695,9 @@
"integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ=="
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.710", "version": "1.5.49",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz",
"integrity": "sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==", "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==",
"dev": true "dev": true
}, },
"node_modules/elementtree": { "node_modules/elementtree": {
@ -4892,9 +4834,9 @@
} }
}, },
"node_modules/escalade": { "node_modules/escalade": {
"version": "3.1.2", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
@ -4904,6 +4846,7 @@
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"engines": { "engines": {
"node": ">=0.8.0" "node": ">=0.8.0"
} }
@ -5648,7 +5591,6 @@
"version": "11.12.0", "version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": { "engines": {
"node": ">=4" "node": ">=4"
} }
@ -5704,6 +5646,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": { "engines": {
"node": ">=4" "node": ">=4"
} }
@ -6371,15 +6314,14 @@
} }
}, },
"node_modules/jsesc": { "node_modules/jsesc": {
"version": "2.5.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
"dev": true,
"bin": { "bin": {
"jsesc": "bin/jsesc" "jsesc": "bin/jsesc"
}, },
"engines": { "engines": {
"node": ">=4" "node": ">=6"
} }
}, },
"node_modules/json-buffer": { "node_modules/json-buffer": {
@ -6805,9 +6747,9 @@
} }
}, },
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.2", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}, },
"node_modules/mute-stream": { "node_modules/mute-stream": {
"version": "0.0.8", "version": "0.0.8",
@ -6876,9 +6818,9 @@
"dev": true "dev": true
}, },
"node_modules/node-releases": { "node_modules/node-releases": {
"version": "2.0.14", "version": "2.0.18",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
"dev": true "dev": true
}, },
"node_modules/npm": { "node_modules/npm": {
@ -9574,9 +9516,9 @@
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -10953,6 +10895,29 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/source-map-support/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"optional": true,
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/split2": { "node_modules/split2": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
@ -11104,6 +11069,7 @@
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": { "dependencies": {
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
}, },
@ -11152,6 +11118,34 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}, },
"node_modules/terser": {
"version": "5.36.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
"integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/text-table": { "node_modules/text-table": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -11239,14 +11233,6 @@
"node": ">=0.6.0" "node": ">=0.6.0"
} }
}, },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -11505,9 +11491,9 @@
} }
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.13", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -11524,8 +11510,8 @@
} }
], ],
"dependencies": { "dependencies": {
"escalade": "^3.1.1", "escalade": "^3.2.0",
"picocolors": "^1.0.0" "picocolors": "^1.1.0"
}, },
"bin": { "bin": {
"update-browserslist-db": "cli.js" "update-browserslist-db": "cli.js"

View File

@ -260,7 +260,7 @@ export const getBaseApiReactSocket = (customApi?: string) => {
return groupApiSocket; return groupApiSocket;
} }
}; };
export const isMainWindow = window?.location?.href?.includes("?main=true"); export const isMainWindow = true
function App() { function App() {
const [extState, setExtstate] = useState<extStates>("not-authenticated"); const [extState, setExtstate] = useState<extStates>("not-authenticated");
const [desktopViewMode, setDesktopViewMode] = useState('home') const [desktopViewMode, setDesktopViewMode] = useState('home')
@ -287,7 +287,7 @@ function App() {
const [walletToBeDownloadedPassword, setWalletToBeDownloadedPassword] = const [walletToBeDownloadedPassword, setWalletToBeDownloadedPassword] =
useState<string>(""); useState<string>("");
const [isMain, setIsMain] = useState<boolean>( const [isMain, setIsMain] = useState<boolean>(
window?.location?.href?.includes("?main=true") true
); );
const isMainRef = useRef(false); const isMainRef = useRef(false);
const [authenticatePassword, setAuthenticatePassword] = useState<string>(""); const [authenticatePassword, setAuthenticatePassword] = useState<string>("");
@ -495,7 +495,6 @@ function App() {
for (const field of requiredFields) { for (const field of requiredFields) {
if (!(field in pf)) throw new Error(field + " not found in JSON"); if (!(field in pf)) throw new Error(field + " not found in JSON");
} }
// storeWalletInfo(pf);
setRawWallet(pf); setRawWallet(pf);
// setExtstate("authenticated"); // setExtstate("authenticated");
setExtstate("wallet-dropped"); setExtstate("wallet-dropped");
@ -529,26 +528,7 @@ function App() {
}; };
}; };
const storeWalletInfo = (wallet: any) => {
chrome?.runtime?.sendMessage(
{ action: "storeWalletInfo", wallet },
(response) => {
if (response) {
}
}
);
chrome.tabs.query(
{ active: true, currentWindow: true },
function (tabs: any[]) {
chrome.tabs.sendMessage(
tabs[0].id,
{ from: "popup", subject: "anySubject" },
function (response) {}
);
}
);
};
const getBalanceFunc = () => { const getBalanceFunc = () => {
setQortBalanceLoading(true); setQortBalanceLoading(true);
@ -755,126 +735,29 @@ function App() {
//param = isDecline //param = isDecline
const confirmPayment = (isDecline: boolean) => { const confirmPayment = (isDecline: boolean) => {
if (isDecline) { // REMOVED FOR MOBILE APP
chrome?.runtime?.sendMessage(
{
action: "sendQortConfirmation",
payload: {
amount: sendqortState?.amount,
receiver: sendqortState?.address,
password: paymentPassword,
interactionId: sendqortState?.interactionId,
isDecline: true,
},
},
(response) => {
if (response) {
setSendPaymentSuccess("Payment successfully sent");
} else {
window.close();
}
}
);
return;
}
setIsLoading(true);
chrome?.runtime?.sendMessage(
{
action: "sendQortConfirmation",
payload: {
amount: sendqortState.amount,
receiver: sendqortState.address,
password: paymentPassword,
interactionId: sendqortState.interactionId,
isDecline: false,
},
},
(response) => {
if (response === true) {
setExtstate("transfer-success-request");
setCountdown(null);
} else {
setSendPaymentError(
response?.error || "Unable to perform payment. Please try again."
);
}
setIsLoading(false);
}
);
}; };
const confirmBuyOrder = (isDecline: boolean) => { const confirmBuyOrder = (isDecline: boolean) => {
if (isDecline) { // REMOVED FOR MOBILE APP
chrome?.runtime?.sendMessage(
{
action: "buyOrderConfirmation",
payload: {
crosschainAtInfo: requestBuyOrder?.crosschainAtInfo,
interactionId: requestBuyOrder?.interactionId,
isDecline: true,
useLocal: requestBuyOrder?.useLocal,
},
},
(response) => {
window.close();
}
);
return;
}
setIsLoading(true);
chrome?.runtime?.sendMessage(
{
action: "buyOrderConfirmation",
payload: {
crosschainAtInfo: requestBuyOrder?.crosschainAtInfo,
interactionId: requestBuyOrder?.interactionId,
isDecline: false,
useLocal: requestBuyOrder?.useLocal,
},
},
(response) => {
if (response === true) {
setExtstate("buy-order-submitted");
setCountdown(null);
} else {
setSendPaymentError(
response?.error || "Unable to perform payment. Please try again."
);
}
setIsLoading(false);
}
);
}; };
const responseToConnectionRequest = ( const responseToConnectionRequest = (
isOkay: boolean, isOkay: boolean,
hostname: string, hostname: string,
interactionId: string interactionId: string
) => { ) => {
chrome?.runtime?.sendMessage( // REMOVED FOR MOBILE APP
{
action: "responseToConnectionRequest",
payload: { isOkay, hostname, interactionId },
},
(response) => {
if (response === false || response === true) {
window.close();
}
}
);
}; };
// const rawWalletRef = useRef(null)
// useEffect(()=> {
// rawWalletRef.current = rawWallet
// }, [rawWallet])
useEffect(() => { useEffect(() => {
try { try {
setIsLoading(true); setIsLoading(true);
chrome?.runtime?.sendMessage({ action: "getWalletInfo" }, (response) => {
window.sendMessage("getWalletInfo")
.then((response) => {
console.log('getwalll', response)
if (response && response?.walletInfo) { if (response && response?.walletInfo) {
setRawWallet(response?.walletInfo); setRawWallet(response?.walletInfo);
if ( if (
@ -886,6 +769,9 @@ function App() {
setExtstate("authenticated"); setExtstate("authenticated");
} }
})
.catch((error) => {
console.error("Failed to get wallet info:", error);
}); });
} catch (error) { } catch (error) {
} finally { } finally {
@ -1120,6 +1006,7 @@ function App() {
wallet: rawWallet, wallet: rawWallet,
}) })
.then((response) => { .then((response) => {
console.log('response2', response)
if (response && !response.error) { if (response && !response.error) {
setAuthenticatePassword(""); setAuthenticatePassword("");
setExtstate("authenticated"); setExtstate("authenticated");

View File

@ -22,7 +22,9 @@ import { CustomizedSnackbars } from "../components/Snackbar/Snackbar";
import { set } from "lodash"; import { set } from "lodash";
import { cleanUrl, isUsingLocal } from "../background"; import { cleanUrl, isUsingLocal } from "../background";
const manifestData = chrome?.runtime?.getManifest(); const manifestData = {
version: '2.2.0'
}
export const NotAuthenticated = ({ export const NotAuthenticated = ({
getRootProps, getRootProps,
@ -69,6 +71,7 @@ export const NotAuthenticated = ({
} }
}; };
const checkIfUserHasLocalNode = useCallback(async () => { const checkIfUserHasLocalNode = useCallback(async () => {
try { try {
const url = `http://127.0.0.1:12391/admin/status`; const url = `http://127.0.0.1:12391/admin/status`;

View File

@ -53,6 +53,7 @@ import {
import { decryptGroupEncryption, encryptAndPublishSymmetricKeyGroupChat, publishGroupEncryptedResource, publishOnQDN } from "./backgroundFunctions/encryption"; import { decryptGroupEncryption, encryptAndPublishSymmetricKeyGroupChat, publishGroupEncryptedResource, publishOnQDN } from "./backgroundFunctions/encryption";
import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from "./constants/codes"; import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from "./constants/codes";
import { encryptSingle } from "./qdn/encryption/group-encryption"; import { encryptSingle } from "./qdn/encryption/group-encryption";
import { getData, storeData } from "./utils/chromeStorage";
export function versionCase(request, event) { export function versionCase(request, event) {
event.source.postMessage( event.source.postMessage(
@ -70,15 +71,42 @@ export async function getWalletInfoCase(request, event) {
try { try {
const response = await getKeyPair(); const response = await getKeyPair();
event.source.postMessage( try {
{ const walletInfo = await getData('walletInfo').catch((error)=> null)
requestId: request.requestId, if(walletInfo){
action: "getWalletInfo", event.source.postMessage(
payload: { walletInfo: response }, {
type: "backgroundMessageResponse", requestId: request.requestId,
}, action: "getWalletInfo",
event.origin payload: { walletInfo },
); type: "backgroundMessageResponse",
},
event.origin
);
} else {
event.source.postMessage(
{
requestId: request.requestId,
action: "getWalletInfo",
error: "No wallet info found",
type: "backgroundMessageResponse",
},
event.origin
);
}
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: "getWalletInfo",
error: "No wallet info found",
type: "backgroundMessageResponse",
},
event.origin
);
}
} catch (error) { } catch (error) {
event.source.postMessage( event.source.postMessage(
{ {
@ -171,10 +199,12 @@ export async function userInfoCase(request, event) {
} }
export async function decryptWalletCase(request, event) { export async function decryptWalletCase(request, event) {
try { try {
console.log('request', request)
const { password, wallet } = request.payload; const { password, wallet } = request.payload;
const response = await decryptWallet(password, wallet, walletVersion); console.log({password, wallet})
const response = await decryptWallet({password, wallet, walletVersion});
console.log('response', response)
event.source.postMessage( event.source.postMessage(
{ {
requestId: request.requestId, requestId: request.requestId,
@ -841,10 +871,7 @@ export async function addTimestampEnterChatCase(request, event) {
export async function setApiKeyCase(request, event) { export async function setApiKeyCase(request, event) {
try { try {
const payload = request.payload; const payload = request.payload;
chrome.storage.local.set({ apiKey: payload }, () => { storeData('apiKey', payload)
// sendResponse(true);
});
event.source.postMessage( event.source.postMessage(
{ {
requestId: request.requestId, requestId: request.requestId,
@ -869,9 +896,7 @@ export async function setApiKeyCase(request, event) {
export async function setCustomNodesCase(request, event) { export async function setCustomNodesCase(request, event) {
try { try {
const nodes = request.payload; const nodes = request.payload;
chrome.storage.local.set({ customNodes: nodes }, () => { storeData('customNodes', nodes)
// sendResponse(true);
});
event.source.postMessage( event.source.postMessage(
{ {
@ -1346,8 +1371,9 @@ export async function publishGroupEncryptedResourceCase(request, event) {
export async function decryptGroupEncryptionCase(request, event) { export async function decryptGroupEncryptionCase(request, event) {
try { try {
const { data} = request.payload; const { data} = request.payload;
console.log('data', data)
const response = await decryptGroupEncryption({ data }); const response = await decryptGroupEncryption({ data });
console.log('dataresponse', response)
event.source.postMessage( event.source.postMessage(
{ {
requestId: request.requestId, requestId: request.requestId,

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
import { getBaseApi } from "../background"; import { getBaseApi } from "../background";
import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption"; import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption";
import { publishData } from "../qdn/publish/pubish"; import { publishData } from "../qdn/publish/pubish";
import { getData } from "../utils/chromeStorage";
const apiEndpoints = [ const apiEndpoints = [
"https://api.qortal.org", "https://api.qortal.org",
@ -36,9 +37,10 @@ async function findUsableApi() {
async function getSaveWallet() { async function getSaveWallet() {
const res = await chrome.storage.local.get(["walletInfo"]); const res = await getData<any>("walletInfo").catch(() => null);
if (res?.walletInfo) {
return res.walletInfo; if (res) {
return res
} else { } else {
throw new Error("No wallet saved"); throw new Error("No wallet saved");
} }
@ -56,9 +58,9 @@ export async function getNameInfo() {
} }
} }
async function getKeyPair() { async function getKeyPair() {
const res = await chrome.storage.local.get(["keyPair"]); const res = await getData<any>("keyPair").catch(() => null);
if (res?.keyPair) { if (res) {
return res.keyPair; return res
} else { } else {
throw new Error("Wallet not authenticated"); throw new Error("Wallet not authenticated");
} }
@ -98,7 +100,7 @@ export const encryptAndPublishSymmetricKeyGroupChat = async ({groupId, previousD
} }
const resKeyPair = await getKeyPair() const resKeyPair = await getKeyPair()
const parsedData = JSON.parse(resKeyPair) const parsedData = resKeyPair
const privateKey = parsedData.privateKey const privateKey = parsedData.privateKey
const userPublicKey = parsedData.publicKey const userPublicKey = parsedData.publicKey
const groupmemberPublicKeys = await getPublicKeys(groupId) const groupmemberPublicKeys = await getPublicKeys(groupId)
@ -219,7 +221,7 @@ export const decryptGroupEncryption = async ({data}: {
}) => { }) => {
try { try {
const resKeyPair = await getKeyPair() const resKeyPair = await getKeyPair()
const parsedData = JSON.parse(resKeyPair) const parsedData = resKeyPair
const privateKey = parsedData.privateKey const privateKey = parsedData.privateKey
const encryptedData = decryptGroupData( const encryptedData = decryptGroupData(
data, data,

View File

@ -118,32 +118,32 @@ export const AppRating = ({ app, myName, ratingCountPosition = "right" }) => {
const pollName = `app-library-${app.service}-rating-${app.name}`; const pollName = `app-library-${app.service}-rating-${app.name}`;
const pollOptions = [`1, 2, 3, 4, 5, initialValue-${newValue}`]; const pollOptions = [`1, 2, 3, 4, 5, initialValue-${newValue}`];
await new Promise((res, rej) => { await new Promise((res, rej) => {
chrome?.runtime?.sendMessage( window.sendMessage("CREATE_POLL", {
{ payload: {
action: "CREATE_POLL", pollName: pollName,
type: "qortalRequest", pollDescription: `Rating for ${app.service} ${app.name}`,
payload: { pollOptions: pollOptions,
pollName: pollName, pollOwnerAddress: myName,
pollDescription: `Rating for ${app.service} ${app.name}`,
pollOptions: pollOptions,
pollOwnerAddress: myName,
},
}, },
(response) => { }, 60000)
if (response.error) { .then((response) => {
rej(response?.message); if (response.error) {
return; rej(response?.message);
} else { return;
res(response); } else {
setInfoSnack({ res(response);
type: "success", setInfoSnack({
message: type: "success",
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.", message:
}); "Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
setOpenSnack(true); });
} setOpenSnack(true);
} }
); })
.catch((error) => {
console.error("Failed qortalRequest", error);
});
}); });
} else { } else {
const pollName = `app-library-${app.service}-rating-${app.name}`; const pollName = `app-library-${app.service}-rating-${app.name}`;
@ -153,30 +153,30 @@ export const AppRating = ({ app, myName, ratingCountPosition = "right" }) => {
if (isNaN(optionIndex) || optionIndex === -1) if (isNaN(optionIndex) || optionIndex === -1)
throw new Error("Cannot find rating option"); throw new Error("Cannot find rating option");
await new Promise((res, rej) => { await new Promise((res, rej) => {
chrome?.runtime?.sendMessage( window.sendMessage("VOTE_ON_POLL", {
{ payload: {
action: "VOTE_ON_POLL", pollName: pollName,
type: "qortalRequest", optionIndex,
payload: {
pollName: pollName,
optionIndex,
},
}, },
(response) => { }, 60000)
if (response.error) { .then((response) => {
rej(response?.message); if (response.error) {
return; rej(response?.message);
} else { return;
res(response); } else {
setInfoSnack({ res(response);
type: "success", setInfoSnack({
message: type: "success",
"Successfully rated. Please wait a couple minutes for the network to propogate the changes.", message:
}); "Successfully rated. Please wait a couple minutes for the network to propogate the changes.",
setOpenSnack(true); });
} setOpenSnack(true);
} }
); })
.catch((error) => {
console.error("Failed qortalRequest", error);
});
}); });
} }
} catch (error) { } catch (error) {

View File

@ -368,7 +368,8 @@ isDOMContentLoaded: false
if (event?.data?.requestedHandler !== 'UI') return; if (event?.data?.requestedHandler !== 'UI') return;
const sendMessageToRuntime = (message, eventPort) => { const sendMessageToRuntime = (message, eventPort) => {
chrome?.runtime?.sendMessage(message, (response) => { window.sendMessage(message.action, message, 60000, message.isFromExtension)
.then((response) => {
if (response.error) { if (response.error) {
eventPort.postMessage({ eventPort.postMessage({
result: null, result: null,
@ -380,7 +381,11 @@ isDOMContentLoaded: false
error: null, error: null,
}); });
} }
})
.catch((error) => {
console.error("Failed qortalRequest", error);
}); });
}; };
// Check if action is included in the predefined list of UI requests // Check if action is included in the predefined list of UI requests

View File

@ -126,7 +126,7 @@ const timeDifferenceForNotificationChats = 900000;
export const requestQueueMemberNames = new RequestQueueWithPromise(5); export const requestQueueMemberNames = new RequestQueueWithPromise(5);
export const requestQueueAdminMemberNames = new RequestQueueWithPromise(5); export const requestQueueAdminMemberNames = new RequestQueueWithPromise(5);
const audio = new Audio(chrome.runtime?.getURL("msg-not1.wav")); // const audio = new Audio(chrome.runtime?.getURL("msg-not1.wav"));
export const getGroupAdminsAddress = async (groupNumber: number) => { export const getGroupAdminsAddress = async (groupNumber: number) => {
// const validApi = await findUsableApi(); // const validApi = await findUsableApi();
@ -203,6 +203,7 @@ export const decryptResource = async (data: string) => {
data, data,
}) })
.then((response) => { .then((response) => {
console.log('decryptseroucs', response)
if (!response?.error) { if (!response?.error) {
res(response); res(response);
return; return;
@ -892,78 +893,89 @@ export const Group = ({
useEffect(() => { useEffect(() => {
// Listen for messages from the background script // Handler function for incoming messages
chrome?.runtime?.onMessage.addListener((message, sender, sendResponse) => { const messageHandler = (event) => {
if (message.action === "SET_GROUPS") { const message = event.data;
if (message?.action === "SET_GROUPS") {
// Update the component state with the received 'sendqort' state // Update the component state with the received 'sendqort' state
setGroups(message.payload); setGroups(message.payload);
getLatestRegularChat(message.payload) getLatestRegularChat(message.payload);
setMemberGroups(message.payload); setMemberGroups(message.payload);
if (selectedGroupRef.current && groupSectionRef.current === "chat") { if (selectedGroupRef.current && groupSectionRef.current === "chat") {
window.sendMessage("addTimestampEnterChat", { window.sendMessage("addTimestampEnterChat", {
timestamp: Date.now(), timestamp: Date.now(),
groupId: selectedGroupRef.current.groupId, groupId: selectedGroupRef.current.groupId,
}).catch((error) => { }).catch((error) => {
console.error("Failed to add timestamp:", error.message || "An error occurred"); console.error("Failed to add timestamp:", error.message || "An error occurred");
}); });
} }
if (selectedDirectRef.current) { if (selectedDirectRef.current) {
window.sendMessage("addTimestampEnterChat", { window.sendMessage("addTimestampEnterChat", {
timestamp: Date.now(), timestamp: Date.now(),
groupId: selectedDirectRef.current.address, groupId: selectedDirectRef.current.address,
}).catch((error) => { }).catch((error) => {
console.error("Failed to add timestamp:", error.message || "An error occurred"); console.error("Failed to add timestamp:", error.message || "An error occurred");
}); });
} }
setTimeout(() => { setTimeout(() => {
getTimestampEnterChat(); getTimestampEnterChat();
}, 200); }, 200);
} }
if (message.action === "SET_GROUP_ANNOUNCEMENTS") {
if (message?.action === "SET_GROUP_ANNOUNCEMENTS") {
// Update the component state with the received 'sendqort' state // Update the component state with the received 'sendqort' state
setGroupAnnouncements(message.payload); setGroupAnnouncements(message.payload);
if ( if (selectedGroupRef.current && groupSectionRef.current === "announcement") {
selectedGroupRef.current &&
groupSectionRef.current === "announcement"
) {
window.sendMessage("addGroupNotificationTimestamp", { window.sendMessage("addGroupNotificationTimestamp", {
timestamp: Date.now(), timestamp: Date.now(),
groupId: selectedGroupRef.current.groupId, groupId: selectedGroupRef.current.groupId,
}).catch((error) => { }).catch((error) => {
console.error("Failed to add group notification timestamp:", error.message || "An error occurred"); console.error("Failed to add group notification timestamp:", error.message || "An error occurred");
}); });
setTimeout(() => { setTimeout(() => {
getGroupAnnouncements(); getGroupAnnouncements();
}, 200); }, 200);
} }
} }
if (message.action === "SET_DIRECTS") {
if (message?.action === "SET_DIRECTS") {
// Update the component state with the received 'sendqort' state // Update the component state with the received 'sendqort' state
setDirects(message.payload); setDirects(message.payload);
} else if (message?.action === "PLAY_NOTIFICATION_SOUND") {
// audio.play();
} else if (message.action === "PLAY_NOTIFICATION_SOUND") {
audio.play();
} }
}); };
// Attach the event listener
window.addEventListener("message", messageHandler);
// Clean up the event listener on component unmount
return () => {
window.removeEventListener("message", messageHandler);
};
}, []); }, []);
useEffect(() => { useEffect(() => {
if ( if (
!myAddress || !myAddress ||
hasInitializedWebsocket.current || hasInitializedWebsocket.current ||
!window?.location?.href?.includes("?main=true") ||
!groups || !groups ||
groups?.length === 0 groups?.length === 0
) )
return; return;
chrome?.runtime?.sendMessage({ action: "setupGroupWebsocket" }); window.sendMessage("setupGroupWebsocket", {})
.catch((error) => {
console.error("Failed to setup group websocket:", error.message || "An error occurred");
});
hasInitializedWebsocket.current = true; hasInitializedWebsocket.current = true;
}, [myAddress, groups]); }, [myAddress, groups]);

View File

@ -18,7 +18,7 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => {
useEffect(() => { useEffect(() => {
if (!myAddress) return; // Only proceed if myAddress is set if (!myAddress) return; // Only proceed if myAddress is set
if (!window?.location?.href?.includes("?main=true")) return;
const pingHeads = () => { const pingHeads = () => {
try { try {

View File

@ -1,97 +1,121 @@
import React, { useContext, useEffect, useMemo, useState } from 'react' import React, { useContext, useEffect, useMemo, useState } from "react";
import { useRecoilState, useSetRecoilState } from 'recoil'; import { useRecoilState, useSetRecoilState } from "recoil";
import isEqual from 'lodash/isEqual'; // Import deep comparison utility import isEqual from "lodash/isEqual"; // Import deep comparison utility
import { canSaveSettingToQdnAtom, hasSettingsChangedAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from '../../atoms/global'; import {
import { ButtonBase } from '@mui/material'; canSaveSettingToQdnAtom,
import { objectToBase64 } from '../../qdn/encryption/group-encryption'; hasSettingsChangedAtom,
import { MyContext } from '../../App'; oldPinnedAppsAtom,
import { getFee } from '../../background'; settingsLocalLastUpdatedAtom,
import { CustomizedSnackbars } from '../Snackbar/Snackbar'; settingsQDNLastUpdatedAtom,
import { SaveIcon } from '../../assets/svgs/SaveIcon'; sortablePinnedAppsAtom,
import { IconWrapper } from '../Desktop/DesktopFooter'; } from "../../atoms/global";
export const Save = ({isDesktop}) => { import { ButtonBase } from "@mui/material";
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom); import { objectToBase64 } from "../../qdn/encryption/group-encryption";
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(settingsQDNLastUpdatedAtom); import { MyContext } from "../../App";
const [settingsLocalLastUpdated] = useRecoilState(settingsLocalLastUpdatedAtom); import { getFee } from "../../background";
const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom); import { CustomizedSnackbars } from "../Snackbar/Snackbar";
import { SaveIcon } from "../../assets/svgs/SaveIcon";
import { IconWrapper } from "../Desktop/DesktopFooter";
export const Save = ({ isDesktop }) => {
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom);
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(
settingsQDNLastUpdatedAtom
);
const [settingsLocalLastUpdated] = useRecoilState(
settingsLocalLastUpdatedAtom
);
const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom);
const [canSave] = useRecoilState(canSaveSettingToQdnAtom); const [canSave] = useRecoilState(canSaveSettingToQdnAtom);
const [openSnack, setOpenSnack] = useState(false); const [openSnack, setOpenSnack] = useState(false);
const [isLoading, setIsLoading] = useState(false) const [isLoading, setIsLoading] = useState(false);
const [infoSnack, setInfoSnack] = useState(null); const [infoSnack, setInfoSnack] = useState(null);
const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom) const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom);
const { show } = useContext(MyContext); const { show } = useContext(MyContext);
const hasChanged = useMemo(()=> { const hasChanged = useMemo(() => {
const newChanges = { const newChanges = {
sortablePinnedApps: pinnedApps.map((item)=> { sortablePinnedApps: pinnedApps.map((item) => {
return {
name: item?.name,
service: item?.service,
};
}),
};
const oldChanges = {
sortablePinnedApps: oldPinnedApps.map((item) => {
return {
name: item?.name,
service: item?.service,
};
}),
};
if (settingsQdnLastUpdated === -100) return false;
return (
!isEqual(oldChanges, newChanges) &&
settingsQdnLastUpdated < settingsLocalLastUpdated
);
}, [
oldPinnedApps,
pinnedApps,
settingsQdnLastUpdated,
settingsLocalLastUpdated,
]);
useEffect(() => {
setHasSettingsChangedAtom(hasChanged);
}, [hasChanged]);
const saveToQdn = async () => {
try {
setIsLoading(true);
const data64 = await objectToBase64({
sortablePinnedApps: pinnedApps.map((item) => {
return { return {
name: item?.name, name: item?.name,
service: item?.service service: item?.service,
} };
}) }),
} });
const oldChanges = { const encryptData = await new Promise((res, rej) => {
sortablePinnedApps: oldPinnedApps.map((item)=> { window
return { .sendMessage(
name: item?.name, "ENCRYPT_DATA",
service: item?.service
}
})
}
if(settingsQdnLastUpdated === -100) return false
return !isEqual(oldChanges, newChanges) && settingsQdnLastUpdated < settingsLocalLastUpdated
}, [oldPinnedApps, pinnedApps, settingsQdnLastUpdated, settingsLocalLastUpdated])
useEffect(()=> {
setHasSettingsChangedAtom(hasChanged)
}, [hasChanged])
const saveToQdn = async ()=> {
try {
setIsLoading(true)
const data64 = await objectToBase64({
sortablePinnedApps: pinnedApps.map((item)=> {
return {
name: item?.name,
service: item?.service
}
})
})
const encryptData = await new Promise((res, rej) => {
chrome?.runtime?.sendMessage(
{ {
action: "ENCRYPT_DATA",
type: "qortalRequest",
payload: { payload: {
data64 data64,
}, },
}, },
(response) => { 60000
if (response.error) { )
rej(response?.message); .then((response) => {
return; if (response.error) {
} else { rej(response?.message);
res(response); return;
} else {
} res(response);
} }
); })
}); .catch((error) => {
if(encryptData && !encryptData?.error){ console.error("Failed qortalRequest", error);
const fee = await getFee('ARBITRARY') });
});
if (encryptData && !encryptData?.error) {
const fee = await getFee("ARBITRARY");
await show({ await show({
message: "Would you like to publish your settings to QDN (encrypted) ?" , message:
publishFee: fee.fee + ' QORT' "Would you like to publish your settings to QDN (encrypted) ?",
}) publishFee: fee.fee + " QORT",
const response = await new Promise((res, rej) => { });
window.sendMessage("publishOnQDN", { const response = await new Promise((res, rej) => {
data: encryptData, window
identifier: "ext_saved_settings", .sendMessage("publishOnQDN", {
service: "DOCUMENT_PRIVATE", data: encryptData,
}) identifier: "ext_saved_settings",
service: "DOCUMENT_PRIVATE",
})
.then((response) => { .then((response) => {
if (!response?.error) { if (!response?.error) {
res(response); res(response);
@ -102,51 +126,67 @@ export const Save = ({isDesktop}) => {
.catch((error) => { .catch((error) => {
rej(error.message || "An error occurred"); rej(error.message || "An error occurred");
}); });
});
if(response?.identifier){
setOldPinnedApps(pinnedApps)
setSettingsQdnLastUpdated(Date.now())
setInfoSnack({
type: "success",
message:
"Sucessfully published to QDN",
});
setOpenSnack(true);
}
}
} catch (error) {
setInfoSnack({
type: "error",
message:
error?.message || "Unable to save to QDN",
}); });
setOpenSnack(true); if (response?.identifier) {
} finally { setOldPinnedApps(pinnedApps);
setIsLoading(false) setSettingsQdnLastUpdated(Date.now());
setInfoSnack({
type: "success",
message: "Sucessfully published to QDN",
});
setOpenSnack(true);
}
} }
} catch (error) {
setInfoSnack({
type: "error",
message: error?.message || "Unable to save to QDN",
});
setOpenSnack(true);
} finally {
setIsLoading(false);
} }
};
return ( return (
<> <>
<ButtonBase onClick={saveToQdn} disabled={!hasChanged || !canSave || isLoading || settingsQdnLastUpdated === -100}> <ButtonBase
{isDesktop ? ( onClick={saveToQdn}
disabled={
!hasChanged ||
!canSave ||
isLoading ||
settingsQdnLastUpdated === -100
}
>
{isDesktop ? (
<IconWrapper <IconWrapper
color="rgba(250, 250, 250, 0.5)" color="rgba(250, 250, 250, 0.5)"
label="Save" label="Save"
selected={false} selected={false}
> >
<SaveIcon <SaveIcon
color={settingsQdnLastUpdated === -100 ? '#8F8F91' : (hasChanged && !isLoading) ? '#5EB049' : '#8F8F91'} color={
/> settingsQdnLastUpdated === -100
? "#8F8F91"
: hasChanged && !isLoading
? "#5EB049"
: "#8F8F91"
}
/>
</IconWrapper> </IconWrapper>
) : ( ) : (
<SaveIcon <SaveIcon
color={settingsQdnLastUpdated === -100 ? '#8F8F91' : (hasChanged && !isLoading) ? '#5EB049' : '#8F8F91'} color={
/> settingsQdnLastUpdated === -100
)} ? "#8F8F91"
: hasChanged && !isLoading
? "#5EB049"
: "#8F8F91"
}
/>
)}
</ButtonBase> </ButtonBase>
<CustomizedSnackbars <CustomizedSnackbars
duration={3500} duration={3500}
open={openSnack} open={openSnack}
setOpen={setOpenSnack} setOpen={setOpenSnack}
@ -154,6 +194,5 @@ export const Save = ({isDesktop}) => {
setInfo={setInfoSnack} setInfo={setInfoSnack}
/> />
</> </>
);
) };
}

View File

@ -46,7 +46,7 @@ export default theme;
ReactDOM.createRoot(document.getElementById('root')!).render( ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode> <>
<ThemeProvider theme={theme}> <ThemeProvider theme={theme}>
<CssBaseline /> <CssBaseline />
<MessageQueueProvider> <MessageQueueProvider>
@ -55,5 +55,5 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
</RecoilRoot> </RecoilRoot>
</MessageQueueProvider> </MessageQueueProvider>
</ThemeProvider> </ThemeProvider>
</React.StrictMode>, </>,
) )

View File

@ -20,21 +20,17 @@ window.addEventListener("message", (event) => {
const { resolve, reject } = callbackMap.get(requestId); const { resolve, reject } = callbackMap.get(requestId);
callbackMap.delete(requestId); // Remove callback after use callbackMap.delete(requestId); // Remove callback after use
if (error) { resolve(event.data)
reject({ error, message });
} else {
resolve({ payload });
}
} }
}); });
export const sendMessageBackground = (action, data = {}, timeout = 60000) => { export const sendMessageBackground = (action, data = {}, timeout = 60000, isFromExtension) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const requestId = generateRequestId(); // Unique ID for each request const requestId = generateRequestId(); // Unique ID for each request
callbackMap.set(requestId, { resolve, reject }); // Store both resolve and reject callbacks callbackMap.set(requestId, { resolve, reject }); // Store both resolve and reject callbacks
// Send the message with `backgroundMessage` type // Send the message with `backgroundMessage` type
window.postMessage({ type: "backgroundMessage", action, requestId, payload: data }, "*"); window.postMessage({ type: "backgroundMessage", action, requestId, payload: data, isFromExtension }, "*");
// Set up a timeout to automatically reject if no response is received // Set up a timeout to automatically reject if no response is received
const timeoutId = setTimeout(() => { const timeoutId = setTimeout(() => {

View File

@ -330,6 +330,7 @@ export const decodeBase64ForUIChatMessages = (messages)=> {
export function decryptGroupData(data64EncryptedData: string, privateKey: string) { export function decryptGroupData(data64EncryptedData: string, privateKey: string) {
console.log({data64EncryptedData, privateKey})
const allCombined = base64ToUint8Array(data64EncryptedData) const allCombined = base64ToUint8Array(data64EncryptedData)
const str = "qortalGroupEncryptedData" const str = "qortalGroupEncryptedData"
const strEncoder = new TextEncoder() const strEncoder = new TextEncoder()

View File

@ -5,6 +5,7 @@ import Base58 from "../../deps/Base58"
import nacl from "../../deps/nacl-fast" import nacl from "../../deps/nacl-fast"
import utils from "../../utils/utils" import utils from "../../utils/utils"
import { createEndpoint, getBaseApi } from "../../background"; import { createEndpoint, getBaseApi } from "../../background";
import { getData } from "../../utils/chromeStorage";
export async function reusableGet(endpoint){ export async function reusableGet(endpoint){
const validApi = await getBaseApi(); const validApi = await getBaseApi();
@ -34,9 +35,9 @@ export async function reusableGet(endpoint){
} }
async function getKeyPair() { async function getKeyPair() {
const res = await chrome.storage.local.get(["keyPair"]); const res = await getData<any>("keyPair").catch(() => null);
if (res?.keyPair) { if (res) {
return res.keyPair; return res
} else { } else {
throw new Error("Wallet not authenticated"); throw new Error("Wallet not authenticated");
} }
@ -118,7 +119,7 @@ export const publishData = async ({
const resKeyPair = await getKeyPair() const resKeyPair = await getKeyPair()
const parsedData = JSON.parse(resKeyPair) const parsedData = resKeyPair
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {

428
src/qortalRequests copy.ts Normal file
View File

@ -0,0 +1,428 @@
import { addForeignServer, addListItems, createPoll, decryptData, deleteListItems, deployAt, encryptData, getCrossChainServerInfo, getDaySummary, getForeignFee, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getWalletBalance, joinGroup, publishMultipleQDNResources, publishQDNResource, removeForeignServer, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, updateForeignFee, voteOnPoll } from "./qortalRequests/get";
// Promisify chrome.storage.local.get
function getLocalStorage(key) {
return new Promise((resolve, reject) => {
chrome.storage.local.get([key], function (result) {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}
resolve(result[key]);
});
});
}
// Promisify chrome.storage.local.set
function setLocalStorage(data) {
return new Promise((resolve, reject) => {
chrome.storage.local.set(data, function () {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}
resolve();
});
});
}
export async function setPermission(key, value) {
try {
// Get the existing qortalRequestPermissions object
const qortalRequestPermissions = (await getLocalStorage('qortalRequestPermissions')) || {};
// Update the permission
qortalRequestPermissions[key] = value;
// Save the updated object back to storage
await setLocalStorage({ qortalRequestPermissions });
console.log('Permission set for', key);
} catch (error) {
console.error('Error setting permission:', error);
}
}
export async function getPermission(key) {
try {
// Get the qortalRequestPermissions object from storage
const qortalRequestPermissions = (await getLocalStorage('qortalRequestPermissions')) || {};
// Return the value for the given key, or null if it doesn't exist
return qortalRequestPermissions[key] || null;
} catch (error) {
console.error('Error getting permission:', error);
return null;
}
}
// TODO: GET_FRIENDS_LIST
// NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS
chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => {
if (request) {
const isFromExtension = request?.isExtension
switch (request.action) {
case "GET_USER_ACCOUNT": {
getUserAccount()
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: "Unable to get user account" });
});
break;
}
case "ENCRYPT_DATA": {
const data = request.payload;
encryptData(data, sender)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DECRYPT_DATA": {
const data = request.payload;
decryptData(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_LIST_ITEMS": {
const data = request.payload;
getListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "ADD_LIST_ITEMS": {
const data = request.payload;
addListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DELETE_LIST_ITEM": {
const data = request.payload;
deleteListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "PUBLISH_QDN_RESOURCE": {
const data = request.payload;
publishQDNResource(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
const data = request.payload;
publishMultipleQDNResources(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "VOTE_ON_POLL": {
const data = request.payload;
voteOnPoll(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "CREATE_POLL": {
const data = request.payload;
createPoll(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SEND_CHAT_MESSAGE": {
const data = request.payload;
sendChatMessage(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "JOIN_GROUP": {
const data = request.payload;
joinGroup(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SAVE_FILE": {
const data = request.payload;
saveFile(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DEPLOY_AT": {
const data = request.payload;
deployAt(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_USER_WALLET": {
const data = request.payload;
getUserWallet(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_WALLET_BALANCE": {
const data = request.payload;
getWalletBalance(data, false, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_USER_WALLET_INFO": {
const data = request.payload;
getUserWalletInfo(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_CROSSCHAIN_SERVER_INFO": {
const data = request.payload;
getCrossChainServerInfo(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_TX_ACTIVITY_SUMMARY": {
const data = request.payload;
getTxActivitySummary(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_FOREIGN_FEE": {
const data = request.payload;
getForeignFee(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "UPDATE_FOREIGN_FEE": {
const data = request.payload;
updateForeignFee(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_SERVER_CONNECTION_HISTORY": {
const data = request.payload;
getServerConnectionHistory(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SET_CURRENT_FOREIGN_SERVER": {
const data = request.payload;
setCurrentForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "ADD_FOREIGN_SERVER": {
const data = request.payload;
addForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "REMOVE_FOREIGN_SERVER": {
const data = request.payload;
removeForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_DAY_SUMMARY": {
const data = request.payload;
getDaySummary(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SEND_COIN": {
const data = request.payload;
sendCoin(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
}
}
return true;
});

View File

@ -1,30 +1,22 @@
import { addForeignServer, addListItems, createPoll, decryptData, deleteListItems, deployAt, encryptData, getCrossChainServerInfo, getDaySummary, getForeignFee, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getWalletBalance, joinGroup, publishMultipleQDNResources, publishQDNResource, removeForeignServer, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, updateForeignFee, voteOnPoll } from "./qortalRequests/get"; import { addForeignServer, addListItems, createPoll, decryptData, deleteListItems, deployAt, encryptData, getCrossChainServerInfo, getDaySummary, getForeignFee, getListItems, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getWalletBalance, joinGroup, publishMultipleQDNResources, publishQDNResource, removeForeignServer, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, updateForeignFee, voteOnPoll } from "./qortalRequests/get";
import { storeData } from "./utils/chromeStorage";
// Promisify chrome.storage.local.get
function getLocalStorage(key) { function getLocalStorage(key) {
return new Promise((resolve, reject) => { return getData(key).catch((error) => {
chrome.storage.local.get([key], function (result) { console.error("Error retrieving data:", error);
if (chrome.runtime.lastError) { throw error;
return reject(chrome.runtime.lastError); });
} }
resolve(result[key]);
}); // Promisify setting data in localStorage
}); function setLocalStorage(key, data) {
} return storeData(key, data).catch((error) => {
console.error("Error saving data:", error);
// Promisify chrome.storage.local.set throw error;
function setLocalStorage(data) { });
return new Promise((resolve, reject) => { }
chrome.storage.local.set(data, function () {
if (chrome.runtime.lastError) {
return reject(chrome.runtime.lastError);
}
resolve();
});
});
}
export async function setPermission(key, value) { export async function setPermission(key, value) {
@ -60,369 +52,565 @@ function getLocalStorage(key) {
// TODO: GET_FRIENDS_LIST // TODO: GET_FRIENDS_LIST
// NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS // NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS
function setupMessageListener() {
window.addEventListener("message", async (event) => {
const request = event.data;
// Ensure the message is from a trusted source
const isFromExtension = request?.isExtension;
if (request?.type !== "backgroundMessage") return; // Only process messages of type 'backgroundMessage'
chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => { console.log("REQUEST MESSAGE QORTALREQUEST", request);
if (request) {
const isFromExtension = request?.isExtension // Handle actions based on the `request.action` value
switch (request.action) { switch (request.action) {
case "GET_USER_ACCOUNT": { case "GET_USER_ACCOUNT": {
getUserAccount() try {
.then((res) => { const res = await getUserAccount();
sendResponse(res); event.source.postMessage({
}) requestId: request.requestId,
.catch((error) => { action: request.action,
sendResponse({ error: "Unable to get user account" }); payload: res,
}); type: "backgroundMessageResponse",
}, event.origin);
break; } catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: "Unable to get user account",
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "ENCRYPT_DATA": {
try {
const res = await encryptData(request.payload, event.source);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "DECRYPT_DATA": {
try {
const res = await decryptData(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_LIST_ITEMS": {
try {
const res = await getListItems(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "ADD_LIST_ITEMS": {
try {
const res = await addListItems(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "DELETE_LIST_ITEM": {
try {
const res = await deleteListItems(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "PUBLISH_QDN_RESOURCE": {
try {
const res = await publishQDNResource(request.payload, event.source, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
try {
const res = await publishMultipleQDNResources(request.payload, event.source, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "VOTE_ON_POLL": {
try {
const res = await voteOnPoll(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "CREATE_POLL": {
try {
const res = await createPoll(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "SEND_CHAT_MESSAGE": {
try {
const res = await sendChatMessage(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "JOIN_GROUP": {
try {
const res = await joinGroup(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "SAVE_FILE": {
try {
const res = await saveFile(request.payload, event.source, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "DEPLOY_AT": {
try {
const res = await deployAt(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_USER_WALLET": {
try {
const res = await getUserWallet(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_WALLET_BALANCE": {
try {
const res = await getWalletBalance(request.payload, false, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_USER_WALLET_INFO": {
try {
const res = await getUserWalletInfo(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_CROSSCHAIN_SERVER_INFO": {
try {
const res = await getCrossChainServerInfo(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_TX_ACTIVITY_SUMMARY": {
try {
const res = await getTxActivitySummary(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_FOREIGN_FEE": {
try {
const res = await getForeignFee(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "UPDATE_FOREIGN_FEE": {
try {
const res = await updateForeignFee(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_SERVER_CONNECTION_HISTORY": {
try {
const res = await getServerConnectionHistory(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "SET_CURRENT_FOREIGN_SERVER": {
try {
const res = await setCurrentForeignServer(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "ADD_FOREIGN_SERVER": {
try {
const res = await addForeignServer(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "REMOVE_FOREIGN_SERVER": {
try {
const res = await removeForeignServer(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "GET_DAY_SUMMARY": {
try {
const res = await getDaySummary(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
case "SEND_COIN": {
try {
const res = await sendCoin(request.payload, isFromExtension);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
default:
break;
} }
case "ENCRYPT_DATA": { });
const data = request.payload;
encryptData(data, sender)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DECRYPT_DATA": {
const data = request.payload;
decryptData(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_LIST_ITEMS": {
const data = request.payload;
getListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "ADD_LIST_ITEMS": {
const data = request.payload;
addListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DELETE_LIST_ITEM": {
const data = request.payload;
deleteListItems(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "PUBLISH_QDN_RESOURCE": {
const data = request.payload;
publishQDNResource(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "PUBLISH_MULTIPLE_QDN_RESOURCES": {
const data = request.payload;
publishMultipleQDNResources(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "VOTE_ON_POLL": {
const data = request.payload;
voteOnPoll(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "CREATE_POLL": {
const data = request.payload;
createPoll(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SEND_CHAT_MESSAGE": {
const data = request.payload;
sendChatMessage(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "JOIN_GROUP": {
const data = request.payload;
joinGroup(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SAVE_FILE": {
const data = request.payload;
saveFile(data, sender, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "DEPLOY_AT": {
const data = request.payload;
deployAt(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_USER_WALLET": {
const data = request.payload;
getUserWallet(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_WALLET_BALANCE": {
const data = request.payload;
getWalletBalance(data, false, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_USER_WALLET_INFO": {
const data = request.payload;
getUserWalletInfo(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_CROSSCHAIN_SERVER_INFO": {
const data = request.payload;
getCrossChainServerInfo(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_TX_ACTIVITY_SUMMARY": {
const data = request.payload;
getTxActivitySummary(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_FOREIGN_FEE": {
const data = request.payload;
getForeignFee(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "UPDATE_FOREIGN_FEE": {
const data = request.payload;
updateForeignFee(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_SERVER_CONNECTION_HISTORY": {
const data = request.payload;
getServerConnectionHistory(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SET_CURRENT_FOREIGN_SERVER": {
const data = request.payload;
setCurrentForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "ADD_FOREIGN_SERVER": {
const data = request.payload;
addForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "REMOVE_FOREIGN_SERVER": {
const data = request.payload;
removeForeignServer(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "GET_DAY_SUMMARY": {
const data = request.payload;
getDaySummary(data)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
case "SEND_COIN": {
const data = request.payload;
sendCoin(data, isFromExtension)
.then((res) => {
sendResponse(res);
})
.catch((error) => {
sendResponse({ error: error.message });
});
break;
}
}
} }
return true;
}); // Initialize the message listener
setupMessageListener();

View File

@ -54,7 +54,7 @@ const _createPoll = async ({pollName, pollDescription, options}, isFromExtension
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {
@ -106,7 +106,7 @@ const _deployAt = async (
const address = wallet.address0; const address = wallet.address0;
const lastReference = await getLastRef(); const lastReference = await getLastRef();
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {
@ -154,7 +154,7 @@ const _voteOnPoll = async ({pollName, optionIndex, optionName}, isFromExtension)
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {
@ -373,7 +373,7 @@ export const encryptData = async (data, sender) => {
} }
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const privateKey = parsedData.privateKey; const privateKey = parsedData.privateKey;
const userPublicKey = parsedData.publicKey; const userPublicKey = parsedData.publicKey;
@ -396,7 +396,7 @@ export const decryptData = async (data) => {
throw new Error(`Missing fields: encryptedData`); throw new Error(`Missing fields: encryptedData`);
} }
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8Array = base64ToUint8Array(encryptedData); const uint8Array = base64ToUint8Array(encryptedData);
const startsWithQortalEncryptedData = uint8ArrayStartsWith( const startsWithQortalEncryptedData = uint8ArrayStartsWith(
@ -638,7 +638,7 @@ export const publishQDNResource = async (data: any, sender, isFromExtension) =>
if (data.encrypt) { if (data.encrypt) {
try { try {
const resKeyPair = await getKeyPair() const resKeyPair = await getKeyPair()
const parsedData = JSON.parse(resKeyPair) const parsedData = resKeyPair
const privateKey = parsedData.privateKey const privateKey = parsedData.privateKey
const userPublicKey = parsedData.publicKey const userPublicKey = parsedData.publicKey
const encryptDataResponse = encryptDataGroup({ const encryptDataResponse = encryptDataGroup({
@ -858,7 +858,7 @@ export const publishMultipleQDNResources = async (data: any, sender, isFromExten
if (data.encrypt) { if (data.encrypt) {
try { try {
const resKeyPair = await getKeyPair() const resKeyPair = await getKeyPair()
const parsedData = JSON.parse(resKeyPair) const parsedData = resKeyPair
const privateKey = parsedData.privateKey const privateKey = parsedData.privateKey
const userPublicKey = parsedData.publicKey const userPublicKey = parsedData.publicKey
const encryptDataResponse = encryptDataGroup({ const encryptDataResponse = encryptDataGroup({
@ -1088,7 +1088,7 @@ export const sendChatMessage = async (data, isFromExtension) => {
let reference = Base58.encode(_reference); let reference = Base58.encode(_reference);
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {
@ -1127,7 +1127,7 @@ export const sendChatMessage = async (data, isFromExtension) => {
let reference = Base58.encode(_reference); let reference = Base58.encode(_reference);
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey); const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey); const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = { const keyPair = {
@ -1355,7 +1355,7 @@ export const getUserWallet = async (data, isFromExtension) => {
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const arrrSeed58 = parsedData.arrrSeed58; const arrrSeed58 = parsedData.arrrSeed58;
if (coin === "ARRR") { if (coin === "ARRR") {
const bodyToString = arrrSeed58; const bodyToString = arrrSeed58;
@ -1448,7 +1448,7 @@ export const getWalletBalance = async (data, bypassPermission?: boolean, isFromE
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
if (coin === "QORT") { if (coin === "QORT") {
let qortAddress = address; let qortAddress = address;
try { try {
@ -1535,7 +1535,7 @@ const getUserWalletFunc = async (coin) => {
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
switch (coin) { switch (coin) {
case "QORT": case "QORT":
userWallet["address"] = address; userWallet["address"] = address;
@ -2068,7 +2068,7 @@ export const sendCoin = async (data, isFromExtension) => {
const wallet = await getSaveWallet(); const wallet = await getSaveWallet();
const address = wallet.address0; const address = wallet.address0;
const resKeyPair = await getKeyPair(); const resKeyPair = await getKeyPair();
const parsedData = JSON.parse(resKeyPair); const parsedData = resKeyPair;
const localNodeAvailable = await isUsingLocal() const localNodeAvailable = await isUsingLocal()
if(checkCoin !== 'QORT' && !localNodeAvailable) throw new Error('Cannot send a non-QORT coin through the gateway. Please use your local node.') if(checkCoin !== 'QORT' && !localNodeAvailable) throw new Error('Cannot send a non-QORT coin through the gateway. Please use your local node.')
if (checkCoin === "QORT") { if (checkCoin === "QORT") {

View File

@ -1,28 +1,54 @@
export const storeWalletInfo = (payload: any)=> {
return new Promise((resolve, reject) => {
chrome.storage.local.set({walletInfo: payload}, () => {
if (chrome.runtime.lastError) {
reject(new Error('Error saving data'));
} else {
resolve('Data saved successfully');
}
});
});
}
export const getWalletInfo = (): Promise<any> => { export const storeData = (key: string, payload: any): Promise<string> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
chrome.storage.local.get(['walletInfo'], (result) => { try {
if (chrome.runtime.lastError) { localStorage.setItem(key, JSON.stringify(payload));
reject(new Error('Error retrieving data')); resolve("Data saved successfully");
} else if (result.walletInfo) { } catch (error) {
resolve(result.walletInfo as any); reject(new Error("Error saving data"));
} else { }
reject(new Error('No wallet info found'));
}
});
}); });
}; };
export const getData = <T = any>(key: string): Promise<T> => {
return new Promise((resolve, reject) => {
try {
const data = localStorage.getItem(key);
if (data) {
resolve(JSON.parse(data) as T);
} else {
reject(new Error(`No data found for key: ${key}`));
}
} catch (error) {
reject(new Error("Error retrieving data"));
}
});
};
export async function removeKeysAndLogout(
keys: string[],
event: MessageEvent,
request: any
) {
try {
// Remove each key from localStorage
keys.forEach((key) => localStorage.removeItem(key));
// Send a response back to indicate successful logout
event.source.postMessage(
{
requestId: request.requestId,
action: "logout",
payload: true,
type: "backgroundMessageResponse",
},
event.origin
);
} catch (error) {
console.error("Error removing keys:", error);
}
}