Date: January 8, 2026
Project: Spritz Chat
Issue: tokenInfo.sub returns different value on each login
Workshop Duration: 10 minutes
This tutorial walks through the Ampersend TypeScript SDK for integrating x402 payment capabilities into MCP (Model Context Protocol) applications. The x402 protocol extends HTTP with a standard way for servers to request payment before providing resources, using the 402 "Payment Required" status code. By the end of this tutorial, you'll understand how to build MCP clients that can pay for tools, MCP servers that charge for tools, and proxy servers that add payments to existing MCP infrastructure.
Workshop Duration: 10 minutes
This tutorial walks through the Ampersend Python SDK for integrating x402 payment capabilities into A2A (Agent-to-Agent) applications. The x402 protocol extends HTTP with a standard way for servers to request payment before providing resources, using the 402 "Payment Required" status code. By the end of this tutorial, you'll understand how to build both buyer (client) and seller (server) agents that can exchange micropayments for AI services.
| import * as dotenv from "dotenv"; | |
| dotenv.config(); | |
| import { ethers, Wallet } from "ethers"; | |
| import { config } from "hardhat"; | |
| import password from "@inquirer/password"; | |
| import { input, confirm, select } from "@inquirer/prompts"; | |
| interface AccountInfo { | |
| address: string; | |
| wallet: Wallet; |
| // SPDX-License-Identifier: MIT | |
| pragma solidity ^0.8.27; | |
| import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; | |
| import "./MentorNFT.sol"; |
| // SPDX-License-Identifier: MIT | |
| pragma solidity ^0.8.27; | |
| import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; | |
| import "@openzeppelin/contracts/security/Pausable.sol"; | |
| import "@openzeppelin/contracts/access/AccessControl.sol"; | |
| import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; | |
| // --- Custom Errors --- | |
| error MentorNFT_ZeroAddressOwner(); |
Welcome to the most exciting DeFi adventure! π Get ready to dive into the world of stablecoins, yield farming, and automated market making!
| // SPDX-License-Identifier: MIT | |
| pragma solidity ^0.8.27; | |
| import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; | |
| import "@openzeppelin/contracts/access/Ownable.sol"; | |
| import "@openzeppelin/contracts/security/Pausable.sol"; | |
| import "@openzeppelin/contracts/access/AccessControl.sol"; | |
| import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; | |
| // --- Custom Errors --- |
| // SPDX-License-Identifier: MIT | |
| pragma solidity ^0.8.27; | |
| import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; | |
| import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; | |
| import "./MentorNFT.sol"; |