gun-eth 1.4.31 → 1.4.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gun-eth.cjs.js +17 -17
- package/dist/gun-eth.cjs.js.map +1 -1
- package/dist/gun-eth.esm.js +11 -11
- package/dist/gun-eth.esm.js.map +1 -1
- package/dist/gun-eth.min.js +1 -1
- package/dist/gun-eth.min.js.map +1 -1
- package/dist/gun-eth.mjs +11 -11
- package/dist/gun-eth.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.js +10 -20
package/dist/gun-eth.cjs.js
CHANGED
|
@@ -486,7 +486,7 @@ function generateRandomId() {
|
|
|
486
486
|
*/
|
|
487
487
|
function generatePassword(signature) {
|
|
488
488
|
try {
|
|
489
|
-
const signatureBytes = ethers.ethers.
|
|
489
|
+
const signatureBytes = ethers.ethers.toUtf8Bytes(signature);
|
|
490
490
|
const hash = ethers.ethers.keccak256(signatureBytes);
|
|
491
491
|
console.log("Generated password:", hash);
|
|
492
492
|
return hash;
|
|
@@ -539,13 +539,13 @@ const getSigner = async () => {
|
|
|
539
539
|
chainId: LOCAL_CONFIG.CHAIN_ID,
|
|
540
540
|
name: "localhost"
|
|
541
541
|
});
|
|
542
|
-
return new
|
|
542
|
+
return new Wallet(privateKey, provider);
|
|
543
543
|
} else if (
|
|
544
544
|
typeof window !== "undefined" &&
|
|
545
545
|
typeof window.ethereum !== "undefined"
|
|
546
546
|
) {
|
|
547
547
|
await window.ethereum.request({ method: "eth_requestAccounts" });
|
|
548
|
-
const provider = new ethers.BrowserProvider(window.ethereum);
|
|
548
|
+
const provider = new ethers.ethers.BrowserProvider(window.ethereum);
|
|
549
549
|
return provider.getSigner();
|
|
550
550
|
} else {
|
|
551
551
|
throw new Error("No valid Ethereum provider found");
|
|
@@ -560,17 +560,17 @@ const getSigner = async () => {
|
|
|
560
560
|
*/
|
|
561
561
|
function deriveStealthAddress(sharedSecret, spendingPublicKey) {
|
|
562
562
|
try {
|
|
563
|
-
const sharedSecretBytes = ethers.
|
|
564
|
-
const spendingPublicKeyBytes = ethers.
|
|
563
|
+
const sharedSecretBytes = ethers.ethers.toUtf8Bytes(sharedSecret);
|
|
564
|
+
const spendingPublicKeyBytes = ethers.ethers.toUtf8Bytes(spendingPublicKey);
|
|
565
565
|
|
|
566
|
-
const stealthPrivateKey = ethers.keccak256(
|
|
567
|
-
ethers.concat([
|
|
566
|
+
const stealthPrivateKey = ethers.ethers.keccak256(
|
|
567
|
+
ethers.ethers.concat([
|
|
568
568
|
sharedSecretBytes,
|
|
569
569
|
spendingPublicKeyBytes
|
|
570
570
|
])
|
|
571
571
|
);
|
|
572
572
|
|
|
573
|
-
const stealthWallet = new
|
|
573
|
+
const stealthWallet = new Wallet(stealthPrivateKey);
|
|
574
574
|
|
|
575
575
|
console.log("Debug deriveStealthAddress:", {
|
|
576
576
|
sharedSecretHex: stealthPrivateKey,
|
|
@@ -620,7 +620,7 @@ Gun.chain.getSigner = getSigner();
|
|
|
620
620
|
*/
|
|
621
621
|
Gun.chain.verifySignature = async function (message, signature) {
|
|
622
622
|
try {
|
|
623
|
-
const recoveredAddress = ethers.verifyMessage(message, signature);
|
|
623
|
+
const recoveredAddress = ethers.ethers.verifyMessage(message, signature);
|
|
624
624
|
return recoveredAddress;
|
|
625
625
|
} catch (error) {
|
|
626
626
|
console.error("Error verifying signature:", error);
|
|
@@ -758,7 +758,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
758
758
|
console.log(`Using ${targetChain} configuration:`, chainConfig);
|
|
759
759
|
|
|
760
760
|
// Usa gli indirizzi dalla configurazione
|
|
761
|
-
const contract = new ethers.Contract(
|
|
761
|
+
const contract = new ethers.ethers.Contract(
|
|
762
762
|
chainConfig.PROOF_OF_INTEGRITY_ADDRESS,
|
|
763
763
|
PROOF_OF_INTEGRITY_ABI,
|
|
764
764
|
signer
|
|
@@ -768,13 +768,13 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
768
768
|
const verifyOnChain = async (nodeId, contentHash) => {
|
|
769
769
|
console.log("Verifying on chain:", { nodeId, contentHash });
|
|
770
770
|
const signer = await getSigner();
|
|
771
|
-
const contract = new
|
|
771
|
+
const contract = new Contract(
|
|
772
772
|
PROOF_CONTRACT_ADDRESS,
|
|
773
773
|
PROOF_OF_INTEGRITY_ABI,
|
|
774
774
|
signer
|
|
775
775
|
);
|
|
776
776
|
const [isValid, timestamp, updater] = await contract.verifyData(
|
|
777
|
-
toUtf8Bytes(nodeId),
|
|
777
|
+
ethers.ethers.toUtf8Bytes(nodeId),
|
|
778
778
|
contentHash
|
|
779
779
|
);
|
|
780
780
|
console.log("Verification result:", { isValid, timestamp, updater });
|
|
@@ -785,7 +785,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
785
785
|
const writeOnChain = async (nodeId, contentHash) => {
|
|
786
786
|
console.log("Writing on chain:", { nodeId, contentHash });
|
|
787
787
|
const signer = await getSigner();
|
|
788
|
-
const contract = new
|
|
788
|
+
const contract = new Contract(
|
|
789
789
|
PROOF_CONTRACT_ADDRESS,
|
|
790
790
|
PROOF_OF_INTEGRITY_ABI,
|
|
791
791
|
signer
|
|
@@ -803,7 +803,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
803
803
|
// Funzione per ottenere l'ultimo record
|
|
804
804
|
const getLatestRecord = async (nodeId) => {
|
|
805
805
|
const signer = await getSigner();
|
|
806
|
-
const contract = new
|
|
806
|
+
const contract = new Contract(
|
|
807
807
|
PROOF_CONTRACT_ADDRESS,
|
|
808
808
|
PROOF_OF_INTEGRITY_ABI,
|
|
809
809
|
signer
|
|
@@ -872,7 +872,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
872
872
|
// Case 2: User passes only text (data)
|
|
873
873
|
const newNodeId = generateRandomId();
|
|
874
874
|
const dataString = JSON.stringify(data);
|
|
875
|
-
const contentHash = ethers.keccak256(toUtf8Bytes(dataString));
|
|
875
|
+
const contentHash = ethers.ethers.keccak256(ethers.ethers.toUtf8Bytes(dataString));
|
|
876
876
|
|
|
877
877
|
gun
|
|
878
878
|
.get(newNodeId)
|
|
@@ -1147,7 +1147,7 @@ Gun.chain.announceStealthPayment = async function (
|
|
|
1147
1147
|
|
|
1148
1148
|
console.log("Using contract address:", contractAddress);
|
|
1149
1149
|
|
|
1150
|
-
const contract = new
|
|
1150
|
+
const contract = new Contract(
|
|
1151
1151
|
contractAddress,
|
|
1152
1152
|
STEALTH_ANNOUNCER_ABI,
|
|
1153
1153
|
signer
|
|
@@ -1205,7 +1205,7 @@ Gun.chain.getStealthPayments = async function (signature, options = { source: 'b
|
|
|
1205
1205
|
const chainConfig = getAddressesForChain(options.chain || 'optimismSepolia');
|
|
1206
1206
|
const contractAddress = chainConfig.STEALTH_ANNOUNCER_ADDRESS;
|
|
1207
1207
|
|
|
1208
|
-
const contract = new
|
|
1208
|
+
const contract = new Contract(
|
|
1209
1209
|
contractAddress,
|
|
1210
1210
|
STEALTH_ANNOUNCER_ABI,
|
|
1211
1211
|
signer
|
package/dist/gun-eth.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gun-eth.cjs.js","sources":["../src/config/local.js","../src/abis/abis.js","../src/index.js"],"sourcesContent":["let contractAddresses = {\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512\",\r\n STEALTH_ANNOUNCER_ADDRESS: \"0x5FbDB2315678afecb367f032d93F642f64180aa3\"\r\n};\r\n\r\nif (typeof window === 'undefined') {\r\n const { fileURLToPath } = require('url');\r\n const { dirname } = require('path');\r\n const { readFileSync } = require('fs');\r\n const { join } = require('path');\r\n\r\n try {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n const rawdata = readFileSync(join(__dirname, 'contract-address.json'), 'utf8');\r\n contractAddresses = JSON.parse(rawdata);\r\n console.log(\"Loaded contract addresses:\", contractAddresses);\r\n } catch (error) {\r\n console.warn(\"Warning: contract-address.json not found or invalid\");\r\n }\r\n}\r\n\r\nexport const LOCAL_CONFIG = {\r\n CHAIN_ID: 1337,\r\n PROOF_OF_INTEGRITY_ADDRESS: contractAddresses.PROOF_OF_INTEGRITY_ADDRESS,\r\n STEALTH_ANNOUNCER_ADDRESS: contractAddresses.STEALTH_ANNOUNCER_ADDRESS,\r\n RPC_URL: \"http://127.0.0.1:8545\",\r\n GUN_PEER: \"http://localhost:8765/gun\"\r\n}; ","import { LOCAL_CONFIG } from '../config/local.js';\r\n\r\n// Indirizzi di produzione per diverse chain\r\nexport const CHAIN_CONFIG = {\r\n optimismSepolia: {\r\n STEALTH_ANNOUNCER_ADDRESS: \"0xD0F2e9DA59d2DFECFdE67CcF17300BB6093A72f8\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0x...\",\r\n RPC_URL: \"https://sepolia.optimism.io\",\r\n CHAIN_ID: 11155420\r\n },\r\n arbitrumSepolia: {\r\n STEALTH_ANNOUNCER_ADDRESS: \"0x...\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0x...\",\r\n RPC_URL: \"https://sepolia-rollup.arbitrum.io/rpc\",\r\n CHAIN_ID: 421614\r\n },\r\n localhost: {\r\n RPC_URL: \"http://127.0.0.1:8545\",\r\n CHAIN_ID: 1337\r\n }\r\n};\r\n\r\n// Esporta gli indirizzi di default (Optimism Sepolia)\r\nexport const STEALTH_ANNOUNCER_ADDRESS = CHAIN_CONFIG.optimismSepolia.STEALTH_ANNOUNCER_ADDRESS;\r\nexport const PROOF_OF_INTEGRITY_ADDRESS = CHAIN_CONFIG.optimismSepolia.PROOF_OF_INTEGRITY_ADDRESS;\r\n\r\n// Funzione per ottenere gli indirizzi corretti\r\nexport function getAddressesForChain(chainName) {\r\n let config;\r\n\r\n // Se è localhost, prova a caricare gli indirizzi locali\r\n if (chainName === 'localhost') {\r\n try {\r\n // Carica gli indirizzi dal file generato dal deploy locale\r\n const localAddresses = require('../config/contract-address.json');\r\n config = {\r\n ...CHAIN_CONFIG.localhost,\r\n ...localAddresses\r\n };\r\n console.log(\"Using local addresses:\", config);\r\n return config;\r\n } catch (err) {\r\n console.warn('No local addresses found');\r\n throw new Error('No local addresses found. Did you run local deployment?');\r\n }\r\n }\r\n\r\n // Altrimenti usa gli indirizzi di produzione\r\n config = CHAIN_CONFIG[chainName];\r\n if (!config) {\r\n throw new Error(`Chain ${chainName} not supported. Supported chains: ${Object.keys(CHAIN_CONFIG).join(', ')}`);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n// Funzione helper per verificare se siamo in ambiente locale\r\nexport function isLocalEnvironment() {\r\n return process.env.NODE_ENV === 'development' && \r\n typeof window !== 'undefined' && \r\n window.location.hostname === 'localhost';\r\n}\r\n\r\nexport const STEALTH_ANNOUNCER_ABI = [\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"_devAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"constructor\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"timestamp\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"StealthPaymentAnnounced\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"newAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"DevAddressUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"newFee\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"DevFeeUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"announcePayment\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"payable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"devAddress\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"devFee\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"getAnnouncementsCount\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"fromIndex\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"toIndex\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"getAnnouncementsInRange\",\r\n \"outputs\": [\r\n {\r\n \"components\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"timestamp\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"internalType\": \"struct StealthAnnouncer.StealthAnnouncement[]\",\r\n \"name\": \"\",\r\n \"type\": \"tuple[]\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"_newFee\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"updateDevFee\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"_newAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"updateDevAddress\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"withdrawStuckETH\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n }\r\n];\r\n\r\nexport const PROOF_OF_INTEGRITY_ABI = [\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes[]\",\r\n \"name\": \"nodeIds\",\r\n \"type\": \"bytes[]\"\r\n },\r\n {\r\n \"internalType\": \"bytes32[]\",\r\n \"name\": \"contentHashes\",\r\n \"type\": \"bytes32[]\"\r\n }\r\n ],\r\n \"name\": \"batchUpdateData\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"indexed\": true,\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"indexed\": false,\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n },\r\n {\r\n \"indexed\": false,\r\n \"internalType\": \"address\",\r\n \"name\": \"updater\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"DataUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n }\r\n ],\r\n \"name\": \"getLatestRecord\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"\",\r\n \"type\": \"bytes32\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n }\r\n ],\r\n \"name\": \"updateData\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n }\r\n ],\r\n \"name\": \"verifyData\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"bool\",\r\n \"name\": \"\",\r\n \"type\": \"bool\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n }\r\n];\r\n\r\n\r\nexport const SHINE_OPTIMISM_SEPOLIA = \"0x43D838b683F772F08f321E5FA265ad3e333BE9C2\";\r\n","// =============================================\r\n// IMPORTS AND GLOBAL VARIABLES\r\n// =============================================\r\nimport Gun from \"gun\";\r\nimport SEA from \"gun/sea.js\";\r\nimport { ethers } from \"ethers\";\r\nimport { \r\n PROOF_OF_INTEGRITY_ABI, \r\n STEALTH_ANNOUNCER_ABI, \r\n getAddressesForChain, \r\n isLocalEnvironment,\r\n CHAIN_CONFIG\r\n} from \"./abis/abis.js\";\r\nimport { LOCAL_CONFIG } from \"./config/local.js\";\r\nimport { fileURLToPath } from 'url';\r\nimport { dirname } from 'path';\r\nimport { readFileSync } from 'fs';\r\nimport { \r\n JsonRpcProvider, \r\n BrowserProvider, \r\n Wallet,\r\n Contract,\r\n concat,\r\n keccak256,\r\n verifyMessage,\r\n getBytes\r\n} from 'ethers';\r\n\r\nlet PROOF_CONTRACT_ADDRESS;\r\nlet rpcUrl = \"\";\r\nlet privateKey = \"\";\r\n\r\nexport const MESSAGE_TO_SIGN = \"Access GunDB with Ethereum\";\r\n\r\nlet contractAddresses = {\r\n PROOF_OF_INTEGRITY_ADDRESS: CHAIN_CONFIG.optimismSepolia.PROOF_OF_INTEGRITY_ADDRESS,\r\n STEALTH_ANNOUNCER_ADDRESS: CHAIN_CONFIG.optimismSepolia.STEALTH_ANNOUNCER_ADDRESS\r\n};\r\n\r\n// Solo per Node.js\r\nif (typeof window === 'undefined') {\r\n try {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n\r\n try {\r\n const rawdata = readFileSync(path.join(__dirname, 'contract-address.json'), 'utf8');\r\n contractAddresses = JSON.parse(rawdata);\r\n console.log('Loaded contract addresses:', contractAddresses);\r\n } catch (err) {\r\n console.warn('Warning: contract-address.json not found or invalid');\r\n }\r\n } catch (error) {\r\n console.error('Error loading Node.js modules:', error);\r\n }\r\n}\r\n\r\n// =============================================\r\n// UTILITY FUNCTIONS\r\n// =============================================\r\n/**\r\n * Generates a random node ID for GunDB\r\n * @returns {string} A random hexadecimal string\r\n */\r\nexport function generateRandomId() {\r\n const randomBytes = ethers.randomBytes(32);\r\n return ethers.hexlify(randomBytes).slice(2);\r\n}\r\n\r\n/**\r\n * Generates a password from a signature.\r\n * @param {string} signature - The signature to derive the password from.\r\n * @returns {string|null} The generated password or null if generation fails.\r\n */\r\nexport function generatePassword(signature) {\r\n try {\r\n const signatureBytes = ethers.getBytes(signature);\r\n const hash = ethers.keccak256(signatureBytes);\r\n console.log(\"Generated password:\", hash);\r\n return hash;\r\n } catch (error) {\r\n console.error(\"Error generating password:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Converts a Gun private key to an Ethereum account.\r\n * @param {string} gunPrivateKey - The Gun private key in base64url format.\r\n * @returns {Object} An object containing the Ethereum account and public key.\r\n */\r\nexport function gunToEthAccount(gunPrivateKey) {\r\n // Function to convert base64url to hex\r\n const base64UrlToHex = (base64url) => {\r\n const padding = \"=\".repeat((4 - (base64url.length % 4)) % 4);\r\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\") + padding;\r\n const binary = atob(base64);\r\n return Array.from(binary, (char) =>\r\n char.charCodeAt(0).toString(16).padStart(2, \"0\")\r\n ).join(\"\");\r\n };\r\n\r\n // Convert Gun private key to hex format\r\n const hexPrivateKey = \"0x\" + base64UrlToHex(gunPrivateKey);\r\n\r\n // Create an Ethereum wallet from the private key\r\n const wallet = new ethers.Wallet(hexPrivateKey);\r\n\r\n // Get the public address (public key)\r\n const publicKey = wallet.address;\r\n\r\n return {\r\n account: wallet,\r\n publicKey: publicKey,\r\n privateKey: hexPrivateKey,\r\n };\r\n}\r\n\r\n/**\r\n * Gets an Ethereum signer based on current configuration\r\n * @returns {Promise<ethers.Signer>} The configured signer\r\n * @throws {Error} If no valid provider is found\r\n */\r\nexport const getSigner = async () => {\r\n if (rpcUrl && privateKey) {\r\n const provider = new ethers.JsonRpcProvider(rpcUrl, {\r\n chainId: LOCAL_CONFIG.CHAIN_ID,\r\n name: \"localhost\"\r\n });\r\n return new Wallet(privateKey, provider);\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof window.ethereum !== \"undefined\"\r\n ) {\r\n await window.ethereum.request({ method: \"eth_requestAccounts\" });\r\n const provider = new BrowserProvider(window.ethereum);\r\n return provider.getSigner();\r\n } else {\r\n throw new Error(\"No valid Ethereum provider found\");\r\n }\r\n};\r\n\r\n/**\r\n * Utility function to generate stealth address\r\n * @param {string} sharedSecret - The shared secret\r\n * @param {string} spendingPublicKey - The spending public key\r\n * @returns {Object} The stealth address and private key\r\n */\r\nexport function deriveStealthAddress(sharedSecret, spendingPublicKey) {\r\n try {\r\n const sharedSecretBytes = getBytes(sharedSecret);\r\n const spendingPublicKeyBytes = getBytes(spendingPublicKey);\r\n \r\n const stealthPrivateKey = keccak256(\r\n concat([\r\n sharedSecretBytes,\r\n spendingPublicKeyBytes\r\n ])\r\n );\r\n \r\n const stealthWallet = new Wallet(stealthPrivateKey);\r\n\r\n console.log(\"Debug deriveStealthAddress:\", {\r\n sharedSecretHex: stealthPrivateKey,\r\n spendingPublicKey,\r\n stealthPrivateKey,\r\n stealthAddress: stealthWallet.address\r\n });\r\n\r\n return {\r\n stealthPrivateKey,\r\n stealthAddress: stealthWallet.address,\r\n wallet: stealthWallet\r\n };\r\n } catch (error) {\r\n console.error(\"Error in deriveStealthAddress:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n// =============================================\r\n// BASIC GUN-ETH CHAIN METHODS\r\n// =============================================\r\n\r\n// Set the message to sign\r\nGun.chain.MESSAGE_TO_SIGN = MESSAGE_TO_SIGN;\r\n\r\n/**\r\n * Sets standalone configuration for Gun.\r\n * @param {string} newRpcUrl - The new RPC URL.\r\n * @param {string} newPrivateKey - The new private key.\r\n * @returns {Gun} The Gun instance for chaining.\r\n */\r\nGun.chain.setSigner = function (newRpcUrl, newPrivateKey) {\r\n rpcUrl = newRpcUrl;\r\n privateKey = newPrivateKey;\r\n console.log(\"Standalone configuration set\");\r\n return this;\r\n};\r\n\r\nGun.chain.getSigner = getSigner();\r\n\r\n/**\r\n * Verifies an Ethereum signature.\r\n * @param {string} message - The original message that was signed.\r\n * @param {string} signature - The signature to verify.\r\n * @returns {Promise<string|null>} The recovered address or null if verification fails.\r\n */\r\nGun.chain.verifySignature = async function (message, signature) {\r\n try {\r\n const recoveredAddress = verifyMessage(message, signature);\r\n return recoveredAddress;\r\n } catch (error) {\r\n console.error(\"Error verifying signature:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Generates a password from a signature.\r\n * @param {string} signature - The signature to derive the password from.\r\n * @returns {string|null} The generated password or null if generation fails.\r\n */\r\nGun.chain.generatePassword = function (signature) {\r\n return generatePassword(signature);\r\n};\r\n\r\n/**\r\n * Creates an Ethereum signature for a given message.\r\n * @param {string} message - The message to sign.\r\n * @returns {Promise<string|null>} The signature or null if signing fails.\r\n */\r\nGun.chain.createSignature = async function (message) {\r\n try {\r\n // Check if message matches MESSAGE_TO_SIGN\r\n if (message !== MESSAGE_TO_SIGN) {\r\n throw new Error(\"Invalid message, valid message is: \" + MESSAGE_TO_SIGN);\r\n }\r\n const signer = await getSigner();\r\n const signature = await signer.signMessage(message);\r\n console.log(\"Signature created:\", signature);\r\n return signature;\r\n } catch (error) {\r\n console.error(\"Error creating signature:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n// =============================================\r\n// KEY PAIR MANAGEMENT\r\n// =============================================\r\n/**\r\n * Creates and stores an encrypted key pair for a given address.\r\n * @param {string} address - The Ethereum address to associate with the key pair.\r\n * @param {string} signature - The signature to use for encryption.\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.createAndStoreEncryptedPair = async function (address, signature) {\r\n try {\r\n const gun = this;\r\n const pair = await SEA.pair();\r\n const v_pair = await SEA.pair();\r\n const s_pair = await SEA.pair();\r\n const password = generatePassword(signature);\r\n\r\n // Save original SEA pairs\r\n const encryptedPair = await SEA.encrypt(JSON.stringify(pair), password);\r\n const encryptedV_pair = await SEA.encrypt(JSON.stringify(v_pair), password);\r\n const encryptedS_pair = await SEA.encrypt(JSON.stringify(s_pair), password);\r\n\r\n // Convert only to get Ethereum addresses\r\n const viewingAccount = gunToEthAccount(v_pair.priv);\r\n const spendingAccount = gunToEthAccount(s_pair.priv);\r\n\r\n gun.get(\"gun-eth\").get(\"users\").get(address).put({\r\n pair: encryptedPair,\r\n v_pair: encryptedV_pair,\r\n s_pair: encryptedS_pair,\r\n publicKeys: {\r\n viewingPublicKey: v_pair.epub, // Use SEA encryption public key\r\n viewingPublicKey: v_pair.epub, // Use SEA encryption public key\r\n spendingPublicKey: spendingAccount.publicKey, // Use Ethereum address\r\n ethViewingAddress: viewingAccount.publicKey // Also save Ethereum address\r\n }\r\n });\r\n\r\n console.log(\"Encrypted pairs and public keys stored for:\", address);\r\n } catch (error) {\r\n console.error(\"Error creating and storing encrypted pair:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves and decrypts a stored key pair for a given address.\r\n * @param {string} address - The Ethereum address associated with the key pair.\r\n * @param {string} signature - The signature to use for decryption.\r\n * @returns {Promise<Object|null>} The decrypted key pair or null if retrieval fails.\r\n */\r\nGun.chain.getAndDecryptPair = async function (address, signature) {\r\n try {\r\n const gun = this;\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(address)\r\n .get(\"pair\")\r\n .then();\r\n if (!encryptedData) {\r\n throw new Error(\"No encrypted data found for this address\");\r\n }\r\n const password = generatePassword(signature);\r\n const decryptedPair = await SEA.decrypt(encryptedData, password);\r\n console.log(decryptedPair);\r\n return decryptedPair;\r\n } catch (error) {\r\n console.error(\"Error retrieving and decrypting pair:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n// =============================================\r\n// PROOF OF INTEGRITY\r\n// =============================================\r\n/**\r\n * Proof of Integrity\r\n * @param {string} chain - The blockchain to use (e.g., \"optimismSepolia\").\r\n * @param {string} nodeId - The ID of the node to verify or write.\r\n * @param {Object} data - The data to write (if writing).\r\n * @param {Function} callback - Callback function to handle the result.\r\n * @returns {Gun} The Gun instance for chaining.\r\n */\r\nGun.chain.proof = function (chain, nodeId, data, callback) {\r\n console.log(\"Proof plugin called with:\", { chain, nodeId, data });\r\n\r\n if (typeof callback !== \"function\") {\r\n console.error(\"Callback must be a function\");\r\n return this;\r\n }\r\n\r\n try {\r\n // Se siamo in localhost e in development, usa automaticamente la chain locale\r\n const targetChain = isLocalEnvironment() ? 'localhost' : chain;\r\n const chainConfig = getAddressesForChain(targetChain);\r\n \r\n console.log(`Using ${targetChain} configuration:`, chainConfig);\r\n\r\n // Usa gli indirizzi dalla configurazione\r\n const contract = new Contract(\r\n chainConfig.PROOF_OF_INTEGRITY_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n\r\n // Funzione per verificare on-chain\r\n const verifyOnChain = async (nodeId, contentHash) => {\r\n console.log(\"Verifying on chain:\", { nodeId, contentHash });\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const [isValid, timestamp, updater] = await contract.verifyData(\r\n toUtf8Bytes(nodeId),\r\n contentHash\r\n );\r\n console.log(\"Verification result:\", { isValid, timestamp, updater });\r\n return { isValid, timestamp, updater };\r\n };\r\n\r\n // Funzione per scrivere on-chain\r\n const writeOnChain = async (nodeId, contentHash) => {\r\n console.log(\"Writing on chain:\", { nodeId, contentHash });\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const tx = await contract.updateData(\r\n toUtf8Bytes(nodeId),\r\n contentHash\r\n );\r\n console.log(\"Transaction sent:\", tx.hash);\r\n const receipt = await tx.wait();\r\n console.log(\"Transaction confirmed:\", receipt);\r\n return tx;\r\n };\r\n\r\n // Funzione per ottenere l'ultimo record\r\n const getLatestRecord = async (nodeId) => {\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const [contentHash, timestamp, updater] = await contract.getLatestRecord(\r\n toUtf8Bytes(nodeId)\r\n );\r\n console.log(\"Latest record from blockchain:\", {\r\n nodeId,\r\n contentHash,\r\n timestamp,\r\n updater,\r\n });\r\n return { contentHash, timestamp, updater };\r\n };\r\n\r\n \r\n if (nodeId && !data) {\r\n // Case 1: User passes only node\r\n gun.get(nodeId).once(async (existingData) => {\r\n if (!existingData) {\r\n if (callback) callback({ err: \"Node not found in GunDB\" });\r\n return;\r\n }\r\n\r\n console.log(\"existingData\", existingData);\r\n\r\n // Use stored contentHash instead of recalculating\r\n const contentHash = existingData._contentHash;\r\n console.log(\"contentHash\", contentHash);\r\n\r\n if (!contentHash) {\r\n if (callback) callback({ err: \"No content hash found for this node\" });\r\n return;\r\n }\r\n\r\n try {\r\n const { isValid, timestamp, updater } = await verifyOnChain(\r\n nodeId,\r\n contentHash\r\n );\r\n const latestRecord = await getLatestRecord(nodeId);\r\n\r\n if (isValid) {\r\n if (callback)\r\n callback({\r\n ok: true,\r\n message: \"Data verified on blockchain\",\r\n timestamp,\r\n updater,\r\n latestRecord,\r\n });\r\n } else {\r\n if (callback)\r\n callback({\r\n ok: false,\r\n message: \"Data not verified on blockchain\",\r\n latestRecord,\r\n });\r\n }\r\n } catch (error) {\r\n if (callback) callback({ err: error.message });\r\n }\r\n });\r\n } else if (data && !nodeId) {\r\n // Case 2: User passes only text (data)\r\n const newNodeId = generateRandomId();\r\n const dataString = JSON.stringify(data);\r\n const contentHash = keccak256(toUtf8Bytes(dataString));\r\n\r\n gun\r\n .get(newNodeId)\r\n .put({ ...data, _contentHash: contentHash }, async (ack) => {\r\n console.log(\"ack\", ack);\r\n if (ack.err) {\r\n if (callback) callback({ err: \"Error saving data to GunDB\" });\r\n return;\r\n }\r\n\r\n try {\r\n const tx = await writeOnChain(newNodeId, contentHash);\r\n if (callback)\r\n callback({\r\n ok: true,\r\n message: \"Data written to GunDB and blockchain\",\r\n nodeId: newNodeId,\r\n txHash: tx.hash,\r\n });\r\n } catch (error) {\r\n if (callback) callback({ err: error.message });\r\n }\r\n });\r\n } else {\r\n if (callback)\r\n callback({\r\n err: \"Invalid input. Provide either nodeId or data, not both.\",\r\n });\r\n }\r\n\r\n return gun;\r\n } catch (error) {\r\n callback({ err: error.message });\r\n return this;\r\n }\r\n};\r\n\r\n// =============================================\r\n// STEALTH ADDRESS CORE FUNCTIONS\r\n// =============================================\r\n/**\r\n * Converts a Gun private key to an Ethereum account.\r\n * @param {string} gunPrivateKey - The Gun private key in base64url format.\r\n * @returns {Object} An object containing the Ethereum account and public key.\r\n */\r\nGun.chain.gunToEthAccount = function (gunPrivateKey) {\r\n return gunToEthAccount(gunPrivateKey);\r\n};\r\n\r\n/**\r\n * Generate a stealth key and related key pairs\r\n * @param {string} recipientAddress - The recipient's Ethereum address\r\n * @param {string} signature - The sender's signature to access their keys\r\n * @returns {Promise<Object>} Object containing stealth addresses and keys\r\n */\r\nGun.chain.generateStealthAddress = async function (recipientAddress, signature) {\r\n try {\r\n const gun = this;\r\n \r\n // Get recipient's public keys\r\n const recipientData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(recipientAddress)\r\n .get(\"publicKeys\")\r\n .then();\r\n\r\n if (!recipientData || !recipientData.viewingPublicKey || !recipientData.spendingPublicKey) {\r\n throw new Error(\"Recipient's public keys not found\");\r\n }\r\n\r\n // Get sender's keys\r\n const senderAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const password = generatePassword(signature);\r\n \r\n const senderData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(senderAddress)\r\n .then();\r\n\r\n if (!senderData || !senderData.s_pair) {\r\n throw new Error(\"Sender's keys not found\");\r\n }\r\n\r\n // Decrypt sender's spending pair\r\n let spendingKeyPair;\r\n try {\r\n const decryptedData = await SEA.decrypt(senderData.s_pair, password);\r\n spendingKeyPair = typeof decryptedData === 'string' ? \r\n JSON.parse(decryptedData) : \r\n decryptedData;\r\n } catch (error) {\r\n console.error(\"Error decrypting spending pair:\", error);\r\n throw new Error(\"Unable to decrypt spending pair\");\r\n }\r\n\r\n // Generate shared secret using SEA ECDH with encryption public key\r\n const sharedSecret = await SEA.secret(recipientData.viewingPublicKey, spendingKeyPair);\r\n\r\n if (!sharedSecret) {\r\n throw new Error(\"Unable to generate shared secret\");\r\n }\r\n\r\n console.log(\"Generate shared secret:\", sharedSecret);\r\n\r\n const { stealthAddress } = deriveStealthAddress(\r\n sharedSecret,\r\n recipientData.spendingPublicKey\r\n );\r\n\r\n return {\r\n stealthAddress,\r\n senderPublicKey: spendingKeyPair.epub, // Use encryption public key\r\n spendingPublicKey: recipientData.spendingPublicKey\r\n };\r\n\r\n } catch (error) {\r\n console.error(\"Error generating stealth address:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Publish public keys needed to receive stealth payments\r\n * @param {string} signature - The signature to authenticate the user\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.publishStealthKeys = async function (signature) {\r\n try {\r\n const gun = this;\r\n const address = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const password = generatePassword(signature);\r\n\r\n // Get encrypted key pairs\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(address)\r\n .then();\r\n\r\n if (!encryptedData || !encryptedData.v_pair || !encryptedData.s_pair) {\r\n throw new Error(\"Keys not found\");\r\n }\r\n\r\n // Decrypt viewing and spending pairs\r\n const viewingKeyPair = JSON.parse(\r\n await SEA.decrypt(encryptedData.v_pair, password)\r\n );\r\n const spendingKeyPair = JSON.parse(\r\n await SEA.decrypt(encryptedData.s_pair, password)\r\n );\r\n\r\n const viewingAccount = gunToEthAccount(viewingKeyPair.priv);\r\n const spendingAccount = gunToEthAccount(spendingKeyPair.priv);\r\n\r\n // Publish only public keys\r\n gun.get(\"gun-eth\").get(\"users\").get(address).get(\"publicKeys\").put({\r\n viewingPublicKey: viewingAccount.publicKey,\r\n spendingPublicKey: spendingAccount.publicKey,\r\n });\r\n\r\n console.log(\"Stealth public keys published successfully\");\r\n } catch (error) {\r\n console.error(\"Error publishing stealth keys:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n// =============================================\r\n// STEALTH PAYMENT FUNCTIONS\r\n// =============================================\r\n/**\r\n * Recover funds from a stealth address\r\n * @param {string} stealthAddress - The stealth address to recover funds from\r\n * @param {string} senderPublicKey - The sender's public key used to generate the address\r\n * @param {string} signature - The signature to decrypt private keys\r\n * @returns {Promise<Object>} Object containing wallet to access funds\r\n */\r\nGun.chain.recoverStealthFunds = async function (\r\n stealthAddress,\r\n senderPublicKey,\r\n signature,\r\n spendingPublicKey\r\n) {\r\n try {\r\n const gun = this;\r\n const password = generatePassword(signature);\r\n\r\n // Get own key pairs\r\n const myAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(myAddress)\r\n .then();\r\n\r\n if (!encryptedData || !encryptedData.v_pair || !encryptedData.s_pair) {\r\n throw new Error(\"Keys not found\");\r\n }\r\n\r\n // Decrypt viewing and spending pairs\r\n let viewingKeyPair;\r\n try {\r\n const decryptedViewingData = await SEA.decrypt(encryptedData.v_pair, password);\r\n viewingKeyPair = typeof decryptedViewingData === 'string' ? \r\n JSON.parse(decryptedViewingData) : \r\n decryptedViewingData;\r\n } catch (error) {\r\n console.error(\"Error decrypting keys:\", error);\r\n throw new Error(\"Unable to decrypt keys\");\r\n }\r\n\r\n // Generate shared secret using SEA ECDH\r\n const sharedSecret = await SEA.secret(senderPublicKey, viewingKeyPair);\r\n\r\n if (!sharedSecret) {\r\n throw new Error(\"Unable to generate shared secret\");\r\n }\r\n\r\n console.log(\"Recover shared secret:\", sharedSecret);\r\n\r\n const { wallet, stealthAddress: recoveredAddress } = deriveStealthAddress(\r\n sharedSecret,\r\n spendingPublicKey\r\n );\r\n\r\n // Verify address matches\r\n if (recoveredAddress.toLowerCase() !== stealthAddress.toLowerCase()) {\r\n console.error(\"Mismatch:\", {\r\n recovered: recoveredAddress,\r\n expected: stealthAddress,\r\n sharedSecret\r\n });\r\n throw new Error(\"Recovered stealth address does not match\");\r\n }\r\n\r\n return {\r\n wallet,\r\n address: recoveredAddress,\r\n };\r\n } catch (error) {\r\n console.error(\"Error recovering stealth funds:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Announce a stealth payment\r\n * @param {string} stealthAddress - The generated stealth address\r\n * @param {string} senderPublicKey - The sender's public key\r\n * @param {string} spendingPublicKey - The spending public key\r\n * @param {string} signature - The sender's signature\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.announceStealthPayment = async function (\r\n stealthAddress,\r\n senderPublicKey,\r\n spendingPublicKey,\r\n signature,\r\n options = { onChain: false, chain: 'optimismSepolia' }\r\n) {\r\n try {\r\n const gun = this;\r\n const senderAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n\r\n if (options.onChain) {\r\n // On-chain announcement\r\n const signer = await getSigner();\r\n const chainConfig = getAddressesForChain(options.chain);\r\n const contractAddress = chainConfig.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n console.log(\"Using contract address:\", contractAddress);\r\n\r\n const contract = new Contract(\r\n contractAddress,\r\n STEALTH_ANNOUNCER_ABI,\r\n signer\r\n );\r\n\r\n // Get dev fee from contract\r\n const devFee = await contract.devFee();\r\n console.log(\"Dev fee:\", devFee.toString());\r\n\r\n // Call contract\r\n const tx = await contract.announcePayment(\r\n senderPublicKey,\r\n spendingPublicKey,\r\n stealthAddress,\r\n { value: devFee }\r\n );\r\n \r\n console.log(\"Transaction sent:\", tx.hash);\r\n const receipt = await tx.wait();\r\n console.log(\"Transaction confirmed:\", receipt.hash);\r\n \r\n console.log(\"Stealth payment announced on-chain (dev fee paid)\");\r\n } else {\r\n // Off-chain announcement (GunDB)\r\n gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .set({\r\n stealthAddress,\r\n senderAddress,\r\n senderPublicKey,\r\n spendingPublicKey,\r\n timestamp: Date.now(),\r\n });\r\n console.log(\"Stealth payment announced off-chain\");\r\n }\r\n } catch (error) {\r\n console.error(\"Error announcing stealth payment:\", error);\r\n console.error(\"Error details:\", error.stack);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get all stealth payments for an address\r\n * @param {string} signature - The signature to authenticate the user\r\n * @returns {Promise<Array>} List of stealth payments\r\n */\r\nGun.chain.getStealthPayments = async function (signature, options = { source: 'both' }) {\r\n try {\r\n const payments = [];\r\n\r\n if (options.source === 'onChain' || options.source === 'both') {\r\n const signer = await getSigner();\r\n const chainConfig = getAddressesForChain(options.chain || 'optimismSepolia');\r\n const contractAddress = chainConfig.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n const contract = new Contract(\r\n contractAddress,\r\n STEALTH_ANNOUNCER_ABI,\r\n signer\r\n );\r\n \r\n try {\r\n // Get total number of announcements\r\n const totalAnnouncements = await contract.getAnnouncementsCount();\r\n const totalCount = Number(totalAnnouncements.toString());\r\n console.log(\"Total on-chain announcements:\", totalCount);\r\n \r\n if (totalCount > 0) {\r\n // Get announcements in batches of 100\r\n const batchSize = 100;\r\n const lastIndex = totalCount - 1;\r\n \r\n for(let i = 0; i <= lastIndex; i += batchSize) {\r\n const toIndex = Math.min(i + batchSize - 1, lastIndex);\r\n const batch = await contract.getAnnouncementsInRange(i, toIndex);\r\n \r\n // For each announcement, try to decrypt\r\n for(const announcement of batch) {\r\n try {\r\n // Verify announcement is valid\r\n if (!announcement || !announcement.stealthAddress || \r\n !announcement.senderPublicKey || !announcement.spendingPublicKey) {\r\n console.log(\"Invalid announcement:\", announcement);\r\n continue;\r\n }\r\n\r\n // Try to recover funds to verify if announcement is for us\r\n const recoveredWallet = await this.recoverStealthFunds(\r\n announcement.stealthAddress,\r\n announcement.senderPublicKey,\r\n signature,\r\n announcement.spendingPublicKey\r\n );\r\n \r\n // If no errors thrown, announcement is for us\r\n payments.push({\r\n stealthAddress: announcement.stealthAddress,\r\n senderPublicKey: announcement.senderPublicKey,\r\n spendingPublicKey: announcement.spendingPublicKey,\r\n timestamp: Number(announcement.timestamp),\r\n source: 'onChain',\r\n wallet: recoveredWallet\r\n });\r\n\r\n } catch (e) {\r\n // Not for us, continue\r\n console.log(`Announcement not for us: ${announcement.stealthAddress}`);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\"Error retrieving on-chain announcements:\", error);\r\n }\r\n }\r\n\r\n if (options.source === 'offChain' || options.source === 'both') {\r\n // Get off-chain payments\r\n const gun = this;\r\n const offChainPayments = await new Promise((resolve) => {\r\n const p = [];\r\n gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .map()\r\n .once((payment, id) => {\r\n if (payment?.stealthAddress) {\r\n p.push({ ...payment, id, source: 'offChain' });\r\n }\r\n });\r\n setTimeout(() => resolve(p), 2000);\r\n });\r\n \r\n payments.push(...offChainPayments);\r\n }\r\n\r\n console.log(`Found ${payments.length} stealth payments`);\r\n return payments;\r\n } catch (error) {\r\n console.error(\"Error retrieving stealth payments:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Clean up old stealth payments\r\n * @param {string} recipientAddress - The recipient's address\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.cleanStealthPayments = async function(recipientAddress) {\r\n try {\r\n const gun = this;\r\n const payments = await gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .map()\r\n .once()\r\n .then();\r\n\r\n // Remove empty or invalid nodes\r\n if (payments) {\r\n Object.keys(payments).forEach(async (key) => {\r\n const payment = payments[key];\r\n if (!payment || !payment.stealthAddress || !payment.senderPublicKey || !payment.spendingPublicKey) {\r\n await gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .get(key)\r\n .put(null);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.error(\"Error cleaning stealth payments:\", error);\r\n }\r\n};\r\n\r\n// =============================================\r\n// EXPORTS\r\n// =============================================\r\n\r\n// Crea una classe GunEth che contiene tutti i metodi e le utility\r\nexport class GunEth {\r\n // Static utility methods\r\n static generateRandomId = generateRandomId;\r\n static generatePassword = generatePassword;\r\n static gunToEthAccount = gunToEthAccount;\r\n static getSigner = getSigner;\r\n static deriveStealthAddress = deriveStealthAddress;\r\n \r\n // Chain methods\r\n static chainMethods = {\r\n setSigner: Gun.chain.setSigner,\r\n getSigner: Gun.chain.getSigner,\r\n verifySignature: Gun.chain.verifySignature,\r\n generatePassword: Gun.chain.generatePassword,\r\n createSignature: Gun.chain.createSignature,\r\n createAndStoreEncryptedPair: Gun.chain.createAndStoreEncryptedPair,\r\n getAndDecryptPair: Gun.chain.getAndDecryptPair,\r\n proof: Gun.chain.proof,\r\n gunToEthAccount: Gun.chain.gunToEthAccount,\r\n generateStealthAddress: Gun.chain.generateStealthAddress,\r\n publishStealthKeys: Gun.chain.publishStealthKeys,\r\n recoverStealthFunds: Gun.chain.recoverStealthFunds,\r\n announceStealthPayment: Gun.chain.announceStealthPayment,\r\n getStealthPayments: Gun.chain.getStealthPayments,\r\n cleanStealthPayments: Gun.chain.cleanStealthPayments\r\n };\r\n\r\n // Constants\r\n static MESSAGE_TO_SIGN = MESSAGE_TO_SIGN;\r\n static PROOF_CONTRACT_ADDRESS = PROOF_CONTRACT_ADDRESS;\r\n static LOCAL_CONFIG = LOCAL_CONFIG;\r\n}\r\n\r\n// Esporta Gun come default\r\nexport default Gun;\r\n"],"names":["contractAddresses","fileURLToPath","dirname","readFileSync","ethers","Wallet","BrowserProvider","getBytes","keccak256","concat","verifyMessage","Contract"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gun-eth.cjs.js","sources":["../src/config/local.js","../src/abis/abis.js","../src/index.js"],"sourcesContent":["let contractAddresses = {\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512\",\r\n STEALTH_ANNOUNCER_ADDRESS: \"0x5FbDB2315678afecb367f032d93F642f64180aa3\"\r\n};\r\n\r\nif (typeof window === 'undefined') {\r\n const { fileURLToPath } = require('url');\r\n const { dirname } = require('path');\r\n const { readFileSync } = require('fs');\r\n const { join } = require('path');\r\n\r\n try {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n const rawdata = readFileSync(join(__dirname, 'contract-address.json'), 'utf8');\r\n contractAddresses = JSON.parse(rawdata);\r\n console.log(\"Loaded contract addresses:\", contractAddresses);\r\n } catch (error) {\r\n console.warn(\"Warning: contract-address.json not found or invalid\");\r\n }\r\n}\r\n\r\nexport const LOCAL_CONFIG = {\r\n CHAIN_ID: 1337,\r\n PROOF_OF_INTEGRITY_ADDRESS: contractAddresses.PROOF_OF_INTEGRITY_ADDRESS,\r\n STEALTH_ANNOUNCER_ADDRESS: contractAddresses.STEALTH_ANNOUNCER_ADDRESS,\r\n RPC_URL: \"http://127.0.0.1:8545\",\r\n GUN_PEER: \"http://localhost:8765/gun\"\r\n}; ","import { LOCAL_CONFIG } from '../config/local.js';\r\n\r\n// Indirizzi di produzione per diverse chain\r\nexport const CHAIN_CONFIG = {\r\n optimismSepolia: {\r\n STEALTH_ANNOUNCER_ADDRESS: \"0xD0F2e9DA59d2DFECFdE67CcF17300BB6093A72f8\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0x...\",\r\n RPC_URL: \"https://sepolia.optimism.io\",\r\n CHAIN_ID: 11155420\r\n },\r\n arbitrumSepolia: {\r\n STEALTH_ANNOUNCER_ADDRESS: \"0x...\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"0x...\",\r\n RPC_URL: \"https://sepolia-rollup.arbitrum.io/rpc\",\r\n CHAIN_ID: 421614\r\n },\r\n localhost: {\r\n RPC_URL: \"http://127.0.0.1:8545\",\r\n CHAIN_ID: 1337\r\n }\r\n};\r\n\r\n// Esporta gli indirizzi di default (Optimism Sepolia)\r\nexport const STEALTH_ANNOUNCER_ADDRESS = CHAIN_CONFIG.optimismSepolia.STEALTH_ANNOUNCER_ADDRESS;\r\nexport const PROOF_OF_INTEGRITY_ADDRESS = CHAIN_CONFIG.optimismSepolia.PROOF_OF_INTEGRITY_ADDRESS;\r\n\r\n// Funzione per ottenere gli indirizzi corretti\r\nexport function getAddressesForChain(chainName) {\r\n let config;\r\n\r\n // Se è localhost, prova a caricare gli indirizzi locali\r\n if (chainName === 'localhost') {\r\n try {\r\n // Carica gli indirizzi dal file generato dal deploy locale\r\n const localAddresses = require('../config/contract-address.json');\r\n config = {\r\n ...CHAIN_CONFIG.localhost,\r\n ...localAddresses\r\n };\r\n console.log(\"Using local addresses:\", config);\r\n return config;\r\n } catch (err) {\r\n console.warn('No local addresses found');\r\n throw new Error('No local addresses found. Did you run local deployment?');\r\n }\r\n }\r\n\r\n // Altrimenti usa gli indirizzi di produzione\r\n config = CHAIN_CONFIG[chainName];\r\n if (!config) {\r\n throw new Error(`Chain ${chainName} not supported. Supported chains: ${Object.keys(CHAIN_CONFIG).join(', ')}`);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n// Funzione helper per verificare se siamo in ambiente locale\r\nexport function isLocalEnvironment() {\r\n return process.env.NODE_ENV === 'development' && \r\n typeof window !== 'undefined' && \r\n window.location.hostname === 'localhost';\r\n}\r\n\r\nexport const STEALTH_ANNOUNCER_ABI = [\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"_devAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"constructor\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"timestamp\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"StealthPaymentAnnounced\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"newAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"DevAddressUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"newFee\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"DevFeeUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"announcePayment\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"payable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"devAddress\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"devFee\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"getAnnouncementsCount\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"fromIndex\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"toIndex\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"getAnnouncementsInRange\",\r\n \"outputs\": [\r\n {\r\n \"components\": [\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"senderPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"string\",\r\n \"name\": \"spendingPublicKey\",\r\n \"type\": \"string\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"stealthAddress\",\r\n \"type\": \"address\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"timestamp\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"internalType\": \"struct StealthAnnouncer.StealthAnnouncement[]\",\r\n \"name\": \"\",\r\n \"type\": \"tuple[]\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"_newFee\",\r\n \"type\": \"uint256\"\r\n }\r\n ],\r\n \"name\": \"updateDevFee\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"_newAddress\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"updateDevAddress\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [],\r\n \"name\": \"withdrawStuckETH\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n }\r\n];\r\n\r\nexport const PROOF_OF_INTEGRITY_ABI = [\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes[]\",\r\n \"name\": \"nodeIds\",\r\n \"type\": \"bytes[]\"\r\n },\r\n {\r\n \"internalType\": \"bytes32[]\",\r\n \"name\": \"contentHashes\",\r\n \"type\": \"bytes32[]\"\r\n }\r\n ],\r\n \"name\": \"batchUpdateData\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"anonymous\": false,\r\n \"inputs\": [\r\n {\r\n \"indexed\": true,\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"indexed\": false,\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n },\r\n {\r\n \"indexed\": false,\r\n \"internalType\": \"address\",\r\n \"name\": \"updater\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"name\": \"DataUpdated\",\r\n \"type\": \"event\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n }\r\n ],\r\n \"name\": \"getLatestRecord\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"\",\r\n \"type\": \"bytes32\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n }\r\n ],\r\n \"name\": \"updateData\",\r\n \"outputs\": [],\r\n \"stateMutability\": \"nonpayable\",\r\n \"type\": \"function\"\r\n },\r\n {\r\n \"inputs\": [\r\n {\r\n \"internalType\": \"bytes\",\r\n \"name\": \"nodeId\",\r\n \"type\": \"bytes\"\r\n },\r\n {\r\n \"internalType\": \"bytes32\",\r\n \"name\": \"contentHash\",\r\n \"type\": \"bytes32\"\r\n }\r\n ],\r\n \"name\": \"verifyData\",\r\n \"outputs\": [\r\n {\r\n \"internalType\": \"bool\",\r\n \"name\": \"\",\r\n \"type\": \"bool\"\r\n },\r\n {\r\n \"internalType\": \"uint256\",\r\n \"name\": \"\",\r\n \"type\": \"uint256\"\r\n },\r\n {\r\n \"internalType\": \"address\",\r\n \"name\": \"\",\r\n \"type\": \"address\"\r\n }\r\n ],\r\n \"stateMutability\": \"view\",\r\n \"type\": \"function\"\r\n }\r\n];\r\n\r\n\r\nexport const SHINE_OPTIMISM_SEPOLIA = \"0x43D838b683F772F08f321E5FA265ad3e333BE9C2\";\r\n","// =============================================\r\n// IMPORTS AND GLOBAL VARIABLES\r\n// =============================================\r\nimport Gun from \"gun\";\r\nimport SEA from \"gun/sea.js\";\r\nimport { ethers } from \"ethers\";\r\nimport { \r\n PROOF_OF_INTEGRITY_ABI, \r\n STEALTH_ANNOUNCER_ABI, \r\n getAddressesForChain, \r\n isLocalEnvironment,\r\n CHAIN_CONFIG\r\n} from \"./abis/abis.js\";\r\nimport { LOCAL_CONFIG } from \"./config/local.js\";\r\nimport { fileURLToPath } from 'url';\r\nimport { dirname } from 'path';\r\nimport { readFileSync } from 'fs';\r\n\r\nlet PROOF_CONTRACT_ADDRESS;\r\nlet rpcUrl = \"\";\r\nlet privateKey = \"\";\r\n\r\nexport const MESSAGE_TO_SIGN = \"Access GunDB with Ethereum\";\r\n\r\nlet contractAddresses = {\r\n PROOF_OF_INTEGRITY_ADDRESS: CHAIN_CONFIG.optimismSepolia.PROOF_OF_INTEGRITY_ADDRESS,\r\n STEALTH_ANNOUNCER_ADDRESS: CHAIN_CONFIG.optimismSepolia.STEALTH_ANNOUNCER_ADDRESS\r\n};\r\n\r\n// Solo per Node.js\r\nif (typeof window === 'undefined') {\r\n try {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n\r\n try {\r\n const rawdata = readFileSync(path.join(__dirname, 'contract-address.json'), 'utf8');\r\n contractAddresses = JSON.parse(rawdata);\r\n console.log('Loaded contract addresses:', contractAddresses);\r\n } catch (err) {\r\n console.warn('Warning: contract-address.json not found or invalid');\r\n }\r\n } catch (error) {\r\n console.error('Error loading Node.js modules:', error);\r\n }\r\n}\r\n\r\n// =============================================\r\n// UTILITY FUNCTIONS\r\n// =============================================\r\n/**\r\n * Generates a random node ID for GunDB\r\n * @returns {string} A random hexadecimal string\r\n */\r\nexport function generateRandomId() {\r\n const randomBytes = ethers.randomBytes(32);\r\n return ethers.hexlify(randomBytes).slice(2);\r\n}\r\n\r\n/**\r\n * Generates a password from a signature.\r\n * @param {string} signature - The signature to derive the password from.\r\n * @returns {string|null} The generated password or null if generation fails.\r\n */\r\nexport function generatePassword(signature) {\r\n try {\r\n const signatureBytes = ethers.toUtf8Bytes(signature);\r\n const hash = ethers.keccak256(signatureBytes);\r\n console.log(\"Generated password:\", hash);\r\n return hash;\r\n } catch (error) {\r\n console.error(\"Error generating password:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Converts a Gun private key to an Ethereum account.\r\n * @param {string} gunPrivateKey - The Gun private key in base64url format.\r\n * @returns {Object} An object containing the Ethereum account and public key.\r\n */\r\nexport function gunToEthAccount(gunPrivateKey) {\r\n // Function to convert base64url to hex\r\n const base64UrlToHex = (base64url) => {\r\n const padding = \"=\".repeat((4 - (base64url.length % 4)) % 4);\r\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\") + padding;\r\n const binary = atob(base64);\r\n return Array.from(binary, (char) =>\r\n char.charCodeAt(0).toString(16).padStart(2, \"0\")\r\n ).join(\"\");\r\n };\r\n\r\n // Convert Gun private key to hex format\r\n const hexPrivateKey = \"0x\" + base64UrlToHex(gunPrivateKey);\r\n\r\n // Create an Ethereum wallet from the private key\r\n const wallet = new ethers.Wallet(hexPrivateKey);\r\n\r\n // Get the public address (public key)\r\n const publicKey = wallet.address;\r\n\r\n return {\r\n account: wallet,\r\n publicKey: publicKey,\r\n privateKey: hexPrivateKey,\r\n };\r\n}\r\n\r\n/**\r\n * Gets an Ethereum signer based on current configuration\r\n * @returns {Promise<ethers.Signer>} The configured signer\r\n * @throws {Error} If no valid provider is found\r\n */\r\nexport const getSigner = async () => {\r\n if (rpcUrl && privateKey) {\r\n const provider = new ethers.JsonRpcProvider(rpcUrl, {\r\n chainId: LOCAL_CONFIG.CHAIN_ID,\r\n name: \"localhost\"\r\n });\r\n return new Wallet(privateKey, provider);\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof window.ethereum !== \"undefined\"\r\n ) {\r\n await window.ethereum.request({ method: \"eth_requestAccounts\" });\r\n const provider = new ethers.BrowserProvider(window.ethereum);\r\n return provider.getSigner();\r\n } else {\r\n throw new Error(\"No valid Ethereum provider found\");\r\n }\r\n};\r\n\r\n/**\r\n * Utility function to generate stealth address\r\n * @param {string} sharedSecret - The shared secret\r\n * @param {string} spendingPublicKey - The spending public key\r\n * @returns {Object} The stealth address and private key\r\n */\r\nexport function deriveStealthAddress(sharedSecret, spendingPublicKey) {\r\n try {\r\n const sharedSecretBytes = ethers.toUtf8Bytes(sharedSecret);\r\n const spendingPublicKeyBytes = ethers.toUtf8Bytes(spendingPublicKey);\r\n \r\n const stealthPrivateKey = ethers.keccak256(\r\n ethers.concat([\r\n sharedSecretBytes,\r\n spendingPublicKeyBytes\r\n ])\r\n );\r\n \r\n const stealthWallet = new Wallet(stealthPrivateKey);\r\n\r\n console.log(\"Debug deriveStealthAddress:\", {\r\n sharedSecretHex: stealthPrivateKey,\r\n spendingPublicKey,\r\n stealthPrivateKey,\r\n stealthAddress: stealthWallet.address\r\n });\r\n\r\n return {\r\n stealthPrivateKey,\r\n stealthAddress: stealthWallet.address,\r\n wallet: stealthWallet\r\n };\r\n } catch (error) {\r\n console.error(\"Error in deriveStealthAddress:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n// =============================================\r\n// BASIC GUN-ETH CHAIN METHODS\r\n// =============================================\r\n\r\n// Set the message to sign\r\nGun.chain.MESSAGE_TO_SIGN = MESSAGE_TO_SIGN;\r\n\r\n/**\r\n * Sets standalone configuration for Gun.\r\n * @param {string} newRpcUrl - The new RPC URL.\r\n * @param {string} newPrivateKey - The new private key.\r\n * @returns {Gun} The Gun instance for chaining.\r\n */\r\nGun.chain.setSigner = function (newRpcUrl, newPrivateKey) {\r\n rpcUrl = newRpcUrl;\r\n privateKey = newPrivateKey;\r\n console.log(\"Standalone configuration set\");\r\n return this;\r\n};\r\n\r\nGun.chain.getSigner = getSigner();\r\n\r\n/**\r\n * Verifies an Ethereum signature.\r\n * @param {string} message - The original message that was signed.\r\n * @param {string} signature - The signature to verify.\r\n * @returns {Promise<string|null>} The recovered address or null if verification fails.\r\n */\r\nGun.chain.verifySignature = async function (message, signature) {\r\n try {\r\n const recoveredAddress = ethers.verifyMessage(message, signature);\r\n return recoveredAddress;\r\n } catch (error) {\r\n console.error(\"Error verifying signature:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Generates a password from a signature.\r\n * @param {string} signature - The signature to derive the password from.\r\n * @returns {string|null} The generated password or null if generation fails.\r\n */\r\nGun.chain.generatePassword = function (signature) {\r\n return generatePassword(signature);\r\n};\r\n\r\n/**\r\n * Creates an Ethereum signature for a given message.\r\n * @param {string} message - The message to sign.\r\n * @returns {Promise<string|null>} The signature or null if signing fails.\r\n */\r\nGun.chain.createSignature = async function (message) {\r\n try {\r\n // Check if message matches MESSAGE_TO_SIGN\r\n if (message !== MESSAGE_TO_SIGN) {\r\n throw new Error(\"Invalid message, valid message is: \" + MESSAGE_TO_SIGN);\r\n }\r\n const signer = await getSigner();\r\n const signature = await signer.signMessage(message);\r\n console.log(\"Signature created:\", signature);\r\n return signature;\r\n } catch (error) {\r\n console.error(\"Error creating signature:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n// =============================================\r\n// KEY PAIR MANAGEMENT\r\n// =============================================\r\n/**\r\n * Creates and stores an encrypted key pair for a given address.\r\n * @param {string} address - The Ethereum address to associate with the key pair.\r\n * @param {string} signature - The signature to use for encryption.\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.createAndStoreEncryptedPair = async function (address, signature) {\r\n try {\r\n const gun = this;\r\n const pair = await SEA.pair();\r\n const v_pair = await SEA.pair();\r\n const s_pair = await SEA.pair();\r\n const password = generatePassword(signature);\r\n\r\n // Save original SEA pairs\r\n const encryptedPair = await SEA.encrypt(JSON.stringify(pair), password);\r\n const encryptedV_pair = await SEA.encrypt(JSON.stringify(v_pair), password);\r\n const encryptedS_pair = await SEA.encrypt(JSON.stringify(s_pair), password);\r\n\r\n // Convert only to get Ethereum addresses\r\n const viewingAccount = gunToEthAccount(v_pair.priv);\r\n const spendingAccount = gunToEthAccount(s_pair.priv);\r\n\r\n gun.get(\"gun-eth\").get(\"users\").get(address).put({\r\n pair: encryptedPair,\r\n v_pair: encryptedV_pair,\r\n s_pair: encryptedS_pair,\r\n publicKeys: {\r\n viewingPublicKey: v_pair.epub, // Use SEA encryption public key\r\n viewingPublicKey: v_pair.epub, // Use SEA encryption public key\r\n spendingPublicKey: spendingAccount.publicKey, // Use Ethereum address\r\n ethViewingAddress: viewingAccount.publicKey // Also save Ethereum address\r\n }\r\n });\r\n\r\n console.log(\"Encrypted pairs and public keys stored for:\", address);\r\n } catch (error) {\r\n console.error(\"Error creating and storing encrypted pair:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves and decrypts a stored key pair for a given address.\r\n * @param {string} address - The Ethereum address associated with the key pair.\r\n * @param {string} signature - The signature to use for decryption.\r\n * @returns {Promise<Object|null>} The decrypted key pair or null if retrieval fails.\r\n */\r\nGun.chain.getAndDecryptPair = async function (address, signature) {\r\n try {\r\n const gun = this;\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(address)\r\n .get(\"pair\")\r\n .then();\r\n if (!encryptedData) {\r\n throw new Error(\"No encrypted data found for this address\");\r\n }\r\n const password = generatePassword(signature);\r\n const decryptedPair = await SEA.decrypt(encryptedData, password);\r\n console.log(decryptedPair);\r\n return decryptedPair;\r\n } catch (error) {\r\n console.error(\"Error retrieving and decrypting pair:\", error);\r\n return null;\r\n }\r\n};\r\n\r\n// =============================================\r\n// PROOF OF INTEGRITY\r\n// =============================================\r\n/**\r\n * Proof of Integrity\r\n * @param {string} chain - The blockchain to use (e.g., \"optimismSepolia\").\r\n * @param {string} nodeId - The ID of the node to verify or write.\r\n * @param {Object} data - The data to write (if writing).\r\n * @param {Function} callback - Callback function to handle the result.\r\n * @returns {Gun} The Gun instance for chaining.\r\n */\r\nGun.chain.proof = function (chain, nodeId, data, callback) {\r\n console.log(\"Proof plugin called with:\", { chain, nodeId, data });\r\n\r\n if (typeof callback !== \"function\") {\r\n console.error(\"Callback must be a function\");\r\n return this;\r\n }\r\n\r\n try {\r\n // Se siamo in localhost e in development, usa automaticamente la chain locale\r\n const targetChain = isLocalEnvironment() ? 'localhost' : chain;\r\n const chainConfig = getAddressesForChain(targetChain);\r\n \r\n console.log(`Using ${targetChain} configuration:`, chainConfig);\r\n\r\n // Usa gli indirizzi dalla configurazione\r\n const contract = new ethers.Contract(\r\n chainConfig.PROOF_OF_INTEGRITY_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n\r\n // Funzione per verificare on-chain\r\n const verifyOnChain = async (nodeId, contentHash) => {\r\n console.log(\"Verifying on chain:\", { nodeId, contentHash });\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const [isValid, timestamp, updater] = await contract.verifyData(\r\n ethers.toUtf8Bytes(nodeId),\r\n contentHash\r\n );\r\n console.log(\"Verification result:\", { isValid, timestamp, updater });\r\n return { isValid, timestamp, updater };\r\n };\r\n\r\n // Funzione per scrivere on-chain\r\n const writeOnChain = async (nodeId, contentHash) => {\r\n console.log(\"Writing on chain:\", { nodeId, contentHash });\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const tx = await contract.updateData(\r\n toUtf8Bytes(nodeId),\r\n contentHash\r\n );\r\n console.log(\"Transaction sent:\", tx.hash);\r\n const receipt = await tx.wait();\r\n console.log(\"Transaction confirmed:\", receipt);\r\n return tx;\r\n };\r\n\r\n // Funzione per ottenere l'ultimo record\r\n const getLatestRecord = async (nodeId) => {\r\n const signer = await getSigner();\r\n const contract = new Contract(\r\n PROOF_CONTRACT_ADDRESS,\r\n PROOF_OF_INTEGRITY_ABI,\r\n signer\r\n );\r\n const [contentHash, timestamp, updater] = await contract.getLatestRecord(\r\n toUtf8Bytes(nodeId)\r\n );\r\n console.log(\"Latest record from blockchain:\", {\r\n nodeId,\r\n contentHash,\r\n timestamp,\r\n updater,\r\n });\r\n return { contentHash, timestamp, updater };\r\n };\r\n\r\n \r\n if (nodeId && !data) {\r\n // Case 1: User passes only node\r\n gun.get(nodeId).once(async (existingData) => {\r\n if (!existingData) {\r\n if (callback) callback({ err: \"Node not found in GunDB\" });\r\n return;\r\n }\r\n\r\n console.log(\"existingData\", existingData);\r\n\r\n // Use stored contentHash instead of recalculating\r\n const contentHash = existingData._contentHash;\r\n console.log(\"contentHash\", contentHash);\r\n\r\n if (!contentHash) {\r\n if (callback) callback({ err: \"No content hash found for this node\" });\r\n return;\r\n }\r\n\r\n try {\r\n const { isValid, timestamp, updater } = await verifyOnChain(\r\n nodeId,\r\n contentHash\r\n );\r\n const latestRecord = await getLatestRecord(nodeId);\r\n\r\n if (isValid) {\r\n if (callback)\r\n callback({\r\n ok: true,\r\n message: \"Data verified on blockchain\",\r\n timestamp,\r\n updater,\r\n latestRecord,\r\n });\r\n } else {\r\n if (callback)\r\n callback({\r\n ok: false,\r\n message: \"Data not verified on blockchain\",\r\n latestRecord,\r\n });\r\n }\r\n } catch (error) {\r\n if (callback) callback({ err: error.message });\r\n }\r\n });\r\n } else if (data && !nodeId) {\r\n // Case 2: User passes only text (data)\r\n const newNodeId = generateRandomId();\r\n const dataString = JSON.stringify(data);\r\n const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));\r\n\r\n gun\r\n .get(newNodeId)\r\n .put({ ...data, _contentHash: contentHash }, async (ack) => {\r\n console.log(\"ack\", ack);\r\n if (ack.err) {\r\n if (callback) callback({ err: \"Error saving data to GunDB\" });\r\n return;\r\n }\r\n\r\n try {\r\n const tx = await writeOnChain(newNodeId, contentHash);\r\n if (callback)\r\n callback({\r\n ok: true,\r\n message: \"Data written to GunDB and blockchain\",\r\n nodeId: newNodeId,\r\n txHash: tx.hash,\r\n });\r\n } catch (error) {\r\n if (callback) callback({ err: error.message });\r\n }\r\n });\r\n } else {\r\n if (callback)\r\n callback({\r\n err: \"Invalid input. Provide either nodeId or data, not both.\",\r\n });\r\n }\r\n\r\n return gun;\r\n } catch (error) {\r\n callback({ err: error.message });\r\n return this;\r\n }\r\n};\r\n\r\n// =============================================\r\n// STEALTH ADDRESS CORE FUNCTIONS\r\n// =============================================\r\n/**\r\n * Converts a Gun private key to an Ethereum account.\r\n * @param {string} gunPrivateKey - The Gun private key in base64url format.\r\n * @returns {Object} An object containing the Ethereum account and public key.\r\n */\r\nGun.chain.gunToEthAccount = function (gunPrivateKey) {\r\n return gunToEthAccount(gunPrivateKey);\r\n};\r\n\r\n/**\r\n * Generate a stealth key and related key pairs\r\n * @param {string} recipientAddress - The recipient's Ethereum address\r\n * @param {string} signature - The sender's signature to access their keys\r\n * @returns {Promise<Object>} Object containing stealth addresses and keys\r\n */\r\nGun.chain.generateStealthAddress = async function (recipientAddress, signature) {\r\n try {\r\n const gun = this;\r\n \r\n // Get recipient's public keys\r\n const recipientData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(recipientAddress)\r\n .get(\"publicKeys\")\r\n .then();\r\n\r\n if (!recipientData || !recipientData.viewingPublicKey || !recipientData.spendingPublicKey) {\r\n throw new Error(\"Recipient's public keys not found\");\r\n }\r\n\r\n // Get sender's keys\r\n const senderAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const password = generatePassword(signature);\r\n \r\n const senderData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(senderAddress)\r\n .then();\r\n\r\n if (!senderData || !senderData.s_pair) {\r\n throw new Error(\"Sender's keys not found\");\r\n }\r\n\r\n // Decrypt sender's spending pair\r\n let spendingKeyPair;\r\n try {\r\n const decryptedData = await SEA.decrypt(senderData.s_pair, password);\r\n spendingKeyPair = typeof decryptedData === 'string' ? \r\n JSON.parse(decryptedData) : \r\n decryptedData;\r\n } catch (error) {\r\n console.error(\"Error decrypting spending pair:\", error);\r\n throw new Error(\"Unable to decrypt spending pair\");\r\n }\r\n\r\n // Generate shared secret using SEA ECDH with encryption public key\r\n const sharedSecret = await SEA.secret(recipientData.viewingPublicKey, spendingKeyPair);\r\n\r\n if (!sharedSecret) {\r\n throw new Error(\"Unable to generate shared secret\");\r\n }\r\n\r\n console.log(\"Generate shared secret:\", sharedSecret);\r\n\r\n const { stealthAddress } = deriveStealthAddress(\r\n sharedSecret,\r\n recipientData.spendingPublicKey\r\n );\r\n\r\n return {\r\n stealthAddress,\r\n senderPublicKey: spendingKeyPair.epub, // Use encryption public key\r\n spendingPublicKey: recipientData.spendingPublicKey\r\n };\r\n\r\n } catch (error) {\r\n console.error(\"Error generating stealth address:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Publish public keys needed to receive stealth payments\r\n * @param {string} signature - The signature to authenticate the user\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.publishStealthKeys = async function (signature) {\r\n try {\r\n const gun = this;\r\n const address = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const password = generatePassword(signature);\r\n\r\n // Get encrypted key pairs\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(address)\r\n .then();\r\n\r\n if (!encryptedData || !encryptedData.v_pair || !encryptedData.s_pair) {\r\n throw new Error(\"Keys not found\");\r\n }\r\n\r\n // Decrypt viewing and spending pairs\r\n const viewingKeyPair = JSON.parse(\r\n await SEA.decrypt(encryptedData.v_pair, password)\r\n );\r\n const spendingKeyPair = JSON.parse(\r\n await SEA.decrypt(encryptedData.s_pair, password)\r\n );\r\n\r\n const viewingAccount = gunToEthAccount(viewingKeyPair.priv);\r\n const spendingAccount = gunToEthAccount(spendingKeyPair.priv);\r\n\r\n // Publish only public keys\r\n gun.get(\"gun-eth\").get(\"users\").get(address).get(\"publicKeys\").put({\r\n viewingPublicKey: viewingAccount.publicKey,\r\n spendingPublicKey: spendingAccount.publicKey,\r\n });\r\n\r\n console.log(\"Stealth public keys published successfully\");\r\n } catch (error) {\r\n console.error(\"Error publishing stealth keys:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n// =============================================\r\n// STEALTH PAYMENT FUNCTIONS\r\n// =============================================\r\n/**\r\n * Recover funds from a stealth address\r\n * @param {string} stealthAddress - The stealth address to recover funds from\r\n * @param {string} senderPublicKey - The sender's public key used to generate the address\r\n * @param {string} signature - The signature to decrypt private keys\r\n * @returns {Promise<Object>} Object containing wallet to access funds\r\n */\r\nGun.chain.recoverStealthFunds = async function (\r\n stealthAddress,\r\n senderPublicKey,\r\n signature,\r\n spendingPublicKey\r\n) {\r\n try {\r\n const gun = this;\r\n const password = generatePassword(signature);\r\n\r\n // Get own key pairs\r\n const myAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n const encryptedData = await gun\r\n .get(\"gun-eth\")\r\n .get(\"users\")\r\n .get(myAddress)\r\n .then();\r\n\r\n if (!encryptedData || !encryptedData.v_pair || !encryptedData.s_pair) {\r\n throw new Error(\"Keys not found\");\r\n }\r\n\r\n // Decrypt viewing and spending pairs\r\n let viewingKeyPair;\r\n try {\r\n const decryptedViewingData = await SEA.decrypt(encryptedData.v_pair, password);\r\n viewingKeyPair = typeof decryptedViewingData === 'string' ? \r\n JSON.parse(decryptedViewingData) : \r\n decryptedViewingData;\r\n } catch (error) {\r\n console.error(\"Error decrypting keys:\", error);\r\n throw new Error(\"Unable to decrypt keys\");\r\n }\r\n\r\n // Generate shared secret using SEA ECDH\r\n const sharedSecret = await SEA.secret(senderPublicKey, viewingKeyPair);\r\n\r\n if (!sharedSecret) {\r\n throw new Error(\"Unable to generate shared secret\");\r\n }\r\n\r\n console.log(\"Recover shared secret:\", sharedSecret);\r\n\r\n const { wallet, stealthAddress: recoveredAddress } = deriveStealthAddress(\r\n sharedSecret,\r\n spendingPublicKey\r\n );\r\n\r\n // Verify address matches\r\n if (recoveredAddress.toLowerCase() !== stealthAddress.toLowerCase()) {\r\n console.error(\"Mismatch:\", {\r\n recovered: recoveredAddress,\r\n expected: stealthAddress,\r\n sharedSecret\r\n });\r\n throw new Error(\"Recovered stealth address does not match\");\r\n }\r\n\r\n return {\r\n wallet,\r\n address: recoveredAddress,\r\n };\r\n } catch (error) {\r\n console.error(\"Error recovering stealth funds:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Announce a stealth payment\r\n * @param {string} stealthAddress - The generated stealth address\r\n * @param {string} senderPublicKey - The sender's public key\r\n * @param {string} spendingPublicKey - The spending public key\r\n * @param {string} signature - The sender's signature\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.announceStealthPayment = async function (\r\n stealthAddress,\r\n senderPublicKey,\r\n spendingPublicKey,\r\n signature,\r\n options = { onChain: false, chain: 'optimismSepolia' }\r\n) {\r\n try {\r\n const gun = this;\r\n const senderAddress = await this.verifySignature(MESSAGE_TO_SIGN, signature);\r\n\r\n if (options.onChain) {\r\n // On-chain announcement\r\n const signer = await getSigner();\r\n const chainConfig = getAddressesForChain(options.chain);\r\n const contractAddress = chainConfig.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n console.log(\"Using contract address:\", contractAddress);\r\n\r\n const contract = new Contract(\r\n contractAddress,\r\n STEALTH_ANNOUNCER_ABI,\r\n signer\r\n );\r\n\r\n // Get dev fee from contract\r\n const devFee = await contract.devFee();\r\n console.log(\"Dev fee:\", devFee.toString());\r\n\r\n // Call contract\r\n const tx = await contract.announcePayment(\r\n senderPublicKey,\r\n spendingPublicKey,\r\n stealthAddress,\r\n { value: devFee }\r\n );\r\n \r\n console.log(\"Transaction sent:\", tx.hash);\r\n const receipt = await tx.wait();\r\n console.log(\"Transaction confirmed:\", receipt.hash);\r\n \r\n console.log(\"Stealth payment announced on-chain (dev fee paid)\");\r\n } else {\r\n // Off-chain announcement (GunDB)\r\n gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .set({\r\n stealthAddress,\r\n senderAddress,\r\n senderPublicKey,\r\n spendingPublicKey,\r\n timestamp: Date.now(),\r\n });\r\n console.log(\"Stealth payment announced off-chain\");\r\n }\r\n } catch (error) {\r\n console.error(\"Error announcing stealth payment:\", error);\r\n console.error(\"Error details:\", error.stack);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Get all stealth payments for an address\r\n * @param {string} signature - The signature to authenticate the user\r\n * @returns {Promise<Array>} List of stealth payments\r\n */\r\nGun.chain.getStealthPayments = async function (signature, options = { source: 'both' }) {\r\n try {\r\n const payments = [];\r\n\r\n if (options.source === 'onChain' || options.source === 'both') {\r\n const signer = await getSigner();\r\n const chainConfig = getAddressesForChain(options.chain || 'optimismSepolia');\r\n const contractAddress = chainConfig.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n const contract = new Contract(\r\n contractAddress,\r\n STEALTH_ANNOUNCER_ABI,\r\n signer\r\n );\r\n \r\n try {\r\n // Get total number of announcements\r\n const totalAnnouncements = await contract.getAnnouncementsCount();\r\n const totalCount = Number(totalAnnouncements.toString());\r\n console.log(\"Total on-chain announcements:\", totalCount);\r\n \r\n if (totalCount > 0) {\r\n // Get announcements in batches of 100\r\n const batchSize = 100;\r\n const lastIndex = totalCount - 1;\r\n \r\n for(let i = 0; i <= lastIndex; i += batchSize) {\r\n const toIndex = Math.min(i + batchSize - 1, lastIndex);\r\n const batch = await contract.getAnnouncementsInRange(i, toIndex);\r\n \r\n // For each announcement, try to decrypt\r\n for(const announcement of batch) {\r\n try {\r\n // Verify announcement is valid\r\n if (!announcement || !announcement.stealthAddress || \r\n !announcement.senderPublicKey || !announcement.spendingPublicKey) {\r\n console.log(\"Invalid announcement:\", announcement);\r\n continue;\r\n }\r\n\r\n // Try to recover funds to verify if announcement is for us\r\n const recoveredWallet = await this.recoverStealthFunds(\r\n announcement.stealthAddress,\r\n announcement.senderPublicKey,\r\n signature,\r\n announcement.spendingPublicKey\r\n );\r\n \r\n // If no errors thrown, announcement is for us\r\n payments.push({\r\n stealthAddress: announcement.stealthAddress,\r\n senderPublicKey: announcement.senderPublicKey,\r\n spendingPublicKey: announcement.spendingPublicKey,\r\n timestamp: Number(announcement.timestamp),\r\n source: 'onChain',\r\n wallet: recoveredWallet\r\n });\r\n\r\n } catch (e) {\r\n // Not for us, continue\r\n console.log(`Announcement not for us: ${announcement.stealthAddress}`);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\"Error retrieving on-chain announcements:\", error);\r\n }\r\n }\r\n\r\n if (options.source === 'offChain' || options.source === 'both') {\r\n // Get off-chain payments\r\n const gun = this;\r\n const offChainPayments = await new Promise((resolve) => {\r\n const p = [];\r\n gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .map()\r\n .once((payment, id) => {\r\n if (payment?.stealthAddress) {\r\n p.push({ ...payment, id, source: 'offChain' });\r\n }\r\n });\r\n setTimeout(() => resolve(p), 2000);\r\n });\r\n \r\n payments.push(...offChainPayments);\r\n }\r\n\r\n console.log(`Found ${payments.length} stealth payments`);\r\n return payments;\r\n } catch (error) {\r\n console.error(\"Error retrieving stealth payments:\", error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * Clean up old stealth payments\r\n * @param {string} recipientAddress - The recipient's address\r\n * @returns {Promise<void>}\r\n */\r\nGun.chain.cleanStealthPayments = async function(recipientAddress) {\r\n try {\r\n const gun = this;\r\n const payments = await gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .map()\r\n .once()\r\n .then();\r\n\r\n // Remove empty or invalid nodes\r\n if (payments) {\r\n Object.keys(payments).forEach(async (key) => {\r\n const payment = payments[key];\r\n if (!payment || !payment.stealthAddress || !payment.senderPublicKey || !payment.spendingPublicKey) {\r\n await gun\r\n .get(\"gun-eth\")\r\n .get(\"stealth-payments\")\r\n .get(recipientAddress)\r\n .get(key)\r\n .put(null);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.error(\"Error cleaning stealth payments:\", error);\r\n }\r\n};\r\n\r\n// =============================================\r\n// EXPORTS\r\n// =============================================\r\n\r\n// Crea una classe GunEth che contiene tutti i metodi e le utility\r\nexport class GunEth {\r\n // Static utility methods\r\n static generateRandomId = generateRandomId;\r\n static generatePassword = generatePassword;\r\n static gunToEthAccount = gunToEthAccount;\r\n static getSigner = getSigner;\r\n static deriveStealthAddress = deriveStealthAddress;\r\n \r\n // Chain methods\r\n static chainMethods = {\r\n setSigner: Gun.chain.setSigner,\r\n getSigner: Gun.chain.getSigner,\r\n verifySignature: Gun.chain.verifySignature,\r\n generatePassword: Gun.chain.generatePassword,\r\n createSignature: Gun.chain.createSignature,\r\n createAndStoreEncryptedPair: Gun.chain.createAndStoreEncryptedPair,\r\n getAndDecryptPair: Gun.chain.getAndDecryptPair,\r\n proof: Gun.chain.proof,\r\n gunToEthAccount: Gun.chain.gunToEthAccount,\r\n generateStealthAddress: Gun.chain.generateStealthAddress,\r\n publishStealthKeys: Gun.chain.publishStealthKeys,\r\n recoverStealthFunds: Gun.chain.recoverStealthFunds,\r\n announceStealthPayment: Gun.chain.announceStealthPayment,\r\n getStealthPayments: Gun.chain.getStealthPayments,\r\n cleanStealthPayments: Gun.chain.cleanStealthPayments\r\n };\r\n\r\n // Constants\r\n static MESSAGE_TO_SIGN = MESSAGE_TO_SIGN;\r\n static PROOF_CONTRACT_ADDRESS = PROOF_CONTRACT_ADDRESS;\r\n static LOCAL_CONFIG = LOCAL_CONFIG;\r\n}\r\n\r\n// Esporta Gun come default\r\nexport default Gun;\r\n"],"names":["contractAddresses","fileURLToPath","dirname","readFileSync","ethers"],"mappings":"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"}
|
package/dist/gun-eth.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Gun from 'gun';
|
|
2
2
|
export { default } from 'gun';
|
|
3
3
|
import SEA from 'gun/sea.js';
|
|
4
|
-
import {
|
|
4
|
+
import { ethers } from 'ethers';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
import { dirname } from 'path';
|
|
7
7
|
import { readFileSync } from 'fs';
|
|
@@ -482,7 +482,7 @@ function generateRandomId() {
|
|
|
482
482
|
*/
|
|
483
483
|
function generatePassword(signature) {
|
|
484
484
|
try {
|
|
485
|
-
const signatureBytes = ethers.
|
|
485
|
+
const signatureBytes = ethers.toUtf8Bytes(signature);
|
|
486
486
|
const hash = ethers.keccak256(signatureBytes);
|
|
487
487
|
console.log("Generated password:", hash);
|
|
488
488
|
return hash;
|
|
@@ -541,7 +541,7 @@ const getSigner = async () => {
|
|
|
541
541
|
typeof window.ethereum !== "undefined"
|
|
542
542
|
) {
|
|
543
543
|
await window.ethereum.request({ method: "eth_requestAccounts" });
|
|
544
|
-
const provider = new BrowserProvider(window.ethereum);
|
|
544
|
+
const provider = new ethers.BrowserProvider(window.ethereum);
|
|
545
545
|
return provider.getSigner();
|
|
546
546
|
} else {
|
|
547
547
|
throw new Error("No valid Ethereum provider found");
|
|
@@ -556,11 +556,11 @@ const getSigner = async () => {
|
|
|
556
556
|
*/
|
|
557
557
|
function deriveStealthAddress(sharedSecret, spendingPublicKey) {
|
|
558
558
|
try {
|
|
559
|
-
const sharedSecretBytes =
|
|
560
|
-
const spendingPublicKeyBytes =
|
|
559
|
+
const sharedSecretBytes = ethers.toUtf8Bytes(sharedSecret);
|
|
560
|
+
const spendingPublicKeyBytes = ethers.toUtf8Bytes(spendingPublicKey);
|
|
561
561
|
|
|
562
|
-
const stealthPrivateKey = keccak256(
|
|
563
|
-
concat([
|
|
562
|
+
const stealthPrivateKey = ethers.keccak256(
|
|
563
|
+
ethers.concat([
|
|
564
564
|
sharedSecretBytes,
|
|
565
565
|
spendingPublicKeyBytes
|
|
566
566
|
])
|
|
@@ -616,7 +616,7 @@ Gun.chain.getSigner = getSigner();
|
|
|
616
616
|
*/
|
|
617
617
|
Gun.chain.verifySignature = async function (message, signature) {
|
|
618
618
|
try {
|
|
619
|
-
const recoveredAddress = verifyMessage(message, signature);
|
|
619
|
+
const recoveredAddress = ethers.verifyMessage(message, signature);
|
|
620
620
|
return recoveredAddress;
|
|
621
621
|
} catch (error) {
|
|
622
622
|
console.error("Error verifying signature:", error);
|
|
@@ -754,7 +754,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
754
754
|
console.log(`Using ${targetChain} configuration:`, chainConfig);
|
|
755
755
|
|
|
756
756
|
// Usa gli indirizzi dalla configurazione
|
|
757
|
-
const contract = new Contract(
|
|
757
|
+
const contract = new ethers.Contract(
|
|
758
758
|
chainConfig.PROOF_OF_INTEGRITY_ADDRESS,
|
|
759
759
|
PROOF_OF_INTEGRITY_ABI,
|
|
760
760
|
signer
|
|
@@ -770,7 +770,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
770
770
|
signer
|
|
771
771
|
);
|
|
772
772
|
const [isValid, timestamp, updater] = await contract.verifyData(
|
|
773
|
-
toUtf8Bytes(nodeId),
|
|
773
|
+
ethers.toUtf8Bytes(nodeId),
|
|
774
774
|
contentHash
|
|
775
775
|
);
|
|
776
776
|
console.log("Verification result:", { isValid, timestamp, updater });
|
|
@@ -868,7 +868,7 @@ Gun.chain.proof = function (chain, nodeId, data, callback) {
|
|
|
868
868
|
// Case 2: User passes only text (data)
|
|
869
869
|
const newNodeId = generateRandomId();
|
|
870
870
|
const dataString = JSON.stringify(data);
|
|
871
|
-
const contentHash = keccak256(toUtf8Bytes(dataString));
|
|
871
|
+
const contentHash = ethers.keccak256(ethers.toUtf8Bytes(dataString));
|
|
872
872
|
|
|
873
873
|
gun
|
|
874
874
|
.get(newNodeId)
|