diff --git a/AltarSeed.sol b/AltarSeed.sol new file mode 100644 index 0000000..330973a --- /dev/null +++ b/AltarSeed.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/* + Simple, verified-friendly ERC20 with Ownable, Mint, Burn, Pause. + Designed for easy verification on explorers (flattening/pasting single file). +*/ + +interface IERC20 { + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address to, uint256 amount) external returns (bool); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +/// @notice Basic Context +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } +} + +/// @notice Ownable (simple) +contract Ownable is Context { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + constructor() { + _transferOwnership(_msgSender()); + } + + function owner() public view returns (address) { + return _owner; + } + + modifier onlyOwner() { + require(owner() == _msgSender(), "Ownable: caller is not the owner"); + _; + } + + function renounceOwnership() public onlyOwner { + _transferOwnership(address(0)); + } + + function transferOwnership(address newOwner) public onlyOwner { + require(newOwner != address(0), "Ownable: new owner is the zero address"); + _transferOwnership(newOwner); + } + + function _transferOwnership(address newOwner) internal { + address old = _owner; + _owner = newOwner; + emit OwnershipTransferred(old, newOwner); + } +} + +/// @notice Pausable +contract Pausable is Context { + event Paused(address account); + event Unpaused(address account); + + bool private _paused; + + constructor() { _paused = false; } + + function paused() public view returns (bool) { return _paused; } + + modifier whenNotPaused() { + require(!_paused, "Pausable: paused"); + _; + } + + modifier whenPaused() { + require(_paused, "Pausable: not paused"); + _; + } + + function _pause() internal whenNotPaused { + _paused = true; + emit Paused(_msgSender()); + } + + function _unpause() internal whenPaused { + _paused = false; + emit Unpaused(_msgSender()); + } +} + +/// @notice Minimal ERC20 implementation (simple, verifiable) +contract ERC20 is Context, IERC20 { + mapping(address => uint256) public override balanceOf; + mapping(address => mapping(address => uint256)) public override allowance; + uint256 public override totalSupply; + + string public name; + string public symbol; + uint8 public decimals = 18; + + constructor(string memory _name, string memory _symbol) { + name = _name; + symbol = _symbol; + } + + function transfer(address to, uint256 amount) public virtual override returns (bool) { + _transfer(_msgSender(), to, amount); + return true; + } + + function approve(address spender, uint256 amount) public virtual override returns (bool) { + allowance[_msgSender()][spender] = amount; + emit Approval(_msgSender(), spender, amount); + return true; + } + + function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { + uint256 allowed = allowance[from][_msgSender()]; + if (allowed != type(uint256).max) { + require(allowed >= amount, "ERC20: transfer amount exceeds allowance"); + allowance[from][_msgSender()] = allowed - amount; + } + _transfer(from, to, amount); + return true; + } + + // internal + function _transfer(address from, address to, uint256 amount) internal virtual { + require(from != address(0), "ERC20: transfer from zero"); + require(to != address(0), "ERC20: transfer to zero"); + uint256 fromBal = balanceOf[from]; + require(fromBal >= amount, "ERC20: transfer amount exceeds balance"); + unchecked { + balanceOf[from] = fromBal - amount; + balanceOf[to] += amount; + } + emit Transfer(from, to, amount); + } + + function _mint(address to, uint256 amount) internal virtual { + require(to != address(0), "ERC20: mint to zero"); + totalSupply += amount; + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal virtual { + require(from != address(0), "ERC20: burn from zero"); + uint256 fromBal = balanceOf[from]; + require(fromBal >= amount, "ERC20: burn amount exceeds balance"); + unchecked { + balanceOf[from] = fromBal - amount; + totalSupply -= amount; + } + emit Transfer(from, address(0), amount); + } +} + +/// @title ALTAR SEED — simple ERC20 you can verify +contract AltarSeed is ERC20, Ownable, Pausable { + event Mint(address indexed to, uint256 amount); + event Burned(address indexed from, uint256 amount); + event PausedBy(address indexed admin); + event UnpausedBy(address indexed admin); + + constructor(uint256 initialSupply) ERC20("ALTAR SEED", "ALTAR") { + // initialSupply should be provided in wei (i.e., tokens * 10**18) + _mint(_msgSender(), initialSupply); + } + + // owner-only mint + function mint(address to, uint256 amount) external onlyOwner whenNotPaused { + _mint(to, amount); + emit Mint(to, amount); + } + + // burn from caller + function burn(uint256 amount) external whenNotPaused { + _burn(_msgSender(), amount); + emit Burned(_msgSender(), amount); + } + + // owner pause/unpause + function pause() external onlyOwner { + _pause(); + emit PausedBy(_msgSender()); + } + + function unpause() external onlyOwner { + _unpause(); + emit UnpausedBy(_msgSender()); + } + + // override transfer to respect pause + function transfer(address to, uint256 amount) public virtual override whenNotPaused returns (bool) { + return super.transfer(to, amount); + } + + function transferFrom(address from, address to, uint256 amount) public virtual override whenNotPaused returns (bool) { + return super.transferFrom(from, to, amount); + } + + // convenience: composer function to get human-friendly supply + function human(uint256 n) public pure returns (uint256) { + return n * (10 ** 18); + } +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 00834cd..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Stytch - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/Spdx-license b/Spdx-license new file mode 100644 index 0000000..e68c409 --- /dev/null +++ b/Spdx-license @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +/* + Mintable ERC20 token for "Seed Altar (Living Seed)" + Owner (deployer) is able to mint. Uses OpenZeppelin patterns. +*/ + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract SeedAltarLiving is ERC20, Ownable { + // optional: a flag to disable minting forever + bool public mintingFinished = false; + + event Mint(address indexed to, uint256 amount); + event MintingFinished(); + + constructor(string memory name_, string memory symbol_, uint256 initialMint) ERC20(name_, symbol_) { + if (initialMint > 0) { + _mint(msg.sender, initialMint); + emit Mint(msg.sender, initialMint); + } + } + + modifier canMint() { + require(!mintingFinished, "SeedAltar: minting finished"); + _; + } + + /// @notice owner-only mint + function mint(address to, uint256 amount) external onlyOwner canMint { + _mint(to, amount); + emit Mint(to, amount); + } + + /// @notice optionally finish minting forever + function finishMinting() external onlyOwner canMint { + mintingFinished = true; + emit MintingFinished(); + } + + /// @notice rescue function for accidentally sent ETH + function rescueETH(address payable to) external onlyOwner { + uint256 bal = address(this).balance; + require(bal > 0, "no ETH"); + to.transfer(bal); + } + + // allow contract to receive ETH (if you want to require payment to mint) + receive() external payable {} +} diff --git a/altar_bot_advanced.py b/altar_bot_advanced.py new file mode 100644 index 0000000..77e3523 --- /dev/null +++ b/altar_bot_advanced.py @@ -0,0 +1,123 @@ +from aiogram import Bot, Dispatcher, types +from aiogram.utils import executor +from apscheduler.schedulers.asyncio import AsyncIOScheduler +import openai +import json +import datetime + +# 🔑 Your bot token +TOKEN = "8533383106:AAF4VVLvHYUgpU8NnhNv084wIyPvFBzxtm4" +bot = Bot(token=TOKEN) +dp = Dispatcher(bot) + +# 🔑 OpenAI API Key (replace with your key) +openai.api_key = "YOUR_OPENAI_API_KEY" + +# ===== User tracking ===== +users_file = "users.json" + +def add_user(user_id): + try: + with open(users_file, "r") as f: + users = json.load(f) + except: + users = [] + if user_id not in users: + users.append(user_id) + with open(users_file, "w") as f: + json.dump(users, f) + +# ===== Welcome Command ===== +@dp.message_handler(commands=['start']) +async def send_welcome(message: types.Message): + add_user(message.from_user.id) + await message.reply( + f"🔥 Welcome {message.from_user.first_name} 🔥\n" + "You are now connected to AltarSeed Bot.\nUse /help to see commands." + ) + +# ===== Help Command ===== +@dp.message_handler(commands=['help']) +async def send_help(message: types.Message): + await message.reply( + "💎 Available Commands:\n" + "/ritual - Receive a spiritual ritual\n" + "/energy - Check your energy status\n" + "/guide - Get spiritual guidance\n" + "/ai - Ask Obim AI a spiritual question\n" + "/start - Start the bot\n" + "/help - Show this message" + ) + +# ===== Ritual Command ===== +@dp.message_handler(commands=['ritual']) +async def send_ritual(message: types.Message): + await message.reply( + "🕯️ Ritual for today:\n" + "1. Sit quietly and breathe deeply.\n" + "2. Visualize your energy clearing.\n" + "3. Say: 'Obim, guide my path.'\n" + "4. Focus for 5 minutes." + ) + +# ===== Energy Command ===== +@dp.message_handler(commands=['energy']) +async def send_energy(message: types.Message): + await message.reply( + "⚡ Your energy status:\n" + "- Chi: Strong\n" + "- Spirit: Protected\n" + "- Aura: Clear\n" + "Keep focused and stay aligned." + ) + +# ===== Guide Command ===== +@dp.message_handler(commands=['guide']) +async def send_guide(message: types.Message): + await message.reply( + "🌟 Spiritual Guidance:\n" + "Stay patient, follow your path, and protect your energy.\n" + "Obim is watching over your journey." + ) + +# ===== AI Spiritual Guidance ===== +@dp.message_handler(lambda message: message.text.startswith('/ai ')) +async def ai_response(message: types.Message): + question = message.text[4:] + response = openai.ChatCompletion.create( + model="gpt-4", + messages=[{"role": "user", "content": question}] + ) + answer = response['choices'][0]['message']['content'] + await message.reply(f"🤖 Obim AI: {answer}") + +# ===== Default reply & anti-spam ===== +@dp.message_handler() +async def default_reply(message: types.Message): + text = message.text.lower() + if "spam" in text or "buy" in text or "free" in text: + await message.reply("⚠️ Spam detected. Message blocked.") + else: + await message.reply(f"💬 You said: {message.text}\nUse /help to see commands.") + +# ===== Daily Ritual Notification Scheduler ===== +scheduler = AsyncIOScheduler() + +async def daily_ritual(): + try: + with open(users_file, "r") as f: + users = json.load(f) + for user_id in users: + await bot.send_message(user_id, + "🕯️ Daily Reminder: Perform your spiritual ritual today and stay aligned with Obim.") + except: + pass + +# Schedule daily at 7:00 AM +scheduler.add_job(daily_ritual, 'cron', hour=7, minute=0) +scheduler.start() + +# ===== Run the Bot ===== +if __name__ == '__main__': + print("⚡ AltarSeed Bot Advanced is now running…") + executor.start_polling(dp, skip_updates=True) diff --git a/seedaltar.art b/seedaltar.art new file mode 100644 index 0000000..090313e --- /dev/null +++ b/seedaltar.art @@ -0,0 +1,166 @@ +import React from "react"; import { ArrowRight, ExternalLink, Sparkles, Twitter, MessageCircleMore, Radio } from "lucide-react"; + +export default function SeedAltar() { return (
{/* Nav */}
SEED ALTAR
View Token
+ +{/* Hero */} +
+
+
+
+
+

+ 108 Seeds of Light, Ancestral Power, and Eternal Energy +

+

+ SEED ALTAR is a sacred digital temple where art meets spirit. Each NFT is a living seed—an altar of wisdom, poetry, and power—planted on the blockchain to live forever. +

+ +

Powered by Base • Contract: 0x1254...fcdd

+
+
+
+
+
+
+
+
ALTAR • Base
+
Sacred NFT Collection
+
+
+
+
+
+
+ + {/* About */} +
+
+

About the Project

+

+ The Seed Altar is a sacred NFT collection of 108 digital relics—each one a seed of wisdom, light, and ancestral power. Crafted as eternal offerings, they awaken the spirit and connect collectors to higher realms. Our first cycle, Born to Conquer, blends prophecy, poetry, and visual energy to guide seekers on their path of victory, rebirth, and inner power. +

+
+
+ + {/* Token Overview */} +
+
+
+
+
Max Supply
+
995,000,000
+
ALTAR
+
+
+
Network
+
Base
+
EVM • L2
+
+
+
Launched
+
Sept 2025
+
Fresh Deployment
+
+
+ +
+ + View on BaseScan + + + + Track on DexScreener + + +
+
+
+ + {/* Roadmap */} +
+
+

Roadmap

+
+
+

Phase 1 — Birth of the Seed

+
    +
  • ALTAR token deployed on Base
  • +
  • Release of 108 NFT relics
  • +
  • Website & brand launch
  • +
+
+
+

Phase 2 — Growth of the Temple

+
    +
  • Community rituals & live spaces
  • +
  • Collector rewards & airdrops
  • +
  • Poetry + audio token drops
  • +
+
+
+

Phase 3 — Eternal Flame

+
    +
  • Partnerships & collabs
  • +
  • On-chain rituals & quests
  • +
  • Physical relics for top holders
  • +
+
+
+
+
+ + {/* Community */} +
+
+

Join the Circle

+

Follow the flame and enter the temple. Updates, drops, and rituals live here.

+
+ + Telegram + + + + X (Twitter) + + + + Warpcast + + +
+
+
+ + {/* Footer */} + +
+ +); } +