Skip to content

Commit 3a3d80e

Browse files
authored
Merge pull request #48 from pyth-network/guibescos/add-permission-account
Add permission account
2 parents 1f18151 + b27fb3a commit 3a3d80e

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

src/PythConnection.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export class PythConnection {
9393
}
9494
break
9595
case AccountType.Test:
96+
case AccountType.Permission:
9697
break
9798
default:
9899
throw new Error(`Unknown account type: ${base.type}. Try upgrading pyth-client.`)

src/PythHttpClient.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import { Commitment, Connection, PublicKey } from '@solana/web3.js'
2-
import { Product, PriceData, parseProductData, parsePriceData, parseBaseData, AccountType } from '.'
2+
import {
3+
Product,
4+
PriceData,
5+
parseProductData,
6+
parsePriceData,
7+
parseBaseData,
8+
AccountType,
9+
parsePermissionData,
10+
PermissionData,
11+
} from '.'
312

413
export interface PythHttpClientResult {
514
assetTypes: string[]
@@ -11,6 +20,7 @@ export interface PythHttpClientResult {
1120
/** The current price of each product. */
1221
productPrice: Map<string, PriceData>
1322
prices: PriceData[]
23+
permissionData: PermissionData | undefined
1424
}
1525

1626
/**
@@ -48,6 +58,9 @@ export class PythHttpClient {
4858
const productAccountKeyToProduct = new Map<string, Product>()
4959
const currentSlot = await this.connection.getSlot(this.commitment)
5060

61+
// Initialize permission field as undefined
62+
let permissionData;
63+
5164
accountList.forEach((singleAccount) => {
5265
const base = parseBaseData(singleAccount.account.data)
5366
if (base) {
@@ -70,6 +83,10 @@ export class PythHttpClient {
7083
break
7184
case AccountType.Test:
7285
break
86+
case AccountType.Permission:
87+
permissionData = parsePermissionData(singleAccount.account.data)
88+
break
89+
7390
default:
7491
throw new Error(`Unknown account type: ${base.type}. Try upgrading pyth-client.`)
7592
}
@@ -92,6 +109,7 @@ export class PythHttpClient {
92109
productFromSymbol,
93110
productPrice,
94111
prices,
112+
permissionData,
95113
}
96114

97115
return result

src/__tests__/Permission.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { PublicKey } from '@solana/web3.js'
2+
import { AccountType, Magic, parsePermissionData, Version } from '../index'
3+
4+
test('Parse permission account', (done) => {
5+
jest.setTimeout(60000)
6+
7+
const data = Buffer.from(
8+
'1MOyoQIAAAAFAAAAcAAAAImry8+SSJfg5VrdIcyH2oRAsza674wsCWWahgc9QNtMMagMxzMOceCCHTfo6+fDdV+hjbfjevgN0nX2y65Rbw59wrxBgcqYAgQ5yOFn8V1OQYvW2z+qvPSyoctqLEwjMg==',
9+
'base64',
10+
)
11+
const permission = parsePermissionData(data)
12+
expect(permission.magic).toBe(Magic)
13+
expect(permission.version).toBe(Version)
14+
expect(permission.type).toBe(AccountType.Permission)
15+
expect(permission.size).toBe(16 + 32 * 3)
16+
expect(permission.masterAuthority.equals(new PublicKey('AGQnwBFJ3WwWXqjkaeDKYkU3tJFi8cMkCCevQeLUYSf5'))).toBeTruthy()
17+
expect(
18+
permission.dataCurationAuthority.equals(new PublicKey('4Lqbt4kQYjc5TxQiyRiLKi9rvizU4VRiXUpzEBkZLbid')),
19+
).toBeTruthy()
20+
expect(
21+
permission.securityAuthority.equals(new PublicKey('9TvBred1G7eFo8E16MEK4LxHP11XEMqxkdmZ84WtaUau')),
22+
).toBeTruthy()
23+
done()
24+
})

src/index.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export enum AccountType {
3737
Product,
3838
Price,
3939
Test,
40+
Permission,
4041
}
4142

4243
const empty32Buffer = Buffer.alloc(32)
@@ -126,6 +127,12 @@ export interface PriceData extends Base {
126127
status: PriceStatus
127128
}
128129

130+
export interface PermissionData extends Base {
131+
masterAuthority: PublicKey
132+
dataCurationAuthority: PublicKey
133+
securityAuthority: PublicKey
134+
}
135+
129136
/** Parse data as a generic Pyth account. Use this method if you don't know the account type. */
130137
export function parseBaseData(data: Buffer): Base | undefined {
131138
// data is too short to have the magic number.
@@ -367,6 +374,29 @@ export const parsePriceData = (data: Buffer, currentSlot?: number): PriceData =>
367374
}
368375
}
369376

377+
export const parsePermissionData = (data: Buffer): PermissionData => {
378+
// pyth magic number
379+
const magic = data.readUInt32LE(0)
380+
// program version
381+
const version = data.readUInt32LE(4)
382+
// account type
383+
const type = data.readUInt32LE(8)
384+
// price account size
385+
const size = data.readUInt32LE(12)
386+
const masterAuthority = new PublicKey(data.slice(16, 48))
387+
const dataCurationAuthority = new PublicKey(data.slice(48, 80))
388+
const securityAuthority = new PublicKey(data.slice(80, 112))
389+
return {
390+
magic,
391+
version,
392+
type,
393+
size,
394+
masterAuthority,
395+
dataCurationAuthority,
396+
securityAuthority,
397+
}
398+
}
399+
370400
export { PythConnection } from './PythConnection'
371401
export { PythHttpClient } from './PythHttpClient'
372402
export { getPythProgramKeyForCluster } from './cluster'

0 commit comments

Comments
 (0)