From 6f87227c4f7b03231ce1cc5c9f21deaf26e8c858 Mon Sep 17 00:00:00 2001 From: Born to conquer Date: Mon, 8 Sep 2025 03:39:49 +0100 Subject: [PATCH 1/5] seedaltar.art --- README.md | 0 seedaltar.art | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) delete mode 100644 README.md create mode 100644 seedaltar.art diff --git a/README.md b/README.md deleted file mode 100644 index e69de29..0000000 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 */} +
+
+
© {new Date().getFullYear()} SEED ALTAR • Powered by Base
+
Contract: 0x1254290214e593a502b97136bc9d100007f1fcdd
+
+
+
+ +); } + From 42172c49b56c94e83c355d57463082b365ecf2d8 Mon Sep 17 00:00:00 2001 From: seedaltar Date: Fri, 3 Oct 2025 05:31:51 +0100 Subject: [PATCH 2/5] Update LICENSE The Seed Altar is a sacred NFT collection of 108 digital relics each one a seed of wisdom, light, and ancestral power. Every piece carries a story of creation, transformation, and eternal energy, crafted to awaken the spirit and connect the collector to higher realms. --- LICENSE | 58 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/LICENSE b/LICENSE index 00834cd..a755a6b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,45 @@ -MIT License +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; -Copyright (c) 2023 Stytch +contract SeedAltarV2 { + string public name = "SeedAltarV2"; + string public symbol = "SEEDV2"; + uint8 public decimals = 18; + uint256 public totalSupply; -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: + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); -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. + constructor(uint256 _initialSupply) { + totalSupply = _initialSupply * 10 ** uint256(decimals); + balanceOf[msg.sender] = totalSupply; + emit Transfer(address(0), msg.sender, totalSupply); + } + + function transfer(address _to, uint256 _value) external returns (bool success) { + require(balanceOf[msg.sender] >= _value, "Insufficient balance"); + balanceOf[msg.sender] -= _value; + balanceOf[_to] += _value; + emit Transfer(msg.sender, _to, _value); + return true; + } + + function approve(address _spender, uint256 _value) external returns (bool success) { + allowance[msg.sender][_spender] = _value; + emit Approval(msg.sender, _spender, _value); + return true; + } + + function transferFrom(address _from, address _to, uint256 _value) external returns (bool success) { + require(balanceOf[_from] >= _value, "Insufficient balance"); + require(allowance[_from][msg.sender] >= _value, "Allowance exceeded"); + balanceOf[_from] -= _value; + balanceOf[_to] += _value; + allowance[_from][msg.sender] -= _value; + emit Transfer(_from, _to, _value); + return true; + } +} From edbbff8ebe379c23cb019240bfb365da6f87a343 Mon Sep 17 00:00:00 2001 From: seedaltar Date: Fri, 3 Oct 2025 05:53:53 +0100 Subject: [PATCH 3/5] Create AltarSeed.sol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- AltarSeed.sol | 211 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 AltarSeed.sol 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); + } +} From 25a6488efbb27ff71817e203a7d3a8ebf438b07f Mon Sep 17 00:00:00 2001 From: seedaltar Date: Sun, 5 Oct 2025 05:40:32 +0100 Subject: [PATCH 4/5] Update and rename LICENSE to Spdx-license MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NFT collection, we blend prophecy, poetry, and visual energy to guide seekers on their path of victory, rebirth, and inner power. At SEED ALTAR, we are not just building NFTs — we are building a temple of creation in the digital age, where collectors become keepers of eternal seeds. Signed-off-by: seedaltar --- LICENSE | 45 --------------------------------------------- Spdx-license | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 45 deletions(-) delete mode 100644 LICENSE create mode 100644 Spdx-license diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a755a6b..0000000 --- a/LICENSE +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -contract SeedAltarV2 { - string public name = "SeedAltarV2"; - string public symbol = "SEEDV2"; - uint8 public decimals = 18; - uint256 public totalSupply; - - mapping(address => uint256) public balanceOf; - mapping(address => mapping(address => uint256)) public allowance; - - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval(address indexed owner, address indexed spender, uint256 value); - - constructor(uint256 _initialSupply) { - totalSupply = _initialSupply * 10 ** uint256(decimals); - balanceOf[msg.sender] = totalSupply; - emit Transfer(address(0), msg.sender, totalSupply); - } - - function transfer(address _to, uint256 _value) external returns (bool success) { - require(balanceOf[msg.sender] >= _value, "Insufficient balance"); - balanceOf[msg.sender] -= _value; - balanceOf[_to] += _value; - emit Transfer(msg.sender, _to, _value); - return true; - } - - function approve(address _spender, uint256 _value) external returns (bool success) { - allowance[msg.sender][_spender] = _value; - emit Approval(msg.sender, _spender, _value); - return true; - } - - function transferFrom(address _from, address _to, uint256 _value) external returns (bool success) { - require(balanceOf[_from] >= _value, "Insufficient balance"); - require(allowance[_from][msg.sender] >= _value, "Allowance exceeded"); - balanceOf[_from] -= _value; - balanceOf[_to] += _value; - allowance[_from][msg.sender] -= _value; - emit Transfer(_from, _to, _value); - return true; - } -} 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 {} +} From afaefbc7ea352b4f4d9b1a7dddede918e0bbaaa1 Mon Sep 17 00:00:00 2001 From: seedaltar Date: Fri, 5 Dec 2025 21:52:05 +0100 Subject: [PATCH 5/5] Implement AltarSeed Bot with commands and scheduling (#8) The project builds a symbolic and functional ecosystem where digital ownership meets spiritual meaning. SEED ALTAR focuses on long-term sustainability, traceability, and simple, verifiable tokenomics. Signed-off-by: seedaltar --- altar_bot_advanced.py | 123 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 altar_bot_advanced.py 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)