Advantages Of The LZN Protocol Over Other Protocols
The security of a protocol is of the utmost importance. The Revoluzion team has put in extensive research, development, and testing to ensure that the Luzion Protocol, when deployed on the MainNet, is secure and reliable for our users' investments. We prioritize a properly functioning protocol over rushing to meet hype or deadlines.
The Luzion Protocol was the first to successfully implement a properly functioning rebase rate, as well as the correct formula for continuous automatic compounding.
Key Features of the Luzion Protocol that Set it Apart ;-
The Luzion Protocol was developed entirely from scratch, with no copy-pasting of code. The lead full stack developer, Nizar, and his team spent hundreds of hours perfecting every aspect of the smart contract's logic to ensure its quality
The Luzion Protocol offers fully functional dual rewards through an automated staking system. By simply holding $LZN in their wallet, users can receive both LZN reflections and BUSD rewards on a perpetual basis. This helps to stabilize the market by incentivizing holders to hold onto their $LZN, rather than cashing out, as they are consistently earning BUSD rewards as profits.
The Luzion Protocol utilizes a fully automated rebalancing system that operates until the maximum supply is reached after 13 years. This eliminates the need for users to stake their tokens on a smart contract, which can expose them to vulnerabilities and exploits. The automated rebalancing helps to ensure the long-term sustainability of the protocol.
The rebase rate code and logic of the Luzion Protocol are fully functioning throughout its lifespan. Unlike other protocols, the rebase rate does not need to be amended after 365 days, which helps to maintain control over the supply and prevent the mass reduction in token value over time. The Luzion Protocol's rebalancing system is robust and helps to ensure the stability and value of the token.
The Luzion Protocol has a fully automated burning mechanism in place. Every transaction on the protocol automatically burns 2% of the transaction amount directly to the blackhole. This helps to reduce the overall supply of tokens and promotes sustainability.
Other protocols may have manually-executed burns that can be manipulated or sold on the market, which does not effectively reduce the supply. The automatic burn on the Luzion Protocol ensures that the supply is consistently and transparently reduced.
Other protocols may have a "burned" address that is essentially a wallet, and burns are done manually. This can be opaque and potentially subject to manipulation. The Luzion Protocol, on the other hand, has a fully automated burning mechanism that sends burned tokens directly to an actual burn address. This ensures a transparent and tamper-proof burn process. The use of a dedicated burn address also helps to increase confidence in the protocol.
The Luzion Protocol offers competitive buy and sell tax rates for investors. The lower fees make it more cost-effective for investors to purchase and sell tokens on the protocol, which can encourage more participation and liquidity. These competitive tax rates are a key advantage for the Luzion Protocol in the market.
The Luzion Protocol has a transparent and secure tax fee structure in place. The tax fee rate is hardcoded directly into the smart contract, which ensures that it cannot be adjusted or manipulated by the team.
This provides a high level of security for transactions on the protocol. In contrast, many other protocols may have variable tax fee rates or even no limits, which can be a cause for concern for investors. The hardcoded tax fee rate on the Luzion Protocol helps to build trust and confidence in the protocol.
The Luzion Protocol utilizes a hardware wallet storage vault to ensure maximum security and safety for treasury funds. By storing all treasury funds directly in a hardware wallet, the protocol is able to prevent exploitation or hacks from occurring. The use of a hardware wallet provides an additional layer of security and helps to build trust and confidence in the protocol.
The entire Revoluzion team behind the Luzion Protocol is fully doxxed, with all necessary information readily available through social media profiles and other channels. The team is actively involved in the development and progress of the protocol, regularly holding Video AMAs and providing updates to the community.
The Revoluzion team has been with the project from the start and is committed to continuously developing and updating the protocol on a daily basis. The team's transparency and dedication to the project helps to build trust and confidence in the Luzion Protocol.
Many projects have an insurance fund wallet in case of an emergency. The Luzion Protocol, however, takes a different approach to risk management by directly paying out insurance funding to users on a regular basis. This provides a risk-free investment experience for users.
The protocol's approach is based on the belief that it is not advisable to hold a large sum of insurance funds in a single entity, and instead, it is better to have the funds distributed to users consistently. The Luzion Protocol's dividend fund is a unique approach to risk management that helps to build trust and confidence in the protocol.
1
/**
2
*Submitted for verification at Etherscan.io on 2022-04-11
3
*/
4
5
// SPDX-License-Identifier: MIT
6
7
/**
8
* @title Luzion Protocol
9
* @notice The future of Dual Reward with Auto-Staking, Auto-Compounding & BUSD Reflection all together!
10
*
11
* @custom:website https://luzion.io
12
* @custom:whitepaper https://docs.luzion.io
13
* @custom:telegram https://t.me/revoluzionecosystem
14
*/
15
16
pragma solidity ^0.8.13;
17
18
19
/** LIBRARY / DEPENDENCY **/
20
21
// CAUTION
22
// This version of SafeMath should only be used with Solidity 0.8 or later,
23
// because it relies on the compiler's built in overflow checks.
24
25
/**
26
* @title Safe Math
27
*
28
* @dev Wrappers over Solidity's arithmetic operations.
29
*
30
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
31
* now has built in overflow checking.
32
*/
33
library SafeMath {
34
/**
35
* @dev Returns the addition of two unsigned integers, with an overflow flag.
36
*
37
* _Available since v3.4._
38
*/
39
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
40
unchecked {
41
uint256 c = a + b;
42
if (c < a) return (false, 0);
43
return (true, c);
44
}
45
}
46
47
/**
48
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
49
*
50
* _Available since v3.4._
51
*/
52
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
53
unchecked {
54
if (b > a) return (false, 0);
55
return (true, a - b);
56
}
57
}
58
59
/**
60
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
61
*
62
* _Available since v3.4._
63
*/
64
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
65
unchecked {
66
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
67
// benefit is lost if 'b' is also tested.
68
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
69
if (a == 0) return (true, 0);
70
uint256 c = a * b;
71
if (c / a != b) return (false, 0);
72
return (true, c);
73
}
74
}
75
76
/**
77
* @dev Returns the division of two unsigned integers, with a division by zero flag.
78
*
79
* _Available since v3.4._
80
*/
81
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
82
unchecked {
83
if (b == 0) return (false, 0);
84
return (true, a / b);
85
}
86
}
87
88
/**
89
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
90
*
91
* _Available since v3.4._
92
*/
93
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
94
unchecked {
95
if (b == 0) return (false, 0);
96
return (true, a % b);
97
}
98
}
99
100
/**
101
* @dev Returns the addition of two unsigned integers, reverting on
102
* overflow.
103
*
104
* Counterpart to Solidity's `+` operator.
105
*
106
* Requirements:
107
*
108
* - Addition cannot overflow.
109
*/
110
function add(uint256 a, uint256 b) internal pure returns (uint256) {
111
return a + b;
112
}
113
114
/**
115
* @dev Returns the subtraction of two unsigned integers, reverting on
116
* overflow (when the result is negative).
117
*
118
* Counterpart to Solidity's `-` operator.
119
*
120
* Requirements:
121
*
122
* - Subtraction cannot overflow.
123
*/
124
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
125
return a - b;
126
}
127
128
/**
129
* @dev Returns the multiplication of two unsigned integers, reverting on
130
* overflow.
131
*
132
* Counterpart to Solidity's `*` operator.
133
*
134
* Requirements:
135
*
136
* - Multiplication cannot overflow.
137
*/
138
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
139
return a * b;
140
}
141
142
/**
143
* @dev Returns the integer division of two unsigned integers, reverting on
144
* division by zero. The result is rounded towards zero.
145
*
146
* Counterpart to Solidity's `/` operator.
147
*
148
* Requirements:
149
*
150
* - The divisor cannot be zero.
151
*/
152
function div(uint256 a, uint256 b) internal pure returns (uint256) {
153
return a / b;
154
}
155
156
/**
157
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
158
* reverting when dividing by zero.
159
*
160
* Counterpart to Solidity's `%` operator. This function uses a `revert`
161
* opcode (which leaves remaining gas untouched) while Solidity uses an
162
* invalid opcode to revert (consuming all remaining gas).
163
*
164
* Requirements:
165
*
166
* - The divisor cannot be zero.
167
*/
168
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
169
return a % b;
170
}
171
172
/**
173
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
174
* overflow (when the result is negative).
175
*
176
* CAUTION: This function is deprecated because it requires allocating memory for the error
177
* message unnecessarily. For custom revert reasons use {trySub}.
178
*
179
* Counterpart to Solidity's `-` operator.
180
*
181
* Requirements:
182
*
183
* - Subtraction cannot overflow.
184
*/
185
function sub(
186
uint256 a,
187
uint256 b,
188
string memory errorMessage
189
) internal pure returns (uint256) {
190
unchecked {
191
require(b <= a, errorMessage);
192
return a - b;
193
}
194
}
195
196
/**
197
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
198
* division by zero. The result is rounded towards zero.
199
*
200
* Counterpart to Solidity's `/` operator. Note: this function uses a
201
* `revert` opcode (which leaves remaining gas untouched) while Solidity
202
* uses an invalid opcode to revert (consuming all remaining gas).
203
*
204
* Requirements:
205
*
206
* - The divisor cannot be zero.
207
*/
208
function div(
209
uint256 a,
210
uint256 b,
211
string memory errorMessage
212
) internal pure returns (uint256) {
213
unchecked {
214
require(b > 0, errorMessage);
215
return a / b;
216
}
217
}
218
219
/**
220
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
221
* reverting with custom message when dividing by zero.
222
*
223
* CAUTION: This function is deprecated because it requires allocating memory for the error
224
* message unnecessarily. For custom revert reasons use {tryMod}.
225
*
226
* Counterpart to Solidity's `%` operator. This function uses a `revert`
227
* opcode (which leaves remaining gas untouched) while Solidity uses an
228
* invalid opcode to revert (consuming all remaining gas).
229
*
230
* Requirements:
231
*
232
* - The divisor cannot be zero.
233
*/
234
function mod(
235
uint256 a,
236
uint256 b,
237
string memory errorMessage
238
) internal pure returns (uint256) {
239
unchecked {
240
require(b > 0, errorMessage);
241
return a % b;
242
}
243
}
244
}
245
246
/**
247
* @title Context
248
*
249
* @dev Provides information about the current execution context, including the
250
* sender of the transaction and its data. While these are generally available
251
* via msg.sender and msg.data, they should not be accessed in such a direct
252
* manner, since when dealing with meta-transactions the account sending and
253
* paying for execution may not be the actual sender (as far as an application
254
* is concerned).
255
*
256
* This contract is only required for intermediate, library-like contracts.
257
*/
258
abstract contract Context {
259
260
261
/** FUNCTION **/
262
263
/**
264
* @dev Act as the shorthand for msg.sender reference.
265
*/
266
function _msgSender() internal view virtual returns (address) {
267
return msg.sender;
268
}
269
270
/**
271
* @dev Act as the shorthand for msg.data reference.
272
*/
273
function _msgData() internal view virtual returns (bytes calldata) {
274
return msg.data;
275
}
276
277
/**
278
* @dev Act as the shorthand for msg.value reference.
279
*/
280
function _msgValue() internal view virtual returns (uint256) {
281
return msg.value;
282
}
283
284
}
285
286
/**
287
* @title Ownable
288
*
289
* @dev Contract module which provides a basic access control mechanism, where
290
* there is an account (an owner) that can be granted exclusive access to
291
* specific functions.
292
*
293
* By default, the owner account will be the one that deploys the contract. This
294
* can later be changed with {transferOwnership}.
295
*
296
* This module is used through inheritance. It will make available the modifier
297
* `onlyOwner`, which can be applied to your functions to restrict their use to
298
* the owner.
299
*/
300
abstract contract Ownable is Context {
301
302
address private _owner;
303
304
mapping(address => bool) internal authorizations;
305
306
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
307
308
/**
309
* @dev Initializes the contract setting the deployer as the initial owner.
310
*/
311
constructor() {
312
_transferOwnership(_msgSender());
313
authorizations[_msgSender()] = true;
314
}
315
316
/**
317
* @dev Returns the address of the current owner.
318
*/
319
function owner() public view virtual returns (address) {
320
return _owner;
321
}
322
323
/**
324
* @dev Throws if called by any account other than the owner.
325
*/
326
modifier onlyOwner() {
327
require(owner() == _msgSender(), "Ownable: caller is not the owner");
328
_;
329
}
330
331
/**
332
* @dev Throws if called by any account other authorized accounts.
333
*/
334
modifier authorized() {
335
require(isAuthorized(_msgSender()), "Ownable: caller is not an authorized account");
336
_;
337
}
338
339
/**
340
* @dev Authorize address. Owner only
341
*/
342
function authorize(address adr) public onlyOwner {
343
authorizations[adr] = true;
344
}
345
346
/**
347
* @dev Remove address' authorization. Owner only
348
*/
349
function unauthorize(address adr) public onlyOwner {
350
authorizations[adr] = false;
351
}
352
353
/**
354
* @dev Check if address is owner
355
*/
356
function isOwner(address adr) public view returns (bool) {
357
return adr == owner();
358
}
359
360
/**
361
* @dev Return address' authorization status
362
*/
363
function isAuthorized(address adr) public view returns (bool) {
364
return authorizations[adr];
365
}
366
367
/**
368
* @dev Leaves the contract without owner. It will not be possible to call
369
* `onlyOwner` functions anymore. Can only be called by the current owner.
370
*
371
* NOTE: Renouncing ownership will leave the contract without an owner,
372
* thereby removing any functionality that is only available to the owner.
373
*/
374
function renounceOwnership() public virtual onlyOwner {
375
_transferOwnership(address(0));
376
}
377
378
/**
379
* @dev Transfers ownership of the contract to a new account (`newOwner`).
380
* Can only be called by the current owner.
381
*/
382
function transferOwnership(address newOwner) public virtual onlyOwner {
383
require(newOwner != address(0), "Ownable: new owner is the zero address");
384
_transferOwnership(newOwner);
385
}
386
387
/**
388
* @dev Transfers ownership of the contract to a new account (`newOwner`).
389
* Internal function without access restriction.
390
*/
391
function _transferOwnership(address newOwner) internal virtual {
392
address oldOwner = _owner;
393
_owner = newOwner;
394
emit OwnershipTransferred(oldOwner, newOwner);
395
}
396
397
}
398
399
400
/** ERC STANDARD **/
401
402
/**
403
* @title IERC20Extended
404
*
405
* @dev The interface for ERC20 with metadata extension included.
406
*/
407
interface IERC20Extended {
408
409
410
/** FUNCTION **/
411
412
/**
413
* @dev Returns the name of the token.
414
*/
415
function name() external view returns (string memory);
416
417
/**
418
* @dev Returns the symbol of the token.
419
*/
420
function symbol() external view returns (string memory);
421
422
/**
423
* @dev Returns the decimals places of the token.
424
*/
425
function decimals() external view returns (uint8);
426
427
/**
428
* @dev Returns the amount of tokens in existence.
429
*/
430
function totalSupply() external view returns (uint256);
431
432
/**
433
* @dev Returns the amount of tokens owned by `account`.
434
*/
435
function balanceOf(address account) external view returns (uint256);
436
437
/**
438
* @dev Moves `amount` tokens from the caller's account to `recipient`.
439
*
440
* Returns a boolean value indicating whether the operation succeeded.
441
*
442
* Emits a {Transfer} event.
443
*/
444
function transfer(address recipient, uint256 amount) external returns (bool);
445
446
/**
447
* @dev Returns the remaining number of tokens that `spender` will be
448
* allowed to spend on behalf of `owner` through {transferFrom}. This is
449
* zero by default.
450
*
451
* This value changes when {approve} or {transferFrom} are called.
452
*/
453
function allowance(address _owner, address spender) external view returns (uint256);
454
455
/**
456
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
457
*
458
* Returns a boolean value indicating whether the operation succeeded.
459
*
460
* IMPORTANT: Beware that changing an allowance with this method brings the risk
461
* that someone may use both the old and the new allowance by unfortunate
462
* transaction ordering. One possible solution to mitigate this race
463
* condition is to first reduce the spender's allowance to 0 and set the
464
* desired value afterwards:
465
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
466
*
467
* Emits an {Approval} event.
468
*/
469
function approve(address spender, uint256 amount) external returns (bool);
470