@pythnetwork/pyth-ton-js 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/lib/index.d.ts +24 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +108 -2
- package/package.json +5 -6
package/README.md
CHANGED
|
@@ -24,6 +24,7 @@ import { HermesClient } from "@pythnetwork/hermes-client";
|
|
|
24
24
|
import {
|
|
25
25
|
PythContract,
|
|
26
26
|
PYTH_CONTRACT_ADDRESS_TESTNET,
|
|
27
|
+
calculateUpdatePriceFeedsFee,
|
|
27
28
|
} from "@pythnetwork/pyth-ton-js";
|
|
28
29
|
|
|
29
30
|
const BTC_PRICE_FEED_ID =
|
|
@@ -73,7 +74,7 @@ async function main() {
|
|
|
73
74
|
await contract.sendUpdatePriceFeeds(
|
|
74
75
|
provider.sender(key.secretKey),
|
|
75
76
|
updateData,
|
|
76
|
-
|
|
77
|
+
calculateUpdatePriceFeedsFee(1n) + BigInt(updateFee)
|
|
77
78
|
);
|
|
78
79
|
console.log("Price feeds updated successfully.");
|
|
79
80
|
|
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Address, Cell, Contract, Sender } from "@ton/core";
|
|
3
3
|
import { ContractProvider } from "@ton/ton";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const PYTH_CONTRACT_ADDRESS_MAINNET = "EQBU6k8HH6yX4Jf3d18swWbnYr31D3PJI7PgjXT-flsKHqql";
|
|
5
|
+
export declare const PYTH_CONTRACT_ADDRESS_TESTNET = "EQB4ZnrI5qsP_IUJgVJNwEGKLzZWsQOFhiaqDbD7pTt_f9oU";
|
|
6
|
+
export declare const UPDATE_PRICE_FEEDS_BASE_GAS = 300000n;
|
|
7
|
+
export declare const UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90000n;
|
|
8
|
+
export declare const GAS_PRICE_FACTOR = 400n;
|
|
9
|
+
export interface DataSource {
|
|
10
|
+
emitterChain: number;
|
|
11
|
+
emitterAddress: string;
|
|
12
|
+
}
|
|
5
13
|
export declare class PythContract implements Contract {
|
|
6
14
|
readonly address: Address;
|
|
7
15
|
readonly init?: {
|
|
@@ -14,7 +22,9 @@ export declare class PythContract implements Contract {
|
|
|
14
22
|
} | undefined);
|
|
15
23
|
static createFromAddress(address: Address): PythContract;
|
|
16
24
|
getCurrentGuardianSetIndex(provider: ContractProvider): Promise<number>;
|
|
25
|
+
sendUpdateGuardianSet(provider: ContractProvider, via: Sender, vm: Buffer): Promise<void>;
|
|
17
26
|
sendUpdatePriceFeeds(provider: ContractProvider, via: Sender, updateData: Buffer, updateFee: bigint): Promise<void>;
|
|
27
|
+
sendExecuteGovernanceAction(provider: ContractProvider, via: Sender, governanceAction: Buffer): Promise<void>;
|
|
18
28
|
getPriceUnsafe(provider: ContractProvider, priceFeedId: string): Promise<{
|
|
19
29
|
price: number;
|
|
20
30
|
conf: number;
|
|
@@ -41,6 +51,19 @@ export declare class PythContract implements Contract {
|
|
|
41
51
|
}>;
|
|
42
52
|
getUpdateFee(provider: ContractProvider, vm: Buffer): Promise<number>;
|
|
43
53
|
getSingleUpdateFee(provider: ContractProvider): Promise<number>;
|
|
54
|
+
getLastExecutedGovernanceSequence(provider: ContractProvider): Promise<number>;
|
|
55
|
+
getChainId(provider: ContractProvider): Promise<number>;
|
|
56
|
+
getDataSources(provider: ContractProvider): Promise<DataSource[]>;
|
|
57
|
+
getGovernanceDataSource(provider: ContractProvider): Promise<DataSource | null>;
|
|
58
|
+
getGuardianSet(provider: ContractProvider, index: number): Promise<{
|
|
59
|
+
expirationTime: number;
|
|
60
|
+
keys: string[];
|
|
61
|
+
keyCount: number;
|
|
62
|
+
}>;
|
|
44
63
|
}
|
|
45
64
|
export declare function createCellChain(buffer: Buffer): Cell;
|
|
65
|
+
export declare function parseDataSources(cell: Cell): DataSource[];
|
|
66
|
+
export declare function parseDataSource(cell: Cell): DataSource | null;
|
|
67
|
+
export declare function parseGuardianSetKeys(cell: Cell): string[];
|
|
68
|
+
export declare function calculateUpdatePriceFeedsFee(numUpdates: bigint): bigint;
|
|
46
69
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,OAAO,EAEP,IAAI,EACJ,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,OAAO,EAEP,IAAI,EACJ,QAAQ,EAER,MAAM,EAGP,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,eAAO,MAAM,6BAA6B,qDACU,CAAC;AACrD,eAAO,MAAM,6BAA6B,qDACU,CAAC;AAErD,eAAO,MAAM,2BAA2B,UAAU,CAAC;AACnD,eAAO,MAAM,iCAAiC,SAAS,CAAC;AAExD,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAa,YAAW,QAAQ;IAEzC,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,QAAQ,CAAC,IAAI,CAAC;cAAU,IAAI;cAAQ,IAAI;;gBAD/B,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC;cAAU,IAAI;cAAQ,IAAI;iBAAE;IAG5C,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO;IAInC,0BAA0B,CAAC,QAAQ,EAAE,gBAAgB;IAMrD,qBAAqB,CACzB,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM;IAcN,oBAAoB,CACxB,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM;IAcb,2BAA2B,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,MAAM;IAcpB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM;;;;;;IAkB9D,mBAAmB,CACvB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM;;;;;;IAoBf,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM;;;;;;IAkBjE,sBAAsB,CAC1B,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM;;;;;;IAoBf,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM;IAQnD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB;IAM7C,iCAAiC,CAAC,QAAQ,EAAE,gBAAgB;IAS5D,UAAU,CAAC,QAAQ,EAAE,gBAAgB;IAMrC,cAAc,CAAC,QAAQ,EAAE,gBAAgB;IAKzC,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB;IAKlD,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM;;;;;CAe/D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBpD;AAmBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,EAAE,CAczD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI,CAQ7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAoBzD;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,UAM9D"}
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createCellChain = exports.PythContract = exports.PYTH_CONTRACT_ADDRESS_TESTNET = void 0;
|
|
3
|
+
exports.calculateUpdatePriceFeedsFee = exports.parseGuardianSetKeys = exports.parseDataSource = exports.parseDataSources = exports.createCellChain = exports.PythContract = exports.GAS_PRICE_FACTOR = exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = exports.UPDATE_PRICE_FEEDS_BASE_GAS = exports.PYTH_CONTRACT_ADDRESS_TESTNET = exports.PYTH_CONTRACT_ADDRESS_MAINNET = void 0;
|
|
4
4
|
const core_1 = require("@ton/core");
|
|
5
|
-
exports.
|
|
5
|
+
exports.PYTH_CONTRACT_ADDRESS_MAINNET = "EQBU6k8HH6yX4Jf3d18swWbnYr31D3PJI7PgjXT-flsKHqql";
|
|
6
|
+
exports.PYTH_CONTRACT_ADDRESS_TESTNET = "EQB4ZnrI5qsP_IUJgVJNwEGKLzZWsQOFhiaqDbD7pTt_f9oU";
|
|
7
|
+
// This is defined in target_chains/ton/contracts/common/gas.fc
|
|
8
|
+
exports.UPDATE_PRICE_FEEDS_BASE_GAS = 300000n;
|
|
9
|
+
exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90000n;
|
|
10
|
+
// Current settings in basechain are as follows: 1 unit of gas costs 400 nanotons
|
|
11
|
+
exports.GAS_PRICE_FACTOR = 400n;
|
|
6
12
|
class PythContract {
|
|
7
13
|
address;
|
|
8
14
|
init;
|
|
@@ -17,6 +23,17 @@ class PythContract {
|
|
|
17
23
|
const result = await provider.get("get_current_guardian_set_index", []);
|
|
18
24
|
return result.stack.readNumber();
|
|
19
25
|
}
|
|
26
|
+
async sendUpdateGuardianSet(provider, via, vm) {
|
|
27
|
+
const messageBody = (0, core_1.beginCell)()
|
|
28
|
+
.storeUint(1, 32) // OP_UPDATE_GUARDIAN_SET
|
|
29
|
+
.storeRef(createCellChain(vm))
|
|
30
|
+
.endCell();
|
|
31
|
+
await provider.internal(via, {
|
|
32
|
+
value: (0, core_1.toNano)("0.1"),
|
|
33
|
+
sendMode: core_1.SendMode.PAY_GAS_SEPARATELY,
|
|
34
|
+
body: messageBody,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
20
37
|
async sendUpdatePriceFeeds(provider, via, updateData, updateFee) {
|
|
21
38
|
const messageBody = (0, core_1.beginCell)()
|
|
22
39
|
.storeUint(2, 32) // OP_UPDATE_PRICE_FEEDS
|
|
@@ -28,6 +45,17 @@ class PythContract {
|
|
|
28
45
|
body: messageBody,
|
|
29
46
|
});
|
|
30
47
|
}
|
|
48
|
+
async sendExecuteGovernanceAction(provider, via, governanceAction) {
|
|
49
|
+
const messageBody = (0, core_1.beginCell)()
|
|
50
|
+
.storeUint(3, 32) // OP_EXECUTE_GOVERNANCE_ACTION
|
|
51
|
+
.storeRef(createCellChain(governanceAction))
|
|
52
|
+
.endCell();
|
|
53
|
+
await provider.internal(via, {
|
|
54
|
+
value: (0, core_1.toNano)("0.1"),
|
|
55
|
+
sendMode: core_1.SendMode.PAY_GAS_SEPARATELY,
|
|
56
|
+
body: messageBody,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
31
59
|
async getPriceUnsafe(provider, priceFeedId) {
|
|
32
60
|
const result = await provider.get("get_price_unsafe", [
|
|
33
61
|
{ type: "int", value: BigInt(priceFeedId) },
|
|
@@ -100,6 +128,35 @@ class PythContract {
|
|
|
100
128
|
const result = await provider.get("get_single_update_fee", []);
|
|
101
129
|
return result.stack.readNumber();
|
|
102
130
|
}
|
|
131
|
+
async getLastExecutedGovernanceSequence(provider) {
|
|
132
|
+
const result = await provider.get("get_last_executed_governance_sequence", []);
|
|
133
|
+
return result.stack.readNumber();
|
|
134
|
+
}
|
|
135
|
+
async getChainId(provider) {
|
|
136
|
+
const result = await provider.get("get_chain_id", []);
|
|
137
|
+
return result.stack.readNumber();
|
|
138
|
+
}
|
|
139
|
+
async getDataSources(provider) {
|
|
140
|
+
const result = await provider.get("get_data_sources", []);
|
|
141
|
+
return parseDataSources(result.stack.readCell());
|
|
142
|
+
}
|
|
143
|
+
async getGovernanceDataSource(provider) {
|
|
144
|
+
const result = await provider.get("get_governance_data_source", []);
|
|
145
|
+
return parseDataSource(result.stack.readCell());
|
|
146
|
+
}
|
|
147
|
+
async getGuardianSet(provider, index) {
|
|
148
|
+
const result = await provider.get("get_guardian_set", [
|
|
149
|
+
{ type: "int", value: BigInt(index) },
|
|
150
|
+
]);
|
|
151
|
+
const expirationTime = result.stack.readNumber();
|
|
152
|
+
const keys = parseGuardianSetKeys(result.stack.readCell());
|
|
153
|
+
const keyCount = result.stack.readNumber();
|
|
154
|
+
return {
|
|
155
|
+
expirationTime,
|
|
156
|
+
keys,
|
|
157
|
+
keyCount,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
103
160
|
}
|
|
104
161
|
exports.PythContract = PythContract;
|
|
105
162
|
function createCellChain(buffer) {
|
|
@@ -133,3 +190,52 @@ function bufferToChunks(buff, chunkSizeBytes = 127) {
|
|
|
133
190
|
}
|
|
134
191
|
return chunks;
|
|
135
192
|
}
|
|
193
|
+
function parseDataSources(cell) {
|
|
194
|
+
const dataSources = [];
|
|
195
|
+
const slice = cell.beginParse();
|
|
196
|
+
const dict = slice.loadDictDirect(core_1.Dictionary.Keys.Uint(8), core_1.Dictionary.Values.Cell());
|
|
197
|
+
for (const [, value] of dict) {
|
|
198
|
+
const dataSource = parseDataSource(value);
|
|
199
|
+
if (dataSource) {
|
|
200
|
+
dataSources.push(dataSource);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return dataSources;
|
|
204
|
+
}
|
|
205
|
+
exports.parseDataSources = parseDataSources;
|
|
206
|
+
function parseDataSource(cell) {
|
|
207
|
+
const slice = cell.beginParse();
|
|
208
|
+
if (slice.remainingBits === 0) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const emitterChain = slice.loadUint(16);
|
|
212
|
+
const emitterAddress = slice.loadUintBig(256).toString(16).padStart(64, "0");
|
|
213
|
+
return { emitterChain, emitterAddress };
|
|
214
|
+
}
|
|
215
|
+
exports.parseDataSource = parseDataSource;
|
|
216
|
+
function parseGuardianSetKeys(cell) {
|
|
217
|
+
const keys = [];
|
|
218
|
+
function parseCell(c) {
|
|
219
|
+
let slice = c.beginParse();
|
|
220
|
+
while (slice.remainingRefs > 0 || slice.remainingBits >= 160) {
|
|
221
|
+
if (slice.remainingBits >= 160) {
|
|
222
|
+
const bitsToSkip = slice.remainingBits - 160;
|
|
223
|
+
slice = slice.skip(bitsToSkip);
|
|
224
|
+
const key = slice.loadBits(160);
|
|
225
|
+
keys.push("0x" + key.toString());
|
|
226
|
+
}
|
|
227
|
+
if (slice.remainingRefs > 0) {
|
|
228
|
+
parseCell(slice.loadRef());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
parseCell(cell);
|
|
233
|
+
return keys;
|
|
234
|
+
}
|
|
235
|
+
exports.parseGuardianSetKeys = parseGuardianSetKeys;
|
|
236
|
+
function calculateUpdatePriceFeedsFee(numUpdates) {
|
|
237
|
+
return ((exports.UPDATE_PRICE_FEEDS_BASE_GAS +
|
|
238
|
+
exports.UPDATE_PRICE_FEEDS_PER_UPDATE_GAS * numUpdates) *
|
|
239
|
+
exports.GAS_PRICE_FACTOR);
|
|
240
|
+
}
|
|
241
|
+
exports.calculateUpdatePriceFeedsFee = calculateUpdatePriceFeedsFee;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pythnetwork/pyth-ton-js",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Pyth Network TON Utilities",
|
|
5
5
|
"homepage": "https://pyth.network",
|
|
6
6
|
"author": {
|
|
@@ -20,12 +20,11 @@
|
|
|
20
20
|
"access": "public"
|
|
21
21
|
},
|
|
22
22
|
"scripts": {
|
|
23
|
-
"test": "jest --passWithNoTests",
|
|
24
23
|
"build": "tsc",
|
|
25
24
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
26
|
-
"lint": "eslint src/",
|
|
27
|
-
"prepublishOnly": "pnpm run build && pnpm
|
|
28
|
-
"preversion": "pnpm run lint",
|
|
25
|
+
"test:lint": "eslint src/",
|
|
26
|
+
"prepublishOnly": "pnpm run build && pnpm run test:lint",
|
|
27
|
+
"preversion": "pnpm run test:lint",
|
|
29
28
|
"version": "pnpm run format && git add -A src"
|
|
30
29
|
},
|
|
31
30
|
"keywords": [
|
|
@@ -47,5 +46,5 @@
|
|
|
47
46
|
"ts-node": "^10.9.2",
|
|
48
47
|
"typescript": "^4.6.3"
|
|
49
48
|
},
|
|
50
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "733971809a4415c420922477a162aff3789a7774"
|
|
51
50
|
}
|