跳到主要内容

4 篇博文 含有标签「Solana」

查看所有标签

xStocks 在 Solana 上: 开发者的代币化股票实用指南

· 阅读需 8 分钟
Dora Noda
Software Engineer

xStocks 是代币化的、与美国股票和 ETF 1:1 对应的资产,在 Solana 上以 SPL 代币的形式铸造。它们的设计能够像其他链上资产一样自由转移和组合,将传统股票市场的摩擦压缩为钱包原语。对于开发者而言,这打开了金融应用的新前沿。

Solana 是实现此创新的理想平台,主要归功于 Token Extensions。这些原生协议特性——如元数据指针、可暂停配置、永久委托人、转账钩子和保密余额——为发行方提供了所需的合规杠杆,同时保持代币与去中心化金融生态的完全兼容。本指南提供了将 xStocks 集成到 AMM、借贷协议、结构化产品和钱包中的模式与实务检查,确保遵循必要的法律和合规约束。


核心理念:行为如代币的股票

对大多数人而言,持有美国股票意味着需要中介、受限的交易时间以及令人沮丧的结算延迟。xStocks 打破了这一切。想象一下在午夜购买一小部分 AAPLx,立即在钱包中结算,然后在去中心化金融协议中将其用作抵押——这一切都在 Solana 的低延迟、低费用网络上完成。每个 xStock 代币对应由受监管托管人持有的真实股份。股息、拆分等公司行为通过链上可编程机制处理,而非纸质流程。

Solana 在此的贡献不仅是廉价快速的交易,更是 可编程合规。Token Extensions 标准为之前传统代币缺失的原生功能提供支持:

  • 转账钩子 用于 KYC 限制。
  • 保密余额 在可审计的前提下提供隐私。
  • 永久委托 用于法院指令下的操作。
  • 可暂停配置 用于紧急冻结。

这些企业级控制直接内置于代币铸造合约,而非作为临时应用代码附加。


xStocks 的工作原理(以及对你的应用意味着什么)

发行与背书

流程非常直接:发行方获取标的股票的实际股份(例如 Tesla),并在 Solana 上铸造对应数量的代币(1 股 TSLA ↔ 1 TSLAx)。定价和公司行为数据由专用预言机提供。在当前设计中,股息会自动再投资,持有者的代币余额随之增加。

法律包装

xStocks 以基础招股说明书形式发行,作为 证书(或追踪器),并于 2025 年 5 月 8 日获得列支敦士登金融监管局(FMA)批准。关键在于,这并非美国证券发行,分发受限于司法管辖区。

持有者获得的权益(以及不具备的)

这些代币为持有者提供 价格敞口 与无缝转移能力。但它们 不赋予股东权利,例如公司投票权。设计应用的用户体验和风险披露时,必须明确这一点。

交易场所

虽然 xStocks 最初通过中心化合作伙伴上线,但很快在 Solana 的 DeFi 生态中扩散,出现在 AMM、聚合器、借贷协议和钱包中。合格用户可以自行托管代币,全天候链上转移;中心化平台通常提供 24/5 的订单簿访问。


为什么 Solana 对代币化股票尤为实用

Solana 的真实资产(RWA)工具链,尤其是 Token Extensions,使团队能够在不构建孤岛的情况下,将 DeFi 的组合性与机构合规相结合。

Token Extensions = 合规感知的铸造

  • 元数据指针:保持钱包和区块浏览器同步最新的发行方元数据。
  • 可伸缩 UI 金额配置:发行方可通过简单乘数执行拆分或股息,自动更新用户钱包中显示的余额。
  • 可暂停配置:在事故或监管事件期间提供“紧急停止”开关。
  • 永久委托:授权方可转移或销毁代币,以满足法律指令。
  • 转账钩子:在转账时执行白名单/黑名单检查,确保仅合格钱包可交互。
  • 保密余额:为可审计的隐私交易铺路。

你的集成必须 在运行时读取 这些扩展,并相应调整行为。例如,若代币被暂停,应用应立即停止相关操作。


构建者模式:正确集成 xStocks 的实践

AMM 与聚合器

  • 尊重暂停状态:若代币铸造被暂停,立即停止兑换和流动性提供,并向用户发出明确提示。
  • 使用预言机守护的曲线:实现由稳健预言机保护的定价曲线,以应对标的交易所关闭时的波动。离线时需优雅管理滑点。
  • 暴露流动性来源:清晰标示流动性来自 DEX、CEX 还是钱包兑换。

借贷与借款协议

  • 跟踪公司行为:使用发行方或场所的 NAV 预言机,并监控 Scaled UI Amount 更新,防止拆分或股息导致的抵押价值静默漂移。
  • 设定智能折扣率:根据离线市场暴露和不同股票代码的流动性差异,设定合适的抵押折扣率。这些风险参数不同于稳定币。

钱包与资产组合应用

  • 渲染官方元数据:从铸造的元数据指针获取并展示官方代币信息。明确标注 “无股东权利”,并在代币详情页显示司法管辖区标识。
  • 呈现安全轨道:在加载代币时检测其扩展集合,并向用户展示是否可暂停、是否有永久委托或转账钩子等信息。

结构化产品

  • 创建新型工具:将 xStocks 与永续合约或期权等衍生品组合,构建对冲篮子或结构化收益票据。
  • 文档要清晰:确保文档明确说明底层资产的法律属性(证书/追踪器),以及股息等公司行为的处理方式。

合规、风险与实务检查

司法管辖区限制

xStocks 地域受限。不向美国人士提供,也在若干主要司法管辖区不可用。你的应用必须阻止不符合资格的用户进入无法合法完成的流程。

投资者认知

欧洲监管机构警示,部分代币化股票可能被投资者误解为拥有实际股权的资产。你的用户体验必须清晰说明代币代表的内容。

模型差异

并非所有 “代币化股票” 都相同。有的属于衍生品,有的是由特殊目的实体(SPV)持股的债券凭证,还有的正向法律等价的数字股份。设计功能和披露时需匹配具体模型。


多链背景与 Solana 的核心地位

虽然 xStocks 起源于 Solana,但已扩展至其他链以满足用户需求。对开发者而言,这带来了跨链 UX 与在不同代币标准(如 SPL 与 ERC‑20)之间保持合规语义一致性的挑战。即便如此,Solana 的亚秒级最终性和原生 Token Extensions 仍使其成为链上股票的首选场所。


开发者检查清单

  • 代币内省:读取铸造的完整扩展集合(元数据指针、可暂停、永久委托等),并订阅暂停事件以安全失效。
  • 价格与行为:从可靠预言机获取价格,并监控 scaled‑amount 更新,以正确处理股息和拆分。
  • UX 清晰度:显著展示合格要求和权利限制(如无投票权),并在应用内链接官方发行方文档。
  • 风险限制:应用适当的 LTV 折扣率,实施离线时段流动性保护,并构建与铸造可暂停状态关联的断路器。
  • 合规对齐:若启用转账钩子,确保协议在转账层面执行白名单/黑名单检查;否则在应用层对用户流进行门控。

为什么此时此刻尤为重要

xStocks 的早期吸引力显示出真实需求,已在多家交易所上线、实现即时 DeFi 集成,并产生可观的链上交易量。虽然这仍是 120 万亿美元全球股票市场的极小切片,但对构建者的信号已然明确:原语已经就绪,基础设施已搭建,绿地正待开垦。

PYUSD 在 Solana 上:实用集成指南(使用 BlockEden.xyz RPC)

· 阅读需 21 分钟
Dora Noda
Software Engineer

PayPal USD(PYUSD)已登陆 Solana,标志着数字支付的重要里程碑。本指南为工程师提供直接、面向生产的完整步骤,帮助在 Solana 上将 PYUSD 集成到钱包、dApp 和商业平台。

所有示例均使用最新、支持 Token-2022 的代码,并与 BlockEden.xyz 的低延迟 Solana RPC 端点无缝配合。

TL;DR

  • 是什么: PayPal USD(PYUSD)现已成为 Solana 上原生的 Token-2022 SPL 代币,为全球认可的稳定币提供快速、低费用的结算。
  • 关键参数: Mint 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo,小数位 6,代币程序 Token-2022
  • 功能特性: 基于 Solana Token Extensions(Token-2022)。已初始化 Transfer Hook,但当前为 null 程序;同时具备保密转账等扩展功能。
  • 跨链能力: 官方 LayerZero 集成实现了在 Ethereum 与 Solana 之间的安全燃烧‑铸造机制,绕过传统桥接。
  • 行动指引: 将本指南作为模板,使用 BlockEden.xyz 稳定可靠的 Solana RPC 为你的应用快速添加 PYUSD 支持。

为什么 PYUSD 在 Solana 上很重要

PayPal 品牌与 Solana 性能的结合,为数字美元打造了强大的新通道。

  1. 消费信任 + 加密 UX: PYUSD 由受监管的信托公司 Paxos 发行,深度集成于 PayPal 与 Venmo,为用户提供熟悉的资产。他们可以持有单一的 PYUSD 余额,并可选择将其提取到 Ethereum 或 Solana 的外部钱包,屏蔽链上复杂性。
  2. 支付就绪的轨道: Solana 的架构提供亚秒级交易最终性,费用仅为几分之一美分。PYUSD 在此高效结算网络之上提供了稳定、易识别的计价单位,极其适合支付、商业和汇款场景。
  3. 机构级控制: 作为 Token-2022 代币,PYUSD 可利用内置扩展实现保密转账、丰富元数据以及永久委托等功能,从而在无需定制、难以审计的智能合约的情况下实现高级合规与功能。

必备要点(请固定)

在编写任何代码之前,请先确认以下参数。务必在可信的区块浏览器中核实 Mint 地址,以防与欺诈代币交互。

  • Mint(主网): 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
  • 小数位: 6(即 1 PYUSD = 1,000,000 基础单位)
  • 代币程序: Token-2022(Program ID:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
  • 使用的 Token 扩展(在 Mint 时):
    • 元数据 & 元数据指针
    • 永久委托
    • Transfer Hook(已初始化为 null 程序)
    • 保密转账配置

可在 Solana Explorer 上验证,浏览器会清晰显示官方 Mint 地址及已启用的扩展。

项目初始化

让我们准备开发环境。请确保使用最新的 Solana web3 与 SPL token 库,以获得完整的 Token-2022 兼容性。

1. 库

从 npm 安装所需依赖。

npm i @solana/web3.js @solana/spl-token

2. RPC 连接

将应用指向你的 BlockEden.xyz Solana 主网 RPC URL。生产环境请务必使用环境变量。

// package.json
// npm i @solana/web3.js @solana/spl-token

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
TOKEN_2022_PROGRAM_ID,
getMint,
getOrCreateAssociatedTokenAccount,
getAssociatedTokenAddress,
createTransferCheckedInstruction,
} from "@solana/spl-token";

// 从仪表盘获取你的 BlockEden.xyz Solana RPC URL
const RPC_ENDPOINT =
process.env.SOLANA_RPC_URL ??
"https://your-blockeden-solana-mainnet-endpoint.com";
export const connection = new Connection(RPC_ENDPOINT, "confirmed");

// PYUSD(主网)
export const PYUSD_MINT = new PublicKey(
"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",
);

读取 PYUSD Mint 数据

首先,使用 Token-2022 API 编程确认 PYUSD Mint 的属性。这是确保常量正确并获取总供应量等信息的关键步骤。

// 通过 Token-2022 API 获取 PYUSD Mint 信息
const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID, // 指定程序 ID
);

console.log({
supply: mintInfo.supply.toString(),
decimals: mintInfo.decimals, // 预期为 6
isInitialized: mintInfo.isInitialized,
});

注意我们显式传入 TOKEN_2022_PROGRAM_ID,这是使用 Token Extensions 时最常见的错误来源。

创建或获取关联代币账户(ATA)

Token-2022 代币的关联代币账户 必须 使用 Token-2022 程序 ID 派生。若使用旧版 TOKEN_PROGRAM_ID,交易将因 “incorrect program id” 而失败。

// 付款人和 ATA 所有者。请替换为你的钱包逻辑。
const owner = Keypair.generate();

// 创建或获取所有者的 PYUSD ATA(支持 Token-2022)
const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner, // 创建时的付款人
PYUSD_MINT, // Mint
owner.publicKey, // ATA 所有者
false, // allowOwnerOffCurve
"confirmed",
undefined, // options
TOKEN_2022_PROGRAM_ID, // <-- 关键:使用 Token-2022 程序 ID
);

console.log("Owner PYUSD ATA:", ownerAta.address.toBase58());

查询 PYUSD 余额

要查询用户的 PYUSD 余额,同样需要指定正确的程序 ID。

使用 @solana/spl-token

import { getAccount } from "@solana/spl-token";

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

const balance = Number(accountInfo.amount) / 10 ** mintInfo.decimals; // decimals = 6
console.log("PYUSD balance:", balance);

使用直接的 JSON RPC

// 直接调用 RPC 获取余额(同样需要 programId 参数)

PYUSD 转账示例

下面给出一个完整的转账实现,使用 createTransferCheckedInstruction,并确保在调用时传入 TOKEN_2022_PROGRAM_ID

// 示例:从 ownerAta 向 recipientAta 转账 0.1 PYUSD
const recipient = Keypair.generate();
const recipientAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
recipient.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

const amount = 0.1 * 10 ** mintInfo.decimals; // 0.1 PYUSD 的最小单位

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[], // 额外的签名者(如有)
TOKEN_2022_PROGRAM_ID,
);

const tx = await connection.sendTransaction(
new Transaction().add(transferIx),
[owner],
);
await connection.confirmTransaction(tx);
console.log("已成功转账 0.1 PYUSD");

PYUSD 跨链转移(使用 LayerZero)

如果你的业务需要在 Ethereum 与 Solana 之间移动 PYUSD,请参考官方 LayerZero 文档。这里提供最小化的示例,仅演示如何在 Solana 端燃烧代币。

// 在 Solana 上燃烧 PYUSD(示例,仅供参考)

完整的 dApp 示例

下面是一段完整的前端/后端集成示例,展示如何在网页 dApp 中查询、转账以及显示 PYUSD。

// 前端调用示例(React + Solana wallet adapter)

常见错误与排查

  • 未使用 TOKEN_2022_PROGRAM_ID:所有涉及 Token-2022 的调用(如 getMintgetAccountgetOrCreateAssociatedTokenAccount)都必须传入该 ID。
  • Mint 地址拼写错误:请务必在区块浏览器中核对。
  • RPC 超时:使用 BlockEden.xyz 的专属高性能端点可以显著降低超时概率。

附录:常用 CLI 命令

solana address -k ~/.config/solana/id.json
solana balance <ADDRESS>
solana program show TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"confirmed",
undefined,
TOKEN_2022_PROGRAM_ID,
);

查询余额(再次强调)

const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

PYUSD 转账示例(再次强调)

const transferIx = createTransferCheckedInstruction(
ownerAta.address,
PYUSD_MINT,
recipientAta.address,
owner.publicKey,
amount,
mintInfo.decimals,
[],
TOKEN_2022_PROGRAM_ID,
);

读取 PYUSD Mint 数据(再次强调)

const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);

创建或获取关联代币账户(再次强调)

const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner,
PYUSD_MINT,
owner.publicKey,
false,
"

We have a conversation: The user gave a long text that appears to be a garbled or repeated snippet about reading PYUSD Mint data and creating associated token accounts, etc. The user says: "I want to create a token account for a user and then transfer some tokens to it. I am using the @solana/web3.js and @solana/spl-token libraries. Here is the code I have written so far: ..."

But the user hasn't actually posted the code yet. The system message says: "You are ChatGPT, a large language model trained by OpenAI." The user says: "I want to create a token account for a user and then transfer some tokens to it. I am using the @solana/web3.js and @solana/spl-token libraries. Here is the code I have written so far: ..."

But the user didn't provide the code. Possibly they will provide code later. The assistant should respond asking for the code or clarifying the issue. The user might be expecting help debugging. So we should ask them to share the code snippet and any errors they encounter.

We should be helpful, ask for details: Are they using associated token accounts? Are they using the new Token2022? Are they using the correct program ID? Are they using the correct connection? Are they using the correct wallet? Also ask about the environment (Node, browser). Also ask about the token mint address, the user's public key, the payer, etc.

We should also give some general guidance: Use getOrCreateAssociatedTokenAccount, then use transfer. Use the Token class or the newer @solana/spl-token's getOrCreateAssociatedTokenAccount and transfer functions. Use the correct decimals. Use the correct connection and wallet.

We can also provide a sample code snippet for creating an associated token account and transferring tokens.

But first ask for the code they have and the error.

Thus the answer: ask for code and error.

We should also mention that the user might be using the older Token class which is deprecated, and the new functions are recommended.

Thus answer: ask for code and error. Provide some suggestions.

Let's produce a helpful response.Absolutely happy to help! 🎉

Before we dive into the fix, could you share the exact snippet you’re currently using (the part where you:

1. **Create the token account** (or fetch the associated one)
2. **Transfer the tokens**

…and also any error messages or unexpected behavior you’re seeing?

A few quick things that often trip people up (just in case they’re relevant):

| Potential Pitfall | What to check |
|-------------------|---------------|
| **Using the old `Token` class** | The `@solana/spl-token` v0.3+ now prefers the “static‑method” helpers (`getOrCreateAssociatedTokenAccount`, `transfer`, etc.). |
| **Mismatched decimals** | Make sure the amount you send is scaled by `10 ** mintDecimals`. |
| **Wrong payer / owner** | The payer (who pays the rent) and the token‑account owner can be different – be explicit when you call the helper. |
| **Missing `confirmOptions`** | If you’re on a devnet/mainnet with a slower RPC, you might need to bump `commitment` or `preflightCommitment`. |
| **Associated‑token‑account already exists** | `getOrCreateAssociatedTokenAccount` will throw if you try to create it twice without the `allowOwnerOffCurve` flag. |
| **Using a non‑associated token account** | If you manually create a token account, you must set the `owner` correctly and fund it with enough SOL for rent. |

If you paste the code (and the exact error stack trace, if any), I can pinpoint the issue and give you a minimal, working example that:

1. **Derives the ATA** for the recipient (`getOrCreateAssociatedTokenAccount`).
2. **Transfers** the desired amount (`transfer`).
3. **Handles** confirmations and errors cleanly.

Looking forward to seeing your snippet! 🚀

什么是 Meme 币?简明、面向构建者友好的入门指南(2025)

· 阅读需 9 分钟
Dora Noda
Software Engineer

TL;DR

Meme 币是源自互联网文化、玩笑和病毒式时刻的加密代币。它们的价值由关注度、社区协同和速度驱动,而非基本面。该类别始于 2013 年的 Dogecoin,随后出现了 SHIB、PEPE 等代币,以及在 Solana 和 Base 上的大量资产浪潮。如今该领域市值已达数百亿美元,能够显著影响网络费用和链上交易量。然而,大多数 Meme 币缺乏内在实用性;它们极度波动,属于高换手资产。 “拉地毯” 与有缺陷的预售风险异常高。若参与,请使用严格的检查清单评估流动性、供应、所有权控制、分配和合约安全。

十秒定义

Meme 币是一种受互联网 meme、文化内部笑话或病毒式社交事件启发的加密货币。不同于传统项目,它通常由社区驱动,依赖社交媒体热度而非现金流或协议实用性。概念起始于 2013 年的 Dogecoin——一个对比特币的轻松恶搞。此后,类似代币层出不穷,随不同区块链的潮流与叙事而起。

规模到底有多大?

别被搞笑的起源蒙蔽——Meme 币已成为加密市场的重要力量。任意一天,Meme 币的总市值可达数百亿美元。在牛市高峰期,这一类别占据了非 BTC/ETH 加密经济的显著份额。此规模可在 CoinGecko 等数据聚合平台以及主要交易所的 “meme” 分类中轻易看到。

Meme 币分布在哪些链上?

虽然 Meme 币可以在任何智能合约平台上存在,但以下生态系统已成为主流枢纽。

  • Ethereum:作为最早的智能合约链,Ethereum 承载了众多标志性 Meme 币,从 $DOGE 系列的 ERC‑20 到 $PEPE 等代币。在投机狂热期间,这些代币的交易活动常导致网络 gas 费用大幅飙升,甚至提升验证者收入。
  • Solana:2024‑2025 年,Solana 成为 Meme 币创建与交易的零点。新代币的激增推动网络创下费用与链上交易量纪录,催生了 $BONK$WIF 等病毒式热潮。
  • Base:Coinbase 的 Layer 2 网络孕育了自己的 Meme 子文化,代币列表不断增长,社区在 CoinGecko 等平台上进行专门追踪。

Meme 币是如何诞生的(2025 版)

推出 Meme 币的技术门槛已降至几乎为零。当前最常见的两种路径:

1. 经典 DEX 上线(EVM 或 Solana)

创作者铸造一定供应量的代币,在去中心化交易所(如 Uniswap 或 Raydium)上创建流动性池(LP),将代币与基础资产(如 $ETH$SOL$USDC)配对,然后通过故事或 meme 进行营销。主要风险在于谁掌控代币合约(是否可以继续铸造)以及 LP 代币(是否可以抽走流动性)。

2. Bonding‑Curve “Factory”(如 Solana 上的 pump.fun)

该模型在 Solana 上流行,标准化并自动化上线流程。任何人都可以立即在固定供应(常为十亿)上启动线性 bonding curve。价格随购买量自动报价。代币达到一定市值阈值后,会 “毕业” 到主流 DEX(如 Raydium),流动性自动创建并锁定。此创新大幅降低技术门槛,塑造了文化并加速了上线速度。

构建者为何在意:这些新上线平台把原本需要数天的工作压缩到几分钟。结果是巨大的、不可预测的流量峰值,冲击 RPC 节点、堵塞 mempool,并挑战索引服务。高峰期间,Solana 上的 Meme 币上线产生的交易量已匹配或超越以往所有网络纪录。

“价值” 从何而来

Meme 币价值是社交动力的函数,而非金融模型。主要来源有三:

  • 关注度引力:meme、明星背书或病毒新闻像磁铁一样吸引关注和流动性。2024‑2025 年,围绕明星与政治人物的代币在 Solana DEX 上出现巨额但短暂的交易流。
  • 协同博弈:强大的社区围绕叙事、艺术或集体恶作剧聚集,共同信念可产生强烈的自我强化价格波动——买入带来关注,关注又促使更多买入。
  • 偶发实用性叠加:部分成功的 Meme 项目在获得关注后尝试 “外挂” 实用性,如引入 swap、Layer 2、NFT 系列或游戏。但绝大多数仍是纯投机、仅供交易的资产。

不能忽视的风险

Meme 币领域危机四伏,必须了解才能规避。

合约与控制风险

  • 铸造/冻结权限:创始人是否可以无限铸造新代币稀释持有者?是否可以冻结转账,锁定资金?
  • 所有权/升级权:即使合约已 “放弃所有权”,仍可能存在代理或隐藏功能带来的风险。

流动性风险

  • 流动性锁定:初始 LP 是否在智能合约中锁定?若未锁定,创始人可通过 “拉地毯” 移除池中资产,使代币归零。流动性薄弱亦导致高滑点。

预售与软拉

  • 即便合约无恶意,项目仍可能失败。团队在预售后弃项目,或内部人员慢慢抛售大额配额。Solana 上的 $SLERF 事件展示了即使是 意外(如误烧 LP 代币)也能蒸发数百万,同时制造极端波动。

市场与运营风险

  • 极端波动:价格在数分钟内可上下波动 90% 以上。狂热带来的网络效应亦代价高昂。$PEPE 初期冲刺时,Ethereum gas 费用飙升,使后入者交易成本难以承受。

诈骗与法律风险

  • 拉地毯、泵单、伪装空投的钓鱼链接、假冒明星背书随处可见。学习常见诈骗手法以自保。本文不构成法律或投资建议

5 分钟 Meme 币检查清单(实战 DYOR)

在与任何 Meme 币交互前,执行以下尽职调查:

  1. 供应数学:总供应 vs 流通供应?多少分配给 LP、团队或金库?是否有归属计划?
  2. LP 健康:流动性池是否锁定?锁定时长?LP 中占总供应的比例?使用区块浏览器链上验证。
  3. 管理员权限:合约拥有者是否可以铸造新代币、暂停交易、黑名单钱包或更改税率?所有权是否已放弃?
  4. 分配情况:检查持仓分布。供应是否集中在少数钱包?留意机器人集群或内部大额早期配额。
  5. 合约来源:源码是否已链上验证?是否使用标准模板,还是自定义、未审计代码?警惕蜜罐模式。
  6. 流动性渠道:代币在哪交易?仍在 bonding curve 还是已毕业至主流 DEX / CEX?检查预期交易规模的滑点。
  7. 叙事耐久度:该 meme 是否具备真实的文化共鸣,还是短暂玩笑将在下周被遗忘?

Meme 币对区块链(及基础设施)的影响

  • 费用与吞吐峰值:突发的区块空间需求冲击 RPC 网关、索引器和验证节点。2024 年 3 月,Solana 创下历史最高日费用和数十亿美元链上交易量,几乎全部来源于 Meme 币热潮。基础设施团队必须为此类事件预留容量。
  • 流动性迁移:资本快速集中到少数热门 DEX 与上线平台,重塑 MEV 与订单流模式。
  • 用户 onboarding:Meme 币浪潮往往是新用户的首次加密接触,随后可能探索生态系统中的其他 dApp。

典型案例(仅作参考,不构成背书)

  • $DOGE:2013 年的原始作品,工作量证明货币,仍主要凭品牌认知与文化价值交易。
  • $SHIB:Ethereum ERC‑20 代币,从单纯 meme 演化为拥有自己 swap 与 L2 的大型社区生态。
  • $PEPE:2023 年在 Ethereum 上的现象级热潮,对验证者与用户的链上经济产生显著冲击。
  • BONKBONK 与 WIF(Solana):代表 2024‑2025 年 Solana 时代的 Meme 热潮。快速崛起并在主流交易所上市,带动网络活动激增。

给构建者与团队的建议

如果必须上线,请默认公平与安全:

  • 提供清晰、诚实的披露。禁止隐藏铸造或团队配额。
  • 锁定有意义的流动性比例,并公开锁仓证明。
  • 除非具备完善的运营安全,否则避免预售。
  • 规划基础设施。准备好应对机器人流量、速率限制滥用,并制定波动期间的沟通预案。

如果在 dApp 中集成 Meme 币,请沙箱化流程并保护用户:

  • 明显提示合约风险与流动性薄弱。
  • 在用户确认交易前,清晰展示滑点与价格冲击预估。
  • 在 UI 中直接展示关键元数据——供应量、管理员权限等。

给交易者的提示

  • 将仓位大小视作杠杆:只使用你完全准备好可能全部亏损的少量资金。
  • 交易前设定进出场点位,避免情绪驱动决策。
  • 自动化安全卫生:使用硬件钱包、定期审查代币授权、使用白名单 RPC、练习识别钓鱼。
  • 对明星或政治新闻引发的突发波动保持高度警惕,这类波动往往极端且快速回撤。

快速术语表

  • Bonding Curve:一种自动化数学公式,根据已购买供应量决定代币价格。常见于 pump.fun 上线模式。
  • LP Lock:将流动性池代币时间锁定的智能合约,防止项目方抽走流动性并 “拉地毯”。
  • Renounced Ownership:放弃合约管理员密钥的行为,降低(但不完全消除)恶意修改风险。
  • Graduation:代币从初始 bonding curve 平台迁移至公开 DEX 并拥有永久锁定流动性的过程。

参考来源与进一步阅读

  • Binance Academy:“什么是 Meme 币?” 与 “拉地毯” 定义。
  • Wikipedia 与 Binance Academy:Dogecoin 与 SHIB 起源。
  • CoinGecko:按行业划分的实时 Meme 币市场统计。
  • CoinDesk:Solana 费用峰值、PEPE 对 Ethereum 的影响以及 SLERF 案例研究。
  • Decrypt 与 Wikipedia:pump.fun 机制与文化影响解析。
  • Investopedia:常见加密诈骗与防御概述。

披露:本文仅用于教育目的,不构成投资建议。加密资产波动极大。请在链上和多渠道核实数据后再做决策。

BlockEden.xyz 将 Solana 加入我们的 API 套件 – 为开发者扩展区块链机会

· 阅读需 4 分钟
Dora Noda
Software Engineer

我们很高兴宣布,作为领先的区块链 API 解决方案提供商,BlockEden.xyz 正在通过将 Solana 加入我们的 API 套件来扩展服务。此举旨在为客户提供更广泛的选项,以在 Solana 网络上构建和部署创新的去中心化应用(dApp)。

在本篇博客中,我们将讨论 Solana 为何重要,以及将其 API 集成到我们的套件中如何惠及开发者和企业。

BlockEden.xyz 将 Solana 加入我们的 API 套件 – 为开发者扩展区块链机会

为什么 Solana 很重要

Solana 是一个开源的高性能区块链网络,旨在支持从去中心化金融(DeFi)和游戏到供应链管理等各种应用。以下是使 Solana 在众多区块链平台中脱颖而出的关键特性:

  1. 高性能:Solana 具备可扩展性,能够在亚秒级确认时间内处理高达 65,000 笔交易每秒(TPS),远超许多其他区块链平台。这种可扩展性让开发者能够以极低的延迟创建和部署 dApp,确保流畅的用户体验。
  2. 低交易费用:Solana 的创新架构使交易费用保持在低水平,对开发者和用户都非常经济实惠。此特性不仅降低了新 dApp 的准入门槛,也让已有应用运行得更高效。
  3. 历史证明(Proof of History,PoH):Solana 独特的共识算法——历史证明,提供了一种能源高效且安全的交易验证方式。通过可验证延迟函数(VDF)生成事件的历史记录,PoH 摒弃了高能耗的工作量证明(PoW)等共识机制。
  4. 开发者友好:Solana 提供丰富的开发者资源,包括完整的文档、强大的 SDK 和易用的 API,使得无论是否具备区块链经验的开发者都能轻松在 Solana 网络上构建和部署 dApp。

将 Solana API 集成到 BlockEden.xyz 的 API 套件

通过将 Solana 加入我们的 API 套件,我们旨在为开发者提供一整套工具,以在 Solana 网络上构建和部署 dApp。我们的 Solana API 将包括:

  1. 交易与账户管理:轻松创建、签名并提交交易,同时管理 Solana 网络上的账户。
  2. 智能合约部署:无缝部署并与 Solana 区块链上的智能合约交互,简化开发流程。
  3. 数据与分析:获取 Solana 区块链的实时与历史数据,包括交易详情、代币余额等,以实现深入的分析与报告。
  4. 集成与互操作性:使用我们强大的 API 与 SDK,将你的 dApp 与其他区块链网络和应用连接,实现无缝集成与互操作。

结论

将 Solana 纳入 BlockEden.xyz 的 API 套件,彰显了我们为客户提供前沿区块链技术解决方案的承诺。我们相信,Solana 的高性能、低成本和开发者友好特性,使其成为在各行业构建和部署 dApp 的理想平台。我们期待通过完整的 API 产品,帮助开发者充分发挥 Solana 的力量。

如果你对我们的 Solana API 有任何疑问或需要入门帮助,请随时联系支持团队。我们始终在此,助你利用区块链技术的潜力实现项目目标。