|
|
vor 3 Wochen | |
|---|---|---|
| .. | ||
| src | 741e22485b fix: fixed a lot of TSC builds | vor 3 Wochen |
| .eslintrc.js | 29e5c9bc62 feat(target_chains/ton): add ton deploy script (#2039) | vor 1 Jahr |
| .gitignore | ab0cf6f7d8 chore: updated gitignore to excluse the built dist/ folder | vor 3 Wochen |
| README.md | 6344c00ec1 chore(target_chains/ton): update contract address (#3143) | vor 1 Monat |
| package.json | 741e22485b fix: fixed a lot of TSC builds | vor 3 Wochen |
| tsconfig.build.json | 741e22485b fix: fixed a lot of TSC builds | vor 3 Wochen |
| tsconfig.json | fe92275443 chore: migrated all package.json and tsconfig files to a single, modern standard | vor 3 Wochen |
This SDK provides a JavaScript interface for interacting with the Pyth Network on the TON blockchain.
npm install @pythnetwork/pyth-ton-js
Here's a basic example of how to use the SDK:
npm install @pythnetwork/pyth-ton-js @pythnetwork/hermes-client @ton/core @ton/ton @ton/crypto
import { TonClient, Address, WalletContractV4 } from "@ton/ton";
import { toNano } from "@ton/core";
import { mnemonicToPrivateKey } from "@ton/crypto";
import { HermesClient } from "@pythnetwork/hermes-client";
import {
PythContract,
PYTH_CONTRACT_ADDRESS_TESTNET,
calculateUpdatePriceFeedsFee,
} from "@pythnetwork/pyth-ton-js";
const BTC_PRICE_FEED_ID =
"0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43";
async function main() {
const client = new TonClient({
endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC",
apiKey: "your-api-key-here", // Optional, but note that without api-key you need to send requests once per second
});
const contractAddress = Address.parse(PYTH_CONTRACT_ADDRESS_TESTNET);
const contract = client.open(PythContract.createFromAddress(contractAddress));
const guardianSetIndex = await contract.getCurrentGuardianSetIndex();
console.log("Guardian Set Index:", guardianSetIndex);
const price = await contract.getPriceUnsafe(BTC_PRICE_FEED_ID);
console.log("BTC Price from TON contract:", price);
const hermesEndpoint = "https://hermes.pyth.network";
const hermesClient = new HermesClient(hermesEndpoint);
const priceIds = [BTC_PRICE_FEED_ID];
const latestPriceUpdates = await hermesClient.getLatestPriceUpdates(
priceIds,
{
encoding: "hex",
}
);
console.log("Hermes BTC price:", latestPriceUpdates.parsed?.[0].price);
const numUpdates = 1; // Only BTC price
const updateData = Buffer.from(latestPriceUpdates.binary.data[0], "hex");
console.log("Update data:", updateData);
// NOTE: As of 2025/10/19 There's a bug with TON Access (https://ton.access.orbs.network) RPC service where if you provide an
// update data buffer with length of more than ~320 then the rpc returns error 404 and the function fails. In this case you can use the
// contract.getSingleUpdateFee() method to get the single update fee and multiply it by the number of updates you want to perform.
const updateFee = await contract.getUpdateFee(updateData);
console.log("Update fee:", updateFee);
const mnemonic = "your mnemonic here";
const key = await mnemonicToPrivateKey(mnemonic.split(" "));
const wallet = WalletContractV4.create({
publicKey: key.publicKey,
workchain: 0,
});
const provider = client.open(wallet);
await contract.sendUpdatePriceFeeds(
provider.sender(key.secretKey),
updateData,
calculateUpdatePriceFeedsFee(numUpdates) + BigInt(updateFee)
);
console.log("Price feeds updated successfully.");
const updatedPrice = await contract.getPriceUnsafe(BTC_PRICE_FEED_ID);
console.log("Updated BTC Price from TON contract:", updatedPrice);
}
main().catch(console.error);
PythContractThe main class for interacting with the Pyth contract on TON.
getCurrentGuardianSetIndex(provider: ContractProvider): Promise<number>getPriceUnsafe(provider: ContractProvider, priceFeedId: string): Promise<PriceInfo>getPriceNoOlderThan(provider: ContractProvider, timePeriod: number, priceFeedId: string): Promise<PriceInfo>getEmaPriceUnsafe(provider: ContractProvider, priceFeedId: string): Promise<PriceInfo>getEmaPriceNoOlderThan(provider: ContractProvider, timePeriod: number, priceFeedId: string): Promise<PriceInfo>getUpdateFee(provider: ContractProvider, vm: Buffer): Promise<number>getSingleUpdateFee(provider: ContractProvider): Promise<number>sendUpdatePriceFeeds(provider: ContractProvider, via: Sender, updateData: Buffer, updateFee: bigint): Promise<void>PYTH_CONTRACT_ADDRESS_TESTNET: The address of the Pyth contract on the TON testnet.