Etherfuse 稳定键程序 SDK
这个 稳定债券方案 class提供一套方法,在索拉纳区块链上与Stablebond程序进行互动.
我们目前正在使用这个自己在 app.etherfuse.com (英语)。 。 。 .
我们还有一个沙盒版本的程序运行在 沙盒. etherfuse.com (中文(简体) )这对测试和开发很有用, 和我们联系 玩钱,我们会给你一些假的代币使用.
用户的债券生命周期如下:
- 用户获准/空投保证金,表明已获准进入平台.
- 用户通过调用来利用债券进入平台
grantAccess。 。 。 . - 用户通过调用购买和薄荷新债券
mintBond。 。 。 . - 用户允许债券在一段时间内成熟,理想的是一年或一年以上,但在购买后可以立即成熟.
- 用户通过调用来赎回债券
redeemBonds,获得一个NFT,它将将用户的债券存储在金库中,直到下一次发行,类似于不冒险的Solana. - 用户通过呼叫来赎回 NFT
redeemNFT获得他们赎回的债券的支付稳定币 也是用来支付债券的.
使用量
尽管SDK包含了程序的所有自动生成代码和类型,但我们建议通过Stablebond Program类与程序互动. 有出口型号可以使开发更快,型号安全更好.
与类的相互作用模式是静态方法揭示关于可益债券的目录信息,而实例方法则用于与用户钱包上下文的相互作用. 这样,目录信息可以独立于用户钱包状态进行刷新.
首先导入 稳定债券方案 类 :
import { StablebondProgram } from "@etherfuse/stablebond-sdk";
收集静态稳定键信息
const bonds = await StablebondProgram.getBonds(rpcEndpoint);
然后,一旦一个用户认证,创建实例 稳定债券方案 类 :
const stablebondProgram = new StablebondProgram(rpcEndpoint, wallet);
实例方法
获取用户BondBalances
async getUserBondBalances(): Promise<Map<string, Decimal>>
在 Stablebond 程序中获取用户的债券余额.
获取用户端
async getUserTokens(): Promise<Stablebond[]>
在 Stablebond 程序中获取用户的令牌,结合GetBonds和GetUserBondBalances. 我们的代码中不叫这个,但是它可供你使用.
获取用户NFTs
async getUserNFTs(): Promise<PartialNFT[]>
在 Stablebond 程序中获取用户的 NFT 。 为有效起见,不包括关于债券的目录信息。 这些信息可以被补丁回放,以使用静态映射器方法map TocompleteNFT来完成一个完整的NFT对象.
有访问
async hasAccess(): Promise<boolean>
检查用户是否可以访问 Stablebond 程序 .
获得补助金
async grantAccess(bondAddress: string, bondMint: string): Promise<Uint8Array>
通过利用钱包中的保证金向用户提供访问权限,证明他们已寻求并重新确认了对平台的访问.
拥有KYC
async hasKYC(): Promise<boolean>
检查用户在 Stablebond 程序中是否完成了 KYC( 了解客户) 验证 .
薄荷铜
async mintBond(stablebondAddress: Address, uiAmount: Decimal): Promise<Uint8Array>
匹配指定数量的用户的新债券。 金额以债券的支付代号表示,而未具体说明购买的债券金额.
甲骨文新鲜度:此操作需要最新的甲骨文价格数据. 见 甲骨文更新 见下文.
即时重试
async instantRedeemBonds(stablebondAddress: Address, passedUIAmount?: Decimal): Promise<Uint8Array>
即时赎回稳定债券计划中的债券. 这导致一个用户在债券的支付代号中得到付款,减去费用. 收费和可用流动性由债券的即时赎回配置决定.
甲骨文新鲜度:此操作需要最新的甲骨文价格数据. 见 甲骨文更新 见下文.
创建购买命令
async createPurchaseOrder(stablebondAddress: Address, paymentAmount: Decimal): Promise<Uint8Array>
为用户在Stablebond程序内即将发行的债券中保留定购单. 金额以保证金的支付代号表示,而未具体说明购买的保证金金额.
甲骨文新鲜度:此操作需要最新的甲骨文价格数据. 见 甲骨文更新 见下文.
赎回命令
async redeemPurchaseOrder(nftMintString: Address): Promise<Uint8Array>
重新定购单,供用户要求以前在稳定债券方案内支付的债券.
赎回铜牌
async redeemBonds(stablebondAddress: Address, passedUIAmount?: Decimal): Promise<Uint8Array>
稳定债券计划中的再发行债券. 这导致用户收到NFT,在本期发行后会成熟.
赎回NFT
async redeemNFT(nftMintString: Address): Promise<Uint8Array>
在 Stablebond 程序中重放一个 NFT 。 这导致用户收到NFT的基本资产.
静态方法
获取铜
static async getBonds(rpcEndpoint: string): Promise<Stablebond[]>
在稳定债券程序中获取债券.
获取BOND
static async getBond(rpcEndpoint: string, bondAddress: string): Promise<Stablebond>
在 Stablebond 程序中获取保证.
获取BondPrices
static async getBondPrices(host = StablebondProgram.etherfuseHost): Promise<{ [mint: string]: PriceData }>
获取以债券薄荷为键的当前债券价格。 此默认使用 Ederfuse 生产主机 .
获得BondPrice
static async getBondPrice(mint: Address, host = StablebondProgram.etherfuseHost): Promise<PriceData>
在其支付符中获取债券的现价。 此默认使用 Ederfuse 生产主机 .
连锁债券价格
这个 BondPrice 账户 ["bond_price", mint] 保证金的价格来源,一旦代表运行 InitializeBondPrice;在这之前,2022年利息的延伸是。 这些帮助者直接从链中读取任一源,而不是以太福斯主机.
import {
bondPriceAt,
bondRateBps,
fetchBondPriceSource,
fetchBondPriceSources,
getBondPriceAddress,
parseBondPriceSource,
} from '@etherfuse/stablebond-sdk';
const source = await fetchBondPriceSource(connection, mint);
const price = bondPriceAt(source);
const rateBps = bondRateBps(source);
getBondPriceAddress(mint)获取BondPricePDA (英语).fetchBondPriceSource(rpc, mint)财务报告和审定财务报表fetchBondPriceSources(rpc, mints)拿薄荷和薄荷来BondPrice并选择程序将使用的来源。 任何对象getMultipleAccountsInfo,例如网络3.jsConnection,作为rpc.parseBondPriceSource(mint, priceAccount, mintAccount)执行从已获取的账户数据.bondPriceAt(source, unixTimestamp?)返回价格为Decimal在特定时间( 现在已违约),以及bondRateBps(source)基点中的现有比率.
每个生成的指令构建者都会定价债券(startIssuance, (中文(简体) ), setInterestRateToZero, (中文(简体) ), delegateMintBondFromCurrencyAmount, (中文(简体) ), burnBondFromTokenAmount, (中文(简体) ), burnBondFromCurrencyAmount, (中文(简体) ), purchaseBondV3, (中文(简体) ), instantBondRedemptionV2填补其 bondPriceAccount 从薄荷,当呼叫者把它漏出.
完成的地图NFT
static mapToCompleteNFT({ ...nft }: PartialNFT, bond: Stablebond): NFT
地图a PartialNFT (单位:千美元) Stablebond 段 次 页 次 NFT。 。 。 .
详情请参见: StablebondProgram 源代码中的类.
获取感兴趣的时间
static getInterestOverTime(basisPoints: number, secondsPast: number): Decimal
计算基点利率中一段时期内的应计利息。 这在内部用于计算债券值,但可能对外部计算有用.
参数:
basisPoints: 基点利率(1%/100%)secondsPast: 已过去秒数
返回一个表示乘数的十进制,以适用于本金金额.
甲骨文更新
一些稳定债券业务(mintBond, (中文(简体) ), createPurchaseOrder, (中文(简体) ), instantRedeemBonds)需要最新的"开关"(Switchboard on-suite oracle)价格数据. 如果甲骨文僵化了(通常超过1小时),这些操作将会在链上失效,并带有 StaleOracle 错误.
SDK 输出公用设备来检查 oracle 新鲜度并获取更新指令, 这样您可以在提交稳定债券交易之前自己更新 .
检查甲骨文残骸
import {
createStablebondProgram,
fetchBond,
fetchPaymentFeedBrute,
isSwitchboardOnDemand,
isOracleStale,
} from "@etherfuse/stablebond-sdk";
import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
import { publicKey } from "@metaplex-foundation/umi";
const umi = createUmi(rpcEndpoint);
umi.programs.add(createStablebondProgram(), false);
const bond = await fetchBond(umi, publicKey(bondAddress));
const paymentFeed = await fetchPaymentFeedBrute(umi, bond.paymentFeedType);
// Check if this bond uses Switchboard on-demand oracles
if (isSwitchboardOnDemand(paymentFeed.paymentFeedType)) {
// Check if the quote price feed is stale (e.g., older than 20 minutes)
const stale = await isOracleStale(umi, paymentFeed.quotePriceFeed, 1200);
console.log("Oracle stale:", stale);
}
更新甲骨文
如果甲骨文已经僵化,请使用 fetchOracleUpdateIxForBond 以获取更新指令。 在您的稳定债券操作前, 在单独的交易中提交 .
import {
fetchOracleUpdateIxForBond,
isOracleStale,
} from "@etherfuse/stablebond-sdk";
import {
Connection,
TransactionMessage,
VersionedTransaction,
} from "@solana/web3.js";
// Check staleness first to avoid unnecessary oracle update calls
const stale = await isOracleStale(umi, paymentFeed.quotePriceFeed, 1200);
if (stale) {
const { instructions, lookupTables } = await fetchOracleUpdateIxForBond(
umi,
bondAddress, // Same address you pass to mintBond
wallet.publicKey.toBase58(),
"mainnet-beta" // or 'devnet'
);
if (instructions.length > 0) {
// Each feed returns 2 instructions (keccak verify + pullFeedSubmit).
// Submit each feed's instructions in a separate transaction to avoid
// checksum mismatches between independently-fetched oracle responses.
const connection = new Connection(rpcEndpoint);
for (let i = 0; i < instructions.length; i += 2) {
const feedIxs = instructions.slice(i, i + 2);
const { blockhash } = await connection.getLatestBlockhash();
const message = new TransactionMessage({
payerKey: wallet.publicKey,
recentBlockhash: blockhash,
instructions: feedIxs,
}).compileToV0Message(lookupTables.length ? lookupTables : undefined);
const tx = new VersionedTransaction(message);
// Sign and send...
}
}
}
// Now the oracle is fresh — proceed with your stablebond operation
const sig = await stablebondProgram.mintBond(bondAddress, amount);
API 参考
isSwitchboardOnDemand(feedType: PaymentFeedType): boolean
回返 true 如果给定的付费饲料类型使用Switchboard on-request oracles,可能需要人工更新.
isOracleStale(umi: Umi, feedPubkey: PublicKey, stalenessThresholdSecs: number): Promise<boolean>
读取神谕 lastUpdateTimestamp 从链上数据和返回 true 如果它比指定的阈值大.
fetchOracleUpdateIxForBond(umi, bondAddress, payerPubkey, network?): Promise<{ instructions, lookupTables }>
使用 @switchboard-xyz/on-demand SDK (英语:PullFeed.fetchUpdateIx) (中文(简体) ). 通过您使用的同一保证地址 mintBond(). 回归 TransactionInstruction[] 财务报告和审定财务报表 AddressLookupTableAccount[] 用于构建 V0 交易。 如果债券不按需使用切换机, 或抓取失败, 返回空数组 .