-
Notifications
You must be signed in to change notification settings - Fork 119
/
HolographGenesisLocal.sol
212 lines (180 loc) · 9.03 KB
/
HolographGenesisLocal.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
// SPDX-License-Identifier: UNLICENSED
/*
┌───────────┐
│ HOLOGRAPH │
└───────────┘
╔═════════════════════════════════════════════════════════════╗
║ ║
║ / ^ \ ║
║ ~~*~~ ¸ ║
║ [ '<>:<>' ] │░░░ ║
║ ╔╗ _/"\_ ╔╣ ║
║ ┌─╬╬─┐ """ ┌─╬╬─┐ ║
║ ┌─┬┘ ╠╣ └┬─┐ \_/ ┌─┬┘ ╠╣ └┬─┐ ║
║ ┌─┬┘ │ ╠╣ │ └┬─┐ ┌─┬┘ │ ╠╣ │ └┬─┐ ║
║ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ┌─┬┘ │ │ ╠╣ │ │ └┬─┐ ║
║ ┌─┬┘ │ │ │ ╠╣ │ │ │ └┬┐ ┌┬┘ │ │ │ ╠╣ │ │ │ └┬─┐ ║
╠┬┘ │ │ │ │ ╠╣ │ │ │ │└¤┘│ │ │ │ ╠╣ │ │ │ │ └┬╣
║│ │ │ │ │ ╠╣ │ │ │ │ │ │ │ │ ╠╣ │ │ │ │ │║
╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
║ ╠╣ ╠╣ ║
║ ╠╣ ╠╣ ║
║ , ╠╣ , ,' * ╠╣ ║
║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
- one protocol, one bridge = infinite possibilities -
***************************************************************
DISCLAIMER: U.S Patent Pending
LICENSE: Holograph Limited Public License (H-LPL)
https://holograph.xyz/licenses/h-lpl/1.0.0
This license governs use of the accompanying software. If you
use the software, you accept this license. If you do not accept
the license, you are not permitted to use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and
"distribution" have the same meaning here as under U.S.
copyright law. A "contribution" is the original software, or
any additions or changes to the software. A "contributor" is
any person that distributes its contribution under this
license. "Licensed patents" are a contributor’s patent claims
that read directly on its contribution.
2. Grant of Rights
A) Copyright Grant- Subject to the terms of this license,
including the license conditions and limitations in sections 3
and 4, each contributor grants you a non-exclusive, worldwide,
royalty-free copyright license to reproduce its contribution,
prepare derivative works of its contribution, and distribute
its contribution or any derivative works that you create.
B) Patent Grant- Subject to the terms of this license,
including the license conditions and limitations in section 3,
each contributor grants you a non-exclusive, worldwide,
royalty-free license under its licensed patents to make, have
made, use, sell, offer for sale, import, and/or otherwise
dispose of its contribution in the software or derivative works
of the contribution in the software.
3. Conditions and Limitations
A) No Trademark License- This license does not grant you rights
to use any contributors’ name, logo, or trademarks.
B) If you bring a patent claim against any contributor over
patents that you claim are infringed by the software, your
patent license from such contributor is terminated with
immediate effect.
C) If you distribute any portion of the software, you must
retain all copyright, patent, trademark, and attribution
notices that are present in the software.
D) If you distribute any portion of the software in source code
form, you may do so only under this license by including a
complete copy of this license with your distribution. If you
distribute any portion of the software in compiled or object
code form, you may only do so under a license that complies
with this license.
E) The software is licensed “as-is.” You bear all risks of
using it. The contributors give no express warranties,
guarantees, or conditions. You may have additional consumer
rights under your local laws which this license cannot change.
To the extent permitted under your local laws, the contributors
exclude all implied warranties, including those of
merchantability, fitness for a particular purpose and
non-infringement.
4. (F) Platform Limitation- The licenses granted in sections
2.A & 2.B extend only to the software or derivative works that
you create that run on a Holograph system product.
***************************************************************
*/
pragma solidity 0.8.13;
import "./interface/InitializableInterface.sol";
/**
* @title HOLOGRAPH GENESIS
* @dev In the beginning there was a smart contract...
*/
contract HolographGenesisLocal {
uint32 private immutable _version;
// Immutable addresses of the initial deployers
address private immutable deployer1 = 0xdf5295149F367b1FBFD595bdA578BAd22e59f504;
// Mapping of addresses that are approved deployers
mapping(address => bool) private _approvedDeployers;
// Events
event Message(string message);
event ContractDeployed(address deployedContract);
// Modifier to restrict function calls to approved deployers
modifier onlyDeployer() {
require(_approvedDeployers[msg.sender], "HOLOGRAPH: deployer not approved");
_;
}
/**
* @dev Sets the initial deployers as approved upon contract creation.
*/
constructor() {
_version = 2;
// Set the immutable deployers as approved
_approvedDeployers[deployer1] = true;
emit Message("The future is Holographic");
}
/**
* @dev Deploy a contract using the EIP-1014 (create2) opcode for deterministic addresses.
* @param chainId The chain on which to deploy
* @param saltHash A unique salt for contract creation
* @param secret A secret part of the salt
* @param sourceCode The bytecode of the contract to deploy
* @param initCode The initialization code for the contract
*/
function deploy(
uint256 chainId,
bytes12 saltHash,
bytes20 secret,
bytes memory sourceCode,
bytes memory initCode
) external onlyDeployer {
require(chainId == block.chainid, "HOLOGRAPH: incorrect chain id");
bytes32 salt = bytes32(abi.encodePacked(secret, saltHash));
address contractAddress = address(
uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(sourceCode)))))
);
require(!_isContract(contractAddress), "HOLOGRAPH: already deployed");
assembly {
contractAddress := create2(0, add(sourceCode, 0x20), mload(sourceCode), salt)
}
require(_isContract(contractAddress), "HOLOGRAPH: deployment failed");
require(
InitializableInterface(contractAddress).init(initCode) == InitializableInterface.init.selector,
"HOLOGRAPH: initialization failed"
);
emit ContractDeployed(contractAddress);
}
/**
* @dev Approve or revoke an address as a deployer.
* @param newDeployer Address to approve or revoke
* @param approve Boolean to approve or revoke
*/
function approveDeployer(address newDeployer, bool approve) external onlyDeployer {
_approvedDeployers[newDeployer] = approve;
}
/**
* @dev Check if an address is an approved deployer.
* @param deployer Address to check
* @return bool representing approval status
*/
function isApprovedDeployer(address deployer) external view returns (bool) {
return _approvedDeployers[deployer];
}
/**
* @dev Internal function to determine if an address is a deployed contract.
* @param contractAddress The address to check
* @return bool representing if the address is a contract
*/
function _isContract(address contractAddress) internal view returns (bool) {
bytes32 codehash;
assembly {
codehash := extcodehash(contractAddress)
}
return (codehash != 0x0 && codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
}
/**
* @dev Returns the version number of the Genesis contract
* @return uint32 representing the version number
*/
function getVersion() external view returns (uint32) {
return _version;
}
}