Skip to content

Commit 2841baa

Browse files
committed
use dns resolver to get account key
1 parent 4d89bde commit 2841baa

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

pythclient/pythclient.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313
from .solana import SolanaAccount, SolanaClient, SolanaPublicKey, SOLANA_DEVNET_HTTP_ENDPOINT, SOLANA_DEVNET_WS_ENDPOINT, SolanaPublicKeyOrStr
1414
from .pythaccounts import PythAccount, PythMappingAccount, PythProductAccount, PythPriceAccount
1515
from . import exceptions, config, ratelimit
16+
from .utils import get_key
1617

17-
V1_FIRST_MAPPING_ACCOUNT_KEY = "ArppEFcsybCLE8CRtQJLQ9tLv2peGmQoKWFuiUWm4KBP"
18-
V2_FIRST_MAPPING_ACCOUNT_KEY = "BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2"
19-
V2_PROGRAM_KEY = "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"
18+
V2_FIRST_MAPPING_ACCOUNT_KEY = get_key("devnet", "mapping")
19+
V2_PROGRAM_KEY = get_key("devnet", "program")
2020

2121

2222
class PythClient:
2323
def __init__(self, *,
2424
solana_client: Optional[SolanaClient] = None,
2525
solana_endpoint: str = SOLANA_DEVNET_HTTP_ENDPOINT,
2626
solana_ws_endpoint: str = SOLANA_DEVNET_WS_ENDPOINT,
27-
first_mapping_account_key: str = V1_FIRST_MAPPING_ACCOUNT_KEY,
27+
first_mapping_account_key: str = V2_FIRST_MAPPING_ACCOUNT_KEY,
2828
program_key: Optional[str] = None,
2929
aiohttp_client_session: Optional[aiohttp.ClientSession] = None) -> None:
3030
self._first_mapping_account_key = SolanaPublicKey(first_mapping_account_key)

pythclient/utils.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import ast
2+
import dns.resolver
3+
from loguru import logger
4+
from typing import Optional
5+
6+
DEFAULT_VERSION = "v2"
7+
8+
9+
def get_key(network: str, type: str, version: str = DEFAULT_VERSION) -> Optional[str]:
10+
"""
11+
Get the program or mapping keys from dns TXT records.
12+
13+
Example dns records:
14+
15+
devnet-program-v2.pyth.network
16+
mainnet-program-v2.pyth.network
17+
testnet-mapping-v2.pyth.network
18+
"""
19+
url = f"{network}-{type}-{version}.pyth.network"
20+
try:
21+
answer = dns.resolver.resolve(url, "TXT")
22+
except dns.resolver.NXDOMAIN:
23+
logger.error("TXT record for {} not found", url)
24+
return ""
25+
if len(answer) != 1:
26+
logger.error("Invalid number of records returned for {}!", url)
27+
return ""
28+
# Example of the raw_key:
29+
# "program=FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH"
30+
raw_key = ast.literal_eval(list(answer)[0].to_text())
31+
# program=FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH"
32+
_, key = raw_key.split("=", 1)
33+
return key

0 commit comments

Comments
 (0)