rebrand(lethean): update branding, ports, and config for Lethean blockchain

- Coin: Zano → Lethean, ticker: ZAN/ZANO → LTHN
- Ports: 11211 → 36941 (mainnet RPC), 46941 (testnet RPC)
- Wallet: 11212 → 36944/46944
- Address prefix: iTHN
- URLs: zano.org → lethean.io
- Explorer links: explorer.lthn.io

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude 2026-04-01 22:24:13 +01:00
parent 5b5e5209ca
commit b0106a4837
No known key found for this signature in database
GPG key ID: AF404715446AEB41
37 changed files with 194 additions and 223 deletions

View file

@ -1,5 +1,5 @@
{ {
"cSpell.words": [ "cSpell.words": [
"zano" "lethean"
] ]
} }

24
Dockerfile Normal file
View file

@ -0,0 +1,24 @@
# Build-only: produces the Chrome extension bundle via webpack
# The local dep lethean_web3 (file:../zano_web3) must be pre-built
FROM node:22-alpine AS builder
WORKDIR /workspace
# Build the lethean_web3 dependency first
COPY zano_web3/package.json zano_web3/package-lock.json ./zano_web3/
RUN cd zano_web3 && npm ci
COPY zano_web3/ ./zano_web3/
RUN cd zano_web3 && npm run build
# Now build the extension
COPY zano-extension/package.json zano-extension/package-lock.json ./zano-extension/
RUN cd zano-extension && npm ci
COPY zano-extension/ ./zano-extension/
RUN cd zano-extension && npm run build
# Export stage: only the built extension artefact
FROM scratch AS export
COPY --from=builder /workspace/zano-extension/build /build

View file

@ -1,25 +1,25 @@
# Zano Companion # Lethean Companion
Zano Companion is a browser extension that enhances your experience with Zano-based dApps by providing seamless wallet integration, transaction signing, and more. Lethean Companion is a browser extension that enhances your experience with Lethean-based dApps by providing seamless wallet integration, transaction signing, and more.
## Features ## Features
- Connect your Zano wallet to web applications securely. - Connect your Lethean wallet to web applications securely.
- Sign transactions and messages directly from the extension. - Sign transactions and messages directly from the extension.
- Easily access your balance and transaction history. - Easily access your balance and transaction history.
- Compatible with dApps in the Zano ecosystem. - Compatible with dApps in the Lethean ecosystem.
## Installation ## Installation
### Chrome Web Store ### Chrome Web Store
Install Zano Companion from the [Chrome Web Store](https://chromewebstore.google.com/detail/zano-companion/akcgnllhhhkcpmlenfpicmcpgfpindlb) Install Lethean Companion from the Chrome Web Store.
### Manual Installation ### Manual Installation
If you prefer to install manually: If you prefer to install manually:
- Download the latest release from [GitHub Releases](https://github.com/hyle-team/zano-extension/releases). - Download the latest release from [GitHub Releases](https://github.com/lethean-io/lethean-extension/releases).
- Extract the archive. - Extract the archive.
- Open Chrome and navigate to chrome://extensions/. - Open Chrome and navigate to chrome://extensions/.
- Enable Developer mode (top-right corner). - Enable Developer mode (top-right corner).
@ -27,7 +27,7 @@ If you prefer to install manually:
## Usage ## Usage
Open the extension and connect your Zano wallet. Open the extension and connect your Lethean wallet.
Approve connection requests from supported dApps. Approve connection requests from supported dApps.
Sign transactions securely. Sign transactions securely.

155
package-lock.json generated
View file

@ -1,11 +1,11 @@
{ {
"name": "zano-extension", "name": "lethean-extension",
"version": "0.1.0", "version": "0.1.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "zano-extension", "name": "lethean-extension",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",
@ -18,14 +18,14 @@
"decimal.js": "^10.4.3", "decimal.js": "^10.4.3",
"dompurify": "^3.3.1", "dompurify": "^3.3.1",
"json-bigint": "^1.0.0", "json-bigint": "^1.0.0",
"lethean_web3": "file:../zano_web3",
"node-forge": "^1.3.2", "node-forge": "^1.3.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-chrome-extension-router": "^1.4.0", "react-chrome-extension-router": "^1.4.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-id-generator": "^3.0.2", "react-id-generator": "^3.0.2",
"sha256": "^0.2.0", "sha256": "^0.2.0",
"web-vitals": "^2.1.4", "web-vitals": "^2.1.4"
"zano_web3": "^9.2.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.21.0", "@babel/cli": "^7.21.0",
@ -66,6 +66,25 @@
"webpack-merge": "^5.8.0" "webpack-merge": "^5.8.0"
} }
}, },
"../zano_web3": {
"name": "lethean_web3",
"version": "9.2.2",
"license": "ISC",
"dependencies": {
"@types/big.js": "^6.2.2",
"@types/node": "^20.14.12",
"@types/node-forge": "^1.3.11",
"@types/react": "^18.3.3",
"@types/uuid": "^10.0.0",
"axios": "^1.7.2",
"big.js": "^6.2.1",
"decimal.js": "^10.4.3",
"node-forge": "^1.3.1",
"react": "^18.3.1",
"typescript": "^5.5.4",
"uuid": "^10.0.0"
}
},
"node_modules/@adobe/css-tools": { "node_modules/@adobe/css-tools": {
"version": "4.4.4", "version": "4.4.4",
"resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
@ -4125,6 +4144,7 @@
"version": "6.2.2", "version": "6.2.2",
"resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz",
"integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/body-parser": { "node_modules/@types/body-parser": {
@ -4393,6 +4413,7 @@
"version": "1.3.11", "version": "1.3.11",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
"integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
@ -4530,12 +4551,6 @@
"devOptional": true, "devOptional": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/uuid": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
"license": "MIT"
},
"node_modules/@types/ws": { "node_modules/@types/ws": {
"version": "8.18.1", "version": "8.18.1",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
@ -5499,7 +5514,8 @@
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
}, },
"node_modules/at-least-node": { "node_modules/at-least-node": {
"version": "1.0.0", "version": "1.0.0",
@ -5568,33 +5584,6 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/axios": {
"version": "1.13.5",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
"integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.11",
"form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/axios/node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/axobject-query": { "node_modules/axobject-query": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
@ -6315,6 +6304,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"es-errors": "^1.3.0", "es-errors": "^1.3.0",
@ -6812,6 +6802,7 @@
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"dependencies": { "dependencies": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
}, },
@ -7902,6 +7893,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.4.0" "node": ">=0.4.0"
} }
@ -8173,6 +8165,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"call-bind-apply-helpers": "^1.0.1", "call-bind-apply-helpers": "^1.0.1",
@ -8402,6 +8395,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@ -8411,6 +8405,7 @@
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@ -8446,6 +8441,7 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"es-errors": "^1.3.0" "es-errors": "^1.3.0"
@ -8458,6 +8454,7 @@
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"es-errors": "^1.3.0", "es-errors": "^1.3.0",
@ -9747,6 +9744,7 @@
"version": "1.15.11", "version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "individual", "type": "individual",
@ -9975,6 +9973,7 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
@ -10045,6 +10044,7 @@
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"call-bind-apply-helpers": "^1.0.2", "call-bind-apply-helpers": "^1.0.2",
@ -10084,6 +10084,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"dunder-proto": "^1.0.1", "dunder-proto": "^1.0.1",
@ -10250,6 +10251,7 @@
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@ -10358,6 +10360,7 @@
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@ -10370,6 +10373,7 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"has-symbols": "^1.0.3" "has-symbols": "^1.0.3"
@ -10385,6 +10389,7 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"function-bind": "^1.1.2" "function-bind": "^1.1.2"
@ -13780,6 +13785,10 @@
"shell-quote": "^1.7.3" "shell-quote": "^1.7.3"
} }
}, },
"node_modules/lethean_web3": {
"resolved": "../zano_web3",
"link": true
},
"node_modules/leven": { "node_modules/leven": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@ -14324,6 +14333,7 @@
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@ -14422,6 +14432,7 @@
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
@ -14430,6 +14441,7 @@
"version": "2.1.35", "version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"dependencies": { "dependencies": {
"mime-db": "1.52.0" "mime-db": "1.52.0"
}, },
@ -16881,12 +16893,6 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/psl": { "node_modules/psl": {
"version": "1.9.0", "version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@ -21039,67 +21045,6 @@
"funding": { "funding": {
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
},
"node_modules/zano_web3": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/zano_web3/-/zano_web3-9.2.2.tgz",
"integrity": "sha512-WDTgMEZ8p5fpR/TJjq/J7c8bfo7Gn5mD0pQHmvR8PCsVpwzdgHNa0PGvuzw9j1WjA6IiMnCk5MMhK6JPHfvHgA==",
"license": "ISC",
"dependencies": {
"@types/big.js": "^6.2.2",
"@types/node": "^20.14.12",
"@types/node-forge": "^1.3.11",
"@types/react": "^18.3.3",
"@types/uuid": "^10.0.0",
"axios": "^1.7.2",
"big.js": "^6.2.1",
"decimal.js": "^10.4.3",
"node-forge": "^1.3.1",
"react": "^18.3.1",
"typescript": "^5.5.4",
"uuid": "^10.0.0"
}
},
"node_modules/zano_web3/node_modules/@types/node": {
"version": "20.19.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
"integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/zano_web3/node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/zano_web3/node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"license": "MIT"
},
"node_modules/zano_web3/node_modules/uuid": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
} }
} }
} }

View file

@ -1,5 +1,5 @@
{ {
"name": "zano-extension", "name": "lethean-extension",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
@ -20,7 +20,7 @@
"react-id-generator": "^3.0.2", "react-id-generator": "^3.0.2",
"sha256": "^0.2.0", "sha256": "^0.2.0",
"web-vitals": "^2.1.4", "web-vitals": "^2.1.4",
"zano_web3": "^9.2.2" "lethean_web3": "file:../zano_web3"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -4,10 +4,10 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta name="description" content="Zano browser walslet extension" /> <meta name="description" content="Lethean browser wallet extension" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>Zano extension</title> <title>Lethean extension</title>
</head> </head>
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>

View file

@ -1,18 +1,18 @@
{ {
"manifest_version": 3, "manifest_version": 3,
"name": "Zano Companion", "name": "Lethean Companion",
"version": "1.1.10", "version": "1.1.10",
"description": "A browser extension for Zano wallet app", "description": "A browser extension for Lethean wallet app",
"permissions": ["storage", "network"], "permissions": ["storage", "network"],
"content_security_policy": { "content_security_policy": {
"extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' http://localhost:* https://api.coingecko.com https://api.zano.org https://explorer.zano.org;" "extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' http://localhost:* https://api.coingecko.com https://explorer.lthn.io https://trade.lthn.io;"
}, },
"action": { "action": {
"default_popup": "index.html", "default_popup": "index.html",
"default_icon": { "default_icon": {
"16": "images/zano_16px.png", "16": "images/lethean_16px.png",
"48": "images/zano_48px.png", "48": "images/lethean_48px.png",
"128": "images/zano_128px.png" "128": "images/lethean_128px.png"
} }
}, },
"background": { "background": {
@ -20,19 +20,19 @@
}, },
"content_scripts": [ "content_scripts": [
{ {
"matches": ["<all_urls>"], "matches": ["https://trade.lthn.io/*", "https://explorer.lthn.io/*", "https://*.lethean.io/*", "http://localhost:*/*"],
"js": ["static/js/content.bundle.js"] "js": ["static/js/content.bundle.js"]
}, },
{ {
"world": "MAIN", "world": "MAIN",
"js": ["static/js/inject.bundle.js"], "js": ["static/js/inject.bundle.js"],
"matches": ["<all_urls>"], "matches": ["https://trade.lthn.io/*", "https://explorer.lthn.io/*", "https://*.lethean.io/*", "http://localhost:*/*"],
"run_at": "document_start" "run_at": "document_start"
} }
], ],
"icons": { "icons": {
"16": "images/zano_16px.png", "16": "images/lethean_16px.png",
"48": "images/zano_48px.png", "48": "images/lethean_48px.png",
"128": "images/zano_128px.png" "128": "images/lethean_128px.png"
} }
} }

View file

@ -30,7 +30,7 @@ import {
setWhiteList, setWhiteList,
} from './store/actions'; } from './store/actions';
import { Store } from './store/store-reducer'; import { Store } from './store/store-reducer';
import { getZanoPrice } from './api/coingecko'; import { getLetheanPrice } from './api/coingecko';
import './styles/App.scss'; import './styles/App.scss';
import PasswordPage from './components/PasswordPage/PasswordPage'; import PasswordPage from './components/PasswordPage/PasswordPage';
import MessageSignPage from './components/MessageSignPage/MessageSignPage'; import MessageSignPage from './components/MessageSignPage/MessageSignPage';
@ -188,7 +188,7 @@ function App() {
}, []); }, []);
useEffect(() => { useEffect(() => {
getZanoPrice().then((priceData) => { getLetheanPrice().then((priceData) => {
console.log('price data', priceData); console.log('price data', priceData);
updatePriceData(dispatch as dispatchType, priceData); updatePriceData(dispatch as dispatchType, priceData);
}); });

View file

@ -1,5 +1,5 @@
export const getZanoPrice = async () => { export const getLetheanPrice = async () => {
const coinId = 'zano'; const coinId = 'lethean';
const vsCurrency = 'usd'; const vsCurrency = 'usd';
// Fetch current price // Fetch current price
@ -16,7 +16,7 @@ export const getZanoPrice = async () => {
const coinData = await coinResponse.json(); const coinData = await coinResponse.json();
const priceChange24h = coinData.market_data.price_change_percentage_24h; const priceChange24h = coinData.market_data.price_change_percentage_24h;
console.log(`Current price of Zano: $${currentPrice}`); console.log(`Current price of Lethean: $${currentPrice}`);
console.log(`24-hour price change: ${priceChange24h.toFixed(2)}%`); console.log(`24-hour price change: ${priceChange24h.toFixed(2)}%`);
return { price: currentPrice, change: priceChange24h.toFixed(2) }; return { price: currentPrice, change: priceChange24h.toFixed(2) };

View file

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -71,7 +71,7 @@ export default function AliasCreatePage() {
</h5> </h5>
<p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}> <p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}>
{fee} ZANO {fee} LTHN
</p> </p>
</div> </div>

View file

@ -96,7 +96,7 @@ const AliasManagePage = ({ mode = 'create' }) => {
</h5> </h5>
<p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}> <p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}>
{fee} ZANO {fee} LTHN
</p> </p>
</div> </div>

View file

@ -89,7 +89,7 @@ const AliasTransfer = () => {
</h5> </h5>
<p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}> <p className={`${styles.fee__value} ${notEnoughFee ? styles.error : ''}`}>
{fee} ZANO {fee} LTHN
</p> </p>
</div> </div>

View file

@ -19,7 +19,7 @@ const AppPlug: React.FC<AppPlugProps> = (props) => {
const btnClasses = state.isLoading ? [s.plugButton, s.hidden].join(' ') : s.plugButton; const btnClasses = state.isLoading ? [s.plugButton, s.hidden].join(' ') : s.plugButton;
const openDocs = () => { const openDocs = () => {
window.open('https://docs.zano.org/docs/use/companion', '_blank'); window.open('https://docs.lethean.io/docs/use/companion', '_blank');
}; };
return ( return (
@ -28,7 +28,7 @@ const AppPlug: React.FC<AppPlugProps> = (props) => {
<div className={s.plug}> <div className={s.plug}>
<div className={`${s.plugBody} container`}> <div className={`${s.plugBody} container`}>
<div className={s.plugLogo}> <div className={s.plugLogo}>
<img src={logo} alt="zano logo" /> <img src={logo} alt="lethean logo" />
</div> </div>
<div className={s.plugContent}> <div className={s.plugContent}>

View file

@ -100,7 +100,7 @@ export default function ConnectPage({
return ( return (
<div className={s.connect}> <div className={s.connect}>
<img className={s.logoImage} src={logo} alt="Zano" /> <img className={s.logoImage} src={logo} alt="Lethean" />
<div className={s.connectCodeContent}> <div className={s.connectCodeContent}>
<div className={s.input}> <div className={s.input}>
<MyInput <MyInput

View file

@ -74,7 +74,7 @@ const Header = () => {
)} )}
</div> </div>
<div className={s.dropdownBalance}> <div className={s.dropdownBalance}>
{censorValue(Number(wallet.balance).toFixed(2))} ZANO {censorValue(Number(wallet.balance).toFixed(2))} LTHN
</div> </div>
</button> </button>
))} ))}

View file

@ -7,7 +7,7 @@ import { fetchBackground, shortenAddress } from '../../utils/utils';
import arrowIcon from '../../assets/svg/arrow-blue.svg'; import arrowIcon from '../../assets/svg/arrow-blue.svg';
import InfoTooltip from '../UI/InfoTooltip'; import InfoTooltip from '../UI/InfoTooltip';
import { BurnAssetDataType } from '../../../types'; import { BurnAssetDataType } from '../../../types';
import { ZANO_ASSET_ID } from '../../../constants'; import { LTHN_ASSET_ID } from '../../../constants';
import { Store } from '../../store/store-reducer'; import { Store } from '../../store/store-reducer';
import WhitelistIconImage from '../UI/WhitelistIconImage'; import WhitelistIconImage from '../UI/WhitelistIconImage';
@ -93,7 +93,7 @@ const OuterConfirmation = () => {
const fee = 0.01; const fee = 0.01;
const balance = new Decimal(state.wallet?.balance || 0); const balance = new Decimal(state.wallet?.balance || 0);
const locked = new Decimal(state.wallet?.lockedBalance || 0); const locked = new Decimal(state.wallet?.lockedBalance || 0);
const zanoBalance = balance.minus(locked); const letheanBalance = balance.minus(locked);
const rawTotalAmount = isMultipleDestinations const rawTotalAmount = isMultipleDestinations
? destinations.reduce( ? destinations.reduce(
(sum: Decimal, dest: { amount: string }) => sum.plus(new Decimal(dest.amount || 0)), (sum: Decimal, dest: { amount: string }) => sum.plus(new Decimal(dest.amount || 0)),
@ -102,35 +102,35 @@ const OuterConfirmation = () => {
: new Decimal(transactionParams.Amount || 0); : new Decimal(transactionParams.Amount || 0);
const assetBalance = const assetBalance =
assetId === ZANO_ASSET_ID assetId === LTHN_ASSET_ID
? zanoBalance ? letheanBalance
: new Decimal(state.wallet?.assets?.find((a) => a.assetId === assetId)?.balance || 0); : new Decimal(state.wallet?.assets?.find((a) => a.assetId === assetId)?.balance || 0);
const feeBig = new Decimal(fee); const feeBig = new Decimal(fee);
const swapAmount = new Decimal(sendingAmount || 0); const swapAmount = new Decimal(sendingAmount || 0);
const notEnoughFee = useMemo(() => { const notEnoughFee = useMemo(() => {
return zanoBalance.lessThan(feeBig); return letheanBalance.lessThan(feeBig);
}, [zanoBalance, feeBig]); }, [letheanBalance, feeBig]);
const notEnoughAmount = useMemo(() => { const notEnoughAmount = useMemo(() => {
if (!isTransferMethod) return false; if (!isTransferMethod) return false;
if (assetId === ZANO_ASSET_ID) { if (assetId === LTHN_ASSET_ID) {
return zanoBalance.lessThan(rawTotalAmount.plus(feeBig)); return letheanBalance.lessThan(rawTotalAmount.plus(feeBig));
} }
return assetBalance.lessThan(rawTotalAmount); return assetBalance.lessThan(rawTotalAmount);
}, [isTransferMethod, assetId, zanoBalance, assetBalance, rawTotalAmount, feeBig]); }, [isTransferMethod, assetId, letheanBalance, assetBalance, rawTotalAmount, feeBig]);
const notEnoughSwapAmount = useMemo(() => { const notEnoughSwapAmount = useMemo(() => {
if (!isIonicSwapMethod) return false; if (!isIonicSwapMethod) return false;
if (assetId === ZANO_ASSET_ID) { if (assetId === LTHN_ASSET_ID) {
return zanoBalance.lessThan(swapAmount.plus(feeBig)); return letheanBalance.lessThan(swapAmount.plus(feeBig));
} }
return assetBalance.lessThan(swapAmount); return assetBalance.lessThan(swapAmount);
}, [isIonicSwapMethod, assetId, assetBalance, swapAmount, zanoBalance, feeBig]); }, [isIonicSwapMethod, assetId, assetBalance, swapAmount, letheanBalance, feeBig]);
const disabled = accepting || denying; const disabled = accepting || denying;
const insufficientBalance = const insufficientBalance =
@ -379,7 +379,7 @@ const OuterConfirmation = () => {
Transaction fee <InfoTooltip title="Total network fee" /> Transaction fee <InfoTooltip title="Total network fee" />
</h5> </h5>
<p className={`${styles.value} ${notEnoughFee ? styles.error : ''}`}> <p className={`${styles.value} ${notEnoughFee ? styles.error : ''}`}>
{fee} ZANO {fee} LTHN
</p> </p>
</div> </div>

View file

@ -26,7 +26,7 @@ function PasswordPage(props: PasswordPageProps) {
return ( return (
<div className={s.passwordPage}> <div className={s.passwordPage}>
<img className={s.logoImage} src={logo} alt="Zano" /> <img className={s.logoImage} src={logo} alt="Lethean" />
<p>Enter your password</p> <p>Enter your password</p>
<div className={s.inputPanel}> <div className={s.inputPanel}>
<MyInput <MyInput

View file

@ -4,7 +4,7 @@ import WhitelistIconImage from '../../UI/WhitelistIconImage';
import { useCensorDigits } from '../../../hooks/useCensorDigits'; import { useCensorDigits } from '../../../hooks/useCensorDigits';
import { Store } from '../../../store/store-reducer'; import { Store } from '../../../store/store-reducer';
import s from './Assets.module.scss'; import s from './Assets.module.scss';
import { ZANO_ASSET_ID } from '../../../../constants'; import { LTHN_ASSET_ID } from '../../../../constants';
function AssetPrice({ assetId, balance }: { assetId: string; balance: number }) { function AssetPrice({ assetId, balance }: { assetId: string; balance: number }) {
const { state } = useContext(Store); const { state } = useContext(Store);
@ -13,12 +13,12 @@ function AssetPrice({ assetId, balance }: { assetId: string; balance: number })
const [assetPrice, setAssetPrice] = React.useState<number | null>(null); const [assetPrice, setAssetPrice] = React.useState<number | null>(null);
useEffect(() => { useEffect(() => {
if (assetId === ZANO_ASSET_ID) { if (assetId === LTHN_ASSET_ID) {
setAssetPrice(state.priceData.price); setAssetPrice(state.priceData.price);
return; return;
} }
fetch(`https://explorer.zano.org/api/price?asset_id=${assetId}`) fetch(`https://explorer.lethean.io/api/price?asset_id=${assetId}`)
.then((response) => response.json()) .then((response) => response.json())
.then((response) => { .then((response) => {
if (response.data && response.data.usd) { if (response.data && response.data.usd) {

View file

@ -8,7 +8,7 @@ import TransactionDetails from '../../TransactionDetails/TransactionDetails';
import s from './History.module.scss'; import s from './History.module.scss';
import NavLink from '../../UI/NavLink/NavLink'; import NavLink from '../../UI/NavLink/NavLink';
import useGetAsset from '../../../hooks/useGetAsset'; import useGetAsset from '../../../hooks/useGetAsset';
import { ZANO_ASSET_ID } from '../../../../constants'; import { LTHN_ASSET_ID } from '../../../../constants';
interface HistoryItemProps { interface HistoryItemProps {
transfer: { transfer: {
@ -37,7 +37,7 @@ const HistoryItem = ({ transfer, fee, isInitiator }: HistoryItemProps) => {
if (amount === undefined) { if (amount === undefined) {
displayAmount = 'N/A'; displayAmount = 'N/A';
} else if (transfer.assetId === ZANO_ASSET_ID) { } else if (transfer.assetId === LTHN_ASSET_ID) {
if (!isInitiator || transfer.incoming) { if (!isInitiator || transfer.incoming) {
displayAmount = amount.toFixed(); displayAmount = amount.toFixed();
} else { } else {

View file

@ -7,7 +7,7 @@ import { useCopy } from '../../hooks/useCopy';
import RoutersNav from '../UI/RoutersNav/RoutersNav'; import RoutersNav from '../UI/RoutersNav/RoutersNav';
import { Store } from '../../store/store-reducer'; import { Store } from '../../store/store-reducer';
import styles from './TransactionDetails.module.scss'; import styles from './TransactionDetails.module.scss';
import { ZANO_ASSET_ID } from '../../../constants'; import { LTHN_ASSET_ID } from '../../../constants';
type Transfer = { type Transfer = {
amount: string; amount: string;
@ -84,11 +84,11 @@ const TransactionDetails: React.FC<TransactionDetailsProps> = (props) => {
<div key={index} className={styles.transaction__transfer}> <div key={index} className={styles.transaction__transfer}>
<p className="table__value"> <p className="table__value">
{(() => { {(() => {
const isZano = transfer.assetId === ZANO_ASSET_ID; const isLethean = transfer.assetId === LTHN_ASSET_ID;
let amountText: string; let amountText: string;
if (isZano) { if (isLethean) {
if (!props.isInitiator) { if (!props.isInitiator) {
amountText = amount.toFixed(); amountText = amount.toFixed();
} else { } else {
@ -124,7 +124,7 @@ const TransactionDetails: React.FC<TransactionDetailsProps> = (props) => {
})} })}
</div> </div>
</TableRow> </TableRow>
<TableRow label="Fee" value={`${props.fee} ZANO`} /> <TableRow label="Fee" value={`${props.fee} LTHN`} />
{props.addresses && ( {props.addresses && (
<TableRow label="Remote address" value={props.addresses[0]} copyButton /> <TableRow label="Remote address" value={props.addresses[0]} copyButton />
)} )}

View file

@ -1,8 +1,8 @@
import DOMPurify from 'dompurify'; import DOMPurify from 'dompurify';
import React, { useEffect, useMemo, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { BANDIT_ASSET_ID, ZANO_ASSET_ID } from '../../../../constants'; import { BANDIT_ASSET_ID, LTHN_ASSET_ID } from '../../../../constants';
import customTokenIcon from '../../../assets/tokens-svg/custom-token.svg'; import customTokenIcon from '../../../assets/tokens-svg/custom-token.svg';
import zanoIcon from '../../../assets/tokens-svg/zano.svg'; import letheanIcon from '../../../assets/tokens-svg/lethean.svg';
import banditIcon from '../../../assets/tokens-svg/bandit-icon.svg'; import banditIcon from '../../../assets/tokens-svg/bandit-icon.svg';
import { WhitelistIconImageProps } from './types'; import { WhitelistIconImageProps } from './types';
@ -12,7 +12,7 @@ function WhitelistIconImage({ asset, width, height, className }: WhitelistIconIm
} | null>(null); } | null>(null);
useEffect(() => { useEffect(() => {
fetch('https://api.zano.org/assets_whitelist.json') fetch('https://api.lethean.io/assets_whitelist.json')
.then((response) => response.json()) .then((response) => response.json())
.then(setWhitelistData) .then(setWhitelistData)
.catch((error) => console.error('Error fetching asset whitelist:', error)); .catch((error) => console.error('Error fetching asset whitelist:', error));
@ -45,8 +45,8 @@ function WhitelistIconImage({ asset, width, height, className }: WhitelistIconIm
); );
} }
if (ZANO_ASSET_ID === asset.assetId) { if (LTHN_ASSET_ID === asset.assetId) {
return <img src={zanoIcon} alt="ZanoIcon" className={className} style={style} />; return <img src={letheanIcon} alt="LetheanIcon" className={className} style={style} />;
} }
if (BANDIT_ASSET_ID === asset.assetId) { if (BANDIT_ASSET_ID === asset.assetId) {

View file

@ -21,7 +21,7 @@ import WalletSend from '../WalletSend/WalletSend';
import s from './Wallet.module.scss'; import s from './Wallet.module.scss';
import NavLink from '../UI/NavLink/NavLink'; import NavLink from '../UI/NavLink/NavLink';
import { classNames } from '../../utils/classNames'; import { classNames } from '../../utils/classNames';
import { ZANO_ASSET_ID } from '../../../constants'; import { LTHN_ASSET_ID } from '../../../constants';
import AliasManagePage from '../AliasManagePage'; import AliasManagePage from '../AliasManagePage';
import AliasTransfer from '../AliasTransfer'; import AliasTransfer from '../AliasTransfer';
@ -56,13 +56,13 @@ const Wallet = ({ setConnectOpened }: { setConnectOpened: Dispatch<SetStateActio
.toDecimalPlaces(6, Decimal.ROUND_DOWN) .toDecimalPlaces(6, Decimal.ROUND_DOWN)
.toFixed(), .toFixed(),
)}{' '} )}{' '}
ZANO LTHN
</span> </span>
); );
}; };
const getUnlockedBalance = () => const getUnlockedBalance = () =>
state.wallet.assets.find((asset) => asset.assetId === ZANO_ASSET_ID)?.unlockedBalance; state.wallet.assets.find((asset) => asset.assetId === LTHN_ASSET_ID)?.unlockedBalance;
const flipDisplay = () => { const flipDisplay = () => {
updateDisplay(dispatch as DispatchFunction, !state.displayUsd as never); updateDisplay(dispatch as DispatchFunction, !state.displayUsd as never);
@ -145,7 +145,7 @@ const Wallet = ({ setConnectOpened }: { setConnectOpened: Dispatch<SetStateActio
{lockedBalanceDisplay !== undefined && ( {lockedBalanceDisplay !== undefined && (
<div className={s.lockedBalanceWrapper}> <div className={s.lockedBalanceWrapper}>
<img src={lockedIcon} alt="locked icon" /> <img src={lockedIcon} alt="locked icon" />
<span className={s.lockedBalanceText}>{lockedBalanceDisplay} ZANO</span> <span className={s.lockedBalanceText}>{lockedBalanceDisplay} LTHN</span>
</div> </div>
)} )}
</div> </div>

View file

@ -5,7 +5,7 @@ import {
validateTokensInput, validateTokensInput,
// @ts-expect-error - Disabling TS error while importing /shared submodule // @ts-expect-error - Disabling TS error while importing /shared submodule
// due to global tsconfig "moduleResolution" prop is set to "node" // due to global tsconfig "moduleResolution" prop is set to "node"
} from 'zano_web3/shared'; } from 'lethean_web3/shared';
import failedImage from '../../assets/images/failed-round.png'; import failedImage from '../../assets/images/failed-round.png';
import successImage from '../../assets/images/success-round.png'; import successImage from '../../assets/images/success-round.png';
@ -114,7 +114,7 @@ const WalletSend = () => {
const openExplorer = (txId: string) => { const openExplorer = (txId: string) => {
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
chrome.tabs.create({ chrome.tabs.create({
url: `https://testnet-explorer.zano.org/block/${txId}`, url: `https://testnet-explorer.lethean.io/block/${txId}`,
}); });
}; };
@ -157,12 +157,12 @@ const WalletSend = () => {
let isValid = false; let isValid = false;
try { try {
const isValidZanoAssetAmount = validateTokensInput( const isValidLetheanAssetAmount = validateTokensInput(
amount.value, amount.value,
Number(asset.decimalPoint), Number(asset.decimalPoint),
).valid; ).valid;
isValid = isValidZanoAssetAmount && isAmountAvailable; isValid = isValidLetheanAssetAmount && isAmountAvailable;
} catch { } catch {
isValid = false; isValid = false;
} }

View file

@ -2,7 +2,7 @@ import React, { Dispatch, SetStateAction, useContext, useEffect, useRef, useStat
import bitcoinIcon from '../../../../assets/tokens-svg/bitcoin.svg'; import bitcoinIcon from '../../../../assets/tokens-svg/bitcoin.svg';
import customTokenIcon from '../../../../assets/tokens-svg/custom-token.svg'; import customTokenIcon from '../../../../assets/tokens-svg/custom-token.svg';
import ethIcon from '../../../../assets/tokens-svg/eth.svg'; import ethIcon from '../../../../assets/tokens-svg/eth.svg';
import zanoIcon from '../../../../assets/tokens-svg/zano.svg'; import letheanIcon from '../../../../assets/tokens-svg/lethean.svg';
import arrowIcon from '../../../../assets/svg/arrow-select.svg'; import arrowIcon from '../../../../assets/svg/arrow-select.svg';
import { Store } from '../../../../store/store-reducer'; import { Store } from '../../../../store/store-reducer';
import mainStyles from '../../WalletSend.module.scss'; import mainStyles from '../../WalletSend.module.scss';

View file

@ -1,10 +1,10 @@
import { ZANO_ASSET_ID } from '../../constants'; import { LTHN_ASSET_ID } from '../../constants';
export const whitelistedAssets = [ export const whitelistedAssets = [
{ {
asset_id: ZANO_ASSET_ID, asset_id: LTHN_ASSET_ID,
ticker: 'ZANO', ticker: 'LTHN',
full_name: 'Zano', full_name: 'Lethean',
}, },
{ {
asset_id: 'e03a140b8447d2895290022b25c06bdabea514e2475ae56ce5bcbc554ab9865c', asset_id: 'e03a140b8447d2895290022b25c06bdabea514e2475ae56ce5bcbc554ab9865c',
@ -13,4 +13,4 @@ export const whitelistedAssets = [
}, },
]; ];
export const defaultPort = 11211; export const defaultPort = 46941;

View file

@ -103,7 +103,7 @@ const initialState: State = {
isConfirmed: true, isConfirmed: true,
incoming: true, incoming: true,
amount: 100, amount: 100,
ticker: 'ZANO', ticker: 'LTHN',
address: address:
'ZxDTZ8LJ88ZK6Ja1P9iqDNgCiBM6FhiBKdDoTAoEp9nY9q8d846iePAGYGjNvrU9uFHDXD3by5CooSBrsXBDfE9M11WBwAxQ9', 'ZxDTZ8LJ88ZK6Ja1P9iqDNgCiBM6FhiBKdDoTAoEp9nY9q8d846iePAGYGjNvrU9uFHDXD3by5CooSBrsXBDfE9M11WBwAxQ9',
}, },
@ -111,7 +111,7 @@ const initialState: State = {
isConfirmed: false, isConfirmed: false,
incoming: false, incoming: false,
value: 17, value: 17,
ticker: 'ZANO', ticker: 'LTHN',
address: address:
'ZxDTZ8LJ88ZK6Ja1P9iqDNgCiBM6FhiBKdDoTAoEp9nY9q8d846iePAGYGjNvrU9uFHDXD3by5CooSBrsXBDfE9M11WBwAxQ9', 'ZxDTZ8LJ88ZK6Ja1P9iqDNgCiBM6FhiBKdDoTAoEp9nY9q8d846iePAGYGjNvrU9uFHDXD3by5CooSBrsXBDfE9M11WBwAxQ9',
}, },

View file

@ -1,5 +1,5 @@
import JSONbig from 'json-bigint'; import JSONbig from 'json-bigint';
import { ZANO_ASSET_ID } from '../constants'; import { LTHN_ASSET_ID } from '../constants';
import { BurnAssetDataType, ionicSwapType, RequestType, TransferDataType } from '../types/index'; import { BurnAssetDataType, ionicSwapType, RequestType, TransferDataType } from '../types/index';
import { import {
fetchData, fetchData,
@ -26,7 +26,7 @@ import { truncateToDecimals } from '../app/utils/utils';
const POPUP_HEIGHT = 630; const POPUP_HEIGHT = 630;
const POPUP_WIDTH = 370; const POPUP_WIDTH = 370;
const ZANO_ID = ZANO_ASSET_ID; const LTHN_ID = LTHN_ASSET_ID;
interface PopupRequest { interface PopupRequest {
windowId?: number; windowId?: number;
@ -176,7 +176,7 @@ interface Credentials {
} }
const defaultCredentials: Credentials = { const defaultCredentials: Credentials = {
port: 11211, port: 46941,
}; };
export let apiCredentials: Credentials = { ...defaultCredentials }; export let apiCredentials: Credentials = { ...defaultCredentials };
@ -465,7 +465,7 @@ async function processRequest(request: RequestType, sender: Sender, sendResponse
const { address } = walletData; const { address } = walletData;
console.log('asset to transfer:', asset); console.log('asset to transfer:', asset);
request.asset = asset || (await getAsset(ZANO_ID)); request.asset = asset || (await getAsset(LTHN_ID));
request.sender = address || ''; request.sender = address || '';
const decimal_point = request.asset?.decimal_point ?? 12; const decimal_point = request.asset?.decimal_point ?? 12;

View file

@ -3,7 +3,7 @@ import { Buffer } from 'buffer';
import JSONbig from 'json-bigint'; import JSONbig from 'json-bigint';
import { apiCredentials } from './background'; import { apiCredentials } from './background';
import { addZeros, removeZeros } from '../app/utils/utils'; import { addZeros, removeZeros } from '../app/utils/utils';
import { ZANO_ASSET_ID } from '../constants'; import { LTHN_ASSET_ID } from '../constants';
import { import {
BurnAssetDataType, BurnAssetDataType,
ionicSwapType, ionicSwapType,
@ -58,7 +58,7 @@ function generateAccessToken(httpBody: string) {
// Example payload // Example payload
const payload = { const payload = {
body_hash: bodyHash, body_hash: bodyHash,
user: 'zano_extension', user: 'lethean_extension',
salt: generateRandomString(64), salt: generateRandomString(64),
exp: Math.floor(Date.now() / 1000) + 60, // Expires in 1 minute exp: Math.floor(Date.now() / 1000) + 60, // Expires in 1 minute
}; };
@ -90,7 +90,7 @@ export const fetchData = async (
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Zano-Access-Token': generateAccessToken(httpBody), 'Lethean-Access-Token': generateAccessToken(httpBody),
}, },
body: httpBody, body: httpBody,
}); });
@ -145,7 +145,7 @@ export const getWallets = async () => {
data.result.wallets.map(async (wallet: WalletRaw) => { data.result.wallets.map(async (wallet: WalletRaw) => {
const alias = await getAlias(wallet.wi.address); const alias = await getAlias(wallet.wi.address);
const balanceRaw = const balanceRaw =
wallet?.wi?.balances?.find((asset) => asset.asset_info.asset_id === ZANO_ASSET_ID) wallet?.wi?.balances?.find((asset) => asset.asset_info.asset_id === LTHN_ASSET_ID)
?.total || '0'; ?.total || '0';
return { return {
@ -184,8 +184,8 @@ export const getWalletData = async () => {
unlockedBalance: removeZeros(asset.unlocked, asset.asset_info.decimal_point), unlockedBalance: removeZeros(asset.unlocked, asset.asset_info.decimal_point),
})) }))
.sort((a, b) => { .sort((a, b) => {
if (a.assetId === ZANO_ASSET_ID) return -1; if (a.assetId === LTHN_ASSET_ID) return -1;
if (b.assetId === ZANO_ASSET_ID) return 1; if (b.assetId === LTHN_ASSET_ID) return 1;
return 0; return 0;
}); });
@ -194,7 +194,7 @@ export const getWalletData = async () => {
} }
const balance = removeZeros( const balance = removeZeros(
balanceParsed.result.balances.find((asset) => asset.asset_info.asset_id === ZANO_ASSET_ID) balanceParsed.result.balances.find((asset) => asset.asset_info.asset_id === LTHN_ASSET_ID)
?.total || '0', ?.total || '0',
); );
@ -340,7 +340,7 @@ export const getAliasByAddress = async (address: string) => {
}; };
export const transfer = async ( export const transfer = async (
assetId = ZANO_ASSET_ID, assetId = LTHN_ASSET_ID,
destination: string | undefined, destination: string | undefined,
amount: string | undefined, amount: string | undefined,
decimalPoint: number, decimalPoint: number,
@ -395,7 +395,7 @@ export const burnBridge = async (
amount: string, amount: string,
destinationAddress: string, destinationAddress: string,
destinationChainId: string, destinationChainId: string,
assetId = ZANO_ASSET_ID, assetId = LTHN_ASSET_ID,
) => { ) => {
const bodyData = { const bodyData = {
service_id: 'B', service_id: 'B',
@ -487,15 +487,15 @@ export const getSwapProposalInfo = async (hex: string | undefined) => {
}; };
export async function getWhiteList() { export async function getWhiteList() {
const fetchedWhiteList = await fetch('https://api.zano.org/assets_whitelist.json') const fetchedWhiteList = await fetch('https://api.lethean.io/assets_whitelist.json')
.then((response) => response.json()) .then((response) => response.json())
.then((data) => data.assets); .then((data) => data.assets);
if (fetchedWhiteList.every((e: { asset_id: string }) => e.asset_id !== ZANO_ASSET_ID)) { if (fetchedWhiteList.every((e: { asset_id: string }) => e.asset_id !== LTHN_ASSET_ID)) {
fetchedWhiteList.push({ fetchedWhiteList.push({
asset_id: ZANO_ASSET_ID, asset_id: LTHN_ASSET_ID,
ticker: 'ZANO', ticker: 'LTHN',
full_name: 'Zano', full_name: 'Lethean',
decimal_point: 12, decimal_point: 12,
}); });
} }
@ -516,11 +516,11 @@ export async function getAssetInfo(assetId: string) {
} }
export async function getAsset(assetId: string): Promise<IAsset | undefined> { export async function getAsset(assetId: string): Promise<IAsset | undefined> {
if (assetId === ZANO_ASSET_ID) { if (assetId === LTHN_ASSET_ID) {
return { return {
asset_id: ZANO_ASSET_ID, asset_id: LTHN_ASSET_ID,
ticker: 'ZANO', ticker: 'LTHN',
full_name: 'Zano', full_name: 'Lethean',
decimal_point: 12, decimal_point: 12,
}; };
} }

View file

@ -1,4 +1,6 @@
export const ZANO_ASSET_ID = 'd6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a'; export const LTHN_ASSET_ID = 'd6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a';
/** @deprecated Use LTHN_ASSET_ID */
export const LETHEAN_ASSET_ID = LTHN_ASSET_ID;
export const BANDIT_ASSET_ID = '55a8e0a730b133fb83915ba0e4335a680ae9d07a99642b17774460560f3b003d'; export const BANDIT_ASSET_ID = '55a8e0a730b133fb83915ba0e4335a680ae9d07a99642b17774460560f3b003d';
export const WETH_ASSET_ID = '93da681503353509367e241cda3234299dedbbad9ec851de31e900490807bf0c'; export const WETH_ASSET_ID = '93da681503353509367e241cda3234299dedbbad9ec851de31e900490807bf0c';
export const WBTC_ASSET_ID = '040a180aca4194a158c17945dd115db42086f6f074c1f77838621a4927fffa91'; export const WBTC_ASSET_ID = '040a180aca4194a158c17945dd115db42086f6f074c1f77838621a4927fffa91';

View file

@ -1,22 +1,22 @@
interface ZanoRequestData { interface LetheanRequestData {
method: string; method: string;
listenerID: string; listenerID: string;
timeout?: number | null; timeout?: number | null;
[key: string]: string | number | boolean | null | undefined; [key: string]: string | number | boolean | null | undefined;
} }
interface DocumentEventMap { interface DocumentEventMap {
zano_request: CustomEvent<ZanoRequestData>; lethean_request: CustomEvent<LetheanRequestData>;
} }
interface ZanoResponse { interface LetheanResponse {
error?: string; error?: string;
[key: string]: string | number | boolean | null | undefined; [key: string]: string | number | boolean | null | undefined;
} }
async function fetchData(data: ZanoRequestData): Promise<ZanoResponse> { async function fetchData(data: LetheanRequestData): Promise<LetheanResponse> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
chrome.runtime.sendMessage(data, (response: ZanoResponse) => { chrome.runtime.sendMessage(data, (response: LetheanResponse) => {
if (chrome.runtime.lastError) { if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError); reject(chrome.runtime.lastError);
} else { } else {
@ -29,20 +29,20 @@ async function fetchData(data: ZanoRequestData): Promise<ZanoResponse> {
}); });
} }
document.addEventListener('zano_request', async (e: CustomEvent<ZanoRequestData>) => { document.addEventListener('lethean_request', async (e: CustomEvent<LetheanRequestData>) => {
const data = e.detail; const data = e.detail;
try { try {
const response = await fetchData(data); const response = await fetchData(data);
document.dispatchEvent( document.dispatchEvent(
new CustomEvent(`zano_response_${data.listenerID}`, { new CustomEvent(`lethean_response_${data.listenerID}`, {
detail: response, detail: response,
}), }),
); );
} catch (error) { } catch (error) {
document.dispatchEvent( document.dispatchEvent(
new CustomEvent(`zano_response_${data.listenerID}`, { new CustomEvent(`lethean_response_${data.listenerID}`, {
detail: { error: error instanceof Error ? error.message : String(error) }, detail: { error: error instanceof Error ? error.message : String(error) },
}), }),
); );

View file

@ -1,4 +1,4 @@
class Zano { class Lethean {
async request( async request(
method: string, method: string,
params: Record<string, unknown>, params: Record<string, unknown>,
@ -25,20 +25,20 @@ class Zano {
? setTimeout(() => { ? setTimeout(() => {
reject(new Error('Request timeout exceeded')); reject(new Error('Request timeout exceeded'));
document.removeEventListener( document.removeEventListener(
`zano_response_${listenerID}`, `lethean_response_${listenerID}`,
handleResponse as EventListener, handleResponse as EventListener,
); );
}, timeoutMs) }, timeoutMs)
: undefined; : undefined;
document.addEventListener( document.addEventListener(
`zano_response_${listenerID}`, `lethean_response_${listenerID}`,
handleResponse as EventListener, handleResponse as EventListener,
); );
function handleResponse(e: CustomEvent) { function handleResponse(e: CustomEvent) {
document.removeEventListener( document.removeEventListener(
`zano_response_${listenerID}`, `lethean_response_${listenerID}`,
handleResponse as EventListener, handleResponse as EventListener,
); );
if (timeout) { if (timeout) {
@ -48,7 +48,7 @@ class Zano {
} }
document.dispatchEvent( document.dispatchEvent(
new CustomEvent('zano_request', { new CustomEvent('lethean_request', {
detail: { detail: {
method, method,
listenerID, listenerID,
@ -61,4 +61,4 @@ class Zano {
} }
} }
window.zano = new Zano(); window.lethean = new Lethean();

2
src/global.d.ts vendored
View file

@ -1,5 +1,5 @@
interface Window { interface Window {
zano: Zano; lethean: Lethean;
} }
declare module '*.scss' { declare module '*.scss' {
const content: { [className: string]: string }; const content: { [className: string]: string };

View file

@ -4,7 +4,7 @@ module.exports = {
module: { module: {
rules: [ rules: [
{ {
include: /node_modules[\\/]zano_web3[\\/]/, include: /node_modules[\\/]lethean_web3[\\/]/,
resolve: { resolve: {
fullySpecified: false, fullySpecified: false,
}, },