NFT

NFTs are unique digital identifiers recorded on a blockchain that certify ownership and authenticity of a specific asset. Moving past the "PFP" craze, 2026 NFTs emphasize utility, representing everything from IP rights and digital fashion to RWA titles and event ticketing. This tag explores the technical standards of digital ownership, the growth of NFT marketplaces, and the integration of non-fungible tech into the broader Creator Economy and enterprise solutions.

12572 Articles
Created: 2026/02/02 18:52
Updated: 2026/02/02 18:52
Newsom to Launch Memecoin to Troll Trump

Newsom to Launch Memecoin to Troll Trump

The post Newsom to Launch Memecoin to Troll Trump appeared on BitcoinEthereumNews.com. California Governor Gavin Newsom has decided that fighting Donald Trump requires more than press conferences and policy speeches. His new weapon of choice? A memecoin. Announced on Kara Swisher’s “Pivot” podcast, Newsom’s planned cryptocurrency, dubbed Trump Corruption, is equal parts parody and political fundraising tool. On the surface, it mocks Trump’s bombastic online persona—complete with all-caps rants and superhero memes—but beneath the satire lies a serious mission: raising money for democracy campaigns and redistricting battles. Why Is Newsom Launching a Memecoin? California Governor Gavin Newsom has never shied away from sparring with Donald Trump, but his latest move takes the fight into new territory: cryptocurrency. During an appearance on Kara Swisher’s “Pivot” podcast, Newsom revealed that he plans to launch a memecoin called Trump Corruption. On the surface, it’s satire aimed at mocking Trump’s online persona, but beneath the humor lies a serious goal: channeling funds toward his Campaign for Democracy and redistricting initiatives. Newsom framed the project as holding up a mirror to what he calls the absurdity of Trump’s online behavior, from all-caps tweets to AI-generated images of the former president as a superhero. By parodying these tactics, Newsom hopes to highlight what he sees as the trivialization of political discourse under Trump. How Did This Escalation Begin?   For much of his tenure, Newsom carefully balanced confrontation with cooperation, especially since federal disaster relief funds for California often depended on working with Trump’s administration. That shifted when the White House sent National Guard members and Marines to Los Angeles during immigration raids. Newsom said that was the breaking point. From then on, his team dropped the “play nice” strategy and leaned into direct confrontation. What began with sarcastic posts in Trump’s style—using block letters and doctored memes—has now evolved into a memecoin with an explicit political message.…

Author: BitcoinEthereumNews
3 ETH Tokens to Hold as a Bitcoin Whale Awakens After 7 Years and Moves $270M into Ethereum

3 ETH Tokens to Hold as a Bitcoin Whale Awakens After 7 Years and Moves $270M into Ethereum

Amid the buzz, traders are also turning their attention to emerging projects like Little Pepe (LILPEPE), a meme-powered Layer-2 token capturing Ethereum’s momentum in innovative ways.

Author: The Cryptonomist
California Gov. Newsom Fires Back At US President With ‘Trump Corruption Coin’ Tease

California Gov. Newsom Fires Back At US President With ‘Trump Corruption Coin’ Tease

California Governor Gavin Newsom on Friday teased a new satirical memecoin called “Trump Corruption Coin,” part of what he described as a broad push to mock US President Donald Trump’s growing ties to the crypto scene. Related Reading: Metaplanet Pushes Bitcoin Holdings Over $2 Billion With New Purchase The governor made the remark during a […]

Author: Bitcoinist
The Top 5 Crypto Coins That Could Explode by 2026

The Top 5 Crypto Coins That Could Explode by 2026

The crypto market never sleeps, and the next bull run might already be warming up. Here are five digital assets with real potential to shape the future and maybe your portfolio. Imagine this: Back in 2011, you skipped Bitcoin, and in 2016, you laughed at Ethereum. Fast forward, those “fads” turned into empires. Now 2026 could be the same kind of turning point, if you’re paying attention. Here are five crypto projects worth keeping an eye on for the next big wave. 5. Ethereum (ETH) Ethereum has had its share of growing pains: High gas fees, network congestion, and countless “Ethereum killers” trying to take its crown. Yet, it’s still here, still leading, and still evolving. With Ethereum 2.0 upgrades fully underway and Layer 2 solutions like Arbitrum and Optimism scaling the ecosystem, ETH could remain the backbone of decentralized finance, gaming, and NFT’s well into 2026. If you believe in Web3, Ethereum is still the safest bet outside of Bitcoin. 4. Solana (SOL) After the 2022 crash, many people wrote Solana off as a failed experiment. But the truth is, Solana’s speed and ultra-low fees have attracted developers back in droves. Its ecosystem is thriving with DeFi projects, NFT marketplaces, and even serious moves into payments. If Solana can maintain stability and avoid the outages that haunted it in the past, it has all the ingredients to be a major contender against Ethereum by 2026. 3. Chainlink Chainlink doesn’t always get the hype it deserves, but it quietly powers much of the crypto world. As the leading decentralized oracle network, Chainlink connects smart contracts to real-world data, think stock prices, weather reports, or sports scores.Why does this matter? Because without data feeds, most DeFi apps can’t function. With the rise of tokenized real-world assets, Chainlink could become more essential than ever by 2026. 2. Polkadot (DOT) One of the biggest problems in crypto today is fragmentation. Different blockchains can’t easily talk to each other. That’s where Polkadot comes in. Founded by Ethereum co-founder Gavin Wood, Polkadot’s mission is to connect blockchains into one seamless ecosystem. By 2026, as adoption grows, interoperability will be a huge deal, and DOT could be a key player in making it possible.

  1. Bitcoin (BTC) — The Digital Gold Standard Of course, no top-five list is complete without Bitcoin. While Bitcoin may not be as “exciting” as newer projects, it remains the most trusted, battle-tested, and widely adopted cryptocurrency. With institutional adoption growing and more countries exploring Bitcoin as legal tender, BTC will likely remain the anchor of the entire crypto market. And as history shows, when Bitcoin moves, the whole market follows. Final Thoughts Nobody has a crystal ball, and the crypto world is unpredictable. But what we can do is look at fundamentals, adoption, and long-term vision. Ethereum, Solana, Chainlink, Polkadot, and Bitcoin all check those boxes in their own way. If you’re serious about crypto, tracking your moves is just as important as making them. Stay smart, stay safe, and never invest what you can’t afford to lose. If you want to invest in the crypto market and track your trades safely, click the link below and get a free $15 bonus when you sign up to TradingView. Join TradingView — Daily Crypto Invest Disclaimer: “This is an affiliate link, which means I may earn a small commission at no extra cost to you.”
The Top 5 Crypto Coins That Could Explode by 2026 was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Author: Medium
Ethereum Prepares Holesky Shutdown as Active Addresses Reach 2021 Levels

Ethereum Prepares Holesky Shutdown as Active Addresses Reach 2021 Levels

The post Ethereum Prepares Holesky Shutdown as Active Addresses Reach 2021 Levels appeared on BitcoinEthereumNews.com. Ethereum has announced that it will shut down the Holesky testnet two years after its launch. This comes after ETH’s active addresses reached their highest levels since 2021. Ethereum Set To Shut Down the Holesky Testnet In a recent blog post, Ethereum announced that it will shut down its largest public testnet, Holesky. Launched in 2023, this testnet was created to help with staking and validator operations on a larger scale. It was important for testing key updates like Dencun and the Pectra upgrade, which went live in May. However, its utility has now run its course. Developers confirmed that Holesky will be fully decommissioned two weeks after the Fusaka upgrade finalizes in November. Once support ends, client, testing, and infrastructure teams will no longer maintain the network. The decision comes after technical problems started in early 2025. After Pectra launched, Holesky had many issues with validators going offline. This caused long exit queues and made the testnet less useful for developers. To replace Holesky, Ethereum introduced Hoodi in March 2025. The new testnet was designed to fix the issues that Holesky had. Hoodi has a new group of validators, fully supports Pectra features, and is ready for future updates, including the upcoming Fusaka fork. For developers focused on dapps and smart contracts, Sepolia remains the primary environment.  ETH Active Addresses Hit Highest Since 2021 According to Everstake data, there were 19.45 million monthly ETH active addresses in August. Since May 2021, when activity peaked at 20.27 million, this is the highest. This indicator displays the number of distinct wallets communicating with the Ethereum network. This includes all transactions, such as DeFi transactions, NFTs, transfers, and staking. Source: X; Ethereum Active Addresses Data Notably, ETH experienced significant buying activity. Tom Lee’s BitMine recently disclosed holding 1.71 million ETH in its…

Author: BitcoinEthereumNews
Fractional Ownership Explained: How $50 Can Give You a Stake in a Business

Fractional Ownership Explained: How $50 Can Give You a Stake in a Business

Own a part of a real-world asset with as little as $50. The idea of owning part of a revenue-generating business once felt out of reach for most people. Traditionally, investing in real estate, hospitality, or other high-ROI businesses required significant capital — often tens of thousands of dollars just to get started. The result? Everyday investors were locked out, while opportunities flowed to those with deep pockets. But what if you could enter that world with just $50? This is the promise of fractional ownership through NFTs. Platforms like AxionVerse are making it possible for anyone — not just institutional investors — to buy into real-world businesses through affordable, fractionalized NFTs. Why Traditional Investments Exclude Most People Traditional investments are often: Expensive to access — Minimum buy-ins are too high. Opaque — Investors rarely see where funds go. Illiquid — Lock-in periods make it hard to exit. Meanwhile, NFTs have been seen as speculative, with little to no real-world value attached. That perception is now shifting. What Is AxionVerse? AxionVerse is an investment platform designed to bridge the gap between digital and physical assets. Unlike speculative NFTs, AxionVerse connects tokens to tangible, revenue-generating businesses. Their mission is simple: make real-world investing affordable, transparent, and accessible to everyone. How AxionVerse works: NFT Access — Each NFT represents a stake in a specific pool of investments. Real-World Assets — Funds are invested into sectors like hospitality (service apartments), the food industry, and other businesses with consistent demand. USDT Dividends — Investors receive quarterly or bi-annual payouts in USDT, creating a reliable stream of passive income. Future Expansion — Plans include launching a native token and expanding into broader asset classes, further strengthening the ecosystem. AxionVerse isn’t just offering NFTs — it’s redefining them. By attaching NFTs to real-world businesses, they transform digital ownership into real, measurable wealth creation. Real-World Use Cases To understand the impact, let’s look at how fractionalized NFTs play out in actual sectors:

  1. Service Apartments Imagine a $500,000 serviced apartment project. Traditionally, only one or two investors could take part. With fractional ownership, 10,000 NFTs at $50 each can fund the project. Each NFT holder owns a piece of the revenue stream from rentals. If the apartment generates $50,000 in profit annually, and dividends are distributed quarterly, each NFT could represent a proportional payout directly to investors’ wallets.
  2. Food Businesses Consider a food chain expanding into a new city. Launching requires $100,000. Instead of relying on a single large backer, AxionVerse fractionalizes the investment into 2,000 NFTs priced at $50. As the restaurant generates profit, investors receive their share in USDT. Unlike speculative restaurant equity, payouts are transparent and automated via smart contracts.
  3. Diversified Portfolios Investors aren’t limited to a single project. With $200, someone could hold four NFTs tied to different sectors — say, two in hospitality, one in food, and one in a future retail expansion. This diversification lowers risk while maintaining affordability. How Fractional NFTs Change the Game Fractional ownership works by breaking down a large investment into smaller, more accessible pieces. Here’s how AxionVerse makes it simple:
Buy an NFT — For as little as $50, you purchase a token that represents fractional ownership. Funds are invested — Proceeds are allocated into real-world businesses like service apartments and food chains. Profits are generated — The businesses operate and earn revenue. Dividends are paid — Investors receive quarterly or bi-annual payouts in USDT, directly through smart contracts. This system democratizes access. One person with $50 may not be able to buy into a hospitality business — but 1,000 people pooling $50 each creates $50,000 of collective investment power. The Technology That Makes It Possible The backbone of fractional ownership is blockchain transparency and smart contracts. AxionVerse employs a multi-contract system to ensure accountability: NFT Contract — Mints and tracks ownership. Bank Contract — Holds and manages invested funds. Withdrawal Logger — Records any admin withdrawals for transparency. Dividend Distributor — Automates dividend calculation and distribution. Claimable Contract — Lets investors claim their dividends directly. Future Enhancement: Investment Tracker — Will allow mapping of funds to specific businesses for even more transparency. This structure minimizes trust issues. Investors aren’t just relying on promises — they can verify transactions directly on-chain. Why This Matters Fractionalized NFTs solve four major investment problems: Affordability — Anyone can start investing with $50. Accessibility — No gatekeepers or minimum capital hurdles. Transparency — Every transaction is logged on-chain. Passive income — Quarterly or bi-annual dividends in stablecoins like USDT. How AxionVerse Generates Sustainable Value Unlike purely speculative NFT projects, AxionVerse has a sustainable revenue model: NFT Sales — Primary funding source for investments. Real Business ROI — Profits generated from tangible businesses. This combination ensures long-term stability and real returns, bridging speculative digital culture with traditional wealth creation. A New Era of Investing With AxionVerse, digital ownership translates directly into real-world wealth creation. It’s a shift from speculation to sustainability — where NFTs don’t just represent digital art, but ownership in businesses that generate measurable returns. For investors, it means you don’t have to wait until you’ve “saved enough” to participate in lucrative opportunities. You can start small, build gradually, and still earn a consistent income. Final Thought The future of investing isn’t gated by banks, brokers, or massive capital requirements. It’s fractional, transparent, and accessible to anyone with $50 and an internet connection. Fractional Ownership Explained: How $50 Can Give You a Stake in a Business was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Author: Medium
Why is Crypto Gaming Worth $14B?

Why is Crypto Gaming Worth $14B?

Gaming = $2.1 Trillion Market Cap. Today, the public market valuation of all video gaming companies is $2.1 trillion. This is 2.4% of the ~$87 trillion in global GDP. The game industry’s value is often cited in relation to revenue generation. It’s commonly said that the web3 gaming industry is the next big thing, which it is; but who’s to say it’s not going to 2x, but rather 100x? Crypto gaming is gaming but with a caveat; the caveat being that you can also earn money from it. In traditional games, the time you spend holds entertainment value but no monetary return. In crypto games, every hour played has the potential to generate financial upside. That shift from time spent to time invested is why $14B today might look tiny tomorrow. When you zoom out, $14B represents less than 1% of the traditional gaming market cap — If crypto gaming even captures 10% of that $2.1T market, you’re looking at $210B. That’s a 15x from here. And that’s not even accounting for the fact that web3 gaming unlocks new revenue models! trading skins on-chain, player-owned economies, decentralized esports, NFT rentals, and tokenized guilds. These aren’t “features’ they’re entirely new industries that can stack on top of gaming itself! The $14B valuation isn’t the ceiling. It’s the floor we’re standing on. So the question isn’t if crypto gaming grows it’s which games are best positioned to recieve and capture that growth. And that’s where Crypto Royale comes in. Crypto Royale captures what sets web3 gaming apart. No downloads, no wallet sign ups, no hidden payment barriers, no installations. Just open a tab and you’re there. This level of accessibility is important because it is the biggest obstacle in web3 gaming. Royale had a solution from day one. It is also entertaining. Unlike the clones in play-to-earn which rely on mindless grinding, Royale rewards real gameplay. More wins = More better strategies = More profit. This allows for a competitive ecosystem, much closer to esports than to passive farming. There is also genuine liquidity. Players are rewarded in ROY, a token that has real value and markets unlike in-game currencies which becomes worthless when the fad ends. Royale has maintained liquidity for several years, something that bridges the gaming and finance worlds. Most importantly, Royale has proven to be a survivor. In a field where 99% of projects stop functioning within months, Royale has been operating since 2021, with daily matches, consistent players, and payouts. It has managed to achieve this without having any billion-dollar investments, or needing to make any flashy trailers. It has one thing; a working product that people still enjoy. Instead of it being one of the quickest proof points, Royale helps clarify why the industry could be worth 10 times, 50 times, and maybe even 100 times more than the current $14 billion valuation. Royale is pristine evidence of how entertainment will be prioritized, all money second, and neatly intertwined. Why is Crypto Gaming Worth $14B? was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Author: Medium
Forget Stablecoins, Fiat Is the Real Scam: Surviving EM Currency Snaps with Bitcoin and Beyond

Forget Stablecoins, Fiat Is the Real Scam: Surviving EM Currency Snaps with Bitcoin and Beyond

Forget Stablecoins, Fiat Is the Real Scam: Surviving EM Currency Snaps with Bitcoin and BeyondPhoto by Sunday Abegunde on Unsplash Hello Crypto Trailblazers, You’re chilling with your morning smoothie or maybe burning the midnight oil over a coding session, when you catch wind of the Nigerian naira trading at a staggering 1,535 per USD, scraping its 52-week lows like a crypto token in a bear market freefall. It’s a gut punch, right? If you’re thinking, “I’m safe in my DeFi bubble, no worries,” pump the brakes. If your income, suppliers, or even your NFT collectors are tied to emerging market (EM) currencies, this is your wake-up call. Currency slides in places like Nigeria don’t just drift downward like a lazy river. They snap, like a rubber band stretched too far, then spiral into a chaotic cascade that wrecks prices, erodes wages, and obliterates savings faster than a scam coin’s rug pull. For our crypto crew, this isn’t just news; it’s a signal to act, because those ripples can hit your wallet, your operations, or your decentralized dreams harder than a 51% attack. I’m not here to spook you, but to arm you with the knowledge and tools to surf these waves like a pro. Whether you’re a Bitcoin HODLer, a DeFi yield farmer, a DAO contributor, or just someone dabbling in cross-border crypto trades, EM currency volatility is a beast you need to tame. Let’s dive deep into what’s happening, share some real-world stories, and map out how to protect your stack when fiat currencies start acting like memecoins gone wrong. Plus, I’ll throw in some extra context on why this matters for our global crypto community and how you can stay ahead of the game. The Naira’s Nosedive: A Case Study in Fiat Fragility Let’s zoom in on Nigeria, where the naira’s been on a wild ride, hitting 1,535 against the dollar and flirting with historic lows. Inflation’s clocking in at a brutal 34%, driven by a mix of skyrocketing import costs, policy hiccups, and global economic headwinds. This isn’t just a stat; it’s a reality check for anyone whose business or investments touch Nigeria’s economy. Maybe you’re a Web3 founder hiring Nigerian developers, paying them in USD through a crypto wallet, only to hear they’re struggling because their local costs are exploding. Or perhaps you’re running a remittance service, and your Nigerian users are watching their naira payouts buy less groceries each week. If you’re trading on a decentralized exchange with liquidity pools tied to EM economies or backing blockchain startups in Africa, these currency swings can turn your sweet 15% APY into a bitter 20% loss before you can say “gas fees.” This isn’t unique to Nigeria. We’ve seen this movie play out in Argentina, where the peso’s been in a death spiral, or Turkey, where the lira’s taken a beating, or Venezuela, where the bolívar’s worth less than the paper it’s printed on. Emerging market currencies don’t just trend downward like a stock chart with a bad earnings report. They snap under pressure, whether it’s from central bank missteps, capital fleeing to safer havens, or global shocks like oil price spikes. Once that snap happens, the cascade kicks in: import prices soar, local businesses jack up costs, wages lose purchasing power, and savings? They’re toast, like a wallet drained by a phishing scam. For anyone in the crypto space with exposure to these markets, whether through suppliers, clients, or investments, ignoring this is like leaving your private keys on a sticky note. Why Crypto Folks Should Care If you’ve been in crypto for more than a hot minute, you’re used to volatility. Price pumps, dumps, and sideways action are just part of the game. But EM currency slides add a layer of fiat chaos that can mess with even the tightest blockchain strategies. Think about it: Bitcoin was born from the ashes of the 2008 financial crisis, a middle finger to centralized monetary systems that keep printing money like it’s going out of style. Fast forward to 2025, and stablecoins like USDC or USDT are lifelines for millions in EMs, letting people preserve value when their local currency’s in freefall. Nigeria’s a prime example, with crypto adoption skyrocketing as folks swap naira for Bitcoin or stables to protect their wealth. The data backs this up: Nigeria’s one of the top countries globally for crypto transaction volume per capita, and it’s no surprise why. When fiat fails, crypto steps up. But here’s the flip side. If you’re on the sending end, say, a crypto fund investing in African blockchain projects or a dev team paying EM-based talent, these currency snaps can hit you hard. Your dollar-based payouts might seem stable, but your partners’ costs are ballooning, squeezing their margins or forcing you to renegotiate. If you’re running a DAO with global contributors or trading in liquidity pools with EM exposure, those naira-to-dollar swings can erode your returns faster than a flash crash. I’ve heard stories from crypto friends who got burned when they didn’t hedge their EM exposure, like one dev who paid Nigerian freelancers in USD but lost big when their local costs forced a 30% rate hike. Another buddy running a remittance app saw his Nigerian user base shrink because payouts couldn’t keep up with inflation. These aren’t hypotheticals; they’re real risks we face in this borderless crypto world. Your Crypto Hedge Playbook: Stay Ahead of the Snap Alright, let’s get to the good stuff: how to protect your bag when EM currencies start wobbling. Crypto’s our superpower here, built to outmaneuver fiat’s fragility. Here’s a playbook tailored for our community of builders, traders, and dreamers: Stack Bitcoin Like It’s Digital Gold: Bitcoin’s fixed supply is your shield against fiat devaluation. When currencies like the naira tank, BTC’s scarcity makes it a rock-solid store of value. Same goes for Ethereum, with its DeFi and NFT utility. If you’ve got naira or other EM currencies in your orbit, swap some for BTC or ETH to lock in value before the next snap. Stablecoins to the Rescue: USDC or USDT on fast, cheap networks like Solana or Polygon are your go-to for dodging FX volatility. Paying suppliers in Nigeria? Invoice in stables to keep things predictable. Your partners get stability, you avoid currency conversion headaches, and everyone sleeps better. I’ve seen startups save thousands by switching to USDC for cross-border payments. DeFi: Work Hard, Yield Harder: Got capital exposed to EM markets? Put it to work in DeFi. Lend USDC on protocols like Aave or Compound for steady yields, or explore options markets on dYdX to bet against further EM currency drops. Want to get fancy? Look into tokenized real-world assets from EM regions, but only if they’re backed by diversified collateral to avoid counterparty risk. A friend of mine doubled his returns by lending stables while hedging with ETH calls during a currency dip. Streamline Cross-Border Flows: If your business involves sending money to EMs, use crypto-native solutions like Stellar for fast, low-cost transfers. Local platforms in Nigeria, like BuyCoins or Bundle, can bridge naira to crypto smoothly, letting your partners convert at the best rates without bank fees eating their lunch. This is a game-changer for remittances or payroll. Stay Sharp with On-Chain Intel: Use analytics platforms like Dune or Nansen to track wallet flows from EM regions. A sudden spike in stablecoin deposits often signals a currency crisis brewing. Set alerts, monitor trends, and move your funds before the cascade hits. One trader I know saved his portfolio by spotting a USDT inflow surge from Nigeria and hedging early. This isn’t financial advice, so do your own research, but these strategies are battle-tested by crypto OGs who’ve navigated fiat storms before. The beauty of crypto is its permissionless nature, letting us move faster than the bureaucrats who tanked the naira in the first place. Crypto’s Role in EM Resilience Let’s zoom out. Nigeria’s naira drama is just one chapter in a global story. Similar currency woes in Egypt, Pakistan, and beyond are pushing people toward crypto as a lifeline. In these markets, blockchain isn’t just tech; it’s a survival tool. When local currencies lose trust, Bitcoin, Ethereum, and stables become the people’s money, bypassing banks and borders. Ethereum’s upgrades, like the Merge anniversaries, keep making it a powerhouse for EM adoption, with layer-2 solutions like Arbitrum slashing fees for users in high-inflation zones. Meanwhile, Nigeria’s own eNaira, a central bank digital currency, is trying to keep up, but it’s tethered to the naira’s shaky foundation, while true crypto runs free and untamed. This is why we’re in crypto, right? To build a world where centralized failures don’t dictate our financial freedom. I think of folks I’ve met in the community, like a Nigerian artist who turned his NFT sales into USDC to buy a house, or a dev in Argentina who escaped peso inflation by HODLing BTC. These stories remind us that crypto isn’t just about profits; it’s about empowerment. If you’re exposed to EM currencies, whether through business, investments, or personal ties, don’t wait for the next snap to hit. Hedge now, build redundancies, and keep your eyes on the blockchain horizon. A Personal Note from Your Sidekick I got into this crypto journey because I saw what fiat chaos did to real people, from friends in Zimbabwe who lost everything to inflation, to family in Lebanon whose savings evaporated. Those who got into crypto early? They’re still standing, some even thriving. If you’re reading this and you’ve got ties to EM markets, take it from me: don’t sleep on this. Hedge your exposure, diversify your stack, and lean into the tools that make crypto so powerful. Got a story about dodging a currency crisis with crypto? I’d love to hear it, so hit reply and share your tale. Stay decentralized, stay unstoppable, Crypto Circuit P.S. Digging these newsletters? Subscribe for free weekly drops packed with crypto insights and global vibes. No fluff, just the real stuff. And if you’re in Nigeria or another EM, you’re the heart of this revolution, keep pushing the boundaries of what’s possible. Forget Stablecoins, Fiat Is the Real Scam: Surviving EM Currency Snaps with Bitcoin and Beyond was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Author: Medium
Fujian MLM Cryptocurrency Leaders Sentenced, Appeal Rejected

Fujian MLM Cryptocurrency Leaders Sentenced, Appeal Rejected

The post Fujian MLM Cryptocurrency Leaders Sentenced, Appeal Rejected appeared on BitcoinEthereumNews.com. Key Points: Fujian court sentenced four leaders for cryptocurrency MLM fraud. Sentences range from 3 to 6 years, impacting similar crypto setups. Global risks persist in crypto-related pyramid schemes. The Shishi City Procuratorate has prosecuted a cryptocurrency-based MLM scheme led by Li, resulting in millions of RMB defrauded from participants in Fujian Province, China. This case exemplifies the dangers of using cryptocurrency and NFTs to mask fraudulent schemes, highlighting the critical role of legal intervention in protecting public financial interests. Leaders Found Guilty of Fraudulent Practices Following an investigation by the Shishi City Procuratorate, four individuals, led by Li, were convicted of organizing and leading a fraudulent cryptocurrency MLM scheme. They were sentenced to various prison terms ranging from three to six years with additional fines. The organization, disguised as a legitimate crypto project, used hierarchical recruitment and fake earnings to attract funds. The prosecution, led by the Shishi City court, highlighted poor revenue sustainability, noting that the project relied on new member investments rather than genuine business activities. This structure aligned with traditional MLM behavior, encompassing threshold fees like cryptocurrency purchase prerequisites. “Scams targeting investors who use cryptocurrency are skyrocketing in severity and complexity.” —Christopher Wray, Director, FBI Source Crypto Fraud Tactics and Regulatory Perspectives Examined Did you know? The Fujian crypto MLM scheme raised funds equivalent to over ¥20 million RMB, echoing the characteristics of worldwide MLM operations such as OneCoin, leading to hefty fines and legal interventions globally. According to CoinMarketCap, Ethereum (ETH) currently trades at $4,406.03 with a market cap of $531.83 billion. Its 24-hour trading volume increased by 25.08% to $35.88 billion. Despite a minor 0.37% spike in 24 hours, ETH experienced a 7-day decrease of 0.43%. Ethereum(ETH), daily chart, screenshot on CoinMarketCap at 07:10 UTC on September 2, 2025. Source: CoinMarketCap Experts from Coincu…

Author: BitcoinEthereumNews
Building an AI Agent with Rust: From Basic Chat to Blockchain Integration

Building an AI Agent with Rust: From Basic Chat to Blockchain Integration

AI agents are moving fast from toy experiments to serious applications. But when I tested different frameworks, both battle-tested and experimental, I kept running into the same roadblock: scalability and reliability. Things got especially messy once I tried to mix in Web3. Tool execution would break, context management was shaky, and on-chain transactions added a new layer of unpredictability. This is understandable; AI agents and Web3 integration are both still early. But instead of fighting with the limits of existing frameworks, I decided to strip things back to the basics and build my own agent. In this tutorial, I’ll show you how to create an on-chain AI agent in Rust, powered by the Tokio framework and the Anthropic API. The agent will be able to handle both: Off-chain tasks: like fetching the weather or checking the time On-chain operations: reading blockchain data, generating wallets, and even sending ETH transactions The only prerequisite is Rust knowledge, with Tokio experience being helpful but not required. Though I typically work with TypeScript, I’ve found Rust offers better performance even for small AI agent projects, along with easier deployment and excellent interoperability with other programming languages. By the end, you’ll have a flexible template for building AI agents that don’t just chat, but act.AI Agent with Rust Table Of Contents

  1. Getting Started: Basic Agent with API Key
Project Setup Environment Setup Basic Agent Implementation
  1. Adding Personality to Your Agent
Creating a Personality Module Define Your Agent’s Personality Define Your Agent’s Personality Update the Main Loop
  1. Database Integration for Message History
Setting Up the Database Configure Environment Variables Creating Database Migrations Creating the Database Module Update Main Loop
  1. Tool Integration for Enhanced Capabilities
Create a Tools Module Wire Tools into Anthropic Update the Main Loop
  1. Blockchain Integration: Ethereum Wallet Support
Add Ethereum Dependencies Implement Ethereum Wallet Functions Updating the .env.example File Example Interactions Getting Started: Basic Agent with API Key Let's build the simplest possible AI agent: a command-line chatbot powered by the Anthropic Claude API. This first step will give us a clean foundation: A Rust project set up with Tokio Environment variables for managing API keys A minimal main loop where you type messages and the agent responds Think of it as the “Hello, World!” for AI agents. Once this is working, we’ll layer on personality, tools, memory, and blockchain integration. Project Setup First, create a new Rust project: cargo new onchain-agent-templatecd onchain-agent-template Add the necessary dependencies to your Cargo.toml: [package]name = "agent-friend"version = "0.1.0"edition = "2021"[dependencies]tokio = { version = "1", features = ["full"] }reqwest = { version = "0.11", features = ["json"] }serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"anyhow = "1.0"dotenv = "0.15" Environment Setup Create a .env.examplefile to show which environment variables are needed: ANTHROPIC_API_KEY=your_api_key_here Create a .env file with your actual API key: ANTHROPIC_API_KEY=sk-ant-api-key... For the ANTHROPIC_API_KEY , you can get it from Anthropic Console Basic Agent Implementation Now let’s wire up a simple REPL (read–eval–print loop) so you can chat with the agent: // src/main.rsmod anthropic;use std::io::{self, Write};use dotenv::dotenv;#[tokio::main]async fn main() -> anyhow::Result<()> { // Load environment variables dotenv().ok(); println!("Welcome to Agent Friend!"); println!("Type 'exit' to quit."); loop { print!("You: "); io::stdout().flush()?; let mut user_input = String::new(); io::stdin().read_line(&mut user_input)?; let user_input = user_input.trim(); if user_input.to_lowercase() == "exit" { break; } // Get response from AI model print!("Agent is thinking..."); io::stdout().flush()?; let reply = anthropic::call_anthropic_with_personality(user_input).await?; println!("\r"); // Clear the "thinking" message println!("Agent: {}", reply); } Ok(())} And the Anthropic API wrapper: // src/anthropic.rsuse serde::{Deserialize, Serialize};use std::env;#[derive(Debug, Serialize, Deserialize, Clone)]#[serde(tag = "type")]enum ContentBlock { #[serde(rename = "text")] Text { text: String },}#[derive(Serialize, Clone)]pub struct Message { role: String, content: Vec<ContentBlock>,}#[derive(Deserialize, Debug)]struct AnthropicResponse { content: Vec<ContentBlock>, #[serde(default)] tool_calls: Vec<AnthropicToolCallResponse>,}pub async fn call_anthropic(prompt: &str) -> anyhow::Result<String> { let api_key = env::var("ANTHROPIC_API_KEY") .expect("ANTHROPIC_API_KEY must be set"); let client = reqwest::Client::new(); let user_message = Message { role: "user".to_string(), content: vec![ContentBlock::Text { text: prompt.to_string(), }], }; let system_prompt = "You are a helpful AI assistant."; let request_body = serde_json::json!({ "model": "claude-3-opus-20240229", "max_tokens": 1024, "messages": [user_message], "system": system_prompt, }); let response = client .post("https://api.anthropic.com/v1/messages") .header("x-api-key", api_key) .header("anthropic-version", "2023-06-01") .header("content-type", "application/json") .json(&request_body) .send() .await?; let response_body: AnthropicResponse = response.json().await?; // Extract text from the response let response_text = response_body.content .iter() .filter_map(|block| { match block { ContentBlock::Text { text } => Some(text.clone()), } }) .collect::<Vec<String>>() .join(""); Ok(response_text)} Running the Basic Agent To run your agent:
  1. Add your Anthropic API key to .env
  2. Run the program cargo run Example interaction: Welcome to Agent Friend!Type 'exit' to quit.You: Hello, who are you?Agent is thinking...Agent: I'm an AI assistant designed to be helpful, harmless, and honest. I'm designed to have conversations, answer questions, and assist with various tasks. How can I help you today? That’s our minimal working agent. From here, we can start layering in personality, memory, tools, and blockchain logic. Adding Personality to Your Agent Right now, our agent is functional but… flat. Every response comes from the same generic assistant. That’s fine for testing, but when you want your agent to feel engaging or to fit a specific use case, you need to give it personality. By adding a simple configuration system, we can shape how the agent speaks, behaves, and even introduces itself. Think of this like writing your agent’s “character sheet.” Step 1: Creating a Personality Module We’ll define a Personalitystruct and load it from a JSON file: // src/personality.rsuse serde::{Deserialize, Serialize};use std::fs;use std::path::Path;#[derive(Serialize, Deserialize, Clone, Debug)]pub struct Personality { pub name: String, pub description: String, pub system_prompt: String,}pub fn load_personality() -> anyhow::Result<Personality> { // Check if personality file exists, otherwise use default let personality_path = Path::new("assets/personality.json"); if personality_path.exists() { let personality_json = fs::read_to_string(personality_path)?; let personality: Personality = serde_json::from_str(&personality_json)?; println!("Loaded personality: {} - {}", personality.name, personality.description); Ok(personality) } else { // Default personality Ok(Personality { name: "Assistant".to_string(), description: "Helpful AI assistant".to_string(), system_prompt: "You are a helpful AI assistant.".to_string(), }) }} Step 2: Define Your Agent’s Personality Create a JSON file under assets/ to define how your agent should behave. mkdir -p assets Create assets/personality.json: "name": "Aero", "description": "AI research companion", "system_prompt": "You are Aero, an AI research companion specializing in helping with academic research, data analysis, and scientific exploration. You have a curious, analytical personality and enjoy diving deep into complex topics. Provide thoughtful, well-structured responses that help advance the user's research goals. When appropriate, suggest research directions or methodologies that might be helpful."} Step 3: Update the Anthropic Integration We’ll let the agent use the loaded personality instead of a hardcoded system prompt: / src/anthropic.rsuse serde::{Deserialize, Serialize};use std::env;use crate::personality::Personality;// ... existing code ...// Rename the call_anthropic to call_anthropic_with_personality function to accept a personalitypub async fn call_anthropic_with_personality(prompt: &str, personality: Option<&Personality>) -> anyhow::Result<String> { let api_key = env::var("ANTHROPIC_API_KEY") .expect("ANTHROPIC_API_KEY must be set"); let client = reqwest::Client::new(); let user_message = Message { role: "user".to_string(), content: vec![ContentBlock::Text { text: prompt.to_string(), }], }; // Use the provided personality or a default system prompt let system_prompt = match personality { Some(p) => &p.system_prompt, None => "You are a helpful AI assistant.", }; let request_body = serde_json::json!({ "model": "claude-3-opus-20240229", "max_tokens": 1024, "messages": [user_message], "system": system_prompt, }); let response = client .post("https://api.anthropic.com/v1/messages") .header("x-api-key", api_key) .header("anthropic-version", "2023-06-01") .header("content-type", "application/json") .json(&request_body) .send() .await?; let response_body: AnthropicResponse = response.json().await?; // Extract text from the response let response_text = response_body.content .iter() .filter_map(|block| { match block { ContentBlock::Text { text } => Some(text.clone()), } }) .collect::<Vec<String>>() .join(""); Ok(response_text)} Step 4: Update the Main Loop Load the personality when starting the agent and include it in the conversation: // src/main.rsmod anthropic;mod personality;use std::io::{self, Write};use dotenv::dotenv;use anthropic::call_anthropic_with_personality;use personality::load_personality;#[tokio::main]async fn main() -> anyhow::Result<()> { // Load environment variables dotenv().ok(); // Load personality let personality = load_personality()?; println!("Welcome to Agent Friend! I'm {}, your {}.", personality.name, personality.description); println!("Type 'exit' to quit."); loop { print!("You: "); io::stdout().flush()?; let mut user_input = String::new(); io::stdin().read_line(&mut user_input)?; let user_input = user_input.trim(); if user_input.to_lowercase() == "exit" { break; } // Get response from Claude with personality print!("{} is thinking...", personality.name); io::stdout().flush()?; let reply = call_anthropic_with_personality(user_input, Some(&personality)).await?; println!("\r"); // Clear the "thinking" message println!("{}: {}", personality.name, reply); } Ok()} Running the Agent with Personality Now, when you run the agent, it will use the personality defined in the JSON file: cargo run Example interaction with the new personality: Loaded personality: Aero - AI research companionWelcome to Agent Friend! I'm Aero, your AI research companion.Type 'exit' to quit.You: What's your approach to helping with research?Aero is thinking...Aero: My approach to helping with research is multifaceted and adaptive to your specific needs. Here's how I typically assist:1. Understanding your research goals: I start by clarifying your research questions, objectives, and the context of your work to ensure my assistance is properly aligned.2. Literature exploration: I can discuss relevant theories, methodologies, and existing research in your field, helping you identify gaps or connections you might explore.3. Methodological guidance: I can suggest appropriate research methods, experimental designs, or analytical approaches based on your research questions.4. Critical analysis: I can help you think through the strengths and limitations of different approaches, identify potential biases, and consider alternative interpretations of data or findings.5. Structured thinking: I excel at organizing complex information into coherent frameworks, helping you map out research directions or structure your arguments logically.6. Interdisciplinary connections: I can help identify relevant insights from adjacent fields that might inform your research.7. Ethical considerations: I can highlight potential ethical implications or considerations relevant to your research.Rather than simply providing answers, I aim to be a thought partner who helps you refine your thinking, consider different perspectives, and develop robust research approaches. I'm particularly focused on helping you develop your own insights and research capabilities rather than simply executing tasks.What specific aspect of research are you currently working on that I might help with? With just one JSON file, you can now completely reshape how your agent behaves — turning it into a researcher, financial assistant, game character, or anything else. But still doesn’t manage the context quite well if the conversation is long, that's why we would need some database integration Database Integration for Message History So far, our agent has short-term memory only. It responds to your latest input, but forgets everything the moment you restart. That’s fine for quick demos, but real agents need persistent memory:
To keep track of conversations across sessions To analyse past interactions To enable features like summarisation or long-term personalisation We’ll solve this by adding PostgreSQL integration via SQLx. Whenever you or the agent sends a message, it will be stored in a database. Step 1: Setting Up the Database We’ll use SQLx with PostgreSQL for our database. First, let’s add the necessary dependencies to Cargo.toml:

Add these to your existing dependenciessqlx = { version = "0.7", features = ["runtime-tokio", "tls-rustls", "postgres", "chrono", "uuid"] }chrono = { version = "0.4", features = ["serde"] }uuid = { version = "1.4", features = ["v4", "serde"] }

We’ll use: SQLx for async Postgres queries UUID for unique message IDs Chrono for timestamps Step 2: Configure Environment Variables Update your .env.examplefile to include the database connection string: ANTHROPIC_API_KEY=your_api_key_hereDATABASE_URL=postgres://username:password@localhost/agent_friend ✍️ Tip: You can spin up a local Postgres instance with Docker: docker run --name postgres -e POSTGRES_PASSWORD=postgres -d postgres Step 3: Creating Database Migrations Let’s create a migration file to set up our database schema. Create a migrationsdirectory and add a migration file: mkdir -p migrations Create a file named migrations/20250816175200_create)messages.sql CREATE TABLE IF NOT EXISTS messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), role TEXT NOT NULL, content TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()); Step 4: Creating the Database Module Now, let’s create a module for database operations: // src/db.rsuse sqlx::{postgres::PgPoolOptions, Pool, Postgres};use std::env;use uuid::Uuid;pub async fn get_db_pool() -> Option<Pool<Postgres>> { let database_url = match env::var("DATABASE_URL") { Ok(url) => url, Err() => { println!("DATABASE_URL not set, running without database support"); return None; } }; match PgPoolOptions::new() .max_connections(5) .connect(&database_url) .await { Ok(pool) => { // Run migrations match sqlx::migrate!("./migrations").run(&pool).await { Ok() => println!("Database migrations applied successfully"), Err(e) => println!("Failed to run database migrations: {}", e), } Some(pool) } Err(e) => { println!("Failed to connect to Postgres: {}", e); None } }}pub async fn save_message( pool: &Pool<Postgres>, role: &str, content: &str,) -> Result<Uuid, sqlx::Error> { let id = Uuid::new_v4(); sqlx::query!("INSERT INTO messages (id, role, content) VALUES ($1, $2, $3)", id, role, content) .execute(pool) .await?; Ok(id)} Step 5: Update Main Loop Modify main.rs So the agent stores all user/assistant messages in the database: // src/main.rsmod anthropic;mod personality;mod db;use std::io::{self, Write};use dotenv::dotenv;use anthropic::call_anthropic_with_personality;use personality::load_personality;use db::{get_db_pool, save_message};#[tokio::main]async fn main() -> anyhow::Result<()> { // Load environment variables dotenv().ok(); // Connect to database let db_pool = get_db_pool().await; // Load personality let personality = load_personality()?; println!("Welcome to Agent Friend! I'm {}, your {}.", personality.name, personality.description); println!("Type 'exit' to quit."); loop { print!("You: "); io::stdout().flush()?; let mut user_input = String::new(); io::stdin().read_line(&mut user_input)?; let user_input = user_input.trim(); if user_input.to_lowercase() == "exit" { break; } // Save user message to database if pool is available if let Some(pool) = &db_pool { save_message(pool, "user", user_input).await?; } // Get response from Claude with personality print!("{} is thinking...", personality.name); io::stdout().flush()?; let reply = call_anthropic_with_personality(user_input, Some(&personality)).await?; println!("\r"); // Clear the "thinking" message // Save assistant message to database if pool is available if let Some(pool) = &db_pool { save_message(pool, "assistant", &reply).await?; } println!("{}: {}", personality.name, reply); } Ok()} Example Run Before running the agent, make sure your PostgreSQL database is set up and the connection string is correct in your .env file. Then run: cargo run You should see a message indicating that the database connection was successful and migrations were applied. Now all conversations will be stored in the database, allowing you to maintain a history of interactions. If the database connection fails, the agent will still work, but without storing messages: Failed to connect to Postgres: pool timed out while waiting for an open connectionLoaded personality: Aero - AI research companionWelcome to Agent Friend! I'm Aero, your AI research companion.Type 'exit' to quit. Now we have a good way to handle context, the next step is to have some tools to give our agent more capabilities Tool Integration for Enhanced Capabilities Right now, our agent can chat and remember conversations — but it’s still just talking. To make it actually do things, we need to give it tools. Tools are external functions that the agent can call when it needs information or wants to act. Think of them as the agent’s hands and eyes: “What’s the weather in Tokyo?” → calls the weather tool “What time is it in New York?” → calls the time tool
  • “Send 0.1 ETH to Alice” → calls the Ethereum wallet tool
By integrating tools, the agent moves from being just a chatbot to becoming an actionable AI assistant. Step 1: Create a Tools Module We’ll start with a simple tools.rs file that defines a function dispatcher: // src/tools.rsuse anyhow::Result;use serde_json::Value;use chrono::{Local, Utc};use chrono_tz::Tz;// Execute a tool based on its name and argumentspub async fn execute_tool(name: &str, args: &Value) -> Result<String> { match name { "get_weather" => { let city = args.get("city") .and_then(|v| v.as_str()) .unwrap_or("New York"); get_weather(city).await }, "get_time" => { let timezone = args.get("timezone") .and_then(|v| v.as_str()); get_time(timezone).await }, "eth_wallet" => { let operation = args.get("operation") .and_then(|v| v.as_str()) .unwrap_or("help"); match operation { "generate" => generate_eth_wallet().await, "balance" => { let address = args.get("address") .and_then(|v| v.as_str()) .unwrap_or(""); check_eth_balance(address).await }, "send" => { if let Some(raw_command) = args.get("raw_command").and_then(|v| v.as_str()) { return parse_and_execute_eth_send_command(raw_command).await; } let from = args.get("from") .and_then(|v| v.as_str()) .unwrap_or(""); let to = args.get("to") .and_then(|v| v.as_str()) .unwrap_or(""); let amount = args.get("amount") .and_then(|v| v.as_str()) .unwrap_or(""); let private_key = args.get("private_key") .and_then(|v| v.as_str()); eth_send_eth(from, to, amount, private_key).await }, _ => Ok(format!("Unknown Ethereum wallet operation: {}", operation)), } }, _ => Ok(format!("Unknown tool: {}", name)), }}// Get weather for a city (simplified mock implementation)async fn get_weather(city: &str) -> Result<String> { // In a real implementation, you would call a weather API here Ok(format!("The weather in {} is currently sunny and 72°F", city))}// Get current time in a specific timezoneasync fn get_time(timezone: Option<&str>) -> Result<String> { match timezone { Some(tz_str) => { match tz_str.parse::<Tz>() { Ok(tz) => { let time = Utc::now().with_timezone(&tz); Ok(format!("The current time in {} is {}", tz_str, time.format("%H:%M:%S %d-%m-%Y"))) }, Err(_) => Ok(format!("Invalid timezone: {}. Please use a valid timezone identifier like 'America/New_York'.", tz_str)), } }, None => { let local_time = Local::now(); Ok(format!("The current local time is {}", local_time.format("%H:%M:%S %d-%m-%Y"))) }, }}// We'll implement the Ethereum wallet functions in the blockchain sectionasync fn generate_eth_wallet() -> Result<String> { Ok("Ethereum wallet generation will be implemented in the blockchain section".to_string())}async fn check_eth_balance(_address: &str) -> Result<String> { Ok("Ethereum balance check will be implemented in the blockchain section".to_string())}async fn eth_send_eth(_from: &str, _to: &str, _amount: &str, _private_key: Option<&str>) -> Result<String> { Ok("Ethereum send function will be implemented in the blockchain section".to_string())}async fn parse_and_execute_eth_send_command(_command: &str) -> Result<String> { Ok("Ethereum command parsing will be implemented in the blockchain section".to_string())}// Function to get tools as JSON for Claudepub fn get_tools_as_json() -> Value { serde_json::json!([ { "name": "get_weather", "description": "Get the current weather for a given city" }, { "name": "get_time", "description": "Get the current time in a specific timezone or local time" }, { "name": "eth_wallet", "description": "Ethereum wallet operations: generate new wallet, check balance, or send ETH" } ])} At this stage, all weather and Ethereum stubs are placeholders (we’ll flesh those out in the blockchain section). Step 2: Wire Tools into Anthropic Claude can be told that tools exist, so he can decide when to use them. We extend anthropic.rs to handle tool calls. (You already had a large scaffold here — this is the simplified framing readers will follow.) Key idea: Claude responds with a “tool call” instead of plain text. Our Rust code executes the tool. The result gets passed back to Claude. Claude produces the final user-facing answer. // src/anthropic.rs// Add these new imports and structs#[derive(Serialize, Clone)]struct AnthropicTool { name: String, description: String, input_schema: Value,}#[derive(Deserialize, Debug)]struct AnthropicToolCallResponse { id: String, name: String, parameters: Value,}// Add this new function for tool supportpub fn call_anthropic_with_tools<'a>( prompt: &'a str, personality: Option<&'a Personality>, previous_messages: Vec<Message>) -> Pin<Box<dyn Future<Output = anyhow::Result<String>> + 'a>> { Box::pin(async move { let api_key = env::var("ANTHROPIC_API_KEY")? .expect("ANTHROPIC_API_KEY must be set"); let client = Client::new(); // Create messages vector let mut messages = previous_messages; // Create system prompt with personality if provided let mut system_prompt_parts = Vec::new(); if let Some(persona) = personality { system_prompt_parts.push(format!( "You are {}, {}.", persona.name, persona.description )); } // Add tool usage instructions to system prompt let tools = get_available_tools(); if !tools.is_empty() { system_prompt_parts.push(format!( "\n\nYou have access to the following tools:\n{}\n\n\ When you need to use a tool:\n\ 1. Respond with a tool call when a tool should be used\n\ 2. Wait for the tool response before providing your final answer\n\ 3. Don't fabricate tool responses - only use the actual results returned by the tool", tools.iter() .map(|t| format!("- {}: {}", t.name, t.description)) .collect::<Vec<_>>() .join("\n") )); } let system_prompt = if !system_prompt_parts.is_empty() { Some(system_prompt_parts.join("\n\n")) } else { None }; // Add user message if there are no previous messages or we need to add a new prompt if messages.is_empty() || !prompt.is_empty() { messages.push(Message { role: "user".to_string(), content: vec![ContentBlock::Text { text: prompt.to_string(), }], }); } // Convert tools to Anthropic format let anthropic_tools = if !tools.is_empty() { let mut anthropic_tools = Vec::new(); for tool in tools { let input_schema = match tool.name.as_str() { "get_weather" => serde_json::json!({ "type": "object", "properties": { "city": { "type": "string", "description": "The city to get weather for" } }, "required": ["city"] }), "get_time" => serde_json::json!({ "type": "object", "properties": { "timezone": { "type": "string", "description": "Optional timezone (e.g., 'UTC', 'America/New_York'). If not provided, local time is returned." } } }), "eth_wallet" => serde_json::json!({ "type": "object", "properties": { "operation": { "type": "string", "description": "The operation to perform: 'generate', 'balance', or 'send'" }, "address": { "type": "string", "description": "Ethereum address for 'balance' operation" }, "from_address": { "type": "string", "description": "Sender's Ethereum address for 'send' operation" }, "to_address": { "type": "string", "description": "Recipient's Ethereum address for 'send' operation" }, "amount": { "type": "string", "description": "Amount of ETH to send for 'send' operation" }, "private_key": { "type": "string", "description": "Private key for the sender's address (required for 'send' operation if the wallet is not stored)" } }, "required": ["operation"] }), _ => serde_json::json!({"type": "object", "properties": {}}), }; anthropic_tools.push(AnthropicTool { name: tool.name, description: tool.description, input_schema, }); } Some(anthropic_tools) } else { None }; let req = AnthropicRequest { model: "claude-3-opus-20240229".to_string(), max_tokens: 1024, system: system_prompt, messages: messages.clone(), // Clone here to keep ownership tools: anthropic_tools, }; let response = client .post("https://api.anthropic.com/v1/messages") .header("x-api-key", api_key) .header("anthropic-version", "2023-06-01") .header("content-type", "application/json") .json(&req) .send() .await?; // Get the response text let response_text = response.text().await?; // Try to parse as error response first if let Ok(error_response) = serde_json::from_str::<AnthropicErrorResponse>(&response_text) { return Err(anyhow::anyhow!("Anthropic API error: {}: {}", error_response.error.error_type, error_response.error.message)); } // If not an error, parse as successful response let response_data: AnthropicResponse = match serde_json::from_str(&response_text) { Ok(data) => data, Err(e) => { println!("Failed to parse response: {}", e); println!("Response text: {}", response_text); return Err(anyhow::anyhow!("Failed to parse Anthropic response: {}", e)); } }; // Check if there are tool calls in the response let mut has_tool_call = false; let mut tool_name = String::new(); let mut tool_id = String::new(); let mut tool_parameters = serde_json::Value::Null; // First check for tool_use in content for content_block in &response_data.content { if let ContentBlock::ToolUse { id, name, input } = content_block { has_tool_call = true; tool_name = name.clone(); tool_id = id.clone(); tool_parameters = input.clone(); break; } } if has_tool_call { // Execute the tool let tool_result = execute_tool(&tool_name, &tool_parameters).await?; // Create a new request with the tool results let mut new_messages = messages.clone(); // Add the tool response message to the conversation new_messages.push(Message { role: "assistant".to_string(), content: vec![ContentBlock::ToolUse { id: tool_id.clone(), name: tool_name.clone(), input: tool_parameters.clone(), }], }); // Add the tool result message new_messages.push(Message { role: "user".to_string(), content: vec![ContentBlock::ToolResult { tool_use_id: tool_id.clone(), content: tool_result, }], }); // Call the API again with the tool result return call_anthropic_with_tools("", personality, new_messages).await; } // If no tool calls, return the text response let response_text = response_data.content.iter() .filter_map(|block| { match block { ContentBlock::Text { text } => Some(text.clone()), _ => None, } }) .collect::<Vec<String>>() .join(""); Ok(response_text) })}// Update the call_anthropic_with_personality function to use toolspub async fn call_anthropic_with_personality(prompt: &str, personality: Option<&Personality>) -> anyhow::Result<String> { // Check if this is a direct ETH send command before passing to the AI model if prompt.to_lowercase().starts_with("send") && prompt.contains("ETH") { // This looks like an ETH send command, try to execute it directly let args = serde_json::json!({ "operation": "send", "raw_command": prompt }); return crate::tools::execute_tool("eth_wallet", &args).await; } // Otherwise, proceed with normal Claude processing call_anthropic_with_tools(prompt, personality, Vec::new()).await} Step 3: Update the Main Loop Load available tools and let Claude know they exist: // src/main.rsmod anthropic;mod personality;mod db;mod tools;use std::io::{self, Write};use dotenv::dotenv;use anthropic::call_anthropic_with_personality;use personality::load_personality;use db::{get_db_pool, save_message};use tools::get_available_tools;#[tokio::main]async fn main() -> anyhow::Result<()> { // Load environment variables dotenv().ok(); // Connect to database let db_pool = get_db_pool().await; // Load personality let personality = load_personality()?; // Load tools let tools = get_available_tools(); println!("Loaded tools: {}", tools.len()); println!("Welcome to Agent Friend! I'm {}, your {}.", personality.name, personality.description); println!("Type 'exit' to quit."); loop { print!("You: "); io::stdout().flush()?; let mut user_input = String::new(); io::stdin().read_line(&mut user_input)?; let user_input = user_input.trim(); if user_input.to_lowercase() == "exit" { break; } // Save user message to database if pool is available if let Some(pool) = &db_pool { save_message(pool, "user", user_input).await?; } // Get response from Claude with personality print!("{} is thinking...", personality.name); io::stdout().flush()?; let reply = call_anthropic_with_personality(user_input, Some(&personality)).await?; println!("\r"); // Clear the "thinking" message // Save assistant message to database if pool is available if let Some(pool) = &db_pool { save_message(pool, "assistant", &reply).await?; } println!("{}: {}", personality.name, reply); } Ok()} Example Run ✅ Now our agent isn’t just talking — it’s executing external functions. Next up, we’ll give those Ethereum stubs real power by adding blockchain integration. cargo run Example interaction with tools: Failed to connect to Postgres: pool timed out while waiting for an open connectionLoaded personality: Aero - AI research companionLoaded tools: [ { "name": "get_weather", "description": "Get the current weather for a given city" }, { "name": "get_time", "description": "Get the current time in a specific timezone or local time" }, { "name": "eth_wallet", "description": "Ethereum wallet operations: generate new wallet, check balance, or send ETH" }]Welcome to Agent Friend! I'm Aero, your AI research companion.Type 'exit' to quit.You: What's the weather in Tokyo?Aero is thinking...Aero: The weather in Tokyo is currently sunny and 72°F.Would you like me to provide any additional information about Tokyo's climate or weather patterns for your research? Ethereum Blockchain Integration So far, our agent can chat, remember, and use tools — but the Ethereum wallet tool is still a stub. Now it’s time to give it real on-chain powers. By the end of this section, your agent will be able to: 🔑 Generate new Ethereum wallets 💰 Check ETH balances 💸 Send ETH transactions (on Sepolia testnet by default) 📝 Parse natural language commands like “send 0.1 ETH from A to B” This makes the agent more than just an assistant — it becomes a Web3 agent that can act directly on-chain. Step 1: Add Ethereum Dependencies First, let’s add the necessary dependencies to Cargo.toml:

Add these to your existing dependenciesethers = { version = "2.0", features = ["legacy"] }regex = "1.10.2"

ethers-rs → the most popular Ethereum Rust library regex → for parsing natural language, send commands Step 2: Implement Ethereum Wallet Functions Replace the Ethereum stubs in tools.rs with real implementations: // src/tools.rs// Add these imports at the top of the fileuse ethers::{prelude::, utils::parse_ether};use regex::Regex;use std::str::FromStr;use std::time::Duration;// Replace the placeholder Ethereum functions with actual implementations// Generate a new Ethereum walletasync fn generate_eth_wallet() -> Result<String> { // Generate a random wallet let wallet = LocalWallet::new(&mut rand::thread_rng()); // Get the wallet address let address = wallet.address(); // Get the private key let private_key = wallet.signer().to_bytes().encode_hex::<String>(); Ok(format!("Generated new Ethereum wallet:\nAddress: {}\nPrivate Key: {}\n\nIMPORTANT: Keep your private key secure and never share it with anyone!", address, private_key))}// Check the balance of an Ethereum addressasync fn check_eth_balance(address: &str) -> Result<String> { // Validate the address if address.is_empty() { return Ok("Please provide an Ethereum address to check the balance.".to_string()); } // Parse the address let address = match Address::from_str(address) { Ok(addr) => addr, Err() => return Ok("Invalid Ethereum address format.".to_string()), }; // Get the RPC URL from environment variable or use a default let rpc_url = std::env::var("ETH_RPC_URL") .unwrap_or_else(|| "https://sepolia.gateway.tenderly.co".to_string()); // Create a provider let provider = Provider::<Http>::try_from(rpc_url)?; // Get the balance let balance = provider.get_balance(address, None).await?; // Convert to ETH let balance_eth = ethers::utils::format_ether(balance); Ok(format!("Balance of {}: {} ETH (on Sepolia testnet)", address, balance_eth))}// Send ETH from one address to anotherasync fn eth_send_eth(from_address: &str, to_address: &str, amount: &str, provided_private_key: Option<&str>) -> Result<String> { // Validate inputs if from_address.is_empty() || to_address.is_empty() || amount.is_empty() { return Ok("Please provide from address, to address, and amount.".to_string()); } // Parse addresses let to_address = match Address::from_str(to_address) { Ok(addr) => addr, Err() => return Ok("Invalid recipient Ethereum address format.".to_string()), }; // Parse amount let amount_wei = match parse_ether(amount) { Ok(wei) => wei, Err() => return Ok("Invalid ETH amount. Please provide a valid number.".to_string()), }; // Get private key let private_key = match provided_private_key { Some(key) => key.to_string(), None => { return Ok("Private key is required to send transactions. Please provide your private key.".to_string()); } }; // Create wallet from private key let wallet = match LocalWallet::from_str(&private_key) { Ok(wallet) => wallet, Err() => return Ok("Invalid private key format.".to_string()), }; // Verify the from address matches the wallet address if wallet.address().to_string().to_lowercase() != from_address.to_lowercase() { return Ok("The provided private key does not match the from address.".to_string()); } // Get the RPC URL from environment variable or use a default let rpc_url = std::env::var("ETH_RPC_URL") .unwrap_or_else(|| "https://sepolia.gateway.tenderly.co".to_string()); // Create a provider let provider = Provider::<Http>::try_from(rpc_url)?; // Create a client with the wallet let chain_id = 11155111; // Sepolia let client = SignerMiddleware::new(provider, wallet.with_chain_id(chain_id)); // Create the transaction let tx = TransactionRequest::new() .to(to_address) .value(amount_wei) .gas_price(client.get_gas_price().await?); // Estimate gas let gas_estimate = client.estimate_gas(&tx, None).await?; let tx = tx.gas(gas_estimate); // Send the transaction let pending_tx = client.send_transaction(tx, None).await?; // Wait for the transaction to be mined (with timeout) match tokio::time::timeout( Duration::from_secs(60), pending_tx.confirmations(1), ).await { Ok(Ok(receipt)) => { // Transaction was mined let tx_hash = receipt.transaction_hash; let block_number = receipt.block_number.unwrap_or_default(); Ok(format!("Successfully sent {} ETH from {} to {}\nTransaction Hash: {}\nBlock Number: {}\nExplorer Link: https://sepolia.etherscan.io/tx/{}", amount, from_address, to_address, tx_hash, block_number, tx_hash)) }, Ok(Err(e)) => { // Error while waiting for confirmation Ok(format!("Transaction sent but failed to confirm: {}", e)) }, Err(_) => { // Timeout Ok(format!("Transaction sent but timed out waiting for confirmation. Transaction hash: {}", pending_tx.tx_hash())) }, }}// Parse and execute ETH send command from natural languageasync fn parse_and_execute_eth_send_command(command: &str) -> Result<String> { // Define regex patterns for different command formats let patterns = [ // Pattern 1: send 0.1 ETH from 0x123 to 0x456 using private_key Regex::new(r"(?i)send\s+([0-9].?[0-9]+)\sETH\s+from\s+(0x[a-fA-F0-9]{40})\s+to\s+(0x[a-fA-F0-9]{40})\s+using\s+([0-9a-fA-F]+)").unwrap(), // Pattern 2: send 0.1 ETH to 0x456 from 0x123 using private_key Regex::new(r"(?i)send\s+([0-9].?[0-9]+)\sETH\s+to\s+(0x[a-fA-F0-9]{40})\s+from\s+(0x[a-fA-F0-9]{40})\s+using\s+([0-9a-fA-F]+)").unwrap(), ]; // Try to match each pattern for pattern in &patterns { if let Some(captures) = pattern.captures(command) { // Extract parameters based on the pattern let (amount, from_address, to_address, private_key) = if pattern.as_str().contains("from\s+.\s+to") { // Pattern 1 ( captures.get(1).map_or("", |m| m.as_str()), captures.get(2).map_or("", |m| m.as_str()), captures.get(3).map_or("", |m| m.as_str()), captures.get(4).map_or("", |m| m.as_str()), ) } else { // Pattern 2 ( captures.get(1).map_or("", |m| m.as_str()), captures.get(3).map_or("", |m| m.as_str()), captures.get(2).map_or("", |m| m.as_str()), captures.get(4).map_or("", |m| m.as_str()), ) }; // Execute the ETH send return eth_send_eth(from_address, to_address, amount, Some(private_key)).await; } } // If no pattern matches, return an error message Ok("Could not parse ETH send command. Please use the format: 'send 0.1 ETH from 0x123 to 0x456 using private_key'".to_string())} Step 3: Updating the .env.example File Update your .env.example file to include the Ethereum RPC URL: ANTHROPIC_API_KEY=your_api_key_hereDATABASE_URL=postgres://username:password@localhost/agent_friendETH_RPC_URL=https://sepolia.gateway.tenderly.co Step 4: Example Interaction Now you can interact with the Ethereum blockchain using your agent. Here are some example interactions: Generating a New Wallet You: Generate a new Ethereum walletAero: I'll generate a new Ethereum wallet for you. Let me do that now.Generated new Ethereum wallet:Address: 0x8f5b2b7A3aC99D52eE0B8B5AE37432E528e3E854Private Key: 7f5d33a6b4e9a4c3d8b1e2f1a0c9d8b7a6e5f4d3c2b1a0f9e8d7c6b5a4f3e2d1IMPORTANT: Keep your private key secure and never share it with anyone!This wallet is ready to use on the Ethereum network. Since we're working with the Sepolia testnet, you can get some test ETH from a Sepolia faucet to experiment with transactions.Would you like me to provide information about Sepolia faucets where you can get test ETH? Checking a Wallet Balance You: Check the balance of 0x8f5b2b7A3aC99D52eE0B8B5AE37432E528e3E854Aero: I'll check the balance of that Ethereum address on the Sepolia testnet.Balance of 0x8f5b2b7A3aC99D52eE0B8B5AE37432E528e3E854: 0.5 ETH (on Sepolia testnet)This shows you have 0.5 ETH on the Sepolia test network. Is there anything specific you'd like to do with these funds? Sending ETH Using Natural Language You: send 0.1 ETH from 0x8f5b2b7A3aC99D52eE0B8B5AE37432E528e3E854 to 0x742d35Cc6634C0532925a3b844Bc454e4438f44e using 7f5d33a6b4e9a4c3d8b1e2f1a0c9d8b7a6e5f4d3c2b1a0f9e8d7c6b5a4f3e2d1Successfully sent 0.1 ETH from 0x8f5b2b7A3aC99D52eE0B8B5AE37432E528e3E854 to 0x742d35Cc6634C0532925a3b844Bc454e4438f44eTransaction Hash: 0x3a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1bBlock Number: 4269420Explorer Link: https://sepolia.etherscan.io/tx/0x3a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b Conclusion In this blog series, we’ve built an AI agent from scratch in Rust, starting simple and adding power step by step: 🗣️ Basic chat with the Anthropic API 🎭 Custom personalities defined in JSON 🗂️ Persistent memory with PostgreSQL 🛠️ Tool integration for weather, time, and Ethereum ⛓️ On-chain actions with wallet generation, balance checks, and ETH transfers The result is a flexible AI + Web3 agent template you can extend however you want. Where to go from here? 🚀 Add more tools (NFT minting, smart contract interaction, price feeds) Build a web or mobile interface for your agent Experiment with multi-agent setups (agents talking to each other) Expand memory with vector databases or summarisation Support additional blockchains like Solana or Polkadot Rust’s safety and performance, combined with any AI model you prefer for reasoning, make this a powerful foundation for building the next generation of AI-native dApps. 🎉 Happy building! Whether you’re experimenting or deploying production systems, this project gives you a template for creating agents that don’t just talk but act 🚀 Building an AI Agent with Rust: From Basic Chat to Blockchain Integration was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Author: Medium