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

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

View File

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

View File

@@ -112,7 +112,6 @@ class DLEV2Service {
location: deployParams.location, location: deployParams.location,
coordinates: deployParams.coordinates, coordinates: deployParams.coordinates,
jurisdiction: deployParams.jurisdiction, jurisdiction: deployParams.jurisdiction,
oktmo: deployParams.oktmo,
okvedCodes: deployParams.okvedCodes || [], okvedCodes: deployParams.okvedCodes || [],
kpp: deployParams.kpp, kpp: deployParams.kpp,
quorumPercentage: deployParams.quorumPercentage, quorumPercentage: deployParams.quorumPercentage,
@@ -225,6 +224,19 @@ class DLEV2Service {
if (!params.supportedChainIds || !Array.isArray(params.supportedChainIds) || params.supportedChainIds.length === 0) { if (!params.supportedChainIds || !Array.isArray(params.supportedChainIds) || params.supportedChainIds.length === 0) {
throw new Error('Должна быть выбрана хотя бы одна сеть для деплоя'); 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, location: params.location,
coordinates: params.coordinates, coordinates: params.coordinates,
jurisdiction: params.jurisdiction, jurisdiction: params.jurisdiction,
oktmo: params.oktmo,
okvedCodes: params.okvedCodes || [], okvedCodes: params.okvedCodes || [],
kpp: params.kpp, kpp: params.kpp,
quorumPercentage: params.quorumPercentage, quorumPercentage: params.quorumPercentage,
@@ -732,7 +743,6 @@ class DLEV2Service {
location: params.location, location: params.location,
coordinates: params.coordinates, coordinates: params.coordinates,
jurisdiction: params.jurisdiction, jurisdiction: params.jurisdiction,
oktmo: params.oktmo,
okvedCodes: params.okvedCodes || [], okvedCodes: params.okvedCodes || [],
kpp: params.kpp, kpp: params.kpp,
quorumPercentage: params.quorumPercentage, quorumPercentage: params.quorumPercentage,

View File

@@ -1,5 +1,17 @@
#!/bin/bash #!/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 # Скрипт для создания резервных копий базы данных DLE
# Запускать: ./backup-database.sh # Запускать: ./backup-database.sh

View File

@@ -325,6 +325,38 @@
<small class="form-help">3-10 символов для токена управления (Governance Token)</small> <small class="form-help">3-10 символов для токена управления (Governance Token)</small>
</div> </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>
</div> </div>
<!-- Предсказанный адрес DLE - СКРЫТ --> <!-- Предсказанный адрес DLE - отключено -->
<!-- <div v-if="selectedNetworks.length > 0" class="predicted-address-section"> <!-- <div v-if="selectedNetworks.length > 0" class="predicted-address-section">
<h5>📍 Адрес DLE во всех сетях:</h5> <h5>📍 Адрес DLE во всех сетях:</h5>
<div class="address-display"> <div class="address-display">
@@ -655,6 +687,13 @@
<div v-if="dleSettings.tokenSymbol" class="preview-item"> <div v-if="dleSettings.tokenSymbol" class="preview-item">
<strong>🪙 Токен:</strong> {{ dleSettings.tokenSymbol }} <strong>🪙 Токен:</strong> {{ dleSettings.tokenSymbol }}
</div> </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> </div>
@@ -889,6 +928,7 @@ const dleSettings = reactive({
selectedOkved: [], // ОКВЭД - дополнительные коды деятельности selectedOkved: [], // ОКВЭД - дополнительные коды деятельности
name: '', // Имя DLE name: '', // Имя DLE
tokenSymbol: '', // Символ токена tokenSymbol: '', // Символ токена
tokenImage: '', // Картинка токена (base64 или URL)
partners: [{ address: '', amount: 1 }], // Партнеры и их доли токенов partners: [{ address: '', amount: 1 }], // Партнеры и их доли токенов
governanceQuorum: 51, // Кворум для принятия решений (%) governanceQuorum: 51, // Кворум для принятия решений (%)
@@ -931,9 +971,9 @@ const selectedNetworks = ref([]);
const availableNetworks = ref([]); const availableNetworks = ref([]);
const isLoadingNetworks = ref(false); const isLoadingNetworks = ref(false);
const totalDeployCost = ref(0); const totalDeployCost = ref(0);
const predictedAddress = ref(''); // const predictedAddress = ref('');
const predictedAddresses = reactive({}); // { chainId: address } // const predictedAddresses = reactive({}); // { chainId: address }
const isPredicting = ref(false); // const isPredicting = ref(false);
// Ключ блокчейн-скана (единый Etherscan V2) // Ключ блокчейн-скана (единый Etherscan V2)
// Единый ключ Etherscan V2 и авто-верификация // Единый ключ Etherscan V2 и авто-верификация
@@ -996,32 +1036,32 @@ const hasSelectedNetworks = computed(() => {
}); });
// Инициализация при смене выбранных сетей // Инициализация при смене выбранных сетей
watch(selectedNetworkDetails, (nets) => { // watch(selectedNetworkDetails, (nets) => {
if (nets && nets.length > 0) predictAddresses(); // if (nets && nets.length > 0) predictAddresses();
}, { immediate: true }); // }, { immediate: true });
// Предсказание адресов (упрощенно через бэкенд) // Предсказание адресов (упрощенно через бэкенд) - отключено
async function predictAddresses() { // async function predictAddresses() {
try { // try {
isPredicting.value = true; // isPredicting.value = true;
const payload = { // const payload = {
name: dleSettings.name, // name: dleSettings.name,
symbol: dleSettings.tokenSymbol, // symbol: dleSettings.tokenSymbol,
selectedNetworks: selectedNetworkDetails.value.map(n => n.chainId) // selectedNetworks: selectedNetworkDetails.value.map(n => n.chainId)
}; // };
const resp = await axios.post('/dle-v2/predict-addresses', payload); // const resp = await axios.post('/dle-v2/predict-addresses', payload);
if (resp.data && resp.data.success && resp.data.data) { // if (resp.data && resp.data.success && resp.data.data) {
// ожидаем вид { [chainId]: address } // // ожидаем вид { [chainId]: address }
Object.keys(predictedAddresses).forEach(k => delete predictedAddresses[k]); // Object.keys(predictedAddresses).forEach(k => delete predictedAddresses[k]);
Object.assign(predictedAddresses, resp.data.data); // Object.assign(predictedAddresses, resp.data.data);
} // }
} catch (e) { // } catch (e) {
console.error('Ошибка расчета предсказанных адресов:', e); // console.error('Ошибка расчета предсказанных адресов:', e);
alert('Не удалось рассчитать предсказанные адреса'); // alert('Не удалось рассчитать предсказанные адреса');
} finally { // } finally {
isPredicting.value = false; // isPredicting.value = false;
} // }
} // }
function copyToClipboard(text) { function copyToClipboard(text) {
navigator.clipboard?.writeText(text).then(() => { navigator.clipboard?.writeText(text).then(() => {
@@ -1340,7 +1380,7 @@ const hasSelectedData = computed(() => {
// Мульти-чейн данные // Мульти-чейн данные
(dleSettings.selectedNetworks && dleSettings.selectedNetworks.length > 0) || (dleSettings.selectedNetworks && dleSettings.selectedNetworks.length > 0) ||
dleSettings.tokenStandard !== 'ERC20' || dleSettings.tokenStandard !== 'ERC20' ||
dleSettings.predictedAddress || // dleSettings.predictedAddress ||
unifiedPrivateKey.value || unifiedPrivateKey.value ||
Object.keys(privateKeys).length > 0 || Object.keys(privateKeys).length > 0 ||
// Устаревшие поля // Устаревшие поля
@@ -1373,7 +1413,7 @@ const saveFormData = () => {
// Мульти-чейн данные // Мульти-чейн данные
selectedNetworks: selectedNetworks.value, selectedNetworks: selectedNetworks.value,
totalDeployCost: totalDeployCost.value, totalDeployCost: totalDeployCost.value,
predictedAddress: predictedAddress.value, // predictedAddress: predictedAddress.value,
useSameKeyForAllChains: useSameKeyForAllChains.value, useSameKeyForAllChains: useSameKeyForAllChains.value,
unifiedPrivateKey: unifiedPrivateKey.value, unifiedPrivateKey: unifiedPrivateKey.value,
privateKeys: { ...privateKeys }, privateKeys: { ...privateKeys },
@@ -1420,6 +1460,7 @@ const loadFormData = () => {
selectedOkved: parsedData.selectedOkved || [], selectedOkved: parsedData.selectedOkved || [],
name: parsedData.name || '', name: parsedData.name || '',
tokenSymbol: parsedData.tokenSymbol || '', tokenSymbol: parsedData.tokenSymbol || '',
tokenImage: parsedData.tokenImage || '',
partners: parsedData.partners || [{ address: '', amount: 1 }], partners: parsedData.partners || [{ address: '', amount: 1 }],
governanceQuorum: parsedData.governanceQuorum || 51, governanceQuorum: parsedData.governanceQuorum || 51,
// Координаты // Координаты
@@ -1427,7 +1468,7 @@ const loadFormData = () => {
// Мульти-чейн настройки // Мульти-чейн настройки
selectedNetworks: parsedData.selectedNetworks || [], selectedNetworks: parsedData.selectedNetworks || [],
tokenStandard: parsedData.tokenStandard || 'ERC20', tokenStandard: parsedData.tokenStandard || 'ERC20',
predictedAddress: parsedData.predictedAddress || '', // predictedAddress: parsedData.predictedAddress || '',
// Устаревшие поля // Устаревшие поля
deployNetwork: parsedData.deployNetwork || '', deployNetwork: parsedData.deployNetwork || '',
privateKey: parsedData.privateKey || '' privateKey: parsedData.privateKey || ''
@@ -1446,7 +1487,7 @@ const loadFormData = () => {
// Восстанавливаем мульти-чейн состояние // Восстанавливаем мульти-чейн состояние
selectedNetworks.value = parsedData.selectedNetworks || []; selectedNetworks.value = parsedData.selectedNetworks || [];
totalDeployCost.value = parsedData.totalDeployCost || 0; totalDeployCost.value = parsedData.totalDeployCost || 0;
predictedAddress.value = parsedData.predictedAddress || ''; // predictedAddress.value = parsedData.predictedAddress || '';
useSameKeyForAllChains.value = parsedData.useSameKeyForAllChains !== undefined ? parsedData.useSameKeyForAllChains : true; useSameKeyForAllChains.value = parsedData.useSameKeyForAllChains !== undefined ? parsedData.useSameKeyForAllChains : true;
unifiedPrivateKey.value = parsedData.unifiedPrivateKey || ''; unifiedPrivateKey.value = parsedData.unifiedPrivateKey || '';
Object.assign(privateKeys, parsedData.privateKeys || {}); Object.assign(privateKeys, parsedData.privateKeys || {});
@@ -1500,13 +1541,14 @@ const clearAllData = () => {
dleSettings.selectedOkved = []; dleSettings.selectedOkved = [];
dleSettings.name = ''; dleSettings.name = '';
dleSettings.tokenSymbol = ''; dleSettings.tokenSymbol = '';
dleSettings.tokenImage = ''; // Очищаем картинку токена
dleSettings.partners = [{ address: '', amount: 1 }]; // Сброс к одному пустому партнеру dleSettings.partners = [{ address: '', amount: 1 }]; // Сброс к одному пустому партнеру
dleSettings.governanceQuorum = 51; // Сброс кворума к значению по умолчанию dleSettings.governanceQuorum = 51; // Сброс кворума к значению по умолчанию
// Очищаем мульти-чейн настройки // Очищаем мульти-чейн настройки
dleSettings.selectedNetworks = []; dleSettings.selectedNetworks = [];
dleSettings.tokenStandard = 'ERC20'; // Сбрасываем к стандартному ERC-20 dleSettings.tokenStandard = 'ERC20'; // Сбрасываем к стандартному ERC-20
dleSettings.predictedAddress = ''; // dleSettings.predictedAddress = '';
// Очищаем координаты // Очищаем координаты
dleSettings.coordinates = ''; dleSettings.coordinates = '';
@@ -1528,7 +1570,7 @@ const clearAllData = () => {
// Очищаем мульти-чейн состояние // Очищаем мульти-чейн состояние
selectedNetworks.value = []; selectedNetworks.value = [];
totalDeployCost.value = 0; totalDeployCost.value = 0;
predictedAddress.value = ''; // predictedAddress.value = '';
useSameKeyForAllChains.value = true; useSameKeyForAllChains.value = true;
unifiedPrivateKey.value = ''; unifiedPrivateKey.value = '';
Object.keys(privateKeys).forEach(key => delete privateKeys[key]); 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 () => { const loadCountries = async () => {
@@ -2026,16 +2151,16 @@ const updateDeployCost = () => {
.reduce((sum, network) => sum + network.estimatedCost, 0); .reduce((sum, network) => sum + network.estimatedCost, 0);
}; };
// Копирование адреса DLE // Копирование адреса DLE - отключено
const copyAddress = async () => { // const copyAddress = async () => {
try { // try {
await navigator.clipboard.writeText(predictedAddress.value); // await navigator.clipboard.writeText(predictedAddress.value);
console.log('Адрес скопирован:', predictedAddress.value); // console.log('Адрес скопирован:', predictedAddress.value);
// TODO: Показать уведомление об успешном копировании // // TODO: Показать уведомление об успешном копировании
} catch (error) { // } catch (error) {
console.error('Ошибка копирования адреса:', error); // console.error('Ошибка копирования адреса:', error);
} // }
}; // };
// Функция переключения использования одного ключа // Функция переключения использования одного ключа
const toggleSameKey = () => { const toggleSameKey = () => {
@@ -2228,28 +2353,28 @@ watch(unifiedPrivateKey, (newValue) => {
}, 100); }, 100);
}); });
// Watcher для predictedAddress - синхронизация с dleSettings // Watcher для predictedAddress - синхронизация с dleSettings - отключено
watch(predictedAddress, (newAddress) => { // watch(predictedAddress, (newAddress) => {
if (dleSettings.predictedAddress !== newAddress) { // if (dleSettings.predictedAddress !== newAddress) {
dleSettings.predictedAddress = newAddress; // dleSettings.predictedAddress = newAddress;
} // }
}); // });
// Вычисление предсказанного адреса при изменении ключевых данных // Вычисление предсказанного адреса при изменении ключевых данных - отключено
watch([() => dleSettings.name, () => dleSettings.tokenSymbol, selectedNetworks], () => { // watch([() => dleSettings.name, () => dleSettings.tokenSymbol, selectedNetworks], () => {
// TODO: Реализовать вычисление предсказанного адреса через API // // TODO: Реализовать вычисление предсказанного адреса через API
if (dleSettings.name && dleSettings.tokenSymbol && selectedNetworks.value.length > 0) { // if (dleSettings.name && dleSettings.tokenSymbol && selectedNetworks.value.length > 0) {
// Заглушка - в реальности будет API запрос // // Заглушка - в реальности будет API запрос
const newAddress = '0x' + Math.random().toString(16).substr(2, 40); // const newAddress = '0x' + Math.random().toString(16).substr(2, 40);
if (predictedAddress.value !== newAddress) { // if (predictedAddress.value !== newAddress) {
predictedAddress.value = newAddress; // predictedAddress.value = newAddress;
} // }
} else { // } else {
if (predictedAddress.value !== '') { // if (predictedAddress.value !== '') {
predictedAddress.value = ''; // predictedAddress.value = '';
} // }
} // }
}, { deep: true }); // }, { deep: true });
// Инициализация // Инициализация
onMounted(() => { onMounted(() => {
@@ -2373,6 +2498,7 @@ const deploySmartContracts = async () => {
// Основная информация DLE // Основная информация DLE
name: dleSettings.name, name: dleSettings.name,
symbol: dleSettings.tokenSymbol, symbol: dleSettings.tokenSymbol,
tokenImage: dleSettings.tokenImage, // Картинка токена
location: dleSettings.addressData.fullAddress || 'Не указан', location: dleSettings.addressData.fullAddress || 'Не указан',
coordinates: dleSettings.coordinates || '0,0', coordinates: dleSettings.coordinates || '0,0',
jurisdiction: parseInt(dleSettings.jurisdiction) || 0, jurisdiction: parseInt(dleSettings.jurisdiction) || 0,
@@ -2438,7 +2564,7 @@ const deploySmartContracts = async () => {
deployStatus.value = '✅ DLE успешно развернут!'; deployStatus.value = '✅ DLE успешно развернут!';
// Сохраняем адрес контракта // Сохраняем адрес контракта
dleSettings.predictedAddress = response.data.data?.dleAddress || 'Адрес будет доступен после деплоя'; // dleSettings.predictedAddress = response.data.data?.dleAddress || 'Адрес будет доступен после деплоя';
// Небольшая задержка для показа успешного завершения // Небольшая задержка для показа успешного завершения
setTimeout(() => { setTimeout(() => {
@@ -4258,4 +4384,109 @@ const validateCoordinates = (coordinates) => {
transform: translateY(0); 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> </style>

View File

@@ -1,5 +1,17 @@
#!/bin/bash #!/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 # Использование: ./migrate-encrypted-data.sh

View File

@@ -1,5 +1,17 @@
#!/bin/bash #!/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 if ! docker exec dapp-postgres pg_isready -U dapp_user -d dapp_db > /dev/null 2>&1; then
exit 1 exit 1
fi fi

View File

@@ -1,5 +1,17 @@
#!/bin/bash #!/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 # Скрипт мониторинга безопасности для DLE
# Автоматически блокирует подозрительные IP адреса и домены # Автоматически блокирует подозрительные IP адреса и домены

View File

@@ -1,5 +1,17 @@
#!/bin/bash #!/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 # Использование: ./start-security-monitor.sh