在 Base 上集成 GENY。
面向需要读取 GENY balance、准备 transfer、验证网络并引导用户完成 wallet onboarding 的应用。
生产常量
| 网络 | Base Mainnet |
|---|---|
| Chain ID | 8453 · 0x2105 |
| Native gas token | ETH |
| Token symbol | GENY |
| 小数位 | 18 |
| 合约 | 0x2a3d6f8c1fc4AcDcf3A75d19b445bae02F03676B |
获取 BTC、ETH 和 GENY 价格
Genyleap 提供受保护的价格端点,一次返回 BTC、ETH 和 GENY。访问权限为个人专用,并与您的 OpenProof 身份绑定。
创建 Bearer 令牌之前,管理员必须为您的 Genyleap 账户启用开发者 API 访问权限。批准后,打开 账户 → API 以生成或轮换令牌。如果访问权限尚未启用,请联系 [email protected] 并说明您正在构建什么、需要哪个 API 以及预计请求量。
| 端点 | GET https://api.genyleap.com/v1/prices |
|---|---|
| 身份验证 | Authorization: Bearer <YOUR_TOKEN> |
| 资产 | BTC · ETH · GENY |
| 来源 | 通过 Dexscreener 获取 Base 交易对 |
| 匹配方式 | 按代币 symbol 匹配,不按响应数组中的位置匹配 |
curl -H "Authorization: Bearer <YOUR_TOKEN>" \ https://api.genyleap.com/v1/prices
const response = await fetch("https://api.genyleap.com/v1/prices", {
headers: {
Authorization: `Bearer ${process.env.GENYLEAP_API_TOKEN}`
}
});
if (!response.ok) {
throw new Error(`Genyleap API returned ${response.status}`);
}
const prices = await response.json();
console.log(prices.GENY.usd);{
"BTC": { "usd": 85703.46, "change24h": 0.38 },
"ETH": { "usd": 2707.72, "change24h": 0.28 },
"GENY": { "usd": 0.001266, "change24h": -0.42 },
"meta": {
"source": "dexscreener",
"chain": "base",
"fetchedAt": "2026-10-06T14:30:00+00:00"
}
}请将 Bearer 令牌保存在服务端或其他受信任的运行环境中。不要把个人令牌嵌入公开的客户端 JavaScript、已提交的源代码、截图或日志。如果怀疑令牌已泄露,请在账户 → API中轮换令牌。
读取余额
GENY 使用标准 ERC-20 balance surface。始终将请求绑定到 Base Mainnet,并按 18 位 decimals 格式化返回的整数。
import { JsonRpcProvider, Contract, formatUnits } from "ethers";
const provider = new JsonRpcProvider("https://mainnet.base.org");
const token = new Contract(
"0x2a3d6f8c1fc4AcDcf3A75d19b445bae02F03676B",
["function balanceOf(address) view returns (uint256)"],
provider
);
const raw = await token.balanceOf(userAddress);
const balance = formatUnits(raw, 18);准备 transfer
transfer 是由钱包授权的 ERC-20 transaction。不要请求或处理用户的 recovery phrase 或 private key。
import { BrowserProvider, Contract, parseUnits } from "ethers";
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const token = new Contract(
"0x2a3d6f8c1fc4AcDcf3A75d19b445bae02F03676B",
["function transfer(address,uint256) returns (bool)"],
signer
);
const tx = await token.transfer(recipient, parseUnits("12.5", 18));
await tx.wait();启用写操作前,请确认已连接的 chain 是 Base Mainnet(8453),并向用户显示完整的目标地址。
Wallet onboarding
检测 injected 或 EIP-6963 wallet
优先使用用户已有的钱包与 provider 选择,不要静默替用户做决定。
请求 Base Mainnet
用途 wallet_switchEthereumChain with 0x2105. 仅在必要时回退到 wallet_addEthereumChain ,并且只在 wallet 报告 chain 未知时使用。
提供 token 导入
wallet_watchAsset 可以向兼容 wallet 建议 GENY,但通过 contract address 的手动路径应始终可用。
独立验证
将用户链接到 BaseScan,并在任何价值转移操作前鼓励其验证 contract address。
集成规则
- 将 contract address 视为 token 的主要标识;名称、符号与 logo 只是显示 metadata。
- 绝不要索取 seed phrase 或 private key。
- 签名前显示 active chain 与 destination。
- 当应用状态依赖确认时,等待 transaction receipt。
- 不要从缓存的 UI state 推断 balance;应从 chain 或可信 indexer 读取。