gun-eth 1.4.22 → 1.4.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- {"version":3,"file":"gun-eth.min.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: \"\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"\",\r\n RPC_URL: \"https://sepolia.optimism.io\",\r\n CHAIN_ID: 11155420\r\n },\r\n arbitrumSepolia: {\r\n STEALTH_ANNOUNCER_ADDRESS: \"\",\r\n PROOF_OF_INTEGRITY_ADDRESS: \"\",\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// 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// 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 { PROOF_OF_INTEGRITY_ABI, STEALTH_ANNOUNCER_ABI, getAddressesForChain } from \"./abis/abis.js\";\r\nimport { LOCAL_CONFIG } from \"./config/local.js\";\r\n\r\n// Ottieni gli indirizzi corretti per la chain\r\nconst chainConfig = getAddressesForChain('optimismSepolia'); // o la chain desiderata\r\nconst STEALTH_ANNOUNCER_ADDRESS = chainConfig.STEALTH_ANNOUNCER_ADDRESS;\r\nconst PROOF_OF_INTEGRITY_ADDRESS = chainConfig.PROOF_OF_INTEGRITY_ADDRESS;\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: null,\r\n STEALTH_ANNOUNCER_ADDRESS: STEALTH_ANNOUNCER_ADDRESS\r\n};\r\n\r\n// Solo per Node.js\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 path = require('path');\r\n \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}\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 return ethers.hexlify(ethers.randomBytes(32)).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 hexSignature = ethers.hexlify(signature);\r\n const hash = ethers.keccak256(hexSignature);\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 // Standalone mode with local provider\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 ethers.Wallet(privateKey, provider);\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof window.ethereum !== \"undefined\"\r\n ) {\r\n // Browser mode\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 // Convert shared secret to bytes\r\n const sharedSecretBytes = Buffer.from(sharedSecret, 'base64');\r\n \r\n // Generate stealth private key using shared secret and spending public key\r\n const stealthPrivateKey = ethers.keccak256(\r\n ethers.concat([\r\n sharedSecretBytes,\r\n ethers.getBytes(spendingPublicKey)\r\n ])\r\n );\r\n \r\n // Create stealth wallet\r\n const stealthWallet = new ethers.Wallet(stealthPrivateKey);\r\n\r\n console.log(\"Debug deriveStealthAddress:\", {\r\n sharedSecretHex: ethers.hexlify(sharedSecretBytes),\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 ethers.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 ethers.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 ethers.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 ethers.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 ethers.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 chainAddresses = getAddressesForChain(options.chain);\r\n const contractAddress = chainAddresses.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n console.log(\"Using contract address:\", contractAddress);\r\n\r\n const contract = new ethers.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 // Get on-chain payments\r\n const signer = await getSigner();\r\n const contractAddress = process.env.NODE_ENV === 'development' \r\n ? LOCAL_CONFIG.STEALTH_ANNOUNCER_ADDRESS \r\n : STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n const contract = new ethers.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","PROOF_OF_INTEGRITY_ADDRESS","STEALTH_ANNOUNCER_ADDRESS","window","fileURLToPath","require","dirname","readFileSync","join","__filename","document","location","pathToFileURL","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","rawdata","JSON","parse","console","log","error","warn","LOCAL_CONFIG","CHAIN_ID","RPC_URL","GUN_PEER","CHAIN_CONFIG","optimismSepolia","arbitrumSepolia","localhost","getAddressesForChain","chainName","config","require$$0","err","Error","Object","keys","STEALTH_ANNOUNCER_ABI","inputs","internalType","name","type","stateMutability","anonymous","outputs","components","PROOF_OF_INTEGRITY_ABI","indexed","chainConfig","PROOF_CONTRACT_ADDRESS","rpcUrl","privateKey","MESSAGE_TO_SIGN","path","__dirname","generateRandomId","ethers","hexlify","randomBytes","slice","generatePassword","signature","hexSignature","hash","keccak256","gunToEthAccount","gunPrivateKey","hexPrivateKey","base64url","padding","repeat","length","base64","replace","binary","atob","Array","from","char","charCodeAt","toString","padStart","base64UrlToHex","wallet","Wallet","account","publicKey","address","getSigner","async","provider","JsonRpcProvider","chainId","ethereum","request","method","BrowserProvider","deriveStealthAddress","sharedSecret","spendingPublicKey","sharedSecretBytes","Buffer","stealthPrivateKey","concat","getBytes","stealthWallet","sharedSecretHex","stealthAddress","Gun","chain","setSigner","newRpcUrl","newPrivateKey","this","verifySignature","message","verifyMessage","createSignature","signer","signMessage","createAndStoreEncryptedPair","gun","pair","SEA","v_pair","s_pair","password","encryptedPair","encrypt","stringify","encryptedV_pair","encryptedS_pair","viewingAccount","priv","spendingAccount","get","put","publicKeys","viewingPublicKey","epub","ethViewingAddress","getAndDecryptPair","encryptedData","then","decryptedPair","decrypt","proof","nodeId","data","callback","targetChain","isLocalEnvironment","Contract","verifyOnChain","contentHash","contract","isValid","timestamp","updater","verifyData","toUtf8Bytes","writeOnChain","tx","updateData","receipt","wait","getLatestRecord","once","existingData","_contentHash","latestRecord","ok","newNodeId","dataString","ack","txHash","generateStealthAddress","recipientAddress","recipientData","senderAddress","senderData","spendingKeyPair","decryptedData","secret","senderPublicKey","publishStealthKeys","viewingKeyPair","recoverStealthFunds","myAddress","decryptedViewingData","recoveredAddress","toLowerCase","recovered","expected","announceStealthPayment","options","onChain","contractAddress","devFee","announcePayment","value","set","Date","now","stack","getStealthPayments","source","payments","process","env","NODE_ENV","totalAnnouncements","getAnnouncementsCount","totalCount","Number","batchSize","lastIndex","i","toIndex","Math","min","batch","getAnnouncementsInRange","announcement","recoveredWallet","push","e","offChainPayments","Promise","resolve","p","map","payment","id","setTimeout","cleanStealthPayments","forEach","key","GunEth","static"],"mappings":"0dAAA,IAAIA,EAAoB,CACtBC,2BAA4B,6CAC5BC,0BAA2B,8CAG7B,GAAsB,oBAAXC,OAAwB,CACjC,MAAMC,cAAEA,GAAkBC,QAAQ,QAC5BC,QAAEA,GAAYD,QAAQ,SACtBE,aAAEA,GAAiBF,QAAQ,OAC3BG,KAAEA,GAASH,QAAQ,QAEzB,IACE,MAAMI,EAAaL,EAAc,oBAAAM,UAAA,oBAAAC,SAAAN,QAAA,OAAAO,cAAAH,GAAAI,KAAA,oBAAAH,SAAAC,SAAAE,KAAAC,GAAA,WAAAA,EAAAC,QAAAC,eAAAF,EAAAG,KAAA,IAAAC,IAAA,iBAAAR,SAAAS,SAAAN,MAE3BO,EAAUb,EAAaC,EADXF,EAAQG,GACmB,yBAA0B,QACvET,EAAoBqB,KAAKC,MAAMF,GAC/BG,QAAQC,IAAI,6BAA8BxB,EAC3C,CAAC,MAAOyB,GACPF,QAAQG,KAAK,sDACd,CACH,CAEO,MAAMC,EAAe,CAC1BC,SAAU,KACV3B,2BAA4BD,EAAkBC,2BAC9CC,0BAA2BF,EAAkBE,0BAC7C2B,QAAS,wBACTC,SAAU,6BCxBCC,EAAe,CAC1BC,gBAAiB,CACf9B,0BAA2B,GAC3BD,2BAA4B,GAC5B4B,QAAS,8BACTD,SAAU,UAEZK,gBAAiB,CACf/B,0BAA2B,GAC3BD,2BAA4B,GAC5B4B,QAAS,yCACTD,SAAU,QAEZM,UAAW,CACTL,QAAS,wBACTD,SAAU,OAKP,SAASO,EAAqBC,GACnC,IAAIC,EAGJ,GAAkB,cAAdD,EACF,IAQE,OALAC,EAAS,IACJN,EAAaG,aAFKI,GAKvBf,QAAQC,IAAI,yBAA0Ba,GAC/BA,CACR,CAAC,MAAOE,GAEP,MADAhB,QAAQG,KAAK,4BACP,IAAIc,MAAM,0DACjB,CAKH,GADAH,EAASN,EAAaK,IACjBC,EACH,MAAM,IAAIG,MAAM,SAASJ,sCAA8CK,OAAOC,KAAKX,GAAcvB,KAAK,SAGxG,OAAO6B,CACT,CASO,MAAMM,EAAwB,CACnC,CACEC,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,cACRC,KAAQ,YAGZC,gBAAmB,aACnBD,KAAQ,eAEV,CACEE,WAAa,EACbL,OAAU,CACR,CACEC,aAAgB,SAChBC,KAAQ,kBACRC,KAAQ,UAEV,CACEF,aAAgB,SAChBC,KAAQ,oBACRC,KAAQ,UAEV,CACEF,aAAgB,UAChBC,KAAQ,iBACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,YACRC,KAAQ,YAGZD,KAAQ,0BACRC,KAAQ,SAEV,CACEE,WAAa,EACbL,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,aACRC,KAAQ,YAGZD,KAAQ,oBACRC,KAAQ,SAEV,CACEE,WAAa,EACbL,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,SACRC,KAAQ,YAGZD,KAAQ,gBACRC,KAAQ,SAEV,CACEH,OAAU,CACR,CACEC,aAAgB,SAChBC,KAAQ,kBACRC,KAAQ,UAEV,CACEF,aAAgB,SAChBC,KAAQ,oBACRC,KAAQ,UAEV,CACEF,aAAgB,UAChBC,KAAQ,iBACRC,KAAQ,YAGZD,KAAQ,kBACRI,QAAW,GACXF,gBAAmB,UACnBD,KAAQ,YAEV,CACEH,OAAU,GACVE,KAAQ,aACRI,QAAW,CACT,CACEL,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,YAEV,CACEH,OAAU,GACVE,KAAQ,SACRI,QAAW,CACT,CACEL,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,YAEV,CACEH,OAAU,GACVE,KAAQ,wBACRI,QAAW,CACT,CACEL,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,YAEV,CACEH,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,YACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,UACRC,KAAQ,YAGZD,KAAQ,0BACRI,QAAW,CACT,CACEC,WAAc,CACZ,CACEN,aAAgB,SAChBC,KAAQ,kBACRC,KAAQ,UAEV,CACEF,aAAgB,SAChBC,KAAQ,oBACRC,KAAQ,UAEV,CACEF,aAAgB,UAChBC,KAAQ,iBACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,YACRC,KAAQ,YAGZF,aAAgB,gDAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,YAEV,CACEH,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,UACRC,KAAQ,YAGZD,KAAQ,eACRI,QAAW,GACXF,gBAAmB,aACnBD,KAAQ,YAEV,CACEH,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,cACRC,KAAQ,YAGZD,KAAQ,mBACRI,QAAW,GACXF,gBAAmB,aACnBD,KAAQ,YAEV,CACEH,OAAU,GACVE,KAAQ,mBACRI,QAAW,GACXF,gBAAmB,aACnBD,KAAQ,aAICK,EAAyB,CACpC,CACER,OAAU,CACR,CACEC,aAAgB,UAChBC,KAAQ,UACRC,KAAQ,WAEV,CACEF,aAAgB,YAChBC,KAAQ,gBACRC,KAAQ,cAGZD,KAAQ,kBACRI,QAAW,GACXF,gBAAmB,aACnBD,KAAQ,YAEV,CACEE,WAAa,EACbL,OAAU,CACR,CACES,SAAW,EACXR,aAAgB,QAChBC,KAAQ,SACRC,KAAQ,SAEV,CACEM,SAAW,EACXR,aAAgB,UAChBC,KAAQ,cACRC,KAAQ,WAEV,CACEM,SAAW,EACXR,aAAgB,UAChBC,KAAQ,UACRC,KAAQ,YAGZD,KAAQ,cACRC,KAAQ,SAEV,CACEH,OAAU,CACR,CACEC,aAAgB,QAChBC,KAAQ,SACRC,KAAQ,UAGZD,KAAQ,kBACRI,QAAW,CACT,CACEL,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,YAEV,CACEH,OAAU,CACR,CACEC,aAAgB,QAChBC,KAAQ,SACRC,KAAQ,SAEV,CACEF,aAAgB,UAChBC,KAAQ,cACRC,KAAQ,YAGZD,KAAQ,aACRI,QAAW,GACXF,gBAAmB,aACnBD,KAAQ,YAEV,CACEH,OAAU,CACR,CACEC,aAAgB,QAChBC,KAAQ,SACRC,KAAQ,SAEV,CACEF,aAAgB,UAChBC,KAAQ,cACRC,KAAQ,YAGZD,KAAQ,aACRI,QAAW,CACT,CACEL,aAAgB,OAChBC,KAAQ,GACRC,KAAQ,QAEV,CACEF,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,WAEV,CACEF,aAAgB,UAChBC,KAAQ,GACRC,KAAQ,YAGZC,gBAAmB,OACnBD,KAAQ,aC1XNO,EAAcnB,EAAqB,mBACnCjC,EAA4BoD,EAAYpD,0BAG9C,IAAIqD,EAF+BD,EAAYrD,2BAG/C,IAAIuD,EAAS,GACTC,EAAa,GAEJ,MAAAC,EAAkB,6BAE/B,IAAI1D,EAAoB,CACtBC,2BAA4B,KAC5BC,0BAA2BA,GAI7B,GAAsB,oBAAXC,OAAwB,CACjC,MAAMC,cAAEA,GAAkBC,QAAQ,QAC5BC,QAAEA,GAAYD,QAAQ,SACtBE,aAAEA,GAAiBF,QAAQ,MAC3BsD,EAAOtD,QAAQ,QAEfI,EAAaL,EAAc,oBAAAM,UAAA,oBAAAC,SAAAN,QAAA,OAAAO,cAAAH,GAAAI,KAAA,oBAAAH,SAAAC,SAAAE,KAAAC,GAAA,WAAAA,EAAAC,QAAAC,eAAAF,EAAAG,KAAA,IAAAC,IAAA,iBAAAR,SAAAS,SAAAN,MAC3B+C,EAAYtD,EAAQG,GAE1B,IACE,MAAMW,EAAUb,EAAaoD,EAAKnD,KAAKoD,EAAW,yBAA0B,QAC5E5D,EAAoBqB,KAAKC,MAAMF,GAC/BG,QAAQC,IAAI,6BAA8BxB,EAC3C,CAAC,MAAOuC,GACPhB,QAAQG,KAAK,sDACd,CACH,CASO,SAASmC,IACd,OAAOC,EAAMA,OAACC,QAAQD,SAAOE,YAAY,KAAKC,MAAM,EACtD,CAOO,SAASC,EAAiBC,GAC/B,IACE,MAAMC,EAAeN,EAAAA,OAAOC,QAAQI,GAC9BE,EAAOP,EAAAA,OAAOQ,UAAUF,GAE9B,OADA7C,QAAQC,IAAI,sBAAuB6C,GAC5BA,CACR,CAAC,MAAO5C,GAEP,OADAF,QAAQE,MAAM,6BAA8BA,GACrC,IACR,CACH,CAOO,SAAS8C,EAAgBC,GAE9B,MAUMC,EAAgB,KAVC,CAACC,IACtB,MAAMC,EAAU,IAAIC,QAAQ,EAAKF,EAAUG,OAAS,GAAM,GACpDC,EAASJ,EAAUK,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAAOJ,EAC3DK,EAASC,KAAKH,GACpB,OAAOI,MAAMC,KAAKH,GAASI,GACzBA,EAAKC,WAAW,GAAGC,SAAS,IAAIC,SAAS,EAAG,OAC5C/E,KAAK,GAAG,EAIiBgF,CAAehB,GAGtCiB,EAAS,IAAI3B,EAAAA,OAAO4B,OAAOjB,GAKjC,MAAO,CACLkB,QAASF,EACTG,UAJgBH,EAAOI,QAKvBpC,WAAYgB,EAEhB,CAOa,MAAAqB,EAAYC,UACvB,GAAIvC,GAAUC,EAAY,CAExB,MAAMuC,EAAW,IAAIlC,SAAOmC,gBAAgBzC,EAAQ,CAClD0C,QAASvE,EAAaC,SACtBkB,KAAM,cAER,OAAO,IAAIgB,EAAAA,OAAO4B,OAAOjC,EAAYuC,EACzC,CAAS,GACa,oBAAX7F,aACoB,IAApBA,OAAOgG,SACd,OAEMhG,OAAOgG,SAASC,QAAQ,CAAEC,OAAQ,wBAExC,OADiB,IAAIvC,EAAMA,OAACwC,gBAAgBnG,OAAOgG,UACnCL,WACpB,CACI,MAAM,IAAItD,MAAM,mCACjB,EASI,SAAS+D,EAAqBC,EAAcC,GACjD,IAEE,MAAMC,EAAoBC,OAAOxB,KAAKqB,EAAc,UAG9CI,EAAoB9C,EAAAA,OAAOQ,UAC/BR,EAAAA,OAAO+C,OAAO,CACZH,EACA5C,EAAMA,OAACgD,SAASL,MAKdM,EAAgB,IAAIjD,EAAAA,OAAO4B,OAAOkB,GASxC,OAPArF,QAAQC,IAAI,8BAA+B,CACzCwF,gBAAiBlD,EAAAA,OAAOC,QAAQ2C,GAChCD,oBACAG,oBACAK,eAAgBF,EAAclB,UAGzB,CACLe,oBACAK,eAAgBF,EAAclB,QAC9BJ,OAAQsB,EAEX,CAAC,MAAOtF,GAEP,MADAF,QAAQE,MAAM,iCAAkCA,GAC1CA,CACP,CACH,CAOAyF,EAAIC,MAAMzD,gBAAkBA,EAQ5BwD,EAAIC,MAAMC,UAAY,SAAUC,EAAWC,GAIzC,OAHA9D,EAAS6D,EACT5D,EAAa6D,EACb/F,QAAQC,IAAI,gCACL+F,IACT,EAEAL,EAAIC,MAAMrB,UAAYA,IAQtBoB,EAAIC,MAAMK,gBAAkBzB,eAAgB0B,EAAStD,GACnD,IAEE,OADyBL,EAAMA,OAAC4D,cAAcD,EAAStD,EAExD,CAAC,MAAO1C,GAEP,OADAF,QAAQE,MAAM,6BAA8BA,GACrC,IACR,CACH,EAOAyF,EAAIC,MAAMjD,iBAAmB,SAAUC,GACrC,OAAOD,EAAiBC,EAC1B,EAOA+C,EAAIC,MAAMQ,gBAAkB5B,eAAgB0B,GAC1C,IAEE,GAAIA,IAAY/D,EACd,MAAM,IAAIlB,MAAM,sCAAwCkB,GAE1D,MAAMkE,QAAe9B,IACf3B,QAAkByD,EAAOC,YAAYJ,GAE3C,OADAlG,QAAQC,IAAI,qBAAsB2C,GAC3BA,CACR,CAAC,MAAO1C,GAEP,OADAF,QAAQE,MAAM,4BAA6BA,GACpC,IACR,CACH,EAWAyF,EAAIC,MAAMW,4BAA8B/B,eAAgBF,EAAS1B,GAC/D,IACE,MAAM4D,EAAMR,KACNS,QAAaC,EAAID,OACjBE,QAAeD,EAAID,OACnBG,QAAeF,EAAID,OACnBI,EAAWlE,EAAiBC,GAG5BkE,QAAsBJ,EAAIK,QAAQjH,KAAKkH,UAAUP,GAAOI,GACxDI,QAAwBP,EAAIK,QAAQjH,KAAKkH,UAAUL,GAASE,GAC5DK,QAAwBR,EAAIK,QAAQjH,KAAKkH,UAAUJ,GAASC,GAG5DM,EAAiBnE,EAAgB2D,EAAOS,MACxCC,EAAkBrE,EAAgB4D,EAAOQ,MAE/CZ,EAAIc,IAAI,WAAWA,IAAI,SAASA,IAAIhD,GAASiD,IAAI,CAC/Cd,KAAMK,EACNH,OAAQM,EACRL,OAAQM,EACRM,WAAY,CACVC,iBAAkBd,EAAOe,KACzBD,iBAAkBd,EAAOe,KACzBxC,kBAAmBmC,EAAgBhD,UACnCsD,kBAAmBR,EAAe9C,aAItCrE,QAAQC,IAAI,8CAA+CqE,EAC5D,CAAC,MAAOpE,GAEP,MADAF,QAAQE,MAAM,6CAA8CA,GACtDA,CACP,CACH,EAQAyF,EAAIC,MAAMgC,kBAAoBpD,eAAgBF,EAAS1B,GACrD,IACE,MAAM4D,EAAMR,KACN6B,QAAsBrB,EACzBc,IAAI,WACJA,IAAI,SACJA,IAAIhD,GACJgD,IAAI,QACJQ,OACH,IAAKD,EACH,MAAM,IAAI5G,MAAM,4CAElB,MAAM4F,EAAWlE,EAAiBC,GAC5BmF,QAAsBrB,EAAIsB,QAAQH,EAAehB,GAEvD,OADA7G,QAAQC,IAAI8H,GACLA,CACR,CAAC,MAAO7H,GAEP,OADAF,QAAQE,MAAM,wCAAyCA,GAChD,IACR,CACH,EAaAyF,EAAIC,MAAMqC,MAAQ,SAAUrC,EAAOsC,EAAQC,EAAMC,GAG/C,GAFApI,QAAQC,IAAI,4BAA6B,CAAE2F,QAAOsC,SAAQC,SAElC,mBAAbC,EAET,OADApI,QAAQE,MAAM,+BACP8F,KAGT,IAEE,MAAMqC,EAAcC,qBAAuB,YAAc1C,EACnD7D,EAAcnB,EAAqByH,GAEzCrI,QAAQC,IAAI,SAASoI,mBAA8BtG,GAGlC,IAAIQ,EAAAA,OAAOgG,SAC1BxG,EAAYrD,2BACZmD,EACAwE,QAHF,MAOMmC,EAAgBhE,MAAO0D,EAAQO,KACnCzI,QAAQC,IAAI,sBAAuB,CAAEiI,SAAQO,gBAC7C,MAAMpC,QAAe9B,IACfmE,EAAW,IAAInG,EAAAA,OAAOgG,SAC1BvG,EACAH,EACAwE,IAEKsC,EAASC,EAAWC,SAAiBH,EAASI,WACnDvG,EAAMA,OAACwG,YAAYb,GACnBO,GAGF,OADAzI,QAAQC,IAAI,uBAAwB,CAAE0I,UAASC,YAAWC,YACnD,CAAEF,UAASC,YAAWC,UAAS,EAIlCG,EAAexE,MAAO0D,EAAQO,KAClCzI,QAAQC,IAAI,oBAAqB,CAAEiI,SAAQO,gBAC3C,MAAMpC,QAAe9B,IACfmE,EAAW,IAAInG,EAAAA,OAAOgG,SAC1BvG,EACAH,EACAwE,GAEI4C,QAAWP,EAASQ,WACxB3G,EAAMA,OAACwG,YAAYb,GACnBO,GAEFzI,QAAQC,IAAI,oBAAqBgJ,EAAGnG,MACpC,MAAMqG,QAAgBF,EAAGG,OAEzB,OADApJ,QAAQC,IAAI,yBAA0BkJ,GAC/BF,CAAE,EAILI,EAAkB7E,MAAO0D,IAC7B,MAAM7B,QAAe9B,IACfmE,EAAW,IAAInG,EAAAA,OAAOgG,SAC1BvG,EACAH,EACAwE,IAEKoC,EAAaG,EAAWC,SAAiBH,EAASW,gBACvD9G,EAAMA,OAACwG,YAAYb,IAQrB,OANAlI,QAAQC,IAAI,iCAAkC,CAC5CiI,SACAO,cACAG,YACAC,YAEK,CAAEJ,cAAaG,YAAWC,UAAS,EAI5C,GAAIX,IAAWC,EAEb3B,IAAIc,IAAIY,GAAQoB,MAAK9E,MAAO+E,IAC1B,IAAKA,EAEH,YADInB,GAAUA,EAAS,CAAEpH,IAAK,6BAIhChB,QAAQC,IAAI,eAAgBsJ,GAG5B,MAAMd,EAAcc,EAAaC,aAGjC,GAFAxJ,QAAQC,IAAI,cAAewI,GAEtBA,EAKL,IACE,MAAME,QAAEA,EAAOC,UAAEA,EAASC,QAAEA,SAAkBL,EAC5CN,EACAO,GAEIgB,QAAqBJ,EAAgBnB,GAEvCS,EACEP,GACFA,EAAS,CACPsB,IAAI,EACJxD,QAAS,8BACT0C,YACAC,UACAY,iBAGArB,GACFA,EAAS,CACPsB,IAAI,EACJxD,QAAS,kCACTuD,gBAGP,CAAC,MAAOvJ,GACHkI,GAAUA,EAAS,CAAEpH,IAAKd,EAAMgG,SACrC,MA9BKkC,GAAUA,EAAS,CAAEpH,IAAK,uCA8B/B,SAEE,GAAImH,IAASD,EAAQ,CAE1B,MAAMyB,EAAYrH,IACZsH,EAAa9J,KAAKkH,UAAUmB,GAC5BM,EAAclG,EAAAA,OAAOQ,UAAUR,EAAMA,OAACwG,YAAYa,IAExDpD,IACGc,IAAIqC,GACJpC,IAAI,IAAKY,EAAMqB,aAAcf,IAAejE,MAAOqF,IAElD,GADA7J,QAAQC,IAAI,MAAO4J,GACfA,EAAI7I,IACFoH,GAAUA,EAAS,CAAEpH,IAAK,oCAIhC,IACE,MAAMiI,QAAWD,EAAaW,EAAWlB,GACrCL,GACFA,EAAS,CACPsB,IAAI,EACJxD,QAAS,uCACTgC,OAAQyB,EACRG,OAAQb,EAAGnG,MAEhB,CAAC,MAAO5C,GACHkI,GAAUA,EAAS,CAAEpH,IAAKd,EAAMgG,SACrC,IAEX,MACUkC,GACFA,EAAS,CACPpH,IAAK,4DAIX,OAAOwF,GACR,CAAC,MAAOtG,GAEP,OADAkI,EAAS,CAAEpH,IAAKd,EAAMgG,UACfF,IACR,CACH,EAUAL,EAAIC,MAAM5C,gBAAkB,SAAUC,GACpC,OAAOD,EAAgBC,EACzB,EAQA0C,EAAIC,MAAMmE,uBAAyBvF,eAAgBwF,EAAkBpH,GACnE,IACE,MAAM4D,EAAMR,KAGNiE,QAAsBzD,EACzBc,IAAI,WACJA,IAAI,SACJA,IAAI0C,GACJ1C,IAAI,cACJQ,OAEH,IAAKmC,IAAkBA,EAAcxC,mBAAqBwC,EAAc/E,kBACtE,MAAM,IAAIjE,MAAM,qCAIlB,MAAMiJ,QAAsBlE,KAAKC,gBAAgB9D,EAAiBS,GAC5DiE,EAAWlE,EAAiBC,GAE5BuH,QAAmB3D,EACtBc,IAAI,WACJA,IAAI,SACJA,IAAI4C,GACJpC,OAEH,IAAKqC,IAAeA,EAAWvD,OAC7B,MAAM,IAAI3F,MAAM,2BAIlB,IAAImJ,EACJ,IACE,MAAMC,QAAsB3D,EAAIsB,QAAQmC,EAAWvD,OAAQC,GAC3DuD,EAA2C,iBAAlBC,EACvBvK,KAAKC,MAAMsK,GACXA,CACH,CAAC,MAAOnK,GAEP,MADAF,QAAQE,MAAM,kCAAmCA,GAC3C,IAAIe,MAAM,kCACjB,CAGD,MAAMgE,QAAqByB,EAAI4D,OAAOL,EAAcxC,iBAAkB2C,GAEtE,IAAKnF,EACH,MAAM,IAAIhE,MAAM,oCAGlBjB,QAAQC,IAAI,0BAA2BgF,GAEvC,MAAMS,eAAEA,GAAmBV,EACzBC,EACAgF,EAAc/E,mBAGhB,MAAO,CACLQ,iBACA6E,gBAAiBH,EAAgB1C,KACjCxC,kBAAmB+E,EAAc/E,kBAGpC,CAAC,MAAOhF,GAEP,MADAF,QAAQE,MAAM,oCAAqCA,GAC7CA,CACP,CACH,EAOAyF,EAAIC,MAAM4E,mBAAqBhG,eAAgB5B,GAC7C,IACE,MAAM4D,EAAMR,KACN1B,QAAgB0B,KAAKC,gBAAgB9D,EAAiBS,GACtDiE,EAAWlE,EAAiBC,GAG5BiF,QAAsBrB,EACzBc,IAAI,WACJA,IAAI,SACJA,IAAIhD,GACJwD,OAEH,IAAKD,IAAkBA,EAAclB,SAAWkB,EAAcjB,OAC5D,MAAM,IAAI3F,MAAM,kBAIlB,MAAMwJ,EAAiB3K,KAAKC,YACpB2G,EAAIsB,QAAQH,EAAclB,OAAQE,IAEpCuD,EAAkBtK,KAAKC,YACrB2G,EAAIsB,QAAQH,EAAcjB,OAAQC,IAGpCM,EAAiBnE,EAAgByH,EAAerD,MAChDC,EAAkBrE,EAAgBoH,EAAgBhD,MAGxDZ,EAAIc,IAAI,WAAWA,IAAI,SAASA,IAAIhD,GAASgD,IAAI,cAAcC,IAAI,CACjEE,iBAAkBN,EAAe9C,UACjCa,kBAAmBmC,EAAgBhD,YAGrCrE,QAAQC,IAAI,6CACb,CAAC,MAAOC,GAEP,MADAF,QAAQE,MAAM,iCAAkCA,GAC1CA,CACP,CACH,EAYAyF,EAAIC,MAAM8E,oBAAsBlG,eAC9BkB,EACA6E,EACA3H,EACAsC,GAEA,IACE,MAAMsB,EAAMR,KACNa,EAAWlE,EAAiBC,GAG5B+H,QAAkB3E,KAAKC,gBAAgB9D,EAAiBS,GACxDiF,QAAsBrB,EACzBc,IAAI,WACJA,IAAI,SACJA,IAAIqD,GACJ7C,OAEH,IAAKD,IAAkBA,EAAclB,SAAWkB,EAAcjB,OAC5D,MAAM,IAAI3F,MAAM,kBAIlB,IAAIwJ,EACJ,IACE,MAAMG,QAA6BlE,EAAIsB,QAAQH,EAAclB,OAAQE,GACrE4D,EAAiD,iBAAzBG,EACtB9K,KAAKC,MAAM6K,GACXA,CACH,CAAC,MAAO1K,GAEP,MADAF,QAAQE,MAAM,yBAA0BA,GAClC,IAAIe,MAAM,yBACjB,CAGD,MAAMgE,QAAqByB,EAAI4D,OAAOC,EAAiBE,GAEvD,IAAKxF,EACH,MAAM,IAAIhE,MAAM,oCAGlBjB,QAAQC,IAAI,yBAA0BgF,GAEtC,MAAMf,OAAEA,EAAQwB,eAAgBmF,GAAqB7F,EACnDC,EACAC,GAIF,GAAI2F,EAAiBC,gBAAkBpF,EAAeoF,cAMpD,MALA9K,QAAQE,MAAM,YAAa,CACzB6K,UAAWF,EACXG,SAAUtF,EACVT,iBAEI,IAAIhE,MAAM,4CAGlB,MAAO,CACLiD,SACAI,QAASuG,EAEZ,CAAC,MAAO3K,GAEP,MADAF,QAAQE,MAAM,kCAAmCA,GAC3CA,CACP,CACH,EAUAyF,EAAIC,MAAMqF,uBAAyBzG,eACjCkB,EACA6E,EACArF,EACAtC,EACAsI,EAAU,CAAEC,SAAS,EAAOvF,MAAO,oBAEnC,IACE,MAAMY,EAAMR,KACNkE,QAAsBlE,KAAKC,gBAAgB9D,EAAiBS,GAElE,GAAIsI,EAAQC,QAAS,CAEnB,MAAM9E,QAAe9B,IAEf6G,EADiBxK,EAAqBsK,EAAQtF,OACbjH,0BAEvCqB,QAAQC,IAAI,0BAA2BmL,GAEvC,MAAM1C,EAAW,IAAInG,EAAAA,OAAOgG,SAC1B6C,EACAhK,EACAiF,GAIIgF,QAAe3C,EAAS2C,SAC9BrL,QAAQC,IAAI,WAAYoL,EAAOtH,YAG/B,MAAMkF,QAAWP,EAAS4C,gBACxBf,EACArF,EACAQ,EACA,CAAE6F,MAAOF,IAGXrL,QAAQC,IAAI,oBAAqBgJ,EAAGnG,MACpC,MAAMqG,QAAgBF,EAAGG,OACzBpJ,QAAQC,IAAI,yBAA0BkJ,EAAQrG,MAE9C9C,QAAQC,IAAI,oDAClB,MAEMuG,EACGc,IAAI,WACJA,IAAI,oBACJkE,IAAI,CACH9F,iBACAwE,gBACAK,kBACArF,oBACA0D,UAAW6C,KAAKC,QAEpB1L,QAAQC,IAAI,sCAEf,CAAC,MAAOC,GAGP,MAFAF,QAAQE,MAAM,oCAAqCA,GACnDF,QAAQE,MAAM,iBAAkBA,EAAMyL,OAChCzL,CACP,CACH,EAOAyF,EAAIC,MAAMgG,mBAAqBpH,eAAgB5B,EAAWsI,EAAU,CAAEW,OAAQ,SAC5E,IACE,MAAMC,EAAW,GAEjB,GAAuB,YAAnBZ,EAAQW,QAA2C,SAAnBX,EAAQW,OAAmB,CAE7D,MAAMxF,QAAe9B,IACf6G,EAA2C,gBAAzBW,QAAQC,IAAIC,SAChC7L,EAAazB,0BACbA,EAEE+J,EAAW,IAAInG,EAAAA,OAAOgG,SAC1B6C,EACAhK,EACAiF,GAGF,IAEE,MAAM6F,QAA2BxD,EAASyD,wBACpCC,EAAaC,OAAOH,EAAmBnI,YAG7C,GAFA/D,QAAQC,IAAI,gCAAiCmM,GAEzCA,EAAa,EAAG,CAElB,MAAME,EAAY,IACZC,EAAYH,EAAa,EAE/B,IAAI,IAAII,EAAI,EAAGA,GAAKD,EAAWC,GAAKF,EAAW,CAC7C,MAAMG,EAAUC,KAAKC,IAAIH,EAAIF,EAAY,EAAGC,GACtCK,QAAclE,EAASmE,wBAAwBL,EAAGC,GAGxD,IAAI,MAAMK,KAAgBF,EACxB,IAEE,KAAKE,GAAiBA,EAAapH,gBAC9BoH,EAAavC,iBAAoBuC,EAAa5H,mBAAmB,CACpElF,QAAQC,IAAI,wBAAyB6M,GACrC,QACD,CAGD,MAAMC,QAAwB/G,KAAK0E,oBACjCoC,EAAapH,eACboH,EAAavC,gBACb3H,EACAkK,EAAa5H,mBAIf4G,EAASkB,KAAK,CACZtH,eAAgBoH,EAAapH,eAC7B6E,gBAAiBuC,EAAavC,gBAC9BrF,kBAAmB4H,EAAa5H,kBAChC0D,UAAWyD,OAAOS,EAAalE,WAC/BiD,OAAQ,UACR3H,OAAQ6I,GAGX,CAAC,MAAOE,GAEPjN,QAAQC,IAAI,4BAA4B6M,EAAapH,kBACrD,QACD,CAEJ,CACF,CACF,CAAC,MAAOxF,GACPF,QAAQE,MAAM,2CAA4CA,EAC3D,CACF,CAED,GAAuB,aAAnBgL,EAAQW,QAA4C,SAAnBX,EAAQW,OAAmB,CAE9D,MAAMrF,EAAMR,KACNkH,QAAyB,IAAIC,SAASC,IAC1C,MAAMC,EAAI,GACV7G,EACGc,IAAI,WACJA,IAAI,oBACJA,IAAI0C,kBACJsD,MACAhE,MAAK,CAACiE,EAASC,KACVD,GAAS7H,gBACX2H,EAAEL,KAAK,IAAKO,EAASC,KAAI3B,OAAQ,YAClC,IAEL4B,YAAW,IAAML,EAAQC,IAAI,IAAK,IAGpCvB,EAASkB,QAAQE,EAClB,CAGD,OADAlN,QAAQC,IAAI,SAAS6L,EAASxI,2BACvBwI,CACR,CAAC,MAAO5L,GAEP,MADAF,QAAQE,MAAM,qCAAsCA,GAC9CA,CACP,CACH,EAOAyF,EAAIC,MAAM8H,qBAAuBlJ,eAAewF,GAC9C,IACE,MAAMxD,EAAMR,KACN8F,QAAiBtF,EACpBc,IAAI,WACJA,IAAI,oBACJA,IAAI0C,GACJsD,MACAhE,OACAxB,OAGCgE,GACF5K,OAAOC,KAAK2K,GAAU6B,SAAQnJ,MAAOoJ,IACnC,MAAML,EAAUzB,EAAS8B,GACpBL,GAAYA,EAAQ7H,gBAAmB6H,EAAQhD,iBAAoBgD,EAAQrI,yBACxEsB,EACHc,IAAI,WACJA,IAAI,oBACJA,IAAI0C,GACJ1C,IAAIsG,GACJrG,IAAI,KACR,GAGN,CAAC,MAAOrH,GACPF,QAAQE,MAAM,mCAAoCA,EACnD,CACH,EAOO,MAAM2N,EAEXC,wBAA0BxL,EAC1BwL,wBAA0BnL,EAC1BmL,uBAAyB9K,EACzB8K,iBAAmBvJ,EACnBuJ,4BAA8B9I,EAG9B8I,oBAAsB,CACpBjI,UAAWF,EAAIC,MAAMC,UACrBtB,UAAWoB,EAAIC,MAAMrB,UACrB0B,gBAAiBN,EAAIC,MAAMK,gBAC3BtD,iBAAkBgD,EAAIC,MAAMjD,iBAC5ByD,gBAAiBT,EAAIC,MAAMQ,gBAC3BG,4BAA6BZ,EAAIC,MAAMW,4BACvCqB,kBAAmBjC,EAAIC,MAAMgC,kBAC7BK,MAAOtC,EAAIC,MAAMqC,MACjBjF,gBAAiB2C,EAAIC,MAAM5C,gBAC3B+G,uBAAwBpE,EAAIC,MAAMmE,uBAClCS,mBAAoB7E,EAAIC,MAAM4E,mBAC9BE,oBAAqB/E,EAAIC,MAAM8E,oBAC/BO,uBAAwBtF,EAAIC,MAAMqF,uBAClCW,mBAAoBjG,EAAIC,MAAMgG,mBAC9B8B,qBAAsB/H,EAAIC,MAAM8H,sBAIlCI,uBAAyB3L,EACzB2L,8BAAgC9L,EAChC8L,oBAAsB1N"}
1
+ {"version":3,"file":"gun-eth.min.js","sources":["../node_modules/gun/sea.js","../src/config/local.js","../src/abis/abis.js","../src/index.js"],"sourcesContent":[";(function(){\n\n /* UNBUILD */\n function USE(arg, req){\n return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){\n arg(mod = {exports: {}});\n USE[R(path)] = mod.exports;\n }\n function R(p){\n return p.split('/').slice(-1).toString().replace('.js','');\n }\n }\n if(typeof module !== \"undefined\"){ var MODULE = module }\n /* UNBUILD */\n\n ;USE(function(module){\n // Security, Encryption, and Authorization: SEA.js\n // MANDATORY READING: https://gun.eco/explainers/data/security.html\n // IT IS IMPLEMENTED IN A POLYFILL/SHIM APPROACH.\n // THIS IS AN EARLY ALPHA!\n\n if(typeof self !== \"undefined\"){ module.window = self } // should be safe for at least browser/worker/nodejs, need to check other envs like RN etc.\n if(typeof window !== \"undefined\"){ module.window = window }\n\n var tmp = module.window || module, u;\n var SEA = tmp.SEA || {};\n\n if(SEA.window = module.window){ SEA.window.SEA = SEA }\n\n try{ if(u+'' !== typeof MODULE){ MODULE.exports = SEA } }catch(e){}\n module.exports = SEA;\n })(USE, './root');\n\n ;USE(function(module){\n var SEA = USE('./root');\n try{ if(SEA.window){\n if(location.protocol.indexOf('s') < 0\n && location.host.indexOf('localhost') < 0\n && ! /^127\\.\\d+\\.\\d+\\.\\d+$/.test(location.hostname)\n && location.protocol.indexOf('file:') < 0){\n console.warn('HTTPS needed for WebCrypto in SEA, redirecting...');\n location.protocol = 'https:'; // WebCrypto does NOT work without HTTPS!\n }\n } }catch(e){}\n })(USE, './https');\n\n ;USE(function(module){\n var u;\n if(u+''== typeof btoa){\n if(u+'' == typeof Buffer){\n try{ global.Buffer = USE(\"buffer\", 1).Buffer }catch(e){ console.log(\"Please `npm install buffer` or add it to your package.json !\") }\n }\n global.btoa = function(data){ return Buffer.from(data, \"binary\").toString(\"base64\") };\n global.atob = function(data){ return Buffer.from(data, \"base64\").toString(\"binary\") };\n }\n })(USE, './base64');\n\n ;USE(function(module){\n USE('./base64');\n // This is Array extended to have .toString(['utf8'|'hex'|'base64'])\n function SeaArray() {}\n Object.assign(SeaArray, { from: Array.from })\n SeaArray.prototype = Object.create(Array.prototype)\n SeaArray.prototype.toString = function(enc, start, end) { enc = enc || 'utf8'; start = start || 0;\n const length = this.length\n if (enc === 'hex') {\n const buf = new Uint8Array(this)\n return [ ...Array(((end && (end + 1)) || length) - start).keys()]\n .map((i) => buf[ i + start ].toString(16).padStart(2, '0')).join('')\n }\n if (enc === 'utf8') {\n return Array.from(\n { length: (end || length) - start },\n (_, i) => String.fromCharCode(this[ i + start])\n ).join('')\n }\n if (enc === 'base64') {\n return btoa(this)\n }\n }\n module.exports = SeaArray;\n })(USE, './array');\n\n ;USE(function(module){\n USE('./base64');\n // This is Buffer implementation used in SEA. Functionality is mostly\n // compatible with NodeJS 'safe-buffer' and is used for encoding conversions\n // between binary and 'hex' | 'utf8' | 'base64'\n // See documentation and validation for safe implementation in:\n // https://github.com/feross/safe-buffer#update\n var SeaArray = USE('./array');\n function SafeBuffer(...props) {\n console.warn('new SafeBuffer() is depreciated, please use SafeBuffer.from()')\n return SafeBuffer.from(...props)\n }\n SafeBuffer.prototype = Object.create(Array.prototype)\n Object.assign(SafeBuffer, {\n // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64'\n from() {\n if (!Object.keys(arguments).length || arguments[0]==null) {\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n }\n const input = arguments[0]\n let buf\n if (typeof input === 'string') {\n const enc = arguments[1] || 'utf8'\n if (enc === 'hex') {\n const bytes = input.match(/([\\da-fA-F]{2})/g)\n .map((byte) => parseInt(byte, 16))\n if (!bytes || !bytes.length) {\n throw new TypeError('Invalid first argument for type \\'hex\\'.')\n }\n buf = SeaArray.from(bytes)\n } else if (enc === 'utf8' || 'binary' === enc) { // EDIT BY MARK: I think this is safe, tested it against a couple \"binary\" strings. This lets SafeBuffer match NodeJS Buffer behavior more where it safely btoas regular strings.\n const length = input.length\n const words = new Uint16Array(length)\n Array.from({ length: length }, (_, i) => words[i] = input.charCodeAt(i))\n buf = SeaArray.from(words)\n } else if (enc === 'base64') {\n const dec = atob(input)\n const length = dec.length\n const bytes = new Uint8Array(length)\n Array.from({ length: length }, (_, i) => bytes[i] = dec.charCodeAt(i))\n buf = SeaArray.from(bytes)\n } else if (enc === 'binary') { // deprecated by above comment\n buf = SeaArray.from(input) // some btoas were mishandled.\n } else {\n console.info('SafeBuffer.from unknown encoding: '+enc)\n }\n return buf\n }\n const byteLength = input.byteLength // what is going on here? FOR MARTTI\n const length = input.byteLength ? input.byteLength : input.length\n if (length) {\n let buf\n if (input instanceof ArrayBuffer) {\n buf = new Uint8Array(input)\n }\n return SeaArray.from(buf || input)\n }\n },\n // This is 'safe-buffer.alloc' sans encoding support\n alloc(length, fill = 0 /*, enc*/ ) {\n return SeaArray.from(new Uint8Array(Array.from({ length: length }, () => fill)))\n },\n // This is normal UNSAFE 'buffer.alloc' or 'new Buffer(length)' - don't use!\n allocUnsafe(length) {\n return SeaArray.from(new Uint8Array(Array.from({ length : length })))\n },\n // This puts together array of array like members\n concat(arr) { // octet array\n if (!Array.isArray(arr)) {\n throw new TypeError('First argument must be Array containing ArrayBuffer or Uint8Array instances.')\n }\n return SeaArray.from(arr.reduce((ret, item) => ret.concat(Array.from(item)), []))\n }\n })\n SafeBuffer.prototype.from = SafeBuffer.from\n SafeBuffer.prototype.toString = SeaArray.prototype.toString\n\n module.exports = SafeBuffer;\n })(USE, './buffer');\n\n ;USE(function(module){\n const SEA = USE('./root')\n const api = {Buffer: USE('./buffer')}\n var o = {}, u;\n\n // ideally we can move away from JSON entirely? unlikely due to compatibility issues... oh well.\n JSON.parseAsync = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n JSON.stringifyAsync = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\n api.parse = function(t,r){ return new Promise(function(res, rej){\n JSON.parseAsync(t,function(err, raw){ err? rej(err) : res(raw) },r);\n })}\n api.stringify = function(v,r,s){ return new Promise(function(res, rej){\n JSON.stringifyAsync(v,function(err, raw){ err? rej(err) : res(raw) },r,s);\n })}\n\n if(SEA.window){\n api.crypto = SEA.window.crypto || SEA.window.msCrypto\n api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;\n api.TextEncoder = SEA.window.TextEncoder;\n api.TextDecoder = SEA.window.TextDecoder;\n api.random = (len) => api.Buffer.from(api.crypto.getRandomValues(new Uint8Array(api.Buffer.alloc(len))));\n }\n if(!api.TextDecoder)\n {\n const { TextEncoder, TextDecoder } = USE((u+'' == typeof MODULE?'.':'')+'./lib/text-encoding', 1);\n api.TextDecoder = TextDecoder;\n api.TextEncoder = TextEncoder;\n }\n if(!api.crypto)\n {\n try\n {\n var crypto = USE('crypto', 1);\n Object.assign(api, {\n crypto,\n random: (len) => api.Buffer.from(crypto.randomBytes(len))\n }); \n const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1);\n api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH\n }\n catch(e){\n console.log(\"Please `npm install @peculiar/webcrypto` or add it to your package.json !\");\n }}\n\n module.exports = api\n })(USE, './shim');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var s = {};\n s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64};\n s.ecdsa = {\n pair: {name: 'ECDSA', namedCurve: 'P-256'},\n sign: {name: 'ECDSA', hash: {name: 'SHA-256'}}\n };\n s.ecdh = {name: 'ECDH', namedCurve: 'P-256'};\n\n // This creates Web Cryptography API compliant JWK for sign/verify purposes\n s.jwk = function(pub, d){ // d === priv\n pub = pub.split('.');\n var x = pub[0], y = pub[1];\n var jwk = {kty: \"EC\", crv: \"P-256\", x: x, y: y, ext: true};\n jwk.key_ops = d ? ['sign'] : ['verify'];\n if(d){ jwk.d = d }\n return jwk;\n };\n \n s.keyToJwk = function(keyBytes) {\n const keyB64 = keyBytes.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n }\n\n s.recall = {\n validity: 12 * 60 * 60, // internally in seconds : 12 hours\n hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)\n };\n\n s.check = function(t){ return (typeof t == 'string') && ('SEA{' === t.slice(0,4)) }\n s.parse = async function p(t){ try {\n var yes = (typeof t == 'string');\n if(yes && 'SEA{' === t.slice(0,4)){ t = t.slice(3) }\n return yes ? await shim.parse(t) : t;\n } catch (e) {}\n return t;\n }\n\n SEA.opt = s;\n module.exports = s\n })(USE, './settings');\n\n ;USE(function(module){\n var shim = USE('./shim');\n module.exports = async function(d, o){\n var t = (typeof d == 'string')? d : await shim.stringify(d);\n var hash = await shim.subtle.digest({name: o||'SHA-256'}, new shim.TextEncoder().encode(t));\n return shim.Buffer.from(hash);\n }\n })(USE, './sha256');\n\n ;USE(function(module){\n // This internal func returns SHA-1 hashed data for KeyID generation\n const __shim = USE('./shim')\n const subtle = __shim.subtle\n const ossl = __shim.ossl ? __shim.ossl : subtle\n const sha1hash = (b) => ossl.digest({name: 'SHA-1'}, new ArrayBuffer(b))\n module.exports = sha1hash\n })(USE, './sha1');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.work = SEA.work || (async (data, pair, cb, opt) => { try { // used to be named `proof`\n var salt = (pair||{}).epub || pair; // epub not recommended, salt should be random!\n opt = opt || {};\n if(salt instanceof Function){\n cb = salt;\n salt = u;\n }\n data = (typeof data == 'string')? data : await shim.stringify(data);\n if('sha' === (opt.name||'').toLowerCase().slice(0,3)){\n var rsha = shim.Buffer.from(await sha(data, opt.name), 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(rsha) }catch(e){console.log(e)} }\n return rsha;\n }\n salt = salt || shim.random(9);\n var key = await (shim.ossl || shim.subtle).importKey('raw', new shim.TextEncoder().encode(data), {name: opt.name || 'PBKDF2'}, false, ['deriveBits']);\n var work = await (shim.ossl || shim.subtle).deriveBits({\n name: opt.name || 'PBKDF2',\n iterations: opt.iterations || S.pbkdf2.iter,\n salt: new shim.TextEncoder().encode(opt.salt || salt),\n hash: opt.hash || S.pbkdf2.hash,\n }, key, opt.length || (S.pbkdf2.ks * 8))\n data = shim.random(data.length) // Erase data in case of passphrase\n var r = shim.Buffer.from(work, 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.work;\n })(USE, './work');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n\n SEA.name = SEA.name || (async (cb, opt) => { try {\n if(cb){ try{ cb() }catch(e){console.log(e)} }\n return;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n //SEA.pair = async (data, proof, cb) => { try {\n SEA.pair = SEA.pair || (async (cb, opt) => { try {\n\n var ecdhSubtle = shim.ossl || shim.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await shim.subtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, [ 'sign', 'verify' ])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key = {};\n key.priv = (await shim.subtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await shim.subtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x+'.'+pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n \n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try{\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x+'.'+pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n }catch(e){\n if(SEA.window){ throw e }\n if(e == 'Error: ECDH is not a supported algorithm'){ console.log('Ignoring ECDH...') }\n else { throw e }\n } dh = dh || {};\n\n var r = { pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.pair;\n })(USE, './pair');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.sign = SEA.sign || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n if(!(pair||opt).priv){\n if(!SEA.I){ throw 'No signing key.' }\n pair = await SEA.I(null, {what: data, how: 'sign', why: opt.why});\n }\n if(u === data){ throw '`undefined` not allowed.' }\n var json = await S.parse(data);\n var check = opt.check = opt.check || json;\n if(SEA.verify && (SEA.opt.check(check) || (check && check.s && check.m))\n && u !== await SEA.verify(check, pair)){ // don't sign if we already signed it.\n var r = await S.parse(check);\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n var pub = pair.pub;\n var priv = pair.priv;\n var jwk = S.jwk(pub, priv);\n var hash = await sha(json);\n var sig = await (shim.ossl || shim.subtle).importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) => (shim.ossl || shim.subtle).sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, new Uint8Array(hash))) // privateKey scope doesn't leak out from here!\n var r = {m: json, s: shim.Buffer.from(sig, 'binary').toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.sign;\n })(USE, './sign');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.verify = SEA.verify || (async (data, pair, cb, opt) => { try {\n var json = await S.parse(data);\n if(false === pair){ // don't verify!\n var raw = await S.parse(json.m);\n if(cb){ try{ cb(raw) }catch(e){console.log(e)} }\n return raw;\n }\n opt = opt || {};\n // SEA.I // verify is free! Requires no user permission.\n var pub = pair.pub || pair;\n var key = SEA.opt.slow_leak? await SEA.opt.slow_leak(pub) : await (shim.ossl || shim.subtle).importKey('jwk', S.jwk(pub), {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n var hash = await sha(json.m);\n var buf, sig, check, tmp; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64'); // NEW DEFAULT!\n sig = new Uint8Array(buf);\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash));\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){\n if(SEA.opt.fallback){\n return await SEA.opt.fall_verify(data, pair, cb, opt);\n }\n }\n var r = check? await S.parse(json.m) : u;\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e); // mismatched owner FOR MARTTI\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.verify;\n // legacy & ossl memory leak mitigation:\n\n var knownKeys = {};\n var keyForPair = SEA.opt.slow_leak = pair => {\n if (knownKeys[pair]) return knownKeys[pair];\n var jwk = S.jwk(pair);\n knownKeys[pair] = (shim.ossl || shim.subtle).importKey(\"jwk\", jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, [\"verify\"]);\n return knownKeys[pair];\n };\n\n var O = SEA.opt;\n SEA.opt.fall_verify = async function(data, pair, cb, opt, f){\n if(f === SEA.opt.fallback){ throw \"Signature did not match\" } f = f || 1;\n var tmp = data||'';\n data = SEA.opt.unpack(data) || data;\n var json = await S.parse(data), pub = pair.pub || pair, key = await SEA.opt.slow_leak(pub);\n var hash = (f <= SEA.opt.fallback)? shim.Buffer.from(await shim.subtle.digest({name: 'SHA-256'}, new shim.TextEncoder().encode(await S.parse(json.m)))) : await sha(json.m); // this line is old bad buggy code but necessary for old compatibility.\n var buf; var sig; var check; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64') // NEW DEFAULT!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){ try{\n buf = shim.Buffer.from(json.s, 'utf8') // AUTO BACKWARD OLD UTF8 DATA!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n }catch(e){\n if(!check){ throw \"Signature did not match.\" }\n }\n }\n var r = check? await S.parse(json.m) : u;\n O.fall_soul = tmp['#']; O.fall_key = tmp['.']; O.fall_val = data; O.fall_state = tmp['>'];\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n SEA.opt.fallback = 2;\n\n })(USE, './verify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha256hash = USE('./sha256');\n\n const importGen = async (key, salt, opt) => {\n //const combo = shim.Buffer.concat([shim.Buffer.from(key, 'utf8'), salt || shim.random(8)]).toString('utf8') // old\n opt = opt || {};\n const combo = key + (salt || shim.random(8)).toString('utf8'); // new\n const hash = shim.Buffer.from(await sha256hash(combo), 'binary')\n \n const jwkKey = S.keyToJwk(hash) \n return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n }\n module.exports = importGen;\n })(USE, './aeskey');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n var u;\n\n SEA.encrypt = SEA.encrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(u === data){ throw '`undefined` not allowed.' }\n if(!key){\n if(!SEA.I){ throw 'No encryption key.' }\n pair = await SEA.I(null, {what: data, how: 'encrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var msg = (typeof data == 'string')? data : await shim.stringify(data);\n var rand = {s: shim.random(9), iv: shim.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await aeskey(key, rand.s, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new shim.TextEncoder().encode(msg)));\n var r = {\n ct: shim.Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.encrypt;\n })(USE, './encrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n\n SEA.decrypt = SEA.decrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(!key){\n if(!SEA.I){ throw 'No decryption key.' }\n pair = await SEA.I(null, {what: data, how: 'decrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var json = await S.parse(data);\n var buf, bufiv, bufct; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64');\n bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64');\n bufct = shim.Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n }catch(e){\n if('utf8' === opt.encode){ throw \"Could not decrypt\" }\n if(SEA.opt.fallback){\n opt.encode = 'utf8';\n return await SEA.decrypt(data, pair, cb, opt);\n }\n }\n var r = await S.parse(new shim.TextDecoder('utf8').decode(ct));\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.decrypt;\n })(USE, './decrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n // Derive shared secret from other's pub and my epub/epriv \n SEA.secret = SEA.secret || (async (key, pair, cb, opt) => { try {\n opt = opt || {};\n if(!pair || !pair.epriv || !pair.epub){\n if(!SEA.I){ throw 'No secret mix.' }\n pair = await SEA.I(null, {what: key, how: 'secret', why: opt.why});\n }\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var ecdhSubtle = shim.ossl || shim.subtle;\n var pubKeyData = keysToEcdhJwk(pub);\n var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },{name: 'ECDH', namedCurve: 'P-256'}); // Thanks to @sirpy !\n var privKeyData = keysToEcdhJwk(epub, epriv);\n var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {\n // privateKey scope doesn't leak out from here!\n var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n })\n var r = derived;\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n // can this be replaced with settings.jwk?\n var keysToEcdhJwk = (pub, d) => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n var jwk = d ? { d: d } : {}\n return [ // Use with spread returned value...\n 'jwk',\n Object.assign(\n jwk,\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n ), // ??? refactor\n {name: 'ECDH', namedCurve: 'P-256'}\n ]\n }\n\n module.exports = SEA.secret;\n })(USE, './secret');\n\n ;USE(function(module){\n var SEA = USE('./root');\n // This is to certify that a group of \"certificants\" can \"put\" anything at a group of matched \"paths\" to the certificate authority's graph\n SEA.certify = SEA.certify || (async (certificants, policy = {}, authority, cb, opt = {}) => { try {\n /*\n The Certify Protocol was made out of love by a Vietnamese code enthusiast. Vietnamese people around the world deserve respect!\n IMPORTANT: A Certificate is like a Signature. No one knows who (authority) created/signed a cert until you put it into their graph.\n \"certificants\": '*' or a String (Bob.pub) || an Object that contains \"pub\" as a key || an array of [object || string]. These people will have the rights.\n \"policy\": A string ('inbox'), or a RAD/LEX object {'*': 'inbox'}, or an Array of RAD/LEX objects or strings. RAD/LEX object can contain key \"?\" with indexOf(\"*\") > -1 to force key equals certificant pub. This rule is used to check against soul+'/'+key using Gun.text.match or String.match.\n \"authority\": Key pair or priv of the certificate authority.\n \"cb\": A callback function after all things are done.\n \"opt\": If opt.expiry (a timestamp) is set, SEA won't sync data after opt.expiry. If opt.block is set, SEA will look for block before syncing.\n */\n console.log('SEA.certify() is an early experimental community supported method that may change API behavior without warning in any future version.')\n\n certificants = (() => {\n var data = []\n if (certificants) {\n if ((typeof certificants === 'string' || Array.isArray(certificants)) && certificants.indexOf('*') > -1) return '*'\n if (typeof certificants === 'string') return certificants\n if (Array.isArray(certificants)) {\n if (certificants.length === 1 && certificants[0]) return typeof certificants[0] === 'object' && certificants[0].pub ? certificants[0].pub : typeof certificants[0] === 'string' ? certificants[0] : null\n certificants.map(certificant => {\n if (typeof certificant ==='string') data.push(certificant)\n else if (typeof certificant === 'object' && certificant.pub) data.push(certificant.pub)\n })\n }\n\n if (typeof certificants === 'object' && certificants.pub) return certificants.pub\n return data.length > 0 ? data : null\n }\n return\n })()\n\n if (!certificants) return console.log(\"No certificant found.\")\n\n const expiry = opt.expiry && (typeof opt.expiry === 'number' || typeof opt.expiry === 'string') ? parseFloat(opt.expiry) : null\n const readPolicy = (policy || {}).read ? policy.read : null\n const writePolicy = (policy || {}).write ? policy.write : typeof policy === 'string' || Array.isArray(policy) || policy[\"+\"] || policy[\"#\"] || policy[\".\"] || policy[\"=\"] || policy[\"*\"] || policy[\">\"] || policy[\"<\"] ? policy : null\n // The \"blacklist\" feature is now renamed to \"block\". Why ? BECAUSE BLACK LIVES MATTER!\n // We can now use 3 keys: block, blacklist, ban\n const block = (opt || {}).block || (opt || {}).blacklist || (opt || {}).ban || {}\n const readBlock = block.read && (typeof block.read === 'string' || (block.read || {})['#']) ? block.read : null\n const writeBlock = typeof block === 'string' ? block : block.write && (typeof block.write === 'string' || block.write['#']) ? block.write : null\n\n if (!readPolicy && !writePolicy) return console.log(\"No policy found.\")\n\n // reserved keys: c, e, r, w, rb, wb\n const data = JSON.stringify({\n c: certificants,\n ...(expiry ? {e: expiry} : {}), // inject expiry if possible\n ...(readPolicy ? {r: readPolicy } : {}), // \"r\" stands for read, which means read permission.\n ...(writePolicy ? {w: writePolicy} : {}), // \"w\" stands for write, which means write permission.\n ...(readBlock ? {rb: readBlock} : {}), // inject READ block if possible\n ...(writeBlock ? {wb: writeBlock} : {}), // inject WRITE block if possible\n })\n\n const certificate = await SEA.sign(data, authority, null, {raw:1})\n\n var r = certificate\n if(!opt.raw){ r = 'SEA'+JSON.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.certify;\n })(USE, './certify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n // Practical examples about usage found in tests.\n var SEA = USE('./root');\n SEA.work = USE('./work');\n SEA.sign = USE('./sign');\n SEA.verify = USE('./verify');\n SEA.encrypt = USE('./encrypt');\n SEA.decrypt = USE('./decrypt');\n SEA.certify = USE('./certify');\n //SEA.opt.aeskey = USE('./aeskey'); // not official! // this causes problems in latest WebCrypto.\n\n SEA.random = SEA.random || shim.random;\n\n // This is Buffer used in SEA and usable from Gun/SEA application also.\n // For documentation see https://nodejs.org/api/buffer.html\n SEA.Buffer = SEA.Buffer || USE('./buffer');\n\n // These SEA functions support now ony Promises or\n // async/await (compatible) code, use those like Promises.\n //\n // Creates a wrapper library around Web Crypto API\n // for various AES, ECDSA, PBKDF2 functions we called above.\n // Calculate public key KeyID aka PGPv4 (result: 8 bytes as hex string)\n SEA.keyid = SEA.keyid || (async (pub) => {\n try {\n // base64('base64(x):base64(y)') => shim.Buffer(xy)\n const pb = shim.Buffer.concat(\n pub.replace(/-/g, '+').replace(/_/g, '/').split('.')\n .map((t) => shim.Buffer.from(t, 'base64'))\n )\n // id is PGPv4 compliant raw key\n const id = shim.Buffer.concat([\n shim.Buffer.from([0x99, pb.length / 0x100, pb.length % 0x100]), pb\n ])\n const sha1 = await sha1hash(id)\n const hash = shim.Buffer.from(sha1, 'binary')\n return hash.toString('hex', hash.length - 8) // 16-bit ID as hex\n } catch (e) {\n console.log(e)\n throw e\n }\n });\n // all done!\n // Obviously it is missing MANY necessary features. This is only an alpha release.\n // Please experiment with it, audit what I've done so far, and complain about what needs to be added.\n // SEA should be a full suite that is easy and seamless to use.\n // Again, scroll naer the top, where I provide an EXAMPLE of how to create a user and sign in.\n // Once logged in, the rest of the code you just read handled automatically signing/validating data.\n // But all other behavior needs to be equally easy, like opinionated ways of\n // Adding friends (trusted public keys), sending private messages, etc.\n // Cheers! Tell me what you think.\n ((SEA.window||{}).GUN||{}).SEA = SEA;\n\n module.exports = SEA\n // -------------- END SEA MODULES --------------------\n // -- BEGIN SEA+GUN MODULES: BUNDLED BY DEFAULT UNTIL OTHERS USE SEA ON OWN -------\n })(USE, './sea');\n\n ;USE(function(module){\n var SEA = USE('./sea'), Gun, u;\n if(SEA.window){\n Gun = SEA.window.GUN || {chain:{}};\n } else {\n Gun = USE((u+'' == typeof MODULE?'.':'')+'./gun', 1);\n }\n SEA.GUN = Gun;\n\n function User(root){ \n this._ = {$: this};\n }\n User.prototype = (function(){ function F(){}; F.prototype = Gun.chain; return new F() }()) // Object.create polyfill\n User.prototype.constructor = User;\n\n // let's extend the gun chain with a `user` function.\n // only one user can be logged in at a time, per gun instance.\n Gun.chain.user = function(pub){\n var gun = this, root = gun.back(-1), user;\n if(pub){\n pub = SEA.opt.pub((pub._||'')['#']) || pub;\n return root.get('~'+pub);\n }\n if(user = root.back('user')){ return user }\n var root = (root._), at = root, uuid = at.opt.uuid || lex;\n (at = (user = at.user = gun.chain(new User))._).opt = {};\n at.opt.uuid = function(cb){\n var id = uuid(), pub = root.user;\n if(!pub || !(pub = pub.is) || !(pub = pub.pub)){ return id }\n id = '~' + pub + '/' + id;\n if(cb && cb.call){ cb(null, id) }\n return id;\n }\n return user;\n }\n function lex(){ return Gun.state().toString(36).replace('.','') }\n Gun.User = User;\n User.GUN = Gun;\n User.SEA = Gun.SEA = SEA;\n module.exports = User;\n })(USE, './user');\n\n ;USE(function(module){\n var u, Gun = (''+u != typeof GUN)? (GUN||{chain:{}}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n Gun.chain.then = function(cb, opt){\n var gun = this, p = (new Promise(function(res, rej){\n gun.once(res, opt);\n }));\n return cb? p.then(cb) : p;\n }\n })(USE, './then');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n\n // Well first we have to actually create a user. That is what this function does.\n User.prototype.create = function(...args){\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = pair && (pair.pub || pair.epub) ? pair.pub : typeof args[0] === 'string' ? args[0] : null;\n var pass = pair && (pair.pub || pair.epub) ? pair : alias && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n cb = cb || noop;\n opt = opt || {};\n if(false !== opt.check){\n var err;\n if(!alias){ err = \"No user.\" }\n if((pass||'').length < 8){ err = \"Password too short!\" }\n if(err){\n cb({err: Gun.log(err)});\n return gun;\n }\n }\n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n var act = {}, u;\n act.a = function(pubs){\n act.pubs = pubs;\n if(pubs && !opt.already){\n // If we can enforce that a user name is already taken, it might be nice to try, but this is not guaranteed.\n var ack = {err: Gun.log('User already created!')};\n cat.ing = false;\n (cb || noop)(ack);\n gun.leave();\n return;\n }\n act.salt = String.random(64); // pseudo-randomly create a salt, then use PBKDF2 function to extend the password with it.\n SEA.work(pass, act.salt, act.b); // this will take some short amount of time to produce a proof, which slows brute force attacks.\n }\n act.b = function(proof){\n act.proof = proof;\n pair ? act.c(pair) : SEA.pair(act.c) // generate a brand new key pair or use the existing.\n }\n act.c = function(pair){\n var tmp\n act.pair = pair || {};\n if(tmp = cat.root.user){\n tmp._.sea = pair;\n tmp.is = {pub: pair.pub, epub: pair.epub, alias: alias};\n }\n // the user's public key doesn't need to be signed. But everything else needs to be signed with it! // we have now automated it! clean up these extra steps now!\n act.data = {pub: pair.pub};\n act.d();\n }\n act.d = function(){\n act.data.alias = alias;\n act.e();\n }\n act.e = function(){\n act.data.epub = act.pair.epub; \n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, act.proof, act.f, {raw:1}); // to keep the private key safe, we AES encrypt it with the proof of work!\n }\n act.f = function(auth){\n act.data.auth = JSON.stringify({ek: auth, s: act.salt}); \n act.g(act.data.auth);\n }\n act.g = function(auth){ var tmp;\n act.data.auth = act.data.auth || auth;\n root.get(tmp = '~'+act.pair.pub).put(act.data).on(act.h); // awesome, now we can actually save the user with their public key as their ID.\n var link = {}; link[tmp] = {'#': tmp}; root.get('~@'+alias).put(link).get(tmp).on(act.i); // next up, we want to associate the alias with the public key. So we add it to the alias list.\n }\n act.h = function(data, key, msg, eve){\n eve.off(); act.h.ok = 1; act.i();\n }\n act.i = function(data, key, msg, eve){\n if(eve){ act.i.ok = 1; eve.off() }\n if(!act.h.ok || !act.i.ok){ return }\n cat.ing = false;\n cb({ok: 0, pub: act.pair.pub}); // callback that the user has been created. (Note: ok = 0 because we didn't wait for disk to ack)\n if(noop === cb){ pair ? gun.auth(pair) : gun.auth(alias, pass) } // if no callback is passed, auto-login after signing up.\n }\n root.get('~@'+alias).once(act.a);\n return gun;\n }\n User.prototype.leave = function(opt, cb){\n var gun = this, user = (gun.back(-1)._).user;\n if(user){\n delete user.is;\n delete user._.is;\n delete user._.sea;\n }\n if(SEA.window){\n try{var sS = {};\n sS = SEA.window.sessionStorage;\n delete sS.recall;\n delete sS.pair;\n }catch(e){};\n }\n return gun;\n }\n })(USE, './create');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n // now that we have created a user, we want to authenticate them!\n User.prototype.auth = function(...args){ // TODO: this PR with arguments need to be cleaned up / refactored.\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = !pair && typeof args[0] === 'string' ? args[0] : null;\n var pass = (alias || (pair && !(pair.priv && pair.epriv))) && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n \n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n \n var act = {}, u, tries = 9;\n act.a = function(data){\n if(!data){ return act.b() }\n if(!data.pub){\n var tmp = []; Object.keys(data).forEach(function(k){ if('_'==k){ return } tmp.push(data[k]) })\n return act.b(tmp);\n }\n if(act.name){ return act.f(data) }\n act.c((act.data = data).auth);\n }\n act.b = function(list){\n var get = (act.list = (act.list||[]).concat(list||[])).shift();\n if(u === get){\n if(act.name){ return act.err('Your user account is not published for dApps to access, please consider syncing it online, or allowing local access by adding your device as a peer.') }\n if(alias && tries--){\n root.get('~@'+alias).once(act.a);\n return;\n }\n return act.err('Wrong user or password.') \n }\n root.get(get).once(act.a);\n }\n act.c = function(auth){\n if(u === auth){ return act.b() }\n if('string' == typeof auth){ return act.c(obj_ify(auth)) } // in case of legacy\n SEA.work(pass, (act.auth = auth).s, act.d, act.enc); // the proof of work is evidence that we've spent some time/effort trying to log in, this slows brute force.\n }\n act.d = function(proof){\n SEA.decrypt(act.auth.ek, proof, act.e, act.enc);\n }\n act.e = function(half){\n if(u === half){\n if(!act.enc){ // try old format\n act.enc = {encode: 'utf8'};\n return act.c(act.auth);\n } act.enc = null; // end backwards\n return act.b();\n }\n act.half = half;\n act.f(act.data);\n }\n act.f = function(pair){\n var half = act.half || {}, data = act.data || {};\n act.g(act.lol = {pub: pair.pub || data.pub, epub: pair.epub || data.epub, priv: pair.priv || half.priv, epriv: pair.epriv || half.epriv});\n }\n act.g = function(pair){\n if(!pair || !pair.pub || !pair.epub){ return act.b() }\n act.pair = pair;\n var user = (root._).user, at = (user._);\n var tmp = at.tag;\n var upt = at.opt;\n at = user._ = root.get('~'+pair.pub)._;\n at.opt = upt;\n // add our credentials in-memory only to our root user instance\n user.is = {pub: pair.pub, epub: pair.epub, alias: alias || pair.pub};\n at.sea = act.pair;\n cat.ing = false;\n try{if(pass && u == (obj_ify(cat.root.graph['~'+pair.pub].auth)||'')[':']){ opt.shuffle = opt.change = pass; } }catch(e){} // migrate UTF8 & Shuffle!\n opt.change? act.z() : (cb || noop)(at);\n if(SEA.window && ((gun.back('user')._).opt||opt).remember){\n // TODO: this needs to be modular.\n try{var sS = {};\n sS = SEA.window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n sS.recall = true;\n sS.pair = JSON.stringify(pair); // auth using pair is more reliable than alias/pass\n }catch(e){}\n }\n try{\n if(root._.tag.auth){ // auth handle might not be registered yet\n (root._).on('auth', at) // TODO: Deprecate this, emit on user instead! Update docs when you do.\n } else { setTimeout(function(){ (root._).on('auth', at) },1) } // if not, hackily add a timeout.\n //at.on('auth', at) // Arrgh, this doesn't work without event \"merge\" code, but \"merge\" code causes stack overflow and crashes after logging in & trying to write data.\n }catch(e){\n Gun.log(\"Your 'auth' callback crashed with:\", e);\n }\n }\n act.h = function(data){\n if(!data){ return act.b() }\n alias = data.alias\n if(!alias)\n alias = data.alias = \"~\" + pair.pub \n if(!data.auth){\n return act.g(pair);\n }\n pair = null;\n act.c((act.data = data).auth);\n }\n act.z = function(){\n // password update so encrypt private key using new pwd + salt\n act.salt = String.random(64); // pseudo-random\n SEA.work(opt.change, act.salt, act.y);\n }\n act.y = function(proof){\n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, proof, act.x, {raw:1});\n }\n act.x = function(auth){\n act.w(JSON.stringify({ek: auth, s: act.salt}));\n }\n act.w = function(auth){\n if(opt.shuffle){ // delete in future!\n console.log('migrate core account from UTF8 & shuffle');\n var tmp = {}; Object.keys(act.data).forEach(function(k){ tmp[k] = act.data[k] });\n delete tmp._;\n tmp.auth = auth;\n root.get('~'+act.pair.pub).put(tmp);\n } // end delete\n root.get('~'+act.pair.pub).get('auth').put(auth, cb || noop);\n }\n act.err = function(e){\n var ack = {err: Gun.log(e || 'User cannot be found!')};\n cat.ing = false;\n (cb || noop)(ack);\n }\n act.plugin = function(name){\n if(!(act.name = name)){ return act.err() }\n var tmp = [name];\n if('~' !== name[0]){\n tmp[1] = '~'+name;\n tmp[2] = '~@'+name;\n }\n act.b(tmp);\n }\n if(pair){\n if(pair.priv && pair.epriv)\n act.g(pair);\n else\n root.get('~'+pair.pub).once(act.h);\n } else\n if(alias){\n root.get('~@'+alias).once(act.a);\n } else\n if(!alias && !pass){\n SEA.name(act.plugin);\n }\n return gun;\n }\n function obj_ify(o){\n if('string' != typeof o){ return o }\n try{o = JSON.parse(o);\n }catch(e){o={}};\n return o;\n }\n })(USE, './auth');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN;\n User.prototype.recall = function(opt, cb){\n var gun = this, root = gun.back(-1), tmp;\n opt = opt || {};\n if(opt && opt.sessionStorage){\n if(SEA.window){\n try{\n var sS = {};\n sS = SEA.window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n if(sS){\n (root._).opt.remember = true;\n ((gun.back('user')._).opt||opt).remember = true;\n if(sS.recall || sS.pair) root.user().auth(JSON.parse(sS.pair), cb); // pair is more reliable than alias/pass\n }\n }catch(e){}\n }\n return gun;\n }\n /*\n TODO: copy mhelander's expiry code back in.\n Although, we should check with community,\n should expiry be core or a plugin?\n */\n return gun;\n }\n })(USE, './recall');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n User.prototype.pair = function(){\n var user = this, proxy; // undeprecated, hiding with proxies.\n try{ proxy = new Proxy({DANGER:'\\u2620'}, {get: function(t,p,r){\n if(!user.is || !(user._||'').sea){ return }\n return user._.sea[p];\n }})}catch(e){}\n return proxy;\n }\n // If authenticated user wants to delete his/her account, let's support it!\n User.prototype.delete = async function(alias, pass, cb){\n console.log(\"user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!\");\n var gun = this, root = gun.back(-1), user = gun.back('user');\n try {\n user.auth(alias, pass, function(ack){\n var pub = (user.is||{}).pub;\n // Delete user data\n user.map().once(function(){ this.put(null) });\n // Wipe user data from memory\n user.leave();\n (cb || noop)({ok: 0});\n });\n } catch (e) {\n Gun.log('User.delete failed! Error:', e);\n }\n return gun;\n }\n User.prototype.alive = async function(){\n console.log(\"user.alive() IS DEPRECATED!!!\");\n const gunRoot = this.back(-1)\n try {\n // All is good. Should we do something more with actual recalled data?\n await authRecall(gunRoot)\n return gunRoot._.user._\n } catch (e) {\n const err = 'No session!'\n Gun.log(err)\n throw { err }\n }\n }\n User.prototype.trust = async function(user){\n console.log(\"`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n // TODO: BUG!!! SEA `node` read listener needs to be async, which means core needs to be async too.\n //gun.get('alice').get('age').trust(bob);\n if (Gun.is(user)) {\n user.get('pub').get((ctx, ev) => {\n console.log(ctx, ev)\n })\n }\n user.get('trust').get(path).put(theirPubkey);\n\n // do a lookup on this gun chain directly (that gets bob's copy of the data)\n // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path)\n // do a lookup on each of those pubKeys ON the path (to get the collab data \"layers\")\n // THEN you perform Jachen's mix operation\n // and return the result of that to...\n }\n User.prototype.grant = function(to, cb){\n console.log(\"`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('grant').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('grant').get(pair.pub).get(path).put(enc);\n }\n var pub = to.get('pub').then();\n var epub = to.get('epub').then();\n pub = await pub; epub = await epub;\n var dh = await SEA.secret(epub, pair);\n enc = await SEA.encrypt(sec, dh);\n user.get('grant').get(pub).get(path).put(enc, cb);\n }());\n return gun;\n }\n User.prototype.secret = function(data, cb){\n console.log(\"`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('trust').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('trust').get(pair.pub).get(path).put(enc);\n }\n enc = await SEA.encrypt(data, sec);\n gun.put(enc, cb);\n }());\n return gun;\n }\n\n /**\n * returns the decrypted value, encrypted by secret\n * @returns {Promise<any>}\n // Mark needs to review 1st before officially supported\n User.prototype.decrypt = function(cb) {\n let gun = this,\n path = ''\n gun.back(function(at) {\n if (at.is) {\n return\n }\n path += at.get || ''\n })\n return gun\n .then(async data => {\n if (data == null) {\n return\n }\n const user = gun.back(-1).user()\n const pair = user.pair()\n let sec = await user\n .get('trust')\n .get(pair.pub)\n .get(path)\n sec = await SEA.decrypt(sec, pair)\n if (!sec) {\n return data\n }\n let decrypted = await SEA.decrypt(data, sec)\n return decrypted\n })\n .then(res => {\n cb && cb(res)\n return res\n })\n }\n */\n module.exports = User\n })(USE, './share');\n\n ;USE(function(module){\n var SEA = USE('./sea'), S = USE('./settings'), noop = function() {}, u;\n var Gun = (SEA.window||'').GUN || USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n // After we have a GUN extension to make user registration/login easy, we then need to handle everything else.\n\n // We do this with a GUN adapter, we first listen to when a gun instance is created (and when its options change)\n Gun.on('opt', function(at){\n if(!at.sea){ // only add SEA once per instance, on the \"at\" context.\n at.sea = {own: {}};\n at.on('put', check, at); // SEA now runs its firewall on HAM diffs, not all i/o.\n }\n this.to.next(at); // make sure to call the \"next\" middleware adapter.\n });\n\n // Alright, this next adapter gets run at the per node level in the graph database.\n // correction: 2020 it gets run on each key/value pair in a node upon a HAM diff.\n // This will let us verify that every property on a node has a value signed by a public key we trust.\n // If the signature does not match, the data is just `undefined` so it doesn't get passed on.\n // If it does match, then we transform the in-memory \"view\" of the data into its plain value (without the signature).\n // Now NOTE! Some data is \"system\" data, not user data. Example: List of public keys, aliases, etc.\n // This data is self-enforced (the value can only match its ID), but that is handled in the `security` function.\n // From the self-enforced data, we can see all the edges in the graph that belong to a public key.\n // Example: ~ASDF is the ID of a node with ASDF as its public key, signed alias and salt, and\n // its encrypted private key, but it might also have other signed values on it like `profile = <ID>` edge.\n // Using that directed edge's ID, we can then track (in memory) which IDs belong to which keys.\n // Here is a problem: Multiple public keys can \"claim\" any node's ID, so this is dangerous!\n // This means we should ONLY trust our \"friends\" (our key ring) public keys, not any ones.\n // I have not yet added that to SEA yet in this alpha release. That is coming soon, but beware in the meanwhile!\n\n function check(msg){ // REVISE / IMPROVE, NO NEED TO PASS MSG/EVE EACH SUB?\n var eve = this, at = eve.as, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp;\n if(!soul || !key){ return }\n if((msg._||'').faith && (at.opt||'').faith && 'function' == typeof msg._){\n SEA.opt.pack(put, function(raw){\n SEA.verify(raw, false, function(data){ // this is synchronous if false\n put['='] = SEA.opt.unpack(data);\n eve.to.next(msg);\n })})\n return \n }\n var no = function(why){ at.on('in', {'@': id, err: msg.err = why}) }; // exploit internal relay stun for now, maybe violates spec, but testing for now. // Note: this may be only the sharded message, not original batch.\n //var no = function(why){ msg.ack(why) };\n (msg._||'').DBG && ((msg._||'').DBG.c = +new Date);\n if(0 <= soul.indexOf('<?')){ // special case for \"do not sync data X old\" forget\n // 'a~pub.key/b<?9'\n tmp = parseFloat(soul.split('<?')[1]||'');\n if(tmp && (state < (Gun.state() - (tmp * 1000)))){ // sec to ms\n (tmp = msg._) && (tmp.stun) && (tmp.stun--); // THIS IS BAD CODE! It assumes GUN internals do something that will probably change in future, but hacking in now.\n return; // omit!\n }\n }\n \n if('~@' === soul){ // special case for shared system data, the list of aliases.\n check.alias(eve, msg, val, key, soul, at, no); return;\n }\n if('~@' === soul.slice(0,2)){ // special case for shared system data, the list of public keys for an alias.\n check.pubs(eve, msg, val, key, soul, at, no); return;\n }\n //if('~' === soul.slice(0,1) && 2 === (tmp = soul.slice(1)).split('.').length){ // special case, account data for a public key.\n if(tmp = SEA.opt.pub(soul)){ // special case, account data for a public key.\n check.pub(eve, msg, val, key, soul, at, no, at.user||'', tmp); return;\n }\n if(0 <= soul.indexOf('#')){ // special case for content addressing immutable hashed data.\n check.hash(eve, msg, val, key, soul, at, no); return;\n } \n check.any(eve, msg, val, key, soul, at, no, at.user||''); return;\n eve.to.next(msg); // not handled\n }\n check.hash = function(eve, msg, val, key, soul, at, no){ // mark unbuilt @i001962 's epic hex contrib!\n SEA.work(val, null, function(data){\n function hexToBase64(hexStr) {\n let base64 = \"\";\n for(let i = 0; i < hexStr.length; i++) {\n base64 += !(i - 1 & 1) ? String.fromCharCode(parseInt(hexStr.substring(i - 1, i + 1), 16)) : \"\"}\n return btoa(base64);} \n if(data && data === key.split('#').slice(-1)[0]){ return eve.to.next(msg) }\n else if (data && data === hexToBase64(key.split('#').slice(-1)[0])){ \n return eve.to.next(msg) }\n no(\"Data hash not same as hash!\");\n }, {name: 'SHA-256'});\n }\n check.alias = function(eve, msg, val, key, soul, at, no){ // Example: {_:#~@, ~@alice: {#~@alice}}\n if(!val){ return no(\"Data must exist!\") } // data MUST exist\n if('~@'+key === link_is(val)){ return eve.to.next(msg) } // in fact, it must be EXACTLY equal to itself\n no(\"Alias not same!\"); // if it isn't, reject.\n };\n check.pubs = function(eve, msg, val, key, soul, at, no){ // Example: {_:#~@alice, ~asdf: {#~asdf}}\n if(!val){ return no(\"Alias must exist!\") } // data MUST exist\n if(key === link_is(val)){ return eve.to.next(msg) } // and the ID must be EXACTLY equal to its property\n no(\"Alias not same!\"); // that way nobody can tamper with the list of public keys.\n };\n check.pub = async function(eve, msg, val, key, soul, at, no, user, pub){ var tmp // Example: {_:#~asdf, hello:'world'~fdsa}}\n const raw = await S.parse(val) || {}\n const verify = (certificate, certificant, cb) => {\n if (certificate.m && certificate.s && certificant && pub)\n // now verify certificate\n return SEA.verify(certificate, pub, data => { // check if \"pub\" (of the graph owner) really issued this cert\n if (u !== data && u !== data.e && msg.put['>'] && msg.put['>'] > parseFloat(data.e)) return no(\"Certificate expired.\") // certificate expired\n // \"data.c\" = a list of certificants/certified users\n // \"data.w\" = lex WRITE permission, in the future, there will be \"data.r\" which means lex READ permission\n if (u !== data && data.c && data.w && (data.c === certificant || data.c.indexOf('*' || certificant) > -1)) {\n // ok, now \"certificant\" is in the \"certificants\" list, but is \"path\" allowed? Check path\n let path = soul.indexOf('/') > -1 ? soul.replace(soul.substring(0, soul.indexOf('/') + 1), '') : ''\n String.match = String.match || Gun.text.match\n const w = Array.isArray(data.w) ? data.w : typeof data.w === 'object' || typeof data.w === 'string' ? [data.w] : []\n for (const lex of w) {\n if ((String.match(path, lex['#']) && String.match(key, lex['.'])) || (!lex['.'] && String.match(path, lex['#'])) || (!lex['#'] && String.match(key, lex['.'])) || String.match((path ? path + '/' + key : key), lex['#'] || lex)) {\n // is Certificant forced to present in Path\n if (lex['+'] && lex['+'].indexOf('*') > -1 && path && path.indexOf(certificant) == -1 && key.indexOf(certificant) == -1) return no(`Path \"${path}\" or key \"${key}\" must contain string \"${certificant}\".`)\n // path is allowed, but is there any WRITE block? Check it out\n if (data.wb && (typeof data.wb === 'string' || ((data.wb || {})['#']))) { // \"data.wb\" = path to the WRITE block\n var root = eve.as.root.$.back(-1)\n if (typeof data.wb === 'string' && '~' !== data.wb.slice(0, 1)) root = root.get('~' + pub)\n return root.get(data.wb).get(certificant).once(value => { // TODO: INTENT TO DEPRECATE.\n if (value && (value === 1 || value === true)) return no(`Certificant ${certificant} blocked.`)\n return cb(data)\n })\n }\n return cb(data)\n }\n }\n return no(\"Certificate verification fail.\")\n }\n })\n return\n }\n \n if ('pub' === key && '~' + pub === soul) {\n if (val === pub) return eve.to.next(msg) // the account MUST match `pub` property that equals the ID of the public key.\n return no(\"Account not same!\")\n }\n\n if ((tmp = user.is) && tmp.pub && !raw['*'] && !raw['+'] && (pub === tmp.pub || (pub !== tmp.pub && ((msg._.msg || {}).opt || {}).cert))){\n SEA.opt.pack(msg.put, packed => {\n SEA.sign(packed, (user._).sea, async function(data) {\n if (u === data) return no(SEA.err || 'Signature fail.')\n msg.put[':'] = {':': tmp = SEA.opt.unpack(data.m), '~': data.s}\n msg.put['='] = tmp\n \n // if writing to own graph, just allow it\n if (pub === user.is.pub) {\n if (tmp = link_is(val)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n }\n \n // if writing to other's graph, check if cert exists then try to inject cert into put, also inject self pub so that everyone can verify the put\n if (pub !== user.is.pub && ((msg._.msg || {}).opt || {}).cert) {\n const cert = await S.parse(msg._.msg.opt.cert)\n // even if cert exists, we must verify it\n if (cert && cert.m && cert.s)\n verify(cert, user.is.pub, _ => {\n msg.put[':']['+'] = cert // '+' is a certificate\n msg.put[':']['*'] = user.is.pub // '*' is pub of the user who puts\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n })\n }\n }, {raw: 1})\n })\n return;\n }\n\n SEA.opt.pack(msg.put, packed => {\n SEA.verify(packed, raw['*'] || pub, function(data){ var tmp;\n data = SEA.opt.unpack(data);\n if (u === data) return no(\"Unverified data.\") // make sure the signature matches the account it claims to be on. // reject any updates that are signed with a mismatched account.\n if ((tmp = link_is(data)) && pub === SEA.opt.pub(tmp)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n \n // check if cert ('+') and putter's pub ('*') exist\n if (raw['+'] && raw['+']['m'] && raw['+']['s'] && raw['*'])\n // now verify certificate\n verify(raw['+'], raw['*'], _ => {\n msg.put['='] = data;\n return eve.to.next(msg);\n })\n else {\n msg.put['='] = data;\n return eve.to.next(msg);\n }\n });\n })\n return\n };\n check.any = function(eve, msg, val, key, soul, at, no, user){ var tmp, pub;\n if(at.opt.secure){ return no(\"Soul missing public key at '\" + key + \"'.\") }\n // TODO: Ask community if should auto-sign non user-graph data.\n at.on('secure', function(msg){ this.off();\n if(!at.opt.secure){ return eve.to.next(msg) }\n no(\"Data cannot be changed.\");\n }).on.on('secure', msg);\n return;\n }\n\n var valid = Gun.valid, link_is = function(d,l){ return 'string' == typeof (l = valid(d)) && l }, state_ify = (Gun.state||'').ify;\n\n var pubcut = /[^\\w_-]/; // anything not alphanumeric or _ -\n SEA.opt.pub = function(s){\n if(!s){ return }\n s = s.split('~');\n if(!s || !(s = s[1])){ return }\n s = s.split(pubcut).slice(0,2);\n if(!s || 2 != s.length){ return }\n if('@' === (s[0]||'')[0]){ return }\n s = s.slice(0,2).join('.');\n return s;\n }\n SEA.opt.stringy = function(t){\n // TODO: encrypt etc. need to check string primitive. Make as breaking change.\n }\n SEA.opt.pack = function(d,cb,k, n,s){ var tmp, f; // pack for verifying\n if(SEA.opt.check(d)){ return cb(d) }\n if(d && d['#'] && d['.'] && d['>']){ tmp = d[':']; f = 1 }\n JSON.parseAsync(f? tmp : d, function(err, meta){\n var sig = ((u !== (meta||'')[':']) && (meta||'')['~']); // or just ~ check?\n if(!sig){ cb(d); return }\n cb({m: {'#':s||d['#'],'.':k||d['.'],':':(meta||'')[':'],'>':d['>']||Gun.state.is(n, k)}, s: sig});\n });\n }\n var O = SEA.opt;\n SEA.opt.unpack = function(d, k, n){ var tmp;\n if(u === d){ return }\n if(d && (u !== (tmp = d[':']))){ return tmp }\n k = k || O.fall_key; if(!n && O.fall_val){ n = {}; n[k] = O.fall_val }\n if(!k || !n){ return }\n if(d === n[k]){ return d }\n if(!SEA.opt.check(n[k])){ return d }\n var soul = (n && n._ && n._['#']) || O.fall_soul, s = Gun.state.is(n, k) || O.fall_state;\n if(d && 4 === d.length && soul === d[0] && k === d[1] && fl(s) === fl(d[3])){\n return d[2];\n }\n if(s < SEA.opt.shuffle_attack){\n return d;\n }\n }\n SEA.opt.shuffle_attack = 1546329600000; // Jan 1, 2019\n var fl = Math.floor; // TODO: Still need to fix inconsistent state issue.\n // TODO: Potential bug? If pub/priv key starts with `-`? IDK how possible.\n\n })(USE, './index');\n}());\n","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 try {\r\n const { fileURLToPath } = require('url');\r\n const { dirname, join } = require('path');\r\n const { readFileSync } = require('fs');\r\n \r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n \r\n const rawdata = readFileSync(join(__dirname, 'contract-address.json'));\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// Funzione helper per verificare l'ambiente\r\nexport function isLocalEnvironment() {\r\n return process.env.NODE_ENV === 'development' && \r\n (typeof window === 'undefined' || window.location.hostname === 'localhost');\r\n}\r\n\r\n// Funzione per ottenere gli indirizzi corretti\r\nexport function getAddressesForChain(chainName) {\r\n let config;\r\n\r\n if (chainName === 'localhost') {\r\n if (typeof window === 'undefined') {\r\n // Server-side\r\n try {\r\n const { fileURLToPath } = require('url');\r\n const { dirname, join } = require('path');\r\n const { readFileSync } = require('fs');\r\n \r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = dirname(__filename);\r\n const localAddresses = JSON.parse(\r\n readFileSync(join(__dirname, '../config/contract-address.json'), 'utf8')\r\n );\r\n \r\n config = {\r\n ...LOCAL_CONFIG,\r\n ...localAddresses\r\n };\r\n } catch (err) {\r\n console.warn('No local addresses found:', err);\r\n throw new Error('No local addresses found. Did you run local deployment?');\r\n }\r\n } else {\r\n // Client-side\r\n config = LOCAL_CONFIG;\r\n }\r\n return config;\r\n }\r\n\r\n // Usa gli indirizzi di produzione\r\n config = CHAIN_CONFIG[chainName];\r\n if (!config) {\r\n throw new Error(`Chain ${chainName} not supported`);\r\n }\r\n\r\n return config;\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\nexport const PROOF_OF_INTEGRITY_ADDRESS = \"...\";\r\nexport const STEALTH_ANNOUNCER_ADDRESS = \"...\";\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 { PROOF_OF_INTEGRITY_ABI, PROOF_OF_INTEGRITY_ADDRESS, STEALTH_ANNOUNCER_ABI, STEALTH_ANNOUNCER_ADDRESS } from \"./abis/abis.js\";\r\nimport { LOCAL_CONFIG } from \"./config/local.js\";\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: null,\r\n STEALTH_ANNOUNCER_ADDRESS: STEALTH_ANNOUNCER_ADDRESS\r\n};\r\n\r\n// Solo per Node.js\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 path = require('path');\r\n \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}\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 return ethers.hexlify(ethers.randomBytes(32)).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 hexSignature = ethers.hexlify(signature);\r\n const hash = ethers.keccak256(hexSignature);\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 // Standalone mode with local provider\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 ethers.Wallet(privateKey, provider);\r\n } else if (\r\n typeof window !== \"undefined\" &&\r\n typeof window.ethereum !== \"undefined\"\r\n ) {\r\n // Browser mode\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 // Convert shared secret to bytes\r\n const sharedSecretBytes = Buffer.from(sharedSecret, 'base64');\r\n \r\n // Generate stealth private key using shared secret and spending public key\r\n const stealthPrivateKey = ethers.keccak256(\r\n ethers.concat([\r\n sharedSecretBytes,\r\n ethers.getBytes(spendingPublicKey)\r\n ])\r\n );\r\n \r\n // Create stealth wallet\r\n const stealthWallet = new ethers.Wallet(stealthPrivateKey);\r\n\r\n console.log(\"Debug deriveStealthAddress:\", {\r\n sharedSecretHex: ethers.hexlify(sharedSecretBytes),\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 ethers.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 ethers.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 ethers.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 ethers.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 ethers.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 chainAddresses = getAddressesForChain(options.chain);\r\n const contractAddress = chainAddresses.STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n console.log(\"Using contract address:\", contractAddress);\r\n\r\n const contract = new ethers.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 // Get on-chain payments\r\n const signer = await getSigner();\r\n const contractAddress = process.env.NODE_ENV === 'development' \r\n ? LOCAL_CONFIG.STEALTH_ANNOUNCER_ADDRESS \r\n : STEALTH_ANNOUNCER_ADDRESS;\r\n\r\n const contract = new ethers.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":["USE","arg","req","require","slice","R","mod","path","exports","p","split","toString","replace","MODULE","module","self","window","SEA","u","e","location","protocol","indexOf","host","test","hostname","console","warn","btoa","Buffer","global","log","data","from","atob","SeaArray","Object","assign","Array","prototype","create","enc","start","end","length","this","buf","Uint8Array","keys","map","i","padStart","join","_","String","fromCharCode","SafeBuffer","props","arguments","TypeError","input","bytes","match","byte","parseInt","words","Uint16Array","charCodeAt","dec","info","byteLength","ArrayBuffer","alloc","fill","allocUnsafe","concat","arr","isArray","reduce","ret","item","api","o","JSON","parseAsync","t","cb","r","parse","stringifyAsync","v","s","stringify","Promise","res","rej","err","raw","crypto","msCrypto","subtle","webkitSubtle","TextEncoder","TextDecoder","random","len","getRandomValues","randomBytes","Crypto","WebCrypto","ossl","directory","shim","hash","name","iter","ks","pair","namedCurve","sign","pub","d","jwk","kty","crv","x","y","ext","key_ops","keyBytes","k","alg","validity","hook","async","yes","opt","digest","encode","__shim","b","S","sha","work","salt","epub","Function","toLowerCase","rsha","key","importKey","deriveBits","iterations","pbkdf2","throw","ecdhSubtle","sa","generateKey","then","priv","exportKey","privateKey","publicKey","dh","epriv","I","what","how","why","json","check","verify","m","sig","slow_leak","fallback","fall_verify","knownKeys","O","f","tmp","unpack","fall_soul","fall_key","fall_val","fall_state","sha256hash","combo","jwkKey","keyToJwk","aeskey","encrypt","msg","rand","iv","ct","aes","decrypt","bufiv","bufct","tagLength","decode","secret","pubKeyData","keysToEcdhJwk","public","privKeyData","privKey","derivedBits","rawBits","derivedKey","certify","certificants","policy","authority","certificant","push","expiry","parseFloat","readPolicy","read","writePolicy","write","block","blacklist","ban","readBlock","writeBlock","c","w","rb","wb","keyid","pb","id","sha1","sha1hash","GUN","Gun","User","root","$","lex","state","chain","F","constructor","user","back","get","at","uuid","is","call","gun","once","noop","args","alias","pass","filter","cat","ing","wait","act","pubs","already","ack","leave","proof","sea","auth","ek","g","put","on","h","link","eve","off","ok","a","sS","sessionStorage","recall","obj_ify","tries","forEach","list","shift","half","lol","tag","upt","graph","shuffle","change","z","remember","setTimeout","plugin","proxy","Proxy","DANGER","delete","alive","gunRoot","authRecall","trust","ctx","ev","theirPubkey","grant","to","sec","as","soul","val","faith","pack","next","no","DBG","Date","stun","any","own","hexStr","base64","substring","hexToBase64","link_is","certificate","text","value","cert","packed","secure","valid","l","ify","pubcut","stringy","n","meta","fl","shuffle_attack","Math","floor","contractAddresses","PROOF_OF_INTEGRITY_ADDRESS","STEALTH_ANNOUNCER_ADDRESS","fileURLToPath","dirname","readFileSync","__filename","document","pathToFileURL","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","rawdata","error","LOCAL_CONFIG","CHAIN_ID","RPC_URL","GUN_PEER","STEALTH_ANNOUNCER_ABI","inputs","internalType","type","stateMutability","anonymous","outputs","components","PROOF_OF_INTEGRITY_ABI","indexed","PROOF_CONTRACT_ADDRESS","rpcUrl","MESSAGE_TO_SIGN","__dirname","generateRandomId","ethers","hexlify","generatePassword","signature","hexSignature","keccak256","gunToEthAccount","gunPrivateKey","hexPrivateKey","base64url","padding","repeat","binary","char","base64UrlToHex","wallet","Wallet","account","address","getSigner","provider","JsonRpcProvider","chainId","ethereum","request","method","BrowserProvider","Error","deriveStealthAddress","sharedSecret","spendingPublicKey","sharedSecretBytes","stealthPrivateKey","getBytes","stealthWallet","sharedSecretHex","stealthAddress","setSigner","newRpcUrl","newPrivateKey","verifySignature","message","verifyMessage","createSignature","signer","signMessage","createAndStoreEncryptedPair","v_pair","s_pair","password","encryptedPair","encryptedV_pair","encryptedS_pair","viewingAccount","spendingAccount","publicKeys","viewingPublicKey","ethViewingAddress","getAndDecryptPair","encryptedData","decryptedPair","nodeId","callback","targetChain","isLocalEnvironment","chainConfig","getAddressesForChain","Contract","verifyOnChain","contentHash","contract","isValid","timestamp","updater","verifyData","toUtf8Bytes","writeOnChain","tx","updateData","receipt","getLatestRecord","existingData","_contentHash","latestRecord","newNodeId","dataString","txHash","generateStealthAddress","recipientAddress","recipientData","senderAddress","senderData","spendingKeyPair","decryptedData","senderPublicKey","publishStealthKeys","viewingKeyPair","recoverStealthFunds","myAddress","decryptedViewingData","recoveredAddress","recovered","expected","announceStealthPayment","options","onChain","contractAddress","devFee","announcePayment","set","now","stack","getStealthPayments","source","payments","process","env","NODE_ENV","totalAnnouncements","getAnnouncementsCount","totalCount","Number","batchSize","lastIndex","toIndex","min","batch","getAnnouncementsInRange","announcement","recoveredWallet","offChainPayments","resolve","payment","cleanStealthPayments","GunEth","static"],"mappings":"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","x_google_ignoreList":[0]}