Описание изменений

This commit is contained in:
2025-02-19 20:22:29 +03:00
parent 7cb967138d
commit 6937079ec0
20 changed files with 777 additions and 3753 deletions

View File

@@ -3,9 +3,13 @@ pragma solidity ^0.8.0;
contract MyContract {
address public owner;
uint256 public price;
event Purchase(address buyer, uint256 amount);
constructor() {
owner = msg.sender;
price = 0.01 ether; // Начальная цена 0.01 ETH
}
modifier onlyOwner() {
@@ -17,4 +21,21 @@ contract MyContract {
require(newOwner != address(0), "New owner cannot be zero address");
owner = newOwner;
}
function setPrice(uint256 newPrice) public onlyOwner {
price = newPrice;
}
function getPrice() public view returns (uint256) {
return price;
}
function purchase(uint256 amount) public payable {
require(msg.value == price * amount, "Incorrect payment amount");
emit Purchase(msg.sender, amount);
}
function withdraw() public onlyOwner {
payable(owner).transfer(address(this).balance);
}
}

View File

@@ -9,17 +9,17 @@
"deploy": "hardhat run scripts/deploy.js --network sepolia",
"node": "hardhat node",
"test": "hardhat test",
"server": "node server.js"
"server": "nodemon server.js"
},
"dependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.0",
"@nomiclabs/hardhat-waffle": "^2.0.0",
"cors": "^2.8.5",
"ethers": "^5.7.2",
"ethers": "^6.13.5",
"express": "^4.21.2",
"express-session": "^1.18.1",
"hardhat": "^2.9.3",
"siwe": "^2.1.4",
"siwe": "^3.0.0",
"viem": "^2.23.2"
},
"devDependencies": {
@@ -28,6 +28,7 @@
"@types/sinon-chai": "^4.0.0",
"chai": "4.3.7",
"dotenv": "^16.4.7",
"ethereum-waffle": "^4.0.10"
"ethereum-waffle": "^4.0.10",
"nodemon": "^3.1.9"
}
}

View File

@@ -1,6 +1,12 @@
import express from 'express';
import cors from 'cors';
import session from 'express-session';
import { SiweMessage, generateNonce } from 'siwe';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
@@ -35,53 +41,85 @@ app.use((req, res, next) => {
});
// Генерация nonce
app.get('/nonce', (_, res) => {
app.get('/nonce', (req, res) => {
try {
const nonce = generateNonce();
res.setHeader('Content-Type', 'text/plain');
res.status(200).send(nonce);
req.session.nonce = generateNonce();
console.log('Сгенерирован новый nonce:', req.session.nonce);
res.setHeader('Content-Type', 'application/json');
res.status(200).json({ nonce: req.session.nonce });
} catch (error) {
console.error('Ошибка генерации nonce:', error);
res.status(500).send('Internal Server Error');
res.status(500).json({ error: 'Internal Server Error' });
}
});
// Верификация сообщения
app.post('/verify', async (req, res) => {
try {
const { address, chainId = 11155111 } = req.body;
const { signature, message } = req.body;
if (isNaN(chainId)) {
throw new Error("Invalid chainId");
console.log('Получен запрос на верификацию:', {
signature: signature?.slice(0, 20) + '...',
message,
sessionNonce: req.session.nonce
});
if (!req.session.nonce) {
console.error('Сессия не содержит nonce');
throw new Error('Invalid session');
}
if (!signature || !message) {
console.error('Отсутствует подпись или сообщение');
throw new Error('Invalid signature or message');
}
// Создаем и верифицируем SIWE сообщение
console.log('Начинаем парсинг SIWE сообщения...');
const siweMessage = new SiweMessage(message);
console.log('Парсинг успешен:', {
domain: siweMessage.domain,
address: siweMessage.address,
nonce: siweMessage.nonce
});
const { success, data: fields } = await siweMessage.verify({
signature,
domain: siweMessage.domain,
nonce: req.session.nonce
});
console.log('Результат верификации:', { success, fields });
if (!success) {
throw new Error('Signature verification failed');
}
// Сохраняем сессию
req.session.siwe = {
address,
chainId
};
req.session.authenticated = true;
req.session.siwe = fields;
console.log('Сессия сохранена:', {
authenticated: true,
address: fields.address
});
req.session.save(() => {
console.log('Session saved successfully');
res.status(200).json({
success: true,
address,
chainId
address: fields.address
});
});
} catch (error) {
console.error('Ошибка верификации:', {
message: error.message,
stack: error.stack,
name: error.name
});
req.session.siwe = null;
console.error('Ошибка верификации:', error);
req.session.authenticated = false;
req.session.nonce = null;
req.session.save(() => {
res.status(400).json({
error: 'Verification failed',
message: error.message
});
req.session.siwe = null;
res.status(400).json({
error: 'Verification failed',
message: error.message
});
}
});
@@ -89,7 +127,10 @@ app.post('/verify', async (req, res) => {
// Получение сессии
app.get('/session', (req, res) => {
try {
res.json(req.session.siwe || null);
res.json({
authenticated: !!req.session.authenticated,
address: req.session.siwe?.address
});
} catch (error) {
console.error('Ошибка получения сессии:', error);
res.status(500).json({ error: 'Internal Server Error' });

View File

@@ -2,6 +2,11 @@
# yarn lockfile v1
"@adraffy/ens-normalize@1.10.1":
version "1.10.1"
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069"
integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==
"@adraffy/ens-normalize@^1.10.1":
version "1.11.0"
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33"
@@ -134,7 +139,7 @@
merkle-patricia-tree "^4.2.2"
rustbn.js "~0.2.0"
"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0":
"@ethersproject/abi@^5.1.2":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
@@ -149,7 +154,7 @@
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
"@ethersproject/abstract-provider@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
@@ -162,7 +167,7 @@
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/web" "^5.7.0"
"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
"@ethersproject/abstract-signer@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
@@ -173,7 +178,7 @@
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0":
"@ethersproject/address@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
@@ -184,22 +189,14 @@
"@ethersproject/logger" "^5.7.0"
"@ethersproject/rlp" "^5.7.0"
"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
"@ethersproject/base64@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b"
integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0":
"@ethersproject/bignumber@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
@@ -208,37 +205,21 @@
"@ethersproject/logger" "^5.7.0"
bn.js "^5.2.1"
"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0":
"@ethersproject/bytes@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
"@ethersproject/constants@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/contracts@5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
dependencies:
"@ethersproject/abi" "^5.7.0"
"@ethersproject/abstract-provider" "^5.7.0"
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/address" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/constants" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0":
"@ethersproject/hash@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
@@ -253,44 +234,7 @@
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf"
integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
dependencies:
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/basex" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/pbkdf2" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/sha2" "^5.7.0"
"@ethersproject/signing-key" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/wordlists" "^5.7.0"
"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360"
integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
dependencies:
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/address" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/hdnode" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/pbkdf2" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/random" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
aes-js "3.0.0"
scrypt-js "3.0.1"
"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0":
"@ethersproject/keccak256@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
@@ -298,68 +242,26 @@
"@ethersproject/bytes" "^5.7.0"
js-sha3 "0.8.0"
"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0":
"@ethersproject/logger@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
"@ethersproject/networks@^5.7.0":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102"
integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/sha2" "^5.7.0"
"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
"@ethersproject/properties@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
dependencies:
"@ethersproject/logger" "^5.7.0"
"@ethersproject/providers@5.7.2":
version "5.7.2"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb"
integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
dependencies:
"@ethersproject/abstract-provider" "^5.7.0"
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/address" "^5.7.0"
"@ethersproject/base64" "^5.7.0"
"@ethersproject/basex" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/constants" "^5.7.0"
"@ethersproject/hash" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/networks" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/random" "^5.7.0"
"@ethersproject/rlp" "^5.7.0"
"@ethersproject/sha2" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/web" "^5.7.0"
bech32 "1.1.4"
ws "7.4.6"
"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c"
integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0":
"@ethersproject/rlp@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
@@ -367,16 +269,7 @@
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb"
integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
hash.js "1.1.7"
"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
"@ethersproject/signing-key@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
@@ -388,19 +281,7 @@
elliptic "6.5.4"
hash.js "1.1.7"
"@ethersproject/solidity@5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/sha2" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0":
"@ethersproject/strings@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
@@ -409,7 +290,7 @@
"@ethersproject/constants" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0":
"@ethersproject/transactions@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
@@ -424,37 +305,7 @@
"@ethersproject/rlp" "^5.7.0"
"@ethersproject/signing-key" "^5.7.0"
"@ethersproject/units@5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
dependencies:
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/constants" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/wallet@5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d"
integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
dependencies:
"@ethersproject/abstract-provider" "^5.7.0"
"@ethersproject/abstract-signer" "^5.7.0"
"@ethersproject/address" "^5.7.0"
"@ethersproject/bignumber" "^5.7.0"
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/hash" "^5.7.0"
"@ethersproject/hdnode" "^5.7.0"
"@ethersproject/json-wallets" "^5.7.0"
"@ethersproject/keccak256" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/random" "^5.7.0"
"@ethersproject/signing-key" "^5.7.0"
"@ethersproject/transactions" "^5.7.0"
"@ethersproject/wordlists" "^5.7.0"
"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
"@ethersproject/web@^5.7.0":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
@@ -465,17 +316,6 @@
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5"
integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
dependencies:
"@ethersproject/bytes" "^5.7.0"
"@ethersproject/hash" "^5.7.0"
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/strings" "^5.7.0"
"@fastify/busboy@^2.0.0":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
@@ -554,6 +394,13 @@
tweetnacl "^1.0.3"
tweetnacl-util "^0.15.1"
"@noble/curves@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
dependencies:
"@noble/hashes" "1.3.2"
"@noble/curves@1.8.1", "@noble/curves@^1.6.0", "@noble/curves@~1.8.1":
version "1.8.1"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff"
@@ -566,6 +413,11 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==
"@noble/hashes@1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
"@noble/hashes@1.7.1", "@noble/hashes@^1.1.2", "@noble/hashes@^1.5.0", "@noble/hashes@~1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f"
@@ -861,15 +713,13 @@
"@sentry/types" "5.30.0"
tslib "^1.9.3"
"@spruceid/siwe-parser@^2.1.2":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-2.1.2.tgz#3e13e7d3ac0bfdaf109a07342590eb21daee2fc3"
integrity sha512-d/r3S1LwJyMaRAKQ0awmo9whfXeE88Qt00vRj91q5uv5ATtWIQEGJ67Yr5eSZw5zp1/fZCXZYuEckt8lSkereQ==
"@spruceid/siwe-parser@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-3.0.0.tgz#8af48683d77aed6dbd1abf541e1b064dc64be10e"
integrity sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==
dependencies:
"@noble/hashes" "^1.1.2"
apg-js "^4.3.0"
uri-js "^4.4.1"
valid-url "^1.0.9"
apg-js "^4.4.0"
"@stablelib/binary@^1.0.1":
version "1.0.1"
@@ -1054,6 +904,13 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a"
integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
"@types/node@22.7.5":
version "22.7.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b"
integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==
dependencies:
undici-types "~6.19.2"
"@types/pbkdf2@^3.0.0":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc"
@@ -1177,10 +1034,10 @@ adm-zip@^0.4.16:
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
aes-js@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
aes-js@4.0.0-beta.5:
version "4.0.0-beta.5"
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873"
integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==
agent-base@6:
version "6.0.2"
@@ -1253,7 +1110,7 @@ anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
apg-js@^4.3.0:
apg-js@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/apg-js/-/apg-js-4.4.0.tgz#09dcecab0731fbde233b9f2352fdd2d07e56b2cf"
integrity sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==
@@ -1348,11 +1205,6 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
bech32@1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
bignumber.js@^9.0.0:
version "9.1.2"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c"
@@ -1593,7 +1445,7 @@ check-error@^1.0.2:
dependencies:
get-func-name "^2.0.2"
chokidar@^3.5.3:
chokidar@^3.5.2, chokidar@^3.5.3:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -1810,7 +1662,7 @@ debug@2.6.9, debug@^2.2.0:
dependencies:
ms "2.0.0"
debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5:
debug@4, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5:
version "4.4.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
@@ -2110,41 +1962,18 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereum
ethereum-cryptography "^0.1.3"
rlp "^2.2.4"
ethers@^5.7.2:
version "5.7.2"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
ethers@^6.13.5:
version "6.13.5"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.5.tgz#8c1d6ac988ac08abc3c1d8fabbd4b8b602851ac4"
integrity sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==
dependencies:
"@ethersproject/abi" "5.7.0"
"@ethersproject/abstract-provider" "5.7.0"
"@ethersproject/abstract-signer" "5.7.0"
"@ethersproject/address" "5.7.0"
"@ethersproject/base64" "5.7.0"
"@ethersproject/basex" "5.7.0"
"@ethersproject/bignumber" "5.7.0"
"@ethersproject/bytes" "5.7.0"
"@ethersproject/constants" "5.7.0"
"@ethersproject/contracts" "5.7.0"
"@ethersproject/hash" "5.7.0"
"@ethersproject/hdnode" "5.7.0"
"@ethersproject/json-wallets" "5.7.0"
"@ethersproject/keccak256" "5.7.0"
"@ethersproject/logger" "5.7.0"
"@ethersproject/networks" "5.7.1"
"@ethersproject/pbkdf2" "5.7.0"
"@ethersproject/properties" "5.7.0"
"@ethersproject/providers" "5.7.2"
"@ethersproject/random" "5.7.0"
"@ethersproject/rlp" "5.7.0"
"@ethersproject/sha2" "5.7.0"
"@ethersproject/signing-key" "5.7.0"
"@ethersproject/solidity" "5.7.0"
"@ethersproject/strings" "5.7.0"
"@ethersproject/transactions" "5.7.0"
"@ethersproject/units" "5.7.0"
"@ethersproject/wallet" "5.7.0"
"@ethersproject/web" "5.7.1"
"@ethersproject/wordlists" "5.7.0"
"@adraffy/ens-normalize" "1.10.1"
"@noble/curves" "1.2.0"
"@noble/hashes" "1.3.2"
"@types/node" "22.7.5"
aes-js "4.0.0-beta.5"
tslib "2.7.0"
ws "8.17.1"
ethjs-util@0.1.6, ethjs-util@^0.1.6:
version "0.1.6"
@@ -2632,6 +2461,11 @@ ieee754@^1.1.13, ieee754@^1.2.1:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
immediate@^3.2.3:
version "3.3.0"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
@@ -3072,7 +2906,7 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
minimatch@^3.0.4:
minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -3188,6 +3022,22 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
nodemon@^3.1.9:
version "3.1.9"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.9.tgz#df502cdc3b120e1c3c0c6e4152349019efa7387b"
integrity sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==
dependencies:
chokidar "^3.5.2"
debug "^4"
ignore-by-default "^1.0.1"
minimatch "^3.1.2"
pstree.remy "^1.1.8"
semver "^7.5.3"
simple-update-notifier "^2.0.0"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.5"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -3362,6 +3212,11 @@ psl@^1.1.28:
dependencies:
punycode "^2.3.1"
pstree.remy@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
@@ -3524,7 +3379,7 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
scrypt-js@3.0.1, scrypt-js@^3.0.0:
scrypt-js@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
@@ -3567,6 +3422,11 @@ semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.5.3:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
send@0.19.0:
version "0.19.0"
resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
@@ -3661,15 +3521,20 @@ side-channel@^1.0.6, side-channel@^1.1.0:
side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2"
siwe@^2.1.4:
version "2.3.2"
resolved "https://registry.yarnpkg.com/siwe/-/siwe-2.3.2.tgz#0794ae25f734f3068de0ab093ddd2f7867bc2d67"
integrity sha512-aSf+6+Latyttbj5nMu6GF3doMfv2UYj83hhwZgUF20ky6fTS83uVhkQABdIVnEuS8y1bBdk7p6ltb9SmlhTTlA==
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
dependencies:
"@spruceid/siwe-parser" "^2.1.2"
semver "^7.5.3"
siwe@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/siwe/-/siwe-3.0.0.tgz#0508c3fca521c476a07d907a9b5b96a03c27c0f2"
integrity sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==
dependencies:
"@spruceid/siwe-parser" "^3.0.0"
"@stablelib/random" "^1.0.1"
uri-js "^4.4.1"
valid-url "^1.0.9"
solc@0.8.15:
version "0.8.15"
@@ -3777,7 +3642,7 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
supports-color@^5.3.0:
supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
@@ -3835,6 +3700,11 @@ toidentifier@1.0.1:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
touch@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694"
integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@@ -3863,6 +3733,11 @@ ts-essentials@^7.0.1:
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38"
integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==
tslib@2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
@@ -3956,6 +3831,16 @@ uid-safe@~2.1.5:
dependencies:
random-bytes "~1.0.0"
undefsafe@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
undici-types@~6.19.2:
version "6.19.8"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
undici-types@~6.20.0:
version "6.20.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
@@ -3978,7 +3863,7 @@ unpipe@1.0.0, unpipe@~1.0.0:
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
uri-js@^4.2.2, uri-js@^4.4.1:
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
@@ -4020,11 +3905,6 @@ uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
valid-url@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -4100,10 +3980,10 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
ws@7.4.6:
version "7.4.6"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
ws@8.17.1:
version "8.17.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
ws@8.18.0:
version "8.18.0"

4
frontend/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"typescript.validate.enable": false,
"javascript.validate.enable": true
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DApp for Business</title>
</head>
<body>
<div id="app"></div>
<!-- Vite автоматически вставит сюда ваш JavaScript -->
<script type="module" src="/src/main.js"></script>
</body>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>DApp for Business</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

View File

@@ -6,25 +6,14 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"type-check": "vue-tsc --noEmit"
"preview": "vite preview"
},
"dependencies": {
"@reown/appkit": "^1.6.8",
"@reown/appkit-adapter-ethers": "^1.6.8",
"@reown/appkit-experimental": "^1.6.8",
"@reown/appkit-siwe": "^1.6.8",
"@reown/appkit-wallet-button": "^1.6.8",
"ethers": "^6.13.4",
"siwe": "^2.1.4",
"viem": "^2.23.2",
"vue": "^3.4.15"
"ethers": "^6.13.5",
"vue": "^3.4.21"
},
"devDependencies": {
"@types/node": "^22.13.4",
"@vitejs/plugin-vue": "^5.2.0",
"vue-tsc": "^1.8.27",
"typescript": "^5.7.3",
"@vitejs/plugin-vue": "^5.2.1",
"vite": "^5.4.10"
}
}

View File

@@ -1,27 +1,21 @@
<template>
<div id="app">
<h1>Добро пожаловать в DApp-for-Business</h1>
<appkit-button
balance="show"
size="md"
label="Подключить кошелек"
loadingLabel="Подключение..."
/>
<h1>DApp for Business</h1>
<ContractInteraction />
</div>
</template>
<script>
<script setup>
import ContractInteraction from './components/ContractInteraction.vue'
export default {
name: "App",
components: {
ContractInteraction
}
};
</script>
<style>
/* Добавьте ваши стили здесь */
#app {
font-family: Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

View File

@@ -1,207 +1,557 @@
<template>
<div class="contract-interaction">
<h2>Управление контрактом</h2>
<h2>Взаимодействие с контрактом</h2>
<div v-if="!isConnected" class="warning">
Пожалуйста, подключите кошелек для управления контрактом
<appkit-button />
<div v-if="!isInitialized" class="loading-message">
Загрузка контракта...
</div>
<div v-else>
<div class="owner-info">
<p>Текущий владелец:
<span v-if="loading">Загрузка...</span>
<span v-else-if="owner">{{ formatAddress(owner) }}</span>
<span v-else>Не удалось загрузить</span>
</p>
</div>
<div v-if="!isConnected">
<button
@click="connectWallet"
class="connect-button"
>
Подключить кошелек
</button>
</div>
<div class="owner-controls">
<input
v-model="newOwner"
placeholder="Адрес нового владельца (0x...)"
:disabled="!isConnected"
/>
<button
@click="setNewOwner"
:disabled="!isConnected || !isValidAddress(newOwner)"
>
Установить нового владельца
</button>
<div v-if="error" class="error-message">{{ error }}</div>
<div v-if="isConnected && isCorrectNetwork" class="wallet-info">
<p>Адрес кошелька: {{ address }}</p>
<div class="contract-controls">
<h3>Управление контрактом</h3>
<p v-if="currentPrice" class="price-info">
Текущая цена: {{ formatPrice(currentPrice) }} ETH
</p>
<!-- Панель управления для владельца -->
<div v-if="isOwner" class="owner-controls">
<h4>Панель владельца</h4>
<div class="input-group">
<input
v-model="newPrice"
type="number"
step="0.001"
placeholder="Новая цена (ETH)"
class="amount-input"
/>
<button
@click="handleSetPrice"
:disabled="!newPrice || isLoading"
class="admin-button"
>
Установить цену
</button>
</div>
<button
@click="handleWithdraw"
:disabled="isLoading"
class="admin-button withdraw-button"
>
Вывести средства
</button>
</div>
<!-- Панель покупки -->
<div class="purchase-panel">
<h4>Покупка</h4>
<div class="input-group">
<input
v-model="amount"
type="number"
placeholder="Введите количество"
class="amount-input"
/>
<button
@click="handlePurchase"
:disabled="!amount || isLoading"
class="purchase-button"
>
{{ isLoading ? 'Обработка...' : 'Купить' }}
</button>
</div>
<p v-if="amount && currentPrice" class="total-cost">
Общая стоимость: {{ formatPrice(currentPrice * amount) }} ETH
</p>
</div>
<p v-if="success" class="success-message">{{ success }}</p>
</div>
</div>
</div>
</template>
<script>
import { ref, onMounted, watch } from 'vue';
import { ethers } from 'ethers';
import { useAppKitAccount, useAppKitProvider, useAppKit } from '@reown/appkit/vue';
import config from '../config';
<script setup>
import { ref, onMounted, computed, watch } from 'vue'
import { BrowserProvider, Contract, JsonRpcProvider, formatEther, parseEther } from 'ethers'
export default {
name: 'ContractInteraction',
setup() {
const owner = ref('');
const newOwner = ref('');
const loading = ref(false);
const { address, isConnected } = useAppKitAccount();
const { walletProvider } = useAppKitProvider('eip155');
const { contractAddress, contractABI } = config.contract;
// Инициализируем все ref переменные в начале
const amount = ref('')
const newPrice = ref('')
const isLoading = ref(false)
const error = ref('')
const success = ref('')
const currentPrice = ref(null)
const contractOwner = ref(null)
const isCorrectNetwork = ref(false)
const isConnected = ref(false)
const isInitialized = ref(false)
const address = ref(null)
const walletProvider = ref(null)
const isAuthenticated = ref(false)
const { open } = useAppKit(); // Получаем функцию открытия модала
// Константы
const SEPOLIA_CHAIN_ID = 11155111
const provider = new JsonRpcProvider(import.meta.env.VITE_APP_ETHEREUM_NETWORK_URL)
const contractAddress = '0xD1789d2E00e4af3157330ADFbb813427696c8A01'
const contractABI = [
'function purchase(uint256 amount) payable',
'function price() view returns (uint256)',
'function owner() view returns (address)',
'function setPrice(uint256 newPrice) public',
'function withdraw() public',
'event Purchase(address buyer, uint256 amount)'
]
const formatAddress = (addr) => addr.slice(0, 6) + '...' + addr.slice(-4);
// Вычисляемые свойства
const isOwner = computed(() => {
return address.value && contractOwner.value &&
address.value.toLowerCase() === contractOwner.value.toLowerCase()
})
const isValidAddress = (addr) => {
try {
return ethers.isAddress(addr);
} catch {
return false;
}
};
// Функции
function formatPrice(price) {
return formatEther(price)
}
// Следим за изменением состояния подключения
watch(isConnected, async (newValue) => {
console.log('Connection state changed:', newValue);
if (newValue) {
await fetchOwner();
} else {
owner.value = '';
}
});
// Функция инициализации контракта
async function initializeContract() {
try {
if (!provider) {
throw new Error('Provider не доступен')
}
const handleConnect = async () => {
try {
console.log('Attempting to connect wallet...');
await open(); // Используем хуки для открытия модала
console.log('Wallet connected successfully');
} catch (error) {
console.error('Wallet connection error:', error);
}
};
const contract = new Contract(contractAddress, contractABI, provider)
await Promise.all([
contract.price().then(price => {
currentPrice.value = price
console.log('Начальная цена:', formatEther(price), 'ETH')
}),
contract.owner().then(owner => {
contractOwner.value = owner
console.log('Владелец контракта:', owner)
})
])
const fetchOwner = async () => {
if (!isConnected.value || !walletProvider) {
console.log('Cannot fetch owner: wallet not connected');
return;
}
loading.value = true;
try {
console.log('Получаем владельца контракта...');
const ethersProvider = new ethers.BrowserProvider(walletProvider);
const contract = new ethers.Contract(contractAddress, contractABI, ethersProvider);
owner.value = await contract.owner();
console.log('Владелец контракта:', owner.value);
} catch (error) {
console.error('Ошибка при получении владельца:', error);
owner.value = '';
} finally {
loading.value = false;
}
};
const setNewOwner = async () => {
try {
if (!isConnected.value) {
console.log('Пожалуйста, подключите кошелек');
return;
}
if (!isValidAddress(newOwner.value)) {
console.log('Неверный адрес');
return;
}
const ethersProvider = new ethers.BrowserProvider(walletProvider);
const signer = await ethersProvider.getSigner();
const contract = new ethers.Contract(contractAddress, contractABI, signer);
const tx = await contract.setOwner(newOwner.value);
await tx.wait();
await fetchOwner();
newOwner.value = '';
} catch (error) {
console.error('Ошибка при установке нового владельца:', error);
}
};
onMounted(async () => {
if (isConnected.value) {
await fetchOwner();
}
});
return {
owner,
newOwner,
isConnected,
loading,
handleConnect,
setNewOwner,
formatAddress,
isValidAddress
};
isInitialized.value = true
} catch (err) {
console.error('Ошибка при инициализации контракта:', err)
error.value = 'Ошибка при инициализации контракта: ' + err.message
}
};
}
// Функция подключения к MetaMask
async function connectWallet() {
try {
// Проверяем доступность MetaMask
if (!window.ethereum) {
throw new Error('MetaMask не установлен')
}
// Запрашиваем доступ к аккаунту
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts'
})
// Сохраняем адрес и провайдер
address.value = accounts[0]
walletProvider.value = window.ethereum
isConnected.value = true
// Подписываемся на изменение аккаунта
window.ethereum.on('accountsChanged', handleAccountsChanged)
window.ethereum.on('chainChanged', handleChainChanged)
await checkNetwork()
} catch (err) {
console.error('Ошибка при подключении кошелька:', err)
error.value = 'Ошибка при подключении кошелька: ' + err.message
}
}
// Обработчики событий MetaMask
function handleAccountsChanged(accounts) {
if (accounts.length === 0) {
// MetaMask отключен
isConnected.value = false
address.value = null
} else {
// Аккаунт изменен
address.value = accounts[0]
}
}
function handleChainChanged() {
// При смене сети перезагружаем страницу
window.location.reload()
}
// Обновляем watch
watch(isConnected, async (newValue) => {
try {
if (newValue) {
console.log('Кошелек подключен, адрес:', address.value)
if (!isInitialized.value) {
await initializeContract()
}
await checkNetwork()
} else {
console.log('Кошелек отключен')
currentPrice.value = null
contractOwner.value = null
isCorrectNetwork.value = false
error.value = ''
isInitialized.value = false
}
} catch (err) {
console.error('Ошибка при обработке подключения:', err)
error.value = 'Ошибка при обработке подключения: ' + err.message
}
}, { immediate: true })
// Обновляем функцию проверки сети
async function checkNetwork() {
try {
if (!walletProvider.value) {
isCorrectNetwork.value = false
error.value = 'Провайдер кошелька недоступен'
return
}
const ethersProvider = new BrowserProvider(walletProvider.value)
const network = await ethersProvider.getNetwork()
console.log('Текущая сеть:', network.chainId)
isCorrectNetwork.value = Number(network.chainId) === SEPOLIA_CHAIN_ID
if (!isCorrectNetwork.value) {
error.value = `Пожалуйста, переключитесь на сеть Sepolia (${SEPOLIA_CHAIN_ID}). Текущая сеть: ${network.chainId}`
} else {
error.value = ''
await Promise.all([fetchPrice(), fetchOwner()])
}
} catch (err) {
console.error('Ошибка при проверке сети:', err)
isCorrectNetwork.value = false
error.value = 'Ошибка при проверке сети: ' + err.message
}
}
// Обновляем функцию fetchPrice с обработкой ошибок
async function fetchPrice() {
try {
const contract = new Contract(contractAddress, contractABI, provider)
const price = await contract.price()
currentPrice.value = price
console.log('Текущая цена:', formatEther(price), 'ETH')
} catch (err) {
console.error('Ошибка при получении цены:', err)
error.value = `Не удалось получить текущую цену: ${err.message}`
currentPrice.value = null
}
}
// Получение адреса владельца
async function fetchOwner() {
try {
const contract = new Contract(contractAddress, contractABI, provider)
contractOwner.value = await contract.owner()
} catch (err) {
console.error('Ошибка при получении адреса владельца:', err)
}
}
// Обновляем onMounted
onMounted(async () => {
console.log('Компонент смонтирован')
try {
await initializeContract()
if (provider) {
const contract = new Contract(contractAddress, contractABI, provider)
contract.on('Purchase', (buyer, amount) => {
console.log(`Новая покупка: ${amount} единиц от ${buyer}`)
fetchPrice()
})
return () => {
contract.removeAllListeners('Purchase')
}
}
} catch (err) {
console.error('Ошибка при монтировании компонента:', err)
}
})
// Обновляем handlePurchase
async function handlePurchase() {
if (!amount.value) return
if (!isCorrectNetwork.value) {
error.value = 'Пожалуйста, переключитесь на сеть Sepolia'
return
}
error.value = ''
success.value = ''
try {
isLoading.value = true
const ethersProvider = new BrowserProvider(walletProvider.value)
const signer = await ethersProvider.getSigner()
const contract = new Contract(contractAddress, contractABI, signer)
const price = await contract.price()
console.log('Цена для покупки:', formatEther(price), 'ETH')
const totalCost = price * BigInt(amount.value)
console.log('Общая стоимость:', formatEther(totalCost), 'ETH')
const tx = await contract.purchase(amount.value, {
value: totalCost
})
console.log('Транзакция отправлена:', tx.hash)
await tx.wait()
console.log('Транзакция подтверждена')
amount.value = ''
success.value = 'Покупка успешно совершена!'
await fetchPrice()
} catch (error) {
console.error('Ошибка при покупке:', error)
if (error.message.includes('user rejected')) {
error.value = 'Транзакция отменена пользователем'
} else {
error.value = 'Произошла ошибка при совершении покупки: ' + error.message
}
} finally {
isLoading.value = false
}
}
// Добавляем новые функции
async function handleSetPrice() {
if (!newPrice.value) return
error.value = ''
success.value = ''
try {
isLoading.value = true
const ethersProvider = new BrowserProvider(walletProvider.value)
const signer = await ethersProvider.getSigner()
const contract = new Contract(contractAddress, contractABI, signer)
const priceInWei = parseEther(newPrice.value.toString())
const tx = await contract.setPrice(priceInWei)
await tx.wait()
newPrice.value = ''
success.value = 'Цена успешно обновлена!'
await fetchPrice()
} catch (err) {
console.error('Ошибка при установке цены:', err)
error.value = 'Ошибка при установке цены: ' + err.message
} finally {
isLoading.value = false
}
}
async function handleWithdraw() {
error.value = ''
success.value = ''
try {
isLoading.value = true
const ethersProvider = new BrowserProvider(walletProvider.value)
const signer = await ethersProvider.getSigner()
const contract = new Contract(contractAddress, contractABI, signer)
const tx = await contract.withdraw()
await tx.wait()
success.value = 'Средства успешно выведены!'
} catch (err) {
console.error('Ошибка при выводе средств:', err)
error.value = 'Ошибка при выводе средств: ' + err.message
} finally {
isLoading.value = false
}
}
</script>
<style scoped>
.contract-interaction {
padding: 20px;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.warning {
color: #721c24;
background-color: #f8d7da;
border: 1px solid #f5c6cb;
padding: 10px;
border-radius: 4px;
margin-bottom: 20px;
.wallet-info {
margin-top: 20px;
padding: 15px;
background-color: #f5f5f5;
border-radius: 8px;
}
.owner-info {
margin-bottom: 20px;
.contract-controls {
margin-top: 20px;
}
.owner-controls {
.input-group {
display: flex;
gap: 10px;
margin-top: 10px;
}
input {
.amount-input {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
.purchase-button {
padding: 8px 16px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
button:disabled {
.purchase-button:hover:not(:disabled) {
background-color: #45a049;
}
.purchase-button:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
button:hover:not(:disabled) {
background-color: #45a049;
.error-message {
color: #dc3545;
padding: 10px;
margin: 10px 0;
background-color: #f8d7da;
border: 1px solid #f5c6cb;
border-radius: 4px;
}
.price-info {
margin: 10px 0;
font-weight: bold;
color: #2c3e50;
}
.owner-controls {
margin-top: 20px;
padding: 15px;
background-color: #f8f9fa;
border-radius: 8px;
border: 1px solid #e9ecef;
}
.purchase-panel {
margin-top: 20px;
}
.admin-button {
padding: 8px 16px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
.admin-button:hover:not(:disabled) {
background-color: #0056b3;
}
.withdraw-button {
margin-top: 10px;
background-color: #6c757d;
}
.withdraw-button:hover:not(:disabled) {
background-color: #5a6268;
}
.total-cost {
margin-top: 10px;
font-size: 0.9em;
color: #6c757d;
}
.success-message {
color: #28a745;
margin-top: 10px;
font-size: 0.9em;
}
.loading-message {
color: #6c757d;
text-align: center;
padding: 20px;
background-color: #f8f9fa;
border-radius: 4px;
margin: 10px 0;
}
.auth-status {
margin: 10px 0;
padding: 10px;
background-color: #f8f9fa;
border-radius: 4px;
display: flex;
justify-content: space-between;
align-items: center;
}
.authenticated {
color: #28a745;
}
.signout-button {
padding: 5px 10px;
background-color: #dc3545;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.signout-button:hover {
background-color: #c82333;
}
.connect-button {
margin-top: 10px;
background-color: #007bff;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
.connect-button:hover:not(:disabled) {
background-color: #0056b3;
.connect-button:hover {
background-color: #45a049;
}
</style>

View File

@@ -1,31 +0,0 @@
<template>
<div ref="walletButton"></div>
</template>
<script>
import { onMounted, ref } from 'vue';
import '@reown/appkit-wallet-button/react';
export default {
name: 'WalletButtonWrapper',
props: {
wallet: {
type: String,
required: true
}
},
setup(props) {
const walletButton = ref(null);
onMounted(() => {
const button = document.createElement('appkit-wallet-button');
button.setAttribute('wallet', props.wallet);
walletButton.value.appendChild(button);
});
return {
walletButton
};
}
};
</script>

View File

@@ -1,36 +0,0 @@
import { EthersAdapter } from '@reown/appkit-adapter-ethers'
import { sepolia } from '@reown/appkit/networks'
export const projectId = '9a6515f7259ebccd149fd53341e01e6b'
export const networks = [sepolia]
export const ethersAdapter = new EthersAdapter()
export const config = {
ethereum: {
networkUrl: import.meta.env.VITE_APP_ETHEREUM_NETWORK_URL as string,
projectId: import.meta.env.VITE_APP_PROJECT_ID as string
},
api: {
baseUrl: 'http://localhost:3000', // URL бэкенда
endpoints: {
verify: '/api/verify'
}
},
contract: {
address: '0x6199Ba629C85Da887dBd8Ffd8d2C75Ea24EaDe2a',
abi: [
'function owner() view returns (address)',
'function setOwner(address newOwner)'
]
},
metadata: {
name: 'DApp for Business',
description: 'Управление смарт-контрактом',
url: window.location.origin,
icons: ['https://avatars.githubusercontent.com/u/37784886']
}
};
export default config;

View File

@@ -1,7 +0,0 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}

View File

@@ -1,26 +1,6 @@
import { createApp } from 'vue';
import App from './App.vue';
import { createAppKit } from '@reown/appkit/vue';
import { EthersAdapter } from '@reown/appkit-adapter-ethers';
import { sepolia } from '@reown/appkit/networks';
import config from './config'; // Импортируем конфигурацию
import { createApp } from 'vue'
import App from './App.vue'
const appKit = createAppKit({
adapters: [new EthersAdapter()],
projectId: config.ethereum.projectId,
networks: [sepolia],
defaultNetwork: sepolia,
metadata: config.metadata,
features: {
analytics: true
},
themeMode: 'light', // Добавляем светлую тему
themeVariables: {
'--w3m-color-mix': '#00BB7F',
'--w3m-color-mix-strength': 40
}
});
const app = createApp(App);
app.use(appKit); // Подключаем AppKit как плагин
app.mount('#app');
// Создаем и монтируем приложение Vue
const app = createApp(App)
app.mount('#app')

View File

@@ -1,5 +0,0 @@
export interface ContractState {
owner: string;
isConnected: boolean;
loading: boolean;
}

View File

@@ -1,9 +0,0 @@
import { ethers } from 'ethers';
export const formatAddress = (address: string): string => {
return `${address.slice(0, 6)}...${address.slice(-4)}`;
};
export const isValidAddress = (address: string): boolean => {
return ethers.isAddress(address);
};

View File

@@ -1,30 +0,0 @@
{
"compilerOptions": {
"target": "esnext",
"useDefineForClassFields": true,
"module": "esnext",
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"lib": ["esnext", "dom"],
"skipLibCheck": true,
"allowJs": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": [
"src/**/*.ts",
"src/**/*.d.ts",
"src/**/*.tsx",
"src/**/*.vue"
],
"exclude": [
"node_modules"
]
}

View File

@@ -1,22 +1,13 @@
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { fileURLToPath, URL } from 'node:url';
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) =>
tag.startsWith('appkit-') ||
tag.startsWith('w3m-')
}
plugins: [vue({
template: {
compilerOptions: {
// Указываем Vue, что appkit-* компоненты являются кастомными элементами
isCustomElement: (tag) => tag.startsWith('appkit-')
}
})
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
});
})]
})

File diff suppressed because it is too large Load Diff