@pizzaton/ton 0.0.0-stage → 0.1.0

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.
Files changed (96) hide show
  1. package/CONTRACTS.md +239 -0
  2. package/README.md +481 -2
  3. package/dist/airdrop/index.d.mts +18 -0
  4. package/dist/airdrop/index.mjs +86 -0
  5. package/dist/connect/errors.d.mts +4 -0
  6. package/dist/connect/errors.mjs +21 -0
  7. package/dist/connect/index.d.mts +23 -0
  8. package/dist/connect/index.mjs +34 -0
  9. package/dist/contracts/catalog/index.d.mts +361 -0
  10. package/dist/contracts/catalog/index.mjs +403 -0
  11. package/dist/contracts/client.d.mts +18 -0
  12. package/dist/contracts/client.mjs +31 -0
  13. package/dist/contracts/codecs.d.mts +14 -0
  14. package/dist/contracts/codecs.mjs +61 -0
  15. package/dist/contracts/hipo.d.mts +138 -0
  16. package/dist/contracts/hipo.mjs +198 -0
  17. package/dist/contracts/index.d.mts +23 -0
  18. package/dist/contracts/index.mjs +20 -0
  19. package/dist/contracts/metadata.d.mts +38 -0
  20. package/dist/contracts/metadata.mjs +50 -0
  21. package/dist/contracts/module-client.d.mts +20 -0
  22. package/dist/contracts/module-client.mjs +34 -0
  23. package/dist/contracts/module.d.mts +8 -0
  24. package/dist/contracts/module.mjs +11 -0
  25. package/dist/contracts/wrappers/base.d.mts +18 -0
  26. package/dist/contracts/wrappers/base.mjs +31 -0
  27. package/dist/contracts/wrappers/index.d.mts +12 -0
  28. package/dist/contracts/wrappers/index.mjs +12 -0
  29. package/dist/contracts/wrappers/jvault-protocols.d.mts +206 -0
  30. package/dist/contracts/wrappers/jvault-protocols.mjs +432 -0
  31. package/dist/contracts/wrappers/jvault-support.d.mts +135 -0
  32. package/dist/contracts/wrappers/jvault-support.mjs +269 -0
  33. package/dist/contracts/wrappers/jvault.d.mts +123 -0
  34. package/dist/contracts/wrappers/jvault.mjs +258 -0
  35. package/dist/contracts/wrappers/memeland.d.mts +253 -0
  36. package/dist/contracts/wrappers/memeland.mjs +396 -0
  37. package/dist/contracts/wrappers/multix.d.mts +92 -0
  38. package/dist/contracts/wrappers/multix.mjs +156 -0
  39. package/dist/contracts/wrappers/pizzabox.d.mts +66 -0
  40. package/dist/contracts/wrappers/pizzabox.mjs +105 -0
  41. package/dist/contracts/wrappers/ton-raffles.d.mts +215 -0
  42. package/dist/contracts/wrappers/ton-raffles.mjs +398 -0
  43. package/dist/contracts/wrappers/tonresistor.d.mts +189 -0
  44. package/dist/contracts/wrappers/tonresistor.mjs +276 -0
  45. package/dist/core/address.d.mts +25 -0
  46. package/dist/core/address.mjs +45 -0
  47. package/dist/core/amount.d.mts +8 -0
  48. package/dist/core/amount.mjs +34 -0
  49. package/dist/core/bytes.d.mts +5 -0
  50. package/dist/core/bytes.mjs +18 -0
  51. package/dist/core/constants.d.mts +14 -0
  52. package/dist/core/constants.mjs +15 -0
  53. package/dist/core/errors.d.mts +9 -0
  54. package/dist/core/errors.mjs +16 -0
  55. package/dist/core/http.mjs +39 -0
  56. package/dist/core/index.d.mts +8 -0
  57. package/dist/core/index.mjs +8 -0
  58. package/dist/core/metadata.d.mts +12 -0
  59. package/dist/core/metadata.mjs +35 -0
  60. package/dist/core/network.d.mts +24 -0
  61. package/dist/core/network.mjs +41 -0
  62. package/dist/emulator/index.d.mts +20 -0
  63. package/dist/emulator/index.mjs +24 -0
  64. package/dist/index.d.mts +21 -0
  65. package/dist/index.mjs +19 -0
  66. package/dist/indexer/index.d.mts +90 -0
  67. package/dist/indexer/index.mjs +279 -0
  68. package/dist/jetton/details.d.mts +27 -0
  69. package/dist/jetton/details.mjs +116 -0
  70. package/dist/jetton/index.d.mts +54 -0
  71. package/dist/jetton/index.mjs +92 -0
  72. package/dist/jetton/versions.d.mts +12 -0
  73. package/dist/jetton/versions.mjs +50 -0
  74. package/dist/nft/collection.d.mts +57 -0
  75. package/dist/nft/collection.mjs +148 -0
  76. package/dist/nft/content.d.mts +34 -0
  77. package/dist/nft/content.mjs +142 -0
  78. package/dist/nft/index.d.mts +35 -0
  79. package/dist/nft/index.mjs +51 -0
  80. package/dist/nft/versions.d.mts +11 -0
  81. package/dist/nft/versions.mjs +29 -0
  82. package/dist/provider/index.d.mts +32 -0
  83. package/dist/provider/index.mjs +1 -0
  84. package/dist/react/index.d.mts +13 -0
  85. package/dist/react/index.mjs +48 -0
  86. package/dist/server/index.d.mts +11 -0
  87. package/dist/server/index.mjs +55 -0
  88. package/dist/simulation/index.d.mts +112 -0
  89. package/dist/simulation/index.mjs +310 -0
  90. package/dist/transactions/index.d.mts +33 -0
  91. package/dist/transactions/index.mjs +51 -0
  92. package/dist/vesting/index.d.mts +12 -0
  93. package/dist/vesting/index.mjs +25 -0
  94. package/dist/wallet/index.d.mts +23 -0
  95. package/dist/wallet/index.mjs +71 -0
  96. package/package.json +169 -5
@@ -0,0 +1,276 @@
1
+ import { buildJettonBurnBody, buildJettonTransferBody } from "../../jetton/index.mjs";
2
+ import { ContractWrapper } from "./base.mjs";
3
+ import { beginCell, contractAddress } from "@ton/core";
4
+ //#region src/contracts/wrappers/tonresistor.ts
5
+ /** TONresistor bonding-curve source revision: https://github.com/TONresistor/bonding-curve-contracts */
6
+ const TONRESISTOR_BONDING_CURVE_COMMIT = "5dbb20575fde5144d00c63f9d3099c0ac71bab95";
7
+ const TONRESISTOR_OPCODES = {
8
+ createLaunch: 2694881281,
9
+ changeMasterAdmin: 2694881282,
10
+ claimMasterAdmin: 2694881283,
11
+ changeTreasury: 2694881284,
12
+ withdrawProtocolFees: 2694881285,
13
+ depositProtocolFees: 2694881286,
14
+ reinitializeCurve: 2694881300,
15
+ initializeCurve: 2694881296,
16
+ buyJettons: 2694881297,
17
+ graduate: 2694881298,
18
+ flushFees: 2694881299,
19
+ initPoolResult: 3457702871,
20
+ transferNotification: 1935855772,
21
+ internalTransfer: 395134233,
22
+ askToTransfer: 260734629,
23
+ askToBurn: 1499400124,
24
+ mintNewJettons: 1680571655,
25
+ dropMinterAdmin: 1949430305,
26
+ changeMinterAdmin: 1694626644,
27
+ claimMinterAdmin: 4220051737,
28
+ changeMinterMetadata: 3414567170,
29
+ upgradeMinterCode: 621336170,
30
+ requestWalletAddress: 745978227,
31
+ topUp: 3547469196,
32
+ returnExcesses: 3576854235,
33
+ jettonTransfer: 260734629,
34
+ jettonBurn: 1499400124,
35
+ burnNotification: 2078119902
36
+ };
37
+ const header = (opcode, queryId = 0n) => beginCell().storeUint(opcode, 32).storeUint(queryId, 64);
38
+ function uint(value, bits, field) {
39
+ if (value < 0n || value >= 1n << BigInt(bits)) throw new RangeError(`${field} must fit in uint${String(bits)}`);
40
+ return value;
41
+ }
42
+ function uint8(value, field) {
43
+ if (!Number.isInteger(value) || value < 0 || value > 255) throw new RangeError(`${field} must fit in uint8`);
44
+ return value;
45
+ }
46
+ function buildTonResistorMasterData(config) {
47
+ return beginCell().storeAddress(config.admin).storeAddress(null).storeAddress(config.treasury).storeUint(uint(config.totalLaunches ?? 0n, 64, "totalLaunches"), 64).storeCoins(config.feesBalance ?? 0n).endCell();
48
+ }
49
+ var TonResistorBondingCurveMaster = class TonResistorBondingCurveMaster extends ContractWrapper {
50
+ static createFromAddress(address) {
51
+ return new TonResistorBondingCurveMaster(address);
52
+ }
53
+ static createFromConfig(config, code, workchain = 0) {
54
+ const init = {
55
+ code,
56
+ data: buildTonResistorMasterData(config)
57
+ };
58
+ return new TonResistorBondingCurveMaster(contractAddress(workchain, init), init);
59
+ }
60
+ async sendDeploy(provider, via, value) {
61
+ await this.send(provider, via, value);
62
+ }
63
+ async sendCreateLaunch(provider, via, value, metadata, salt, queryId = 0n) {
64
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.createLaunch, queryId).storeRef(metadata).storeUint(uint(salt, 64, "salt"), 64).endCell());
65
+ }
66
+ async sendChangeAdmin(provider, via, value, newAdmin, queryId = 0n) {
67
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.changeMasterAdmin, queryId).storeAddress(newAdmin).endCell());
68
+ }
69
+ async sendClaimAdmin(provider, via, value, queryId = 0n) {
70
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.claimMasterAdmin, queryId).endCell());
71
+ }
72
+ async sendChangeTreasury(provider, via, value, treasury, queryId = 0n) {
73
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.changeTreasury, queryId).storeAddress(treasury).endCell());
74
+ }
75
+ async sendWithdrawProtocolFees(provider, via, value, amount, queryId = 0n) {
76
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.withdrawProtocolFees, queryId).storeCoins(amount).endCell());
77
+ }
78
+ async sendDepositProtocolFees(provider, via, value, amount, creator, salt, queryId = 0n) {
79
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.depositProtocolFees, queryId).storeCoins(amount).storeAddress(creator).storeUint(uint(salt, 64, "salt"), 64).endCell());
80
+ }
81
+ async sendReinitializeCurve(provider, via, value, creator, salt, metadata, queryId = 0n) {
82
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.reinitializeCurve, queryId).storeAddress(creator).storeUint(uint(salt, 64, "salt"), 64).storeRef(metadata).endCell());
83
+ }
84
+ async sendTopUp(provider, via, value) {
85
+ await this.send(provider, via, value, beginCell().storeUint(TONRESISTOR_OPCODES.topUp, 32).endCell());
86
+ }
87
+ async getMasterData(provider) {
88
+ const stack = await this.get(provider, "get_master_data");
89
+ return {
90
+ admin: stack.readAddress(),
91
+ nextAdmin: stack.readAddressOpt(),
92
+ treasury: stack.readAddress(),
93
+ totalLaunches: stack.readBigNumber(),
94
+ feesBalance: stack.readBigNumber()
95
+ };
96
+ }
97
+ async getLaunchAddress(provider, creator, salt) {
98
+ return (await this.get(provider, "get_launch_address", [{
99
+ type: "slice",
100
+ cell: beginCell().storeAddress(creator).endCell()
101
+ }, {
102
+ type: "int",
103
+ value: salt
104
+ }])).readAddress();
105
+ }
106
+ async getStorageReserve(provider) {
107
+ return (await this.get(provider, "get_storage_reserve")).readBigNumber();
108
+ }
109
+ async getVersion(provider) {
110
+ return (await this.get(provider, "get_version")).readBigNumber();
111
+ }
112
+ };
113
+ function buildTonResistorCurveData(config) {
114
+ uint8(config.state, "state");
115
+ return beginCell().storeUint(config.state, 8).storeAddress(config.jettonMinter).storeCoins(config.virtualTonReserve).storeCoins(config.realTonReserve ?? 0n).storeCoins(config.curveJettonBalance ?? 0n).storeCoins(config.feeAccrued ?? 0n).storeCoins(config.migrationReserve ?? 0n).storeRef(buildTonResistorLaunchConfig(config.config)).storeBit(config.dropAdminPending ?? false).storeCoins(config.pendingBuyTonInNet ?? 0n).endCell();
116
+ }
117
+ function buildTonResistorLaunchConfig(config) {
118
+ return beginCell().storeAddress(config.master).storeAddress(config.creator).storeUint(uint(config.salt, 64, "salt"), 64).storeCoins(config.curveSupply).storeCoins(config.dexReserveSupply).storeCoins(config.graduationThreshold).endCell();
119
+ }
120
+ function storeForwardPayload(builder, payload) {
121
+ if (payload.type === "inline") return builder.storeBit(0).storeSlice(payload.cell.beginParse());
122
+ return builder.storeBit(1).storeRef(payload.cell);
123
+ }
124
+ var TonResistorBondingCurve = class TonResistorBondingCurve extends ContractWrapper {
125
+ static createFromAddress(address) {
126
+ return new TonResistorBondingCurve(address);
127
+ }
128
+ static createFromConfig(config, code, workchain = 0) {
129
+ const init = {
130
+ code,
131
+ data: buildTonResistorCurveData(config)
132
+ };
133
+ return new TonResistorBondingCurve(contractAddress(workchain, init), init);
134
+ }
135
+ async sendDeploy(provider, via, value) {
136
+ await this.send(provider, via, value);
137
+ }
138
+ async sendInitialize(provider, via, value, jettonMinter, refundTo, queryId = 0n) {
139
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.initializeCurve, queryId).storeAddress(jettonMinter).storeAddress(refundTo ?? null).endCell());
140
+ }
141
+ async sendBuy(provider, via, value, minJettonsOut, queryId = 0n) {
142
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.buyJettons, queryId).storeCoins(minJettonsOut).endCell());
143
+ }
144
+ async sendFlushFees(provider, via, value, queryId = 0n) {
145
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.flushFees, queryId).endCell());
146
+ }
147
+ async sendGraduate(provider, via, value, queryId = 0n) {
148
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.graduate, queryId).endCell());
149
+ }
150
+ async sendInitPoolResult(provider, via, value, exitCode, customPayload, queryId = 0n) {
151
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.initPoolResult, queryId).storeInt(exitCode, 32).storeMaybeRef(customPayload ?? null).endCell());
152
+ }
153
+ async sendTransferNotification(provider, via, value, jettonAmount, transferInitiator, forwardPayload, queryId = 0n) {
154
+ const body = header(TONRESISTOR_OPCODES.transferNotification, queryId).storeCoins(jettonAmount).storeAddress(transferInitiator);
155
+ await this.send(provider, via, value, storeForwardPayload(body, forwardPayload).endCell());
156
+ }
157
+ async sendTopUp(provider, via, value) {
158
+ await this.send(provider, via, value, beginCell().storeUint(TONRESISTOR_OPCODES.topUp, 32).endCell());
159
+ }
160
+ async getCurveData(provider) {
161
+ const stack = await this.get(provider, "get_curve_data");
162
+ return {
163
+ state: stack.readBigNumber(),
164
+ creator: stack.readAddress(),
165
+ salt: stack.readBigNumber(),
166
+ jettonMinter: stack.readAddressOpt(),
167
+ virtualTonReserve: stack.readBigNumber(),
168
+ realTonReserve: stack.readBigNumber(),
169
+ curveJettonBalance: stack.readBigNumber(),
170
+ curveSupply: stack.readBigNumber(),
171
+ dexReserveSupply: stack.readBigNumber(),
172
+ graduationThreshold: stack.readBigNumber(),
173
+ feeAccrued: stack.readBigNumber(),
174
+ migrationReserve: stack.readBigNumber(),
175
+ dropAdminPending: stack.readBoolean(),
176
+ pendingBuyTonInNet: stack.readBigNumber()
177
+ };
178
+ }
179
+ };
180
+ function buildTonResistorJettonWalletData(config) {
181
+ return beginCell().storeCoins(config.balance).storeAddress(config.owner).storeAddress(config.minter).endCell();
182
+ }
183
+ var TonResistorJettonWallet = class TonResistorJettonWallet extends ContractWrapper {
184
+ static createFromAddress(address) {
185
+ return new TonResistorJettonWallet(address);
186
+ }
187
+ static createFromConfig(config, code, workchain = 0) {
188
+ const init = {
189
+ code,
190
+ data: buildTonResistorJettonWalletData(config)
191
+ };
192
+ return new TonResistorJettonWallet(contractAddress(workchain, init), init);
193
+ }
194
+ async sendAskToTransfer(provider, via, value, input) {
195
+ const body = header(TONRESISTOR_OPCODES.askToTransfer, input.queryId).storeCoins(input.amount).storeAddress(input.recipient).storeAddress(input.excessesTo ?? null).storeMaybeRef(input.customPayload ?? null).storeCoins(input.forwardAmount);
196
+ await this.send(provider, via, value, storeForwardPayload(body, input.forwardPayload).endCell());
197
+ }
198
+ async sendAskToBurn(provider, via, value, amount, excessesTo, customPayload, queryId = 0n) {
199
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.askToBurn, queryId).storeCoins(amount).storeAddress(excessesTo ?? null).storeMaybeRef(customPayload ?? null).endCell());
200
+ }
201
+ async sendInternalTransfer(provider, via, value, input) {
202
+ const body = header(TONRESISTOR_OPCODES.internalTransfer, input.queryId).storeCoins(input.amount).storeAddress(input.initiator ?? null).storeAddress(input.excessesTo ?? null).storeCoins(input.forwardAmount);
203
+ await this.send(provider, via, value, storeForwardPayload(body, input.forwardPayload).endCell());
204
+ }
205
+ async sendTopUp(provider, via, value) {
206
+ await this.send(provider, via, value, beginCell().storeUint(TONRESISTOR_OPCODES.topUp, 32).endCell());
207
+ }
208
+ async getWalletData(provider) {
209
+ const stack = await this.get(provider, "get_wallet_data");
210
+ return {
211
+ balance: stack.readBigNumber(),
212
+ owner: stack.readAddress(),
213
+ minter: stack.readAddress(),
214
+ walletCode: stack.readCell()
215
+ };
216
+ }
217
+ };
218
+ var TonResistorJettonMinter = class TonResistorJettonMinter extends ContractWrapper {
219
+ static createFromAddress(address) {
220
+ return new TonResistorJettonMinter(address);
221
+ }
222
+ async sendMint(provider, via, value, input) {
223
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.mintNewJettons, input.queryId).storeAddress(input.recipient).storeCoins(input.tonAmount).storeRef(input.internalTransfer).endCell());
224
+ }
225
+ async sendRequestWalletAddress(provider, via, value, owner, includeOwnerAddress, queryId = 0n) {
226
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.requestWalletAddress, queryId).storeAddress(owner).storeBit(includeOwnerAddress).endCell());
227
+ }
228
+ async sendChangeAdmin(provider, via, value, admin, queryId = 0n) {
229
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.changeMinterAdmin, queryId).storeAddress(admin).endCell());
230
+ }
231
+ async sendClaimAdmin(provider, via, value, queryId = 0n) {
232
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.claimMinterAdmin, queryId).endCell());
233
+ }
234
+ async sendDropAdmin(provider, via, value, queryId = 0n) {
235
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.dropMinterAdmin, queryId).endCell());
236
+ }
237
+ async sendChangeMetadata(provider, via, value, metadata, queryId = 0n) {
238
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.changeMinterMetadata, queryId).storeRef(metadata).endCell());
239
+ }
240
+ async sendUpgradeCode(provider, via, value, newData, newCode, queryId = 0n) {
241
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.upgradeMinterCode, queryId).storeRef(newData).storeRef(newCode).endCell());
242
+ }
243
+ async sendBurnNotification(provider, via, value, amount, burnInitiator, excessesTo, queryId = 0n) {
244
+ await this.send(provider, via, value, header(TONRESISTOR_OPCODES.burnNotification, queryId).storeCoins(amount).storeAddress(burnInitiator).storeAddress(excessesTo ?? null).endCell());
245
+ }
246
+ async sendTopUp(provider, via, value) {
247
+ await this.send(provider, via, value, beginCell().storeUint(TONRESISTOR_OPCODES.topUp, 32).endCell());
248
+ }
249
+ async getJettonData(provider) {
250
+ const stack = await this.get(provider, "get_jetton_data");
251
+ return {
252
+ totalSupply: stack.readBigNumber(),
253
+ mintable: stack.readBoolean(),
254
+ admin: stack.readAddressOpt(),
255
+ content: stack.readCell(),
256
+ walletCode: stack.readCell()
257
+ };
258
+ }
259
+ async getWalletAddress(provider, owner) {
260
+ return (await this.get(provider, "get_wallet_address", [{
261
+ type: "slice",
262
+ cell: beginCell().storeAddress(owner).endCell()
263
+ }])).readAddress();
264
+ }
265
+ async getNextAdmin(provider) {
266
+ return (await this.get(provider, "get_next_admin_address")).readAddressOpt();
267
+ }
268
+ };
269
+ function buildTonResistorJettonTransfer(input) {
270
+ return buildJettonTransferBody(input);
271
+ }
272
+ function buildTonResistorJettonBurn(input) {
273
+ return buildJettonBurnBody(input);
274
+ }
275
+ //#endregion
276
+ export { TONRESISTOR_BONDING_CURVE_COMMIT, TONRESISTOR_OPCODES, TonResistorBondingCurve, TonResistorBondingCurveMaster, TonResistorJettonMinter, TonResistorJettonWallet, buildTonResistorCurveData, buildTonResistorJettonBurn, buildTonResistorJettonTransfer, buildTonResistorJettonWalletData, buildTonResistorLaunchConfig, buildTonResistorMasterData };
@@ -0,0 +1,25 @@
1
+ import { TonNetwork } from "./network.mjs";
2
+ import { Address } from "@ton/core";
3
+ //#region src/core/address.d.ts
4
+ export type TonAddress = string & {
5
+ readonly __brand: "TonAddress";
6
+ };
7
+ export declare function parseTonAddress(value: string | Address): Address;
8
+ export declare function toTonAddress(value: string | Address): TonAddress;
9
+ export declare function addressesEqual(left: string | Address, right: string | Address): boolean;
10
+ export declare function toFriendlyAddress(value: string | Address, options?: {
11
+ network?: TonNetwork;
12
+ bounceable?: boolean;
13
+ }): string;
14
+ /**
15
+ * Returns a compact, user-facing TON address while preserving the friendly
16
+ * (base64url) representation used by wallets and explorers.
17
+ */
18
+ export declare function shortenTonAddress(value: string | Address, options?: {
19
+ network?: TonNetwork;
20
+ bounceable?: boolean;
21
+ prefixLength?: number;
22
+ suffixLength?: number;
23
+ }): string;
24
+ export declare function assertWorkchain(value: string | Address, workchain: number): void;
25
+ //#endregion
@@ -0,0 +1,45 @@
1
+ import { TonPackageError, invariant } from "./errors.mjs";
2
+ import { Address } from "@ton/core";
3
+ //#region src/core/address.ts
4
+ function parseTonAddress(value) {
5
+ if (value instanceof Address) return value;
6
+ if (typeof value !== "string") throw new TonPackageError("INVALID_ADDRESS", "Invalid TON address");
7
+ try {
8
+ return Address.parse(value);
9
+ } catch (error) {
10
+ throw new TonPackageError("INVALID_ADDRESS", "Invalid TON address", { cause: String(error) });
11
+ }
12
+ }
13
+ function toTonAddress(value) {
14
+ return parseTonAddress(value).toRawString();
15
+ }
16
+ function addressesEqual(left, right) {
17
+ return parseTonAddress(left).equals(parseTonAddress(right));
18
+ }
19
+ function toFriendlyAddress(value, options = {}) {
20
+ invariant(options.network === void 0 || options.network === "mainnet" || options.network === "testnet", "INVALID_NETWORK", "Unsupported TON network");
21
+ return parseTonAddress(value).toString({
22
+ urlSafe: true,
23
+ bounceable: options.bounceable ?? true,
24
+ testOnly: options.network === "testnet"
25
+ });
26
+ }
27
+ /**
28
+ * Returns a compact, user-facing TON address while preserving the friendly
29
+ * (base64url) representation used by wallets and explorers.
30
+ */
31
+ function shortenTonAddress(value, options = {}) {
32
+ const friendlyAddress = toFriendlyAddress(value, options);
33
+ const prefixLength = options.prefixLength ?? 6;
34
+ const suffixLength = options.suffixLength ?? 4;
35
+ invariant(Number.isSafeInteger(prefixLength) && prefixLength >= 0, "INVALID_ADDRESS", "Address prefix length must be a non-negative safe integer");
36
+ invariant(Number.isSafeInteger(suffixLength) && suffixLength >= 0, "INVALID_ADDRESS", "Address suffix length must be a non-negative safe integer");
37
+ if (friendlyAddress.length <= prefixLength + suffixLength + 1) return friendlyAddress;
38
+ return `${friendlyAddress.slice(0, prefixLength)}…${friendlyAddress.slice(-suffixLength)}`;
39
+ }
40
+ function assertWorkchain(value, workchain) {
41
+ const address = parseTonAddress(value);
42
+ invariant(address.workChain === workchain, "INVALID_ADDRESS", `Expected workchain ${workchain}, received ${address.workChain}`);
43
+ }
44
+ //#endregion
45
+ export { addressesEqual, assertWorkchain, parseTonAddress, shortenTonAddress, toFriendlyAddress, toTonAddress };
@@ -0,0 +1,8 @@
1
+ //#region src/core/amount.d.ts
2
+ export declare const MAX_TON_COINS: bigint;
3
+ export declare function assertTonAmount(value: bigint, label?: string): void;
4
+ export declare function parseUnits(value: string, decimals: number): bigint;
5
+ export declare function formatUnits(value: bigint, decimals: number, trimTrailingZeros?: boolean): string;
6
+ export declare const parseTon: (value: string) => bigint;
7
+ export declare const formatTon: (value: bigint) => string;
8
+ //#endregion
@@ -0,0 +1,34 @@
1
+ import { invariant } from "./errors.mjs";
2
+ //#region src/core/amount.ts
3
+ const DECIMAL_PATTERN = /^\d+(?:\.\d+)?$/;
4
+ const MAX_TON_COINS = (1n << 120n) - 1n;
5
+ function assertTonAmount(value, label = "TON amount") {
6
+ invariant(typeof value === "bigint" && value >= 0n && value <= MAX_TON_COINS, "INVALID_AMOUNT", `${label} is outside the TON coin range`);
7
+ }
8
+ function parseUnits(value, decimals) {
9
+ invariant(typeof value === "string", "INVALID_AMOUNT", "Amount must be a decimal string");
10
+ invariant(Number.isInteger(decimals) && decimals >= 0 && decimals <= 255, "INVALID_AMOUNT", "Invalid decimals");
11
+ const normalized = value.trim();
12
+ invariant(DECIMAL_PATTERN.test(normalized), "INVALID_AMOUNT", "Amount must be a non-negative decimal string");
13
+ const [whole = "", fraction = ""] = normalized.split(".");
14
+ invariant(fraction.length <= decimals, "INVALID_AMOUNT", "Amount has more fractional digits than the token supports");
15
+ const paddedFraction = fraction.padEnd(decimals, "0");
16
+ return BigInt(whole) * BigInt(10) ** BigInt(decimals) + BigInt(paddedFraction || "0");
17
+ }
18
+ function formatUnits(value, decimals, trimTrailingZeros = true) {
19
+ invariant(typeof value === "bigint", "INVALID_AMOUNT", "Amount must be a bigint");
20
+ invariant(Number.isInteger(decimals) && decimals >= 0 && decimals <= 255, "INVALID_AMOUNT", "Invalid decimals");
21
+ invariant(value >= BigInt(0), "INVALID_AMOUNT", "Amount cannot be negative");
22
+ if (decimals === 0) return value.toString();
23
+ const scale = BigInt(10) ** BigInt(decimals);
24
+ const whole = value / scale;
25
+ const fraction = value % scale;
26
+ if (fraction === BigInt(0)) return whole.toString();
27
+ let fractional = fraction.toString().padStart(decimals, "0");
28
+ if (trimTrailingZeros) fractional = fractional.replace(/0+$/, "");
29
+ return `${whole}.${fractional}`;
30
+ }
31
+ const parseTon = (value) => parseUnits(value, 9);
32
+ const formatTon = (value) => formatUnits(value, 9);
33
+ //#endregion
34
+ export { MAX_TON_COINS, assertTonAmount, formatTon, formatUnits, parseTon, parseUnits };
@@ -0,0 +1,5 @@
1
+ //#region src/core/bytes.d.ts
2
+ export declare function bytesToBase64(bytes: Uint8Array): string;
3
+ export declare function bytesToHex(bytes: Uint8Array): string;
4
+ export declare function hexToBytes(value: string): Uint8Array;
5
+ //#endregion
@@ -0,0 +1,18 @@
1
+ //#region src/core/bytes.ts
2
+ function bytesToBase64(bytes) {
3
+ let binary = "";
4
+ for (const byte of bytes) binary += String.fromCharCode(byte);
5
+ if (typeof btoa === "function") return btoa(binary);
6
+ return Buffer.from(bytes).toString("base64");
7
+ }
8
+ function bytesToHex(bytes) {
9
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
10
+ }
11
+ function hexToBytes(value) {
12
+ if (!/^(?:[0-9a-f]{2})*$/i.test(value)) throw new Error("Invalid hexadecimal value");
13
+ const bytes = new Uint8Array(value.length / 2);
14
+ for (let index = 0; index < bytes.length; index += 1) bytes[index] = Number.parseInt(value.slice(index * 2, index * 2 + 2), 16);
15
+ return bytes;
16
+ }
17
+ //#endregion
18
+ export { bytesToBase64, bytesToHex, hexToBytes };
@@ -0,0 +1,14 @@
1
+ //#region src/core/constants.d.ts
2
+ export declare const PIZZATON_MAINNET_ADDRESSES: {
3
+ readonly ptjMaster: "EQAgotSkX06MIW-A0ni5yKqeNlwc3nASnbO1dwGo-kwpg2Zg";
4
+ readonly pizzaBoyNftCollection: "EQA6A7BJi3m_DF7hnVjzrm_Oj0XeaT9e_rqCRRn99sHvYbcD";
5
+ readonly saleCoordinator: "EQAagkh1kW3ZoK0zNn3QnOC0kKKDJi3AcxcEgnh5uz1LyrfZ";
6
+ };
7
+ export declare const PTJ_TOKEN_INFO: {
8
+ readonly symbol: "PTJ";
9
+ readonly name: "PizzaTon Token";
10
+ readonly decimals: 9;
11
+ readonly maxSupply: bigint;
12
+ readonly masterAddress: "EQAgotSkX06MIW-A0ni5yKqeNlwc3nASnbO1dwGo-kwpg2Zg";
13
+ };
14
+ //#endregion
@@ -0,0 +1,15 @@
1
+ //#region src/core/constants.ts
2
+ const PIZZATON_MAINNET_ADDRESSES = {
3
+ ptjMaster: "EQAgotSkX06MIW-A0ni5yKqeNlwc3nASnbO1dwGo-kwpg2Zg",
4
+ pizzaBoyNftCollection: "EQA6A7BJi3m_DF7hnVjzrm_Oj0XeaT9e_rqCRRn99sHvYbcD",
5
+ saleCoordinator: "EQAagkh1kW3ZoK0zNn3QnOC0kKKDJi3AcxcEgnh5uz1LyrfZ"
6
+ };
7
+ const PTJ_TOKEN_INFO = {
8
+ symbol: "PTJ",
9
+ name: "PizzaTon Token",
10
+ decimals: 9,
11
+ maxSupply: 200000000n * 10n ** 9n,
12
+ masterAddress: PIZZATON_MAINNET_ADDRESSES.ptjMaster
13
+ };
14
+ //#endregion
15
+ export { PIZZATON_MAINNET_ADDRESSES, PTJ_TOKEN_INFO };
@@ -0,0 +1,9 @@
1
+ //#region src/core/errors.d.ts
2
+ export type TonErrorCode = "INVALID_ADDRESS" | "INVALID_AMOUNT" | "INVALID_NETWORK" | "INVALID_TRANSACTION" | "INVALID_METADATA" | "INVALID_PROOF" | "INVALID_SCHEDULE" | "PROVIDER_ERROR";
3
+ export declare class TonPackageError extends Error {
4
+ readonly code: TonErrorCode;
5
+ readonly details: Readonly<Record<string, unknown>> | undefined;
6
+ constructor(code: TonErrorCode, message: string, details?: Readonly<Record<string, unknown>>);
7
+ }
8
+ export declare function invariant(condition: unknown, code: TonErrorCode, message: string, details?: Readonly<Record<string, unknown>>): asserts condition;
9
+ //#endregion
@@ -0,0 +1,16 @@
1
+ //#region src/core/errors.ts
2
+ var TonPackageError = class extends Error {
3
+ code;
4
+ details;
5
+ constructor(code, message, details) {
6
+ super(message);
7
+ this.name = "TonPackageError";
8
+ this.code = code;
9
+ this.details = details;
10
+ }
11
+ };
12
+ function invariant(condition, code, message, details) {
13
+ if (!condition) throw new TonPackageError(code, message, details);
14
+ }
15
+ //#endregion
16
+ export { TonPackageError, invariant };
@@ -0,0 +1,39 @@
1
+ import { TonPackageError, invariant } from "./errors.mjs";
2
+ //#region src/core/http.ts
3
+ function normalizeHttpsBaseUrl(value, provider) {
4
+ let url;
5
+ try {
6
+ url = new URL(value);
7
+ } catch {
8
+ throw new TonPackageError("INVALID_NETWORK", `${provider} base URL must be a valid HTTPS URL`);
9
+ }
10
+ invariant(url.protocol === "https:" && !url.username && !url.password && !url.search && !url.hash, "INVALID_NETWORK", `${provider} base URL must use HTTPS and contain no credentials, query, or fragment`);
11
+ return url.toString().replace(/\/$/, "");
12
+ }
13
+ function validateRequestTimeout(timeoutMs, provider) {
14
+ const timeout = timeoutMs ?? 1e4;
15
+ invariant(Number.isSafeInteger(timeout) && timeout > 0, "INVALID_NETWORK", `${provider} timeout must be a positive safe integer`);
16
+ return timeout;
17
+ }
18
+ function createTimedFetch(fetcher, timeoutMs, provider) {
19
+ return (async (input, init) => {
20
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
21
+ const signal = init?.signal ? AbortSignal.any([init.signal, timeoutSignal]) : timeoutSignal;
22
+ try {
23
+ return await fetcher(input, {
24
+ ...init,
25
+ signal
26
+ });
27
+ } catch (cause) {
28
+ const timedOut = timeoutSignal.aborted && !init?.signal?.aborted;
29
+ throw new TonPackageError("PROVIDER_ERROR", `${provider} request ${timedOut ? "timed out" : "failed"}`, {
30
+ provider,
31
+ timedOut,
32
+ timeoutMs,
33
+ causeName: cause instanceof Error ? cause.name : typeof cause
34
+ });
35
+ }
36
+ });
37
+ }
38
+ //#endregion
39
+ export { createTimedFetch, normalizeHttpsBaseUrl, validateRequestTimeout };
@@ -0,0 +1,8 @@
1
+ import { TON_NETWORKS, TonNetwork, TonNetworkConfig, createNetworkConfig, explorerAddressUrl } from "./network.mjs";
2
+ import { TonAddress, addressesEqual, assertWorkchain, parseTonAddress, shortenTonAddress, toFriendlyAddress, toTonAddress } from "./address.mjs";
3
+ import { TokenMetadata, parseTokenMetadata, parseTokenMetadataJson } from "./metadata.mjs";
4
+ import { MAX_TON_COINS, assertTonAmount, formatTon, formatUnits, parseTon, parseUnits } from "./amount.mjs";
5
+ import { bytesToBase64, bytesToHex, hexToBytes } from "./bytes.mjs";
6
+ import { PIZZATON_MAINNET_ADDRESSES, PTJ_TOKEN_INFO } from "./constants.mjs";
7
+ import { TonErrorCode, TonPackageError, invariant } from "./errors.mjs";
8
+ export { MAX_TON_COINS, PIZZATON_MAINNET_ADDRESSES, PTJ_TOKEN_INFO, TON_NETWORKS, TokenMetadata, TonAddress, TonErrorCode, TonNetwork, TonNetworkConfig, TonPackageError, addressesEqual, assertTonAmount, assertWorkchain, bytesToBase64, bytesToHex, createNetworkConfig, explorerAddressUrl, formatTon, formatUnits, hexToBytes, invariant, parseTokenMetadata, parseTokenMetadataJson, parseTon, parseTonAddress, parseUnits, shortenTonAddress, toFriendlyAddress, toTonAddress };
@@ -0,0 +1,8 @@
1
+ import { TonPackageError, invariant } from "./errors.mjs";
2
+ import { addressesEqual, assertWorkchain, parseTonAddress, shortenTonAddress, toFriendlyAddress, toTonAddress } from "./address.mjs";
3
+ import { MAX_TON_COINS, assertTonAmount, formatTon, formatUnits, parseTon, parseUnits } from "./amount.mjs";
4
+ import { bytesToBase64, bytesToHex, hexToBytes } from "./bytes.mjs";
5
+ import { PIZZATON_MAINNET_ADDRESSES, PTJ_TOKEN_INFO } from "./constants.mjs";
6
+ import { parseTokenMetadata, parseTokenMetadataJson } from "./metadata.mjs";
7
+ import { TON_NETWORKS, createNetworkConfig, explorerAddressUrl } from "./network.mjs";
8
+ export { MAX_TON_COINS, PIZZATON_MAINNET_ADDRESSES, PTJ_TOKEN_INFO, TON_NETWORKS, TonPackageError, addressesEqual, assertTonAmount, assertWorkchain, bytesToBase64, bytesToHex, createNetworkConfig, explorerAddressUrl, formatTon, formatUnits, hexToBytes, invariant, parseTokenMetadata, parseTokenMetadataJson, parseTon, parseTonAddress, parseUnits, shortenTonAddress, toFriendlyAddress, toTonAddress };
@@ -0,0 +1,12 @@
1
+ //#region src/core/metadata.d.ts
2
+ export interface TokenMetadata {
3
+ readonly name?: string;
4
+ readonly symbol?: string;
5
+ readonly description?: string;
6
+ readonly image?: string;
7
+ readonly decimals?: number;
8
+ readonly uri?: string;
9
+ }
10
+ export declare function parseTokenMetadata(value: unknown): TokenMetadata;
11
+ export declare function parseTokenMetadataJson(json: string): TokenMetadata;
12
+ //#endregion
@@ -0,0 +1,35 @@
1
+ import { TonPackageError } from "./errors.mjs";
2
+ import { z } from "zod";
3
+ //#region src/core/metadata.ts
4
+ const TOKEN_METADATA_MAX_BYTES = 65536;
5
+ const tokenMetadataSchema = z.object({
6
+ name: z.string().max(256).optional(),
7
+ symbol: z.string().max(64).optional(),
8
+ description: z.string().max(8192).optional(),
9
+ image: z.string().max(2048).optional(),
10
+ decimals: z.number().int().min(0).max(255).optional(),
11
+ uri: z.string().max(2048).optional()
12
+ });
13
+ function parseTokenMetadata(value) {
14
+ const result = tokenMetadataSchema.safeParse(value);
15
+ if (!result.success) throw new TonPackageError("INVALID_METADATA", "Token metadata failed validation", { issues: result.error.issues.map((issue) => issue.message) });
16
+ return {
17
+ ...result.data.name === void 0 ? {} : { name: result.data.name },
18
+ ...result.data.symbol === void 0 ? {} : { symbol: result.data.symbol },
19
+ ...result.data.description === void 0 ? {} : { description: result.data.description },
20
+ ...result.data.image === void 0 ? {} : { image: result.data.image },
21
+ ...result.data.decimals === void 0 ? {} : { decimals: result.data.decimals },
22
+ ...result.data.uri === void 0 ? {} : { uri: result.data.uri }
23
+ };
24
+ }
25
+ function parseTokenMetadataJson(json) {
26
+ if (new TextEncoder().encode(json).byteLength > TOKEN_METADATA_MAX_BYTES) throw new TonPackageError("INVALID_METADATA", "Token metadata exceeds the size limit");
27
+ try {
28
+ return parseTokenMetadata(JSON.parse(json));
29
+ } catch (error) {
30
+ if (error instanceof TonPackageError) throw error;
31
+ throw new TonPackageError("INVALID_METADATA", "Token metadata is not valid JSON", { cause: String(error) });
32
+ }
33
+ }
34
+ //#endregion
35
+ export { parseTokenMetadata, parseTokenMetadataJson };
@@ -0,0 +1,24 @@
1
+ //#region src/core/network.d.ts
2
+ export declare const TON_NETWORKS: {
3
+ readonly mainnet: {
4
+ readonly network: "mainnet";
5
+ readonly explorerBaseUrl: "https://tonviewer.com";
6
+ };
7
+ readonly testnet: {
8
+ readonly network: "testnet";
9
+ readonly explorerBaseUrl: "https://testnet.tonviewer.com";
10
+ };
11
+ };
12
+ export type TonNetwork = keyof typeof TON_NETWORKS;
13
+ export interface TonNetworkConfig {
14
+ readonly network: TonNetwork;
15
+ readonly endpoint: string;
16
+ readonly explorerBaseUrl: string;
17
+ }
18
+ export declare function createNetworkConfig(input: {
19
+ network: TonNetwork;
20
+ endpoint: string;
21
+ explorerBaseUrl?: string;
22
+ }): TonNetworkConfig;
23
+ export declare function explorerAddressUrl(config: TonNetworkConfig, address: string): string;
24
+ //#endregion
@@ -0,0 +1,41 @@
1
+ import { TonPackageError } from "./errors.mjs";
2
+ //#region src/core/network.ts
3
+ const TON_NETWORKS = {
4
+ mainnet: {
5
+ network: "mainnet",
6
+ explorerBaseUrl: "https://tonviewer.com"
7
+ },
8
+ testnet: {
9
+ network: "testnet",
10
+ explorerBaseUrl: "https://testnet.tonviewer.com"
11
+ }
12
+ };
13
+ function createNetworkConfig(input) {
14
+ if (input.network !== "mainnet" && input.network !== "testnet") throw new TonPackageError("INVALID_NETWORK", "Unsupported TON network");
15
+ let endpoint;
16
+ try {
17
+ endpoint = new URL(input.endpoint);
18
+ } catch {
19
+ throw new TonPackageError("INVALID_NETWORK", "TON endpoint must be a valid URL");
20
+ }
21
+ if (endpoint.protocol !== "https:") throw new TonPackageError("INVALID_NETWORK", "TON endpoint must use HTTPS");
22
+ if (endpoint.username || endpoint.password) throw new TonPackageError("INVALID_NETWORK", "TON endpoint must not include embedded credentials");
23
+ const explorerInput = input.explorerBaseUrl ?? TON_NETWORKS[input.network].explorerBaseUrl;
24
+ let explorer;
25
+ try {
26
+ explorer = new URL(explorerInput);
27
+ } catch {
28
+ throw new TonPackageError("INVALID_NETWORK", "TON explorer URL must be a valid URL");
29
+ }
30
+ if (explorer.protocol !== "https:" || explorer.username || explorer.password) throw new TonPackageError("INVALID_NETWORK", "TON explorer URL must use HTTPS and must not include credentials");
31
+ return Object.freeze({
32
+ network: input.network,
33
+ endpoint: endpoint.toString(),
34
+ explorerBaseUrl: explorer.toString().replace(/\/$/, "")
35
+ });
36
+ }
37
+ function explorerAddressUrl(config, address) {
38
+ return `${config.explorerBaseUrl}/${encodeURIComponent(address)}`;
39
+ }
40
+ //#endregion
41
+ export { TON_NETWORKS, createNetworkConfig, explorerAddressUrl };