ваше сообщение коммита

This commit is contained in:
2025-08-15 20:05:53 +03:00
parent 00f6dc2972
commit 5238e1ee55
20 changed files with 654 additions and 354 deletions

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../../../build-info/29c61b08eb590d8fc12c8139671115f4.json"
}

View File

@@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "../../build-info/3e12480a731f7a845287f0f150241bb4.json"
"buildInfo": "../../build-info/ae6e57b918547db576362d7ba12641eb.json"
}

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,9 @@
{
"_format": "hh-sol-cache-2",
"files": {
"/app/contracts/DLE.sol": {
"lastModificationDate": 1755001745034,
"contentHash": "a77cbe367dec496f574716fd50e1ef07",
"/home/alex/Digital_Legal_Entity(DLE)/backend/contracts/DLE.sol": {
"lastModificationDate": 1755277189432,
"contentHash": "03b4ac83148b5b1246f64c54fa0e959c",
"sourceName": "contracts/DLE.sol",
"solcConfig": {
"version": "0.8.20",
@@ -44,7 +44,7 @@
"DLE"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "190613e556d509d9e9a0ea43dc5d891d",
"sourceName": "@openzeppelin/contracts/utils/ReentrancyGuard.sol",
@@ -81,7 +81,7 @@
"ReentrancyGuard"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "227a6eb2225701c12d9c959b758b6333",
"sourceName": "@openzeppelin/contracts/token/ERC20/ERC20.sol",
@@ -123,7 +123,44 @@
"ERC20"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "81de029d56aa803972be03c5d277cb6c",
"sourceName": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"ECDSA"
]
},
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": {
"lastModificationDate": 1754306768254,
"contentHash": "51c2083b160453420aaa0a046c16d5ca",
"sourceName": "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol",
@@ -164,7 +201,7 @@
"ERC20Votes"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": {
"lastModificationDate": 1754306768254,
"contentHash": "b1a8fc63b83ce00408e0c9ed1230b717",
"sourceName": "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol",
@@ -207,44 +244,7 @@
"ERC20Permit"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "81de029d56aa803972be03c5d277cb6c",
"sourceName": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"ECDSA"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/Context.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/Context.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "67bfbc07588eb8683b3fd8f6f909563e",
"sourceName": "@openzeppelin/contracts/utils/Context.sol",
@@ -281,7 +281,7 @@
"Context"
]
},
"/app/node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "267d92fe4de67b1bdb3302c08f387dbf",
"sourceName": "@openzeppelin/contracts/interfaces/draft-IERC6093.sol",
@@ -320,7 +320,7 @@
"IERC721Errors"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "8f19f64d2adadf448840908bbaf431c8",
"sourceName": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
@@ -357,7 +357,7 @@
"IERC20"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"lastModificationDate": 1754306768254,
"contentHash": "794db3115001aa372c79326fcfd44b1f",
"sourceName": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol",
@@ -396,46 +396,7 @@
"IERC20Metadata"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/structs/Checkpoints.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "657c6dfea3bae1af948de6113ba01cea",
"sourceName": "@openzeppelin/contracts/utils/structs/Checkpoints.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [
"../math/Math.sol"
],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"Checkpoints"
]
},
"/app/node_modules/@openzeppelin/contracts/governance/utils/Votes.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/governance/utils/Votes.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "95aceafdc639babdd22576e5e3774d64",
"sourceName": "@openzeppelin/contracts/governance/utils/Votes.sol",
@@ -481,10 +442,10 @@
"Votes"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/math/Math.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/structs/Checkpoints.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "2b2665ae9bdb1af440658741a77fe213",
"sourceName": "@openzeppelin/contracts/utils/math/Math.sol",
"contentHash": "657c6dfea3bae1af948de6113ba01cea",
"sourceName": "@openzeppelin/contracts/utils/structs/Checkpoints.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
@@ -511,91 +472,16 @@
}
},
"imports": [
"../Panic.sol",
"./SafeCast.sol"
"../math/Math.sol"
],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"Math"
"Checkpoints"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "2adca1150f58fc6f3d1f0a0f22ee7cca",
"sourceName": "@openzeppelin/contracts/utils/math/SafeCast.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"SafeCast"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/Panic.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "2133dc13536b4a6a98131e431fac59e1",
"sourceName": "@openzeppelin/contracts/utils/Panic.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"Panic"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/Nonces.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/Nonces.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "c32d108058718efb9061b88e83a83f79",
"sourceName": "@openzeppelin/contracts/utils/Nonces.sol",
@@ -632,7 +518,47 @@
"Nonces"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "65ba9f89b1057e2192e341b286d4e261",
"sourceName": "@openzeppelin/contracts/interfaces/IERC5805.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [
"../governance/utils/IVotes.sol",
"./IERC6372.sol"
],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"IERC5805"
]
},
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "8dbb261c55f358342798c4d1803d4f8e",
"sourceName": "@openzeppelin/contracts/utils/cryptography/EIP712.sol",
@@ -673,10 +599,10 @@
"EIP712"
]
},
"/app/node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "65ba9f89b1057e2192e341b286d4e261",
"sourceName": "@openzeppelin/contracts/interfaces/IERC5805.sol",
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "2adca1150f58fc6f3d1f0a0f22ee7cca",
"sourceName": "@openzeppelin/contracts/utils/math/SafeCast.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
@@ -702,18 +628,15 @@
}
}
},
"imports": [
"../governance/utils/IVotes.sol",
"./IERC6372.sol"
],
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"IERC5805"
"SafeCast"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/types/Time.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/types/Time.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "d83e7814a059fc1287fd765f424ce004",
"sourceName": "@openzeppelin/contracts/utils/types/Time.sol",
@@ -753,7 +676,81 @@
"Time"
]
},
"/app/node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "905ffceb29869fee4b5a649abe7e2927",
"sourceName": "@openzeppelin/contracts/governance/utils/IVotes.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"IVotes"
]
},
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "414cd6acf090e4009cf016ff62ecbd88",
"sourceName": "@openzeppelin/contracts/interfaces/IERC6372.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"IERC6372"
]
},
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "94364524cb1a39dcbc3d3afff6d8e53e",
"sourceName": "@openzeppelin/contracts/interfaces/IERC5267.sol",
@@ -790,7 +787,7 @@
"IERC5267"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "94e7feaf138d08fb736e43ca0be9bf26",
"sourceName": "@openzeppelin/contracts/utils/ShortStrings.sol",
@@ -829,7 +826,7 @@
"ShortStrings"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": {
"lastModificationDate": 1754306764465,
"contentHash": "86fd93657e4e27ff76c38699e9b9fcef",
"sourceName": "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol",
@@ -868,7 +865,7 @@
"MessageHashUtils"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "e656d64c4ce918f3d13030b91c935134",
"sourceName": "@openzeppelin/contracts/utils/StorageSlot.sol",
@@ -905,7 +902,7 @@
"StorageSlot"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/Strings.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/Strings.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "a55fef2557b35bac18a1880d3c2e6740",
"sourceName": "@openzeppelin/contracts/utils/Strings.sol",
@@ -946,7 +943,47 @@
"Strings"
]
},
"/app/node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/math/Math.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "2b2665ae9bdb1af440658741a77fe213",
"sourceName": "@openzeppelin/contracts/utils/math/Math.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [
"../Panic.sol",
"./SafeCast.sol"
],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"Math"
]
},
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "ae3528afb8bdb0a7dcfba5b115ee8074",
"sourceName": "@openzeppelin/contracts/utils/math/SignedMath.sol",
@@ -985,10 +1022,10 @@
"SignedMath"
]
},
"/app/node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": {
"lastModificationDate": 1754306764456,
"contentHash": "905ffceb29869fee4b5a649abe7e2927",
"sourceName": "@openzeppelin/contracts/governance/utils/IVotes.sol",
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/utils/Panic.sol": {
"lastModificationDate": 1754306760451,
"contentHash": "2133dc13536b4a6a98131e431fac59e1",
"sourceName": "@openzeppelin/contracts/utils/Panic.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
@@ -1019,47 +1056,10 @@
"^0.8.20"
],
"artifacts": [
"IVotes"
"Panic"
]
},
"/app/node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": {
"lastModificationDate": 1754306760460,
"contentHash": "414cd6acf090e4009cf016ff62ecbd88",
"sourceName": "@openzeppelin/contracts/interfaces/IERC6372.sol",
"solcConfig": {
"version": "0.8.20",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.20"
],
"artifacts": [
"IERC6372"
]
},
"/app/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": {
"lastModificationDate": 1754306768254,
"contentHash": "94ec15baf0d5df863f45b8f351937ec7",
"sourceName": "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol",
@@ -1096,7 +1096,7 @@
"IERC20Permit"
]
},
"/app/contracts/FactoryDeployer.sol": {
"/home/alex/Digital_Legal_Entity(DLE)/backend/contracts/FactoryDeployer.sol": {
"lastModificationDate": 1754685617489,
"contentHash": "6161bbb21af830bc05d6acd8682d9678",
"sourceName": "contracts/FactoryDeployer.sol",

View File

@@ -26,10 +26,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
struct DLEInfo {
string name;
string symbol;
string tokenImage; // Картинка токена (base64 или URL)
string location;
string coordinates;
uint256 jurisdiction;
uint256 oktmo;
string[] okvedCodes;
uint256 kpp;
uint256 creationTimestamp;
@@ -39,10 +39,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
struct DLEConfig {
string name;
string symbol;
string tokenImage; // Картинка токена (base64 или URL)
string location;
string coordinates;
uint256 jurisdiction;
uint256 oktmo;
string[] okvedCodes;
uint256 kpp;
uint256 quorumPercentage;
@@ -91,10 +91,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
event DLEInitialized(
string name,
string symbol,
string tokenImage,
string location,
string coordinates,
uint256 jurisdiction,
uint256 oktmo,
string[] okvedCodes,
uint256 kpp,
address tokenAddress,
@@ -112,7 +112,7 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
event ProposalExecutionApprovedInChain(uint256 proposalId, uint256 chainId);
event ChainAdded(uint256 chainId);
event ChainRemoved(uint256 chainId);
event DLEInfoUpdated(string name, string symbol, string location, string coordinates, uint256 jurisdiction, uint256 oktmo, string[] okvedCodes, uint256 kpp);
event DLEInfoUpdated(string name, string symbol, string tokenImage, string location, string coordinates, uint256 jurisdiction, string[] okvedCodes, uint256 kpp);
event QuorumPercentageUpdated(uint256 oldQuorumPercentage, uint256 newQuorumPercentage);
event CurrentChainIdUpdated(uint256 oldChainId, uint256 newChainId);
@@ -129,10 +129,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
dleInfo = DLEInfo({
name: config.name,
symbol: config.symbol,
tokenImage: config.tokenImage,
location: config.location,
coordinates: config.coordinates,
jurisdiction: config.jurisdiction,
oktmo: config.oktmo,
okvedCodes: config.okvedCodes,
kpp: config.kpp,
creationTimestamp: block.timestamp,
@@ -166,10 +166,10 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
emit DLEInitialized(
config.name,
config.symbol,
config.tokenImage,
config.location,
config.coordinates,
config.jurisdiction,
config.oktmo,
config.okvedCodes,
config.kpp,
address(this),
@@ -509,11 +509,11 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
// Декодируем операцию
(bytes4 selector, bytes memory data) = abi.decode(_operation, (bytes4, bytes));
if (selector == bytes4(keccak256("updateDLEInfo(string,string,string,string,uint256,uint256,string[],uint256)"))) {
if (selector == bytes4(keccak256("updateDLEInfo(string,string,string,string,string,uint256,uint256,string[],uint256)"))) {
// Операция обновления информации DLE
(string memory name, string memory symbol, string memory location, string memory coordinates,
uint256 jurisdiction, uint256 oktmo, string[] memory okvedCodes, uint256 kpp) = abi.decode(data, (string, string, string, string, uint256, uint256, string[], uint256));
_updateDLEInfo(name, symbol, location, coordinates, jurisdiction, oktmo, okvedCodes, kpp);
(string memory name, string memory symbol, string memory tokenImage, string memory location, string memory coordinates,
uint256 jurisdiction, string[] memory okvedCodes, uint256 kpp) = abi.decode(data, (string, string, string, string, string, uint256, string[], uint256));
_updateDLEInfo(name, symbol, tokenImage, location, coordinates, jurisdiction, okvedCodes, kpp);
} else if (selector == bytes4(keccak256("updateQuorumPercentage(uint256)"))) {
// Операция обновления процента кворума
(uint256 newQuorumPercentage) = abi.decode(data, (uint256));
@@ -550,20 +550,20 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
* @dev Обновить информацию DLE
* @param _name Новое название
* @param _symbol Новый символ
* @param _tokenImage Новая картинка токена
* @param _location Новое местонахождение
* @param _coordinates Новые координаты
* @param _jurisdiction Новая юрисдикция
* @param _oktmo Новый ОКТМО
* @param _okvedCodes Новые коды ОКВЭД
* @param _kpp Новый КПП
*/
function _updateDLEInfo(
string memory _name,
string memory _symbol,
string memory _tokenImage,
string memory _location,
string memory _coordinates,
uint256 _jurisdiction,
uint256 _oktmo,
string[] memory _okvedCodes,
uint256 _kpp
) internal {
@@ -571,19 +571,18 @@ contract DLE is ERC20, ERC20Permit, ERC20Votes, ReentrancyGuard {
require(bytes(_symbol).length > 0, "Symbol cannot be empty");
require(bytes(_location).length > 0, "Location cannot be empty");
require(_jurisdiction > 0, "Invalid jurisdiction");
require(_oktmo > 0, "Invalid OKTMO");
require(_kpp > 0, "Invalid KPP");
dleInfo.name = _name;
dleInfo.symbol = _symbol;
dleInfo.tokenImage = _tokenImage;
dleInfo.location = _location;
dleInfo.coordinates = _coordinates;
dleInfo.jurisdiction = _jurisdiction;
dleInfo.oktmo = _oktmo;
dleInfo.okvedCodes = _okvedCodes;
dleInfo.kpp = _kpp;
emit DLEInfoUpdated(_name, _symbol, _location, _coordinates, _jurisdiction, _oktmo, _okvedCodes, _kpp);
emit DLEInfoUpdated(_name, _symbol, _tokenImage, _location, _coordinates, _jurisdiction, _okvedCodes, _kpp);
}
/**

View File

@@ -39,10 +39,10 @@ async function main() {
const dleConfig = {
name: params.name,
symbol: params.symbol,
tokenImage: params.tokenImage || '',
location: params.location,
coordinates: params.coordinates,
jurisdiction: params.jurisdiction,
oktmo: params.oktmo,
okvedCodes: params.okvedCodes || [],
kpp: params.kpp,
quorumPercentage: params.quorumPercentage,

View File

@@ -112,7 +112,6 @@ class DLEV2Service {
location: deployParams.location,
coordinates: deployParams.coordinates,
jurisdiction: deployParams.jurisdiction,
oktmo: deployParams.oktmo,
okvedCodes: deployParams.okvedCodes || [],
kpp: deployParams.kpp,
quorumPercentage: deployParams.quorumPercentage,
@@ -225,6 +224,19 @@ class DLEV2Service {
if (!params.supportedChainIds || !Array.isArray(params.supportedChainIds) || params.supportedChainIds.length === 0) {
throw new Error('Должна быть выбрана хотя бы одна сеть для деплоя');
}
// Проверяем размер картинки токена (если передана)
if (params.tokenImage && params.tokenImage.trim() !== '') {
const base64Size = params.tokenImage.length;
if (base64Size > 350) {
throw new Error(`Размер картинки токена превышает лимит: ${base64Size} байт. Максимальный размер: 350 байт`);
}
// Проверяем, что это валидный base64
if (!params.tokenImage.startsWith('data:image/')) {
throw new Error('Картинка токена должна быть в формате base64 data URL');
}
}
}
/**
@@ -557,7 +569,6 @@ class DLEV2Service {
location: params.location,
coordinates: params.coordinates,
jurisdiction: params.jurisdiction,
oktmo: params.oktmo,
okvedCodes: params.okvedCodes || [],
kpp: params.kpp,
quorumPercentage: params.quorumPercentage,
@@ -732,7 +743,6 @@ class DLEV2Service {
location: params.location,
coordinates: params.coordinates,
jurisdiction: params.jurisdiction,
oktmo: params.oktmo,
okvedCodes: params.okvedCodes || [],
kpp: params.kpp,
quorumPercentage: params.quorumPercentage,

View File

@@ -1,5 +1,17 @@
#!/bin/bash
/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
# Скрипт для создания резервных копий базы данных DLE
# Запускать: ./backup-database.sh

View File

@@ -325,6 +325,38 @@
<small class="form-help">3-10 символов для токена управления (Governance Token)</small>
</div>
<!-- Картинка токена -->
<div class="form-group">
<label class="form-label" for="tokenImage">Картинка токена:</label>
<div class="token-image-upload">
<input
type="file"
id="tokenImage"
ref="tokenImageInput"
class="form-control"
accept="image/*"
@change="handleTokenImageUpload"
style="display: none;"
>
<div class="upload-area" @click="triggerImageUpload">
<div v-if="!dleSettings.tokenImage" class="upload-placeholder">
<i class="fas fa-image"></i>
<p>Нажмите для выбора картинки токена</p>
<small>Поддерживаются форматы: JPG, PNG, GIF (макс. 1MB, 200x200px)</small>
</div>
<div v-else class="image-preview">
<img :src="dleSettings.tokenImage" alt="Картинка токена" class="token-image">
<div class="image-overlay">
<button type="button" @click.stop="removeTokenImage" class="btn btn-danger btn-sm">
<i class="fas fa-trash"></i> Удалить
</button>
</div>
</div>
</div>
</div>
<small class="form-help">Загрузите картинку для вашего токена (макс. 350 байт в base64, автоматически сжимается до 200x200px)</small>
</div>
<!-- Партнеры и распределение токенов -->
@@ -465,7 +497,7 @@
</div>
</div>
<!-- Предсказанный адрес DLE - СКРЫТ -->
<!-- Предсказанный адрес DLE - отключено -->
<!-- <div v-if="selectedNetworks.length > 0" class="predicted-address-section">
<h5>📍 Адрес DLE во всех сетях:</h5>
<div class="address-display">
@@ -655,6 +687,13 @@
<div v-if="dleSettings.tokenSymbol" class="preview-item">
<strong>🪙 Токен:</strong> {{ dleSettings.tokenSymbol }}
</div>
<div v-if="dleSettings.tokenImage" class="preview-item">
<strong>🖼 Картинка токена:</strong>
<div class="token-image-preview">
<img :src="dleSettings.tokenImage" alt="Картинка токена" class="preview-token-image">
</div>
</div>
</div>
@@ -889,6 +928,7 @@ const dleSettings = reactive({
selectedOkved: [], // ОКВЭД - дополнительные коды деятельности
name: '', // Имя DLE
tokenSymbol: '', // Символ токена
tokenImage: '', // Картинка токена (base64 или URL)
partners: [{ address: '', amount: 1 }], // Партнеры и их доли токенов
governanceQuorum: 51, // Кворум для принятия решений (%)
@@ -931,9 +971,9 @@ const selectedNetworks = ref([]);
const availableNetworks = ref([]);
const isLoadingNetworks = ref(false);
const totalDeployCost = ref(0);
const predictedAddress = ref('');
const predictedAddresses = reactive({}); // { chainId: address }
const isPredicting = ref(false);
// const predictedAddress = ref('');
// const predictedAddresses = reactive({}); // { chainId: address }
// const isPredicting = ref(false);
// Ключ блокчейн-скана (единый Etherscan V2)
// Единый ключ Etherscan V2 и авто-верификация
@@ -996,32 +1036,32 @@ const hasSelectedNetworks = computed(() => {
});
// Инициализация при смене выбранных сетей
watch(selectedNetworkDetails, (nets) => {
if (nets && nets.length > 0) predictAddresses();
}, { immediate: true });
// watch(selectedNetworkDetails, (nets) => {
// if (nets && nets.length > 0) predictAddresses();
// }, { immediate: true });
// Предсказание адресов (упрощенно через бэкенд)
async function predictAddresses() {
try {
isPredicting.value = true;
const payload = {
name: dleSettings.name,
symbol: dleSettings.tokenSymbol,
selectedNetworks: selectedNetworkDetails.value.map(n => n.chainId)
};
const resp = await axios.post('/dle-v2/predict-addresses', payload);
if (resp.data && resp.data.success && resp.data.data) {
// ожидаем вид { [chainId]: address }
Object.keys(predictedAddresses).forEach(k => delete predictedAddresses[k]);
Object.assign(predictedAddresses, resp.data.data);
}
} catch (e) {
console.error('Ошибка расчета предсказанных адресов:', e);
alert('Не удалось рассчитать предсказанные адреса');
} finally {
isPredicting.value = false;
}
}
// Предсказание адресов (упрощенно через бэкенд) - отключено
// async function predictAddresses() {
// try {
// isPredicting.value = true;
// const payload = {
// name: dleSettings.name,
// symbol: dleSettings.tokenSymbol,
// selectedNetworks: selectedNetworkDetails.value.map(n => n.chainId)
// };
// const resp = await axios.post('/dle-v2/predict-addresses', payload);
// if (resp.data && resp.data.success && resp.data.data) {
// // ожидаем вид { [chainId]: address }
// Object.keys(predictedAddresses).forEach(k => delete predictedAddresses[k]);
// Object.assign(predictedAddresses, resp.data.data);
// }
// } catch (e) {
// console.error('Ошибка расчета предсказанных адресов:', e);
// alert('Не удалось рассчитать предсказанные адреса');
// } finally {
// isPredicting.value = false;
// }
// }
function copyToClipboard(text) {
navigator.clipboard?.writeText(text).then(() => {
@@ -1340,7 +1380,7 @@ const hasSelectedData = computed(() => {
// Мульти-чейн данные
(dleSettings.selectedNetworks && dleSettings.selectedNetworks.length > 0) ||
dleSettings.tokenStandard !== 'ERC20' ||
dleSettings.predictedAddress ||
// dleSettings.predictedAddress ||
unifiedPrivateKey.value ||
Object.keys(privateKeys).length > 0 ||
// Устаревшие поля
@@ -1373,7 +1413,7 @@ const saveFormData = () => {
// Мульти-чейн данные
selectedNetworks: selectedNetworks.value,
totalDeployCost: totalDeployCost.value,
predictedAddress: predictedAddress.value,
// predictedAddress: predictedAddress.value,
useSameKeyForAllChains: useSameKeyForAllChains.value,
unifiedPrivateKey: unifiedPrivateKey.value,
privateKeys: { ...privateKeys },
@@ -1420,6 +1460,7 @@ const loadFormData = () => {
selectedOkved: parsedData.selectedOkved || [],
name: parsedData.name || '',
tokenSymbol: parsedData.tokenSymbol || '',
tokenImage: parsedData.tokenImage || '',
partners: parsedData.partners || [{ address: '', amount: 1 }],
governanceQuorum: parsedData.governanceQuorum || 51,
// Координаты
@@ -1427,7 +1468,7 @@ const loadFormData = () => {
// Мульти-чейн настройки
selectedNetworks: parsedData.selectedNetworks || [],
tokenStandard: parsedData.tokenStandard || 'ERC20',
predictedAddress: parsedData.predictedAddress || '',
// predictedAddress: parsedData.predictedAddress || '',
// Устаревшие поля
deployNetwork: parsedData.deployNetwork || '',
privateKey: parsedData.privateKey || ''
@@ -1446,7 +1487,7 @@ const loadFormData = () => {
// Восстанавливаем мульти-чейн состояние
selectedNetworks.value = parsedData.selectedNetworks || [];
totalDeployCost.value = parsedData.totalDeployCost || 0;
predictedAddress.value = parsedData.predictedAddress || '';
// predictedAddress.value = parsedData.predictedAddress || '';
useSameKeyForAllChains.value = parsedData.useSameKeyForAllChains !== undefined ? parsedData.useSameKeyForAllChains : true;
unifiedPrivateKey.value = parsedData.unifiedPrivateKey || '';
Object.assign(privateKeys, parsedData.privateKeys || {});
@@ -1500,13 +1541,14 @@ const clearAllData = () => {
dleSettings.selectedOkved = [];
dleSettings.name = '';
dleSettings.tokenSymbol = '';
dleSettings.tokenImage = ''; // Очищаем картинку токена
dleSettings.partners = [{ address: '', amount: 1 }]; // Сброс к одному пустому партнеру
dleSettings.governanceQuorum = 51; // Сброс кворума к значению по умолчанию
// Очищаем мульти-чейн настройки
dleSettings.selectedNetworks = [];
dleSettings.tokenStandard = 'ERC20'; // Сбрасываем к стандартному ERC-20
dleSettings.predictedAddress = '';
// dleSettings.predictedAddress = '';
// Очищаем координаты
dleSettings.coordinates = '';
@@ -1528,7 +1570,7 @@ const clearAllData = () => {
// Очищаем мульти-чейн состояние
selectedNetworks.value = [];
totalDeployCost.value = 0;
predictedAddress.value = '';
// predictedAddress.value = '';
useSameKeyForAllChains.value = true;
unifiedPrivateKey.value = '';
Object.keys(privateKeys).forEach(key => delete privateKeys[key]);
@@ -1773,6 +1815,89 @@ const formatTokenSymbol = () => {
}
};
// Функции для работы с картинкой токена
const tokenImageInput = ref(null);
// Запуск выбора файла
const triggerImageUpload = () => {
tokenImageInput.value?.click();
};
// Обработка загрузки изображения
const handleTokenImageUpload = (event) => {
const file = event.target.files[0];
if (!file) return;
// Проверка типа файла
if (!file.type.startsWith('image/')) {
alert('Пожалуйста, выберите файл изображения (JPG, PNG, GIF)');
return;
}
// Проверка размера файла (максимум 1MB)
const maxSize = 1 * 1024 * 1024; // 1MB
if (file.size > maxSize) {
alert('Размер файла не должен превышать 1MB');
return;
}
// Создаем canvas для сжатия изображения
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = new Image();
img.onload = () => {
// Ограничиваем размер изображения
const maxWidth = 200;
const maxHeight = 200;
let { width, height } = img;
if (width > maxWidth) {
height = (height * maxWidth) / width;
width = maxWidth;
}
if (height > maxHeight) {
width = (width * maxHeight) / height;
height = maxHeight;
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, width, height);
// Конвертируем в base64 с сжатием
const compressedDataUrl = canvas.toDataURL('image/jpeg', 0.7); // 70% качество
// Проверяем размер base64 (максимум 350 байт)
const base64Size = compressedDataUrl.length;
if (base64Size > 350) {
alert(`Изображение слишком большое (${base64Size} байт). Максимальный размер: 350 байт. Попробуйте уменьшить размер или качество изображения.`);
return;
}
dleSettings.tokenImage = compressedDataUrl;
// Сохраняем в localStorage
saveFormData();
};
img.onerror = () => {
alert('Ошибка при загрузке изображения');
};
img.src = URL.createObjectURL(file);
};
// Удаление картинки токена
const removeTokenImage = () => {
dleSettings.tokenImage = '';
// Очищаем input
if (tokenImageInput.value) {
tokenImageInput.value.value = '';
}
// Сохраняем в localStorage
saveFormData();
};
// Функция загрузки стран
const loadCountries = async () => {
@@ -2026,16 +2151,16 @@ const updateDeployCost = () => {
.reduce((sum, network) => sum + network.estimatedCost, 0);
};
// Копирование адреса DLE
const copyAddress = async () => {
try {
await navigator.clipboard.writeText(predictedAddress.value);
console.log('Адрес скопирован:', predictedAddress.value);
// TODO: Показать уведомление об успешном копировании
} catch (error) {
console.error('Ошибка копирования адреса:', error);
}
};
// Копирование адреса DLE - отключено
// const copyAddress = async () => {
// try {
// await navigator.clipboard.writeText(predictedAddress.value);
// console.log('Адрес скопирован:', predictedAddress.value);
// // TODO: Показать уведомление об успешном копировании
// } catch (error) {
// console.error('Ошибка копирования адреса:', error);
// }
// };
// Функция переключения использования одного ключа
const toggleSameKey = () => {
@@ -2228,28 +2353,28 @@ watch(unifiedPrivateKey, (newValue) => {
}, 100);
});
// Watcher для predictedAddress - синхронизация с dleSettings
watch(predictedAddress, (newAddress) => {
if (dleSettings.predictedAddress !== newAddress) {
dleSettings.predictedAddress = newAddress;
}
});
// Watcher для predictedAddress - синхронизация с dleSettings - отключено
// watch(predictedAddress, (newAddress) => {
// if (dleSettings.predictedAddress !== newAddress) {
// dleSettings.predictedAddress = newAddress;
// }
// });
// Вычисление предсказанного адреса при изменении ключевых данных
watch([() => dleSettings.name, () => dleSettings.tokenSymbol, selectedNetworks], () => {
// TODO: Реализовать вычисление предсказанного адреса через API
if (dleSettings.name && dleSettings.tokenSymbol && selectedNetworks.value.length > 0) {
// Заглушка - в реальности будет API запрос
const newAddress = '0x' + Math.random().toString(16).substr(2, 40);
if (predictedAddress.value !== newAddress) {
predictedAddress.value = newAddress;
}
} else {
if (predictedAddress.value !== '') {
predictedAddress.value = '';
}
}
}, { deep: true });
// Вычисление предсказанного адреса при изменении ключевых данных - отключено
// watch([() => dleSettings.name, () => dleSettings.tokenSymbol, selectedNetworks], () => {
// // TODO: Реализовать вычисление предсказанного адреса через API
// if (dleSettings.name && dleSettings.tokenSymbol && selectedNetworks.value.length > 0) {
// // Заглушка - в реальности будет API запрос
// const newAddress = '0x' + Math.random().toString(16).substr(2, 40);
// if (predictedAddress.value !== newAddress) {
// predictedAddress.value = newAddress;
// }
// } else {
// if (predictedAddress.value !== '') {
// predictedAddress.value = '';
// }
// }
// }, { deep: true });
// Инициализация
onMounted(() => {
@@ -2373,6 +2498,7 @@ const deploySmartContracts = async () => {
// Основная информация DLE
name: dleSettings.name,
symbol: dleSettings.tokenSymbol,
tokenImage: dleSettings.tokenImage, // Картинка токена
location: dleSettings.addressData.fullAddress || 'Не указан',
coordinates: dleSettings.coordinates || '0,0',
jurisdiction: parseInt(dleSettings.jurisdiction) || 0,
@@ -2438,7 +2564,7 @@ const deploySmartContracts = async () => {
deployStatus.value = '✅ DLE успешно развернут!';
// Сохраняем адрес контракта
dleSettings.predictedAddress = response.data.data?.dleAddress || 'Адрес будет доступен после деплоя';
// dleSettings.predictedAddress = response.data.data?.dleAddress || 'Адрес будет доступен после деплоя';
// Небольшая задержка для показа успешного завершения
setTimeout(() => {
@@ -4258,4 +4384,109 @@ const validateCoordinates = (coordinates) => {
transform: translateY(0);
}
}
/* Стили для загрузки картинки токена */
.token-image-upload {
margin-top: 0.5rem;
}
.upload-area {
border: 2px dashed #ddd;
border-radius: 8px;
padding: 2rem;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: #fafafa;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
}
.upload-area:hover {
border-color: var(--color-primary);
background: #f0f8ff;
}
.upload-placeholder {
color: #666;
}
.upload-placeholder i {
font-size: 3rem;
margin-bottom: 1rem;
color: #ccc;
}
.upload-placeholder p {
margin: 0.5rem 0;
font-size: 1rem;
font-weight: 500;
}
.upload-placeholder small {
color: #999;
font-size: 0.875rem;
}
.image-preview {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.token-image {
max-width: 100%;
max-height: 200px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.image-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
border-radius: 8px;
}
.image-preview:hover .image-overlay {
opacity: 1;
}
.image-overlay .btn {
background: rgba(220, 53, 69, 0.9);
border: none;
color: white;
padding: 0.5rem 1rem;
border-radius: 4px;
font-size: 0.875rem;
}
.image-overlay .btn:hover {
background: rgba(220, 53, 69, 1);
}
/* Стили для превью картинки токена */
.token-image-preview {
margin-top: 0.5rem;
}
.preview-token-image {
max-width: 100px;
max-height: 100px;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
</style>

View File

@@ -1,5 +1,17 @@
#!/bin/bash
/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
# Скрипт для переноса зашифрованных данных между серверами
# Использование: ./migrate-encrypted-data.sh

View File

@@ -1,5 +1,17 @@
#!/bin/bash
/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
if ! docker exec dapp-postgres pg_isready -U dapp_user -d dapp_db > /dev/null 2>&1; then
exit 1
fi

View File

@@ -1,5 +1,17 @@
#!/bin/bash
/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
# Скрипт мониторинга безопасности для DLE
# Автоматически блокирует подозрительные IP адреса и домены

View File

@@ -1,5 +1,17 @@
#!/bin/bash
/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
# Простой скрипт для запуска мониторинга безопасности
# Использование: ./start-security-monitor.sh