// SPDX-License-Identifier: MIT
صلابة براغما ^ 0.8.0 ؛
استيراد "@openzeppelin / عقود / رمز / ERC20 / ERC20.sol" ؛
استيراد "@openzeppelin/contracts/access/Ownable.sol"؛
عقد PhilanthropyToken هو ERC20 ، قابل للتملك {
uint256 ثابت عام MAX_TOTAL_SUPPLY = 500 * 10 ** 6 * 10 ** 18 ؛ الحد الأقصى لإجمالي المعروض 500 مليون توكن
uint256 ثابت عام MARKET_CAP = 10 * 10 ** 6 * 10 ** 18 ؛ القيمة السوقية الافتراضية 10 ملايين توكن
uint256 INVESTOR_ALLOCATION العامة = 4 * 10 ** 6 * 10 ** 18 ؛ 4 مليون توكنز للمستثمرين
uint256 ثابت عام GENERAL_PUBLIC_ALLOCATION = 5 * 10 ** 6 * 10 ** 18 ؛ 5 مليون رمز لعامة الناس
uint256 CHARITY_ALLOCATION العامة = 4 * 10 ** 6 * 10 ** 18 ؛ 4 مليون رمز للجمعيات الخيرية
uint256 ثابت عام PRESALE_ALLOCATION = 5 * 10 ** 6 * 10 ** 18 ؛ 5 مليون توكنز للبيع المسبق
uint256 PRESALE_TOTAL_SOLD العامة = 0 ؛
uint256 INVESTOR_LOCK_PERIOD الثابت العام = 730 يوما ؛ 2 سنوات فترة الحجز للمستثمرين
uint256 PRESALE_LOCK_PERIOD الثابت العام = 365 يوما ؛ 1 سنة فترة الإغلاق للبيع المسبق
uint256 TOTAL_INITIAL_RELEASED العامة = 0 ؛
uint256 TOTAL_INVESTOR_CLAIMED العامة = 0 ؛
uint256 ثابت عام PRESALE_PRICE = 50 * 10 ** 15 ؛ 0.50 دولار في وي
uint256 ثابت عام TRANSACTION_THRESHOLD = 1 * 10 ** 6 * 10 ** 18 ؛ 1 مليون حد للمعاملة لطلب رمز سري
uint256 presaleStartTime العامة ؛
// Mapping to track buyer purchase timestamps
تعيين (العنوان = > uint256) lastPurchaseالطابع الزمني العام ؛
سلسلة السر العامرمز ؛
تعيين (العنوان = > منطقية) المسؤولين العامين ؛
/**
* معدل المشرف فقط
*/
المعدل فقطمشرف() {
تتطلب (المشرفون [msg.sender] || msg.sender == المالك () ، "ليس مسؤولا") ؛
_;
}
/**
*منشئ
*/
المنشئ () ERC20 ("PhilanthropyToken" ، "PTPH") {
// Mint the initial supply to the contract owner
_mint (msg.sender ، MARKET_CAP) ؛
presaleStartTime = block.timestamp;
// Transfer ownership to the contract deployer!
نقل الملكية (msg.sender) ؛
}
// Function to add or remove admins
وظيفة setAdmin (عنوان _admin ، bool _status) خارجي فقطالمالك {
المشرفون[_admin] = _status;
}
/**
* وظيفة للسماح للمستخدمين بشراء الرموز المميزة قبل البيع
* مبلغ @param uint256
*/
وظيفة شراءPresaleTokens (مبلغ uint256) خارجي مستحق الدفع {
تتطلب (المبلغ > 0 ، "مبلغ الشراء غير صالح") ؛
تتطلب(
block.timestamp >= presaleStartTime,
"ما قبل البيع لم يبدأ بعد"
);
تتطلب(
block.timestamp <= presaleStartTime + 182.5 days,
"انتهى العرض المسبق"
);
uint256 السعر الإجمالي = المبلغ * PRESALE_PRICE ؛
تتطلب (msg.value >= totalPrice ، "تم إرسال أموال غير كافية") ؛
// Calculate and check remaining presale allocation
uint256 المتبقيةتخصيص ما قبل البيع = PRESALE_TOTAL_SOLD ؛
تتطلب(
amount <= remainingPresaleAllocation,
"لا توجد رموز كافية متاحة للشراء"
);
// Transfer tokens to the buyer
_transfer (العنوان (هذا) ، msg.sender ، المبلغ) ؛
// Update the buyer's last purchase timestamp
lastPurchaseTimestamp [msg.sender] = block.timestamp;
// Refund any excess funds sent
إذا (msg.value > totalPrice) {
مستحق الدفع (msg.sender) .transfer (msg.value - totalPrice) ؛
}
PRESALE_TOTAL_SOLD += المبلغ ؛
}
/**
* وظيفة لزيادة القيمة السوقية
* مبلغ @param uint256
*/
وظيفة زيادة MarketCap (مبلغ uint256) خارجي فقطالمسؤول {
uint256 العرض الحالي = إجمالي العرض () ؛
تتطلب(
currentSupply + amount <= MAX_TOTAL_SUPPLY,
"يتجاوز الحد الأقصى لإجمالي العرض"
);
_mint (المالك () ، المبلغ) ؛
}
/**
* وظيفة لتوزيع CHARITY_ALLOCATION إلى عناوين متعددة
* @param recipients string<addresses>
* @param المبالغ uint256
*/
الدالة initialRelease(
عنوان [] مستلمي الذاكرة ،
uint256[] كميات الذاكرة
) خارجي فقطمشرف {
تتطلب(
المستلمون.الطول == المبالغ.الطول ،
"أطوال الصفيف غير متطابقة"
);
تتطلب(
block.timestamp >= presaleStartTime + PRESALE_LOCK_PERIOD,
"فترة الإغلاق لم تنته بعد"
);
for (uint256 i = 0; i < recipients.length; i++) {
مستلم العنوان = المستلمون[i];
uint256 المبلغ = المبالغ [i] ؛
تتطلب (المستلم != العنوان (0) ، "عنوان المستلم غير صالح") ؛
تتطلب (المبلغ > 0 ، "مبلغ غير صالح") ؛
TOTAL_INITIAL_RELEASED += المبلغ ؛
تتطلب(
TOTAL_INITIAL_RELEASED <= CHARITY_ALLOCATION,
"إجمالي التوزيع يتجاوز CHARITY_ALLOCATION"
);
// Transfer tokens to the recipient
_transfer (العنوان (هذا) ، المستلم ، المبلغ) ؛
}
}
/**
* وظيفة لتوزيع INVESTOR_ALLOCATION على مستثمرين متعددين
* عنوان @param المستثمرين
* @param المبالغ uint256
*/
وظيفة المطالبةInvestorTokens(
عنوان [] مستثمري الذاكرة ،
uint256[] كميات الذاكرة
) خارجي فقطمشرف {
تتطلب(
طول المستثمرين == المبالغ.الطول ،
"أطوال الصفيف غير متطابقة"
);
تتطلب(
block.timestamp > = presaleStartTime + INVESTOR_LOCK_PERIOD ،
"فترة الإغلاق لم تنته بعد"
);
for (uint256 i = 0; i < investors.length; i++) {
عنوان المستثمر = المستثمرين[i];
uint256 المبلغ = المبالغ [i] ؛
تتطلب (مستثمر!= العنوان (0) ، "عنوان مستثمر غير صالح") ؛
تتطلب (المبلغ > 0 ، "مبلغ غير صالح") ؛
TOTAL_INVESTOR_CLAIMED += المبلغ ؛
// Check if totalDistribution exceeds INVESTOR_ALLOCATION
تتطلب(
TOTAL_INVESTOR_CLAIMED <= INVESTOR_ALLOCATION,
"إجمالي التوزيع يتجاوز INVESTOR_ALLOCATION"
);
// Transfer tokens to the investor
_transfer (العنوان (هذا) ، المستثمر ، المبلغ) ؛
}
}
// Function to set a secret code for transactions above the threshold
وظيفة setSecretCode (رمز ذاكرة سلسلة) خارجي فقطمشرف {
الرمز السري = الرمز ؛
}
// Function to perform a transaction above the threshold with the correct secret code
نقل وظيفة (
مستلم العنوان ،
مبلغ uint256 ،
رمز ذاكرة السلسلة
) خارجي {
require(amount <= TRANSACTION_THRESHOLD, "Amount exceeds threshold");
تتطلب(
keccak256 (abi.encodePacked (code)) ==
keccak256 (abi.encodePacked (secretCode)) ،
"رمز سري غير صحيح"
);
_transfer (msg.sender ، المستلم ، المبلغ) ؛
}
/**
* وظيفة لإظهار القيمة TOTAL_INITIAL_RELEASED
* @return uint256
*/
الدالة getTotalIInvestorAllocation() إرجاع العرض الخارجي (uint256) {
عودة INVESTOR_ALLOCATION
}
/**
* وظيفة لإظهار قيمة TOTAL_INVESTOR_CLAIMED
* @return uint256
*/
الدالة getTotalInitialAllocation() إرجاع العرض الخارجي (uint256) {
عودة CHARITY_ALLOCATION
}
/**
* وظيفة لإظهار القيمة TOTAL_INITIAL_RELEASED
* @return uint256
*/
الدالة getTotalInitialRelease() إرجاع العرض الخارجي (uint256) {
عودة TOTAL_INITIAL_RELEASED
}
/**
* وظيفة لإظهار قيمة TOTAL_INVESTOR_CLAIMED
* @return uint256
*/
الدالة getTotalInvestorClaimed() إرجاع العرض الخارجي (uint256) {
عودة TOTAL_INVESTOR_CLAIMED
}
/**
* وظيفة لنقل الرموز بين TOTAL_INITIAL_RELEASED و TOTAL_INVESTOR_CLAIMED
* مبلغ @param uint256
* @param من أوليتو إنفستور منطقي
*/
نقل الدالة بين الفئات (
مبلغ uint256 ،
bool fromInitialToInvestor
) خارجي فقطمشرف {
تتطلب(
منإنفورميتو إنفستور || TOTAL_INITIAL_RELEASED >= المبلغ،
"الرموز غير كافية في INITIAL_RELEASED"
);
تتطلب(
!fromInitialToInvestor || TOTAL_INVESTOR_CLAIMED >= المبلغ،
"الرموز غير كافية في INVESTOR_CLAIMED"
);
إذا (fromInitialToInvestor) {
CHARITY_ALLOCATION - = المبلغ ؛
INVESTOR_ALLOCATION += المبلغ ؛
} آخر {
INVESTOR_ALLOCATION - = المبلغ ؛
CHARITY_ALLOCATION += المبلغ ؛
}
_transfer (العنوان (هذا) ، msg.sender ، المبلغ) ؛
}
/**
* وظيفة لنقل الرموز بين TOTAL_INITIAL_RELEASED و TOTAL_INVESTOR_CLAIMED
* مبلغ @param uint256
* @param من أوليتو إنفستور منطقي
*/
وظيفة توب أب الفئات(
مبلغ uint256 ،
bool fromInitialToInvestor
) خارجي فقطمشرف {
تتطلب(
منإنفورميتو إنفستور || CHARITY_ALLOCATION > = المبلغ ،
"الرموز غير كافية في INITIAL_RELEASED"
);
تتطلب(
!fromInitialToInvestor || TOTAL_INVESTOR_CLAIMED >= المبلغ،
"الرموز غير كافية في INVESTOR_CLAIMED"
);
إذا (fromInitialToInvestor) {
CHARITY_ALLOCATION - = المبلغ ؛
INVESTOR_ALLOCATION += المبلغ ؛
} آخر {
INVESTOR_ALLOCATION - = المبلغ ؛
CHARITY_ALLOCATION += المبلغ ؛
}
_transfer (العنوان (هذا) ، msg.sender ، المبلغ) ؛
}
/**
* وظيفة لتعبئة CHARITY_ALLOCATION من الرصيد المتاح للعقد
* مبلغ @param uint256
*/
وظيفة topUpCharityAlallocation (مبلغ uint256) خارجي فقطمشرف {
uint256 متاح الرصيد = رصيد من (العنوان (هذا)) ؛
require(amount <= availableBalance, "Exceeds available balance");
CHARITY_ALLOCATION += المبلغ ؛
_transfer (العنوان (هذا) ، المالك () ، المبلغ) ؛
}
/**
* وظيفة لتعبئة INVESTOR_ALLOCATION من الرصيد المتاح للعقد
* مبلغ @param uint256
*/
وظيفة topUpInvestorAllocation(uint256 المبلغ) خارجي فقطمشرف {
uint256 متاح الرصيد = رصيد من (العنوان (هذا)) ؛
require(amount <= availableBalance, "Exceeds available balance");
INVESTOR_ALLOCATION += المبلغ ؛
_transfer (العنوان (هذا) ، المالك () ، المبلغ) ؛
}
}