Описание изменений
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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' });
|
||||
|
||||
@@ -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
4
frontend/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"typescript.validate.enable": false,
|
||||
"javascript.validate.enable": true
|
||||
}
|
||||
1472
frontend/REOWN.md
1472
frontend/REOWN.md
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
<div v-if="!isConnected">
|
||||
<button
|
||||
@click="connectWallet"
|
||||
class="connect-button"
|
||||
>
|
||||
Подключить кошелек
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
|
||||
<div class="owner-controls">
|
||||
<input
|
||||
v-model="newOwner"
|
||||
placeholder="Адрес нового владельца (0x...)"
|
||||
:disabled="!isConnected"
|
||||
/>
|
||||
<button
|
||||
@click="setNewOwner"
|
||||
:disabled="!isConnected || !isValidAddress(newOwner)"
|
||||
>
|
||||
Установить нового владельца
|
||||
</button>
|
||||
<!-- Панель управления для владельца -->
|
||||
<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 = '';
|
||||
}
|
||||
});
|
||||
|
||||
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 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
|
||||
};
|
||||
// Функция инициализации контракта
|
||||
async function initializeContract() {
|
||||
try {
|
||||
if (!provider) {
|
||||
throw new Error('Provider не доступен')
|
||||
}
|
||||
|
||||
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)
|
||||
})
|
||||
])
|
||||
|
||||
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>
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
7
frontend/src/env.d.ts
vendored
7
frontend/src/env.d.ts
vendored
@@ -1,7 +0,0 @@
|
||||
/// <reference types="vite/client" />
|
||||
|
||||
declare module '*.vue' {
|
||||
import type { DefineComponent } from 'vue'
|
||||
const component: DefineComponent<{}, {}, any>
|
||||
export default component
|
||||
}
|
||||
@@ -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')
|
||||
@@ -1,5 +0,0 @@
|
||||
export interface ContractState {
|
||||
owner: string;
|
||||
isConnected: boolean;
|
||||
loading: boolean;
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
});
|
||||
})]
|
||||
})
|
||||
1652
frontend/yarn.lock
1652
frontend/yarn.lock
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user