@pizzaton/ton 0.0.0-stage → 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/CONTRACTS.md +239 -0
- package/README.md +505 -2
- package/dist/airdrop/index.d.mts +18 -0
- package/dist/airdrop/index.mjs +86 -0
- package/dist/connect/errors.d.mts +4 -0
- package/dist/connect/errors.mjs +21 -0
- package/dist/connect/index.d.mts +23 -0
- package/dist/connect/index.mjs +34 -0
- package/dist/contracts/catalog/index.d.mts +361 -0
- package/dist/contracts/catalog/index.mjs +403 -0
- package/dist/contracts/client.d.mts +18 -0
- package/dist/contracts/client.mjs +31 -0
- package/dist/contracts/codecs.d.mts +14 -0
- package/dist/contracts/codecs.mjs +61 -0
- package/dist/contracts/hipo.d.mts +138 -0
- package/dist/contracts/hipo.mjs +198 -0
- package/dist/contracts/index.d.mts +23 -0
- package/dist/contracts/index.mjs +20 -0
- package/dist/contracts/metadata.d.mts +38 -0
- package/dist/contracts/metadata.mjs +50 -0
- package/dist/contracts/module-client.d.mts +20 -0
- package/dist/contracts/module-client.mjs +34 -0
- package/dist/contracts/module.d.mts +8 -0
- package/dist/contracts/module.mjs +11 -0
- package/dist/contracts/wrappers/base.d.mts +18 -0
- package/dist/contracts/wrappers/base.mjs +31 -0
- package/dist/contracts/wrappers/index.d.mts +12 -0
- package/dist/contracts/wrappers/index.mjs +12 -0
- package/dist/contracts/wrappers/jvault-protocols.d.mts +206 -0
- package/dist/contracts/wrappers/jvault-protocols.mjs +432 -0
- package/dist/contracts/wrappers/jvault-support.d.mts +135 -0
- package/dist/contracts/wrappers/jvault-support.mjs +269 -0
- package/dist/contracts/wrappers/jvault.d.mts +123 -0
- package/dist/contracts/wrappers/jvault.mjs +258 -0
- package/dist/contracts/wrappers/memeland.d.mts +253 -0
- package/dist/contracts/wrappers/memeland.mjs +396 -0
- package/dist/contracts/wrappers/multix.d.mts +92 -0
- package/dist/contracts/wrappers/multix.mjs +156 -0
- package/dist/contracts/wrappers/pizzabox.d.mts +66 -0
- package/dist/contracts/wrappers/pizzabox.mjs +105 -0
- package/dist/contracts/wrappers/ton-raffles.d.mts +215 -0
- package/dist/contracts/wrappers/ton-raffles.mjs +398 -0
- package/dist/contracts/wrappers/tonresistor.d.mts +189 -0
- package/dist/contracts/wrappers/tonresistor.mjs +276 -0
- package/dist/core/address.d.mts +31 -0
- package/dist/core/address.mjs +53 -0
- package/dist/core/amount.d.mts +8 -0
- package/dist/core/amount.mjs +34 -0
- package/dist/core/bytes.d.mts +5 -0
- package/dist/core/bytes.mjs +18 -0
- package/dist/core/constants.d.mts +14 -0
- package/dist/core/constants.mjs +15 -0
- package/dist/core/errors.d.mts +9 -0
- package/dist/core/errors.mjs +16 -0
- package/dist/core/http.mjs +39 -0
- package/dist/core/index.d.mts +8 -0
- package/dist/core/index.mjs +8 -0
- package/dist/core/metadata.d.mts +12 -0
- package/dist/core/metadata.mjs +35 -0
- package/dist/core/network.d.mts +24 -0
- package/dist/core/network.mjs +41 -0
- package/dist/emulator/index.d.mts +20 -0
- package/dist/emulator/index.mjs +24 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.mjs +19 -0
- package/dist/indexer/index.d.mts +90 -0
- package/dist/indexer/index.mjs +279 -0
- package/dist/jetton/details.d.mts +27 -0
- package/dist/jetton/details.mjs +116 -0
- package/dist/jetton/index.d.mts +54 -0
- package/dist/jetton/index.mjs +92 -0
- package/dist/jetton/versions.d.mts +12 -0
- package/dist/jetton/versions.mjs +50 -0
- package/dist/nft/collection.d.mts +57 -0
- package/dist/nft/collection.mjs +148 -0
- package/dist/nft/content.d.mts +34 -0
- package/dist/nft/content.mjs +142 -0
- package/dist/nft/index.d.mts +35 -0
- package/dist/nft/index.mjs +51 -0
- package/dist/nft/versions.d.mts +11 -0
- package/dist/nft/versions.mjs +29 -0
- package/dist/proof/index.d.mts +62 -0
- package/dist/proof/index.mjs +227 -0
- package/dist/provider/index.d.mts +32 -0
- package/dist/provider/index.mjs +1 -0
- package/dist/react/index.d.mts +13 -0
- package/dist/react/index.mjs +48 -0
- package/dist/server/index.d.mts +11 -0
- package/dist/server/index.mjs +55 -0
- package/dist/simulation/index.d.mts +112 -0
- package/dist/simulation/index.mjs +310 -0
- package/dist/transactions/index.d.mts +33 -0
- package/dist/transactions/index.mjs +51 -0
- package/dist/vesting/index.d.mts +12 -0
- package/dist/vesting/index.mjs +25 -0
- package/dist/wallet/index.d.mts +23 -0
- package/dist/wallet/index.mjs +71 -0
- package/package.json +176 -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,31 @@
|
|
|
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 interface ParsedFriendlyTonAddress {
|
|
8
|
+
readonly address: Address;
|
|
9
|
+
readonly isBounceable: boolean;
|
|
10
|
+
readonly isTestOnly: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseTonAddress(value: string | Address): Address;
|
|
13
|
+
export declare function parseFriendlyTonAddress(value: string): ParsedFriendlyTonAddress;
|
|
14
|
+
export declare function toTonAddress(value: string | Address): TonAddress;
|
|
15
|
+
export declare function addressesEqual(left: string | Address, right: string | Address): boolean;
|
|
16
|
+
export declare function toFriendlyAddress(value: string | Address, options?: {
|
|
17
|
+
network?: TonNetwork;
|
|
18
|
+
bounceable?: boolean;
|
|
19
|
+
}): string;
|
|
20
|
+
/**
|
|
21
|
+
* Returns a compact, user-facing TON address while preserving the friendly
|
|
22
|
+
* (base64url) representation used by wallets and explorers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function shortenTonAddress(value: string | Address, options?: {
|
|
25
|
+
network?: TonNetwork;
|
|
26
|
+
bounceable?: boolean;
|
|
27
|
+
prefixLength?: number;
|
|
28
|
+
suffixLength?: number;
|
|
29
|
+
}): string;
|
|
30
|
+
export declare function assertWorkchain(value: string | Address, workchain: number): void;
|
|
31
|
+
//#endregion
|
|
@@ -0,0 +1,53 @@
|
|
|
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 parseFriendlyTonAddress(value) {
|
|
14
|
+
if (typeof value !== "string") throw new TonPackageError("INVALID_ADDRESS", "Invalid friendly TON address");
|
|
15
|
+
try {
|
|
16
|
+
return Address.parseFriendly(value.trim());
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw new TonPackageError("INVALID_ADDRESS", "Invalid friendly TON address", { cause: String(error) });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function toTonAddress(value) {
|
|
22
|
+
return parseTonAddress(value).toRawString();
|
|
23
|
+
}
|
|
24
|
+
function addressesEqual(left, right) {
|
|
25
|
+
return parseTonAddress(left).equals(parseTonAddress(right));
|
|
26
|
+
}
|
|
27
|
+
function toFriendlyAddress(value, options = {}) {
|
|
28
|
+
invariant(options.network === void 0 || options.network === "mainnet" || options.network === "testnet", "INVALID_NETWORK", "Unsupported TON network");
|
|
29
|
+
return parseTonAddress(value).toString({
|
|
30
|
+
urlSafe: true,
|
|
31
|
+
bounceable: options.bounceable ?? true,
|
|
32
|
+
testOnly: options.network === "testnet"
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns a compact, user-facing TON address while preserving the friendly
|
|
37
|
+
* (base64url) representation used by wallets and explorers.
|
|
38
|
+
*/
|
|
39
|
+
function shortenTonAddress(value, options = {}) {
|
|
40
|
+
const friendlyAddress = toFriendlyAddress(value, options);
|
|
41
|
+
const prefixLength = options.prefixLength ?? 6;
|
|
42
|
+
const suffixLength = options.suffixLength ?? 4;
|
|
43
|
+
invariant(Number.isSafeInteger(prefixLength) && prefixLength >= 0, "INVALID_ADDRESS", "Address prefix length must be a non-negative safe integer");
|
|
44
|
+
invariant(Number.isSafeInteger(suffixLength) && suffixLength >= 0, "INVALID_ADDRESS", "Address suffix length must be a non-negative safe integer");
|
|
45
|
+
if (friendlyAddress.length <= prefixLength + suffixLength + 1) return friendlyAddress;
|
|
46
|
+
return `${friendlyAddress.slice(0, prefixLength)}…${friendlyAddress.slice(-suffixLength)}`;
|
|
47
|
+
}
|
|
48
|
+
function assertWorkchain(value, workchain) {
|
|
49
|
+
const address = parseTonAddress(value);
|
|
50
|
+
invariant(address.workChain === workchain, "INVALID_ADDRESS", `Expected workchain ${workchain}, received ${address.workChain}`);
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { addressesEqual, assertWorkchain, parseFriendlyTonAddress, 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,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 { ParsedFriendlyTonAddress, TonAddress, addressesEqual, assertWorkchain, parseFriendlyTonAddress, 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, ParsedFriendlyTonAddress, TON_NETWORKS, TokenMetadata, TonAddress, TonErrorCode, TonNetwork, TonNetworkConfig, TonPackageError, addressesEqual, assertTonAmount, assertWorkchain, bytesToBase64, bytesToHex, createNetworkConfig, explorerAddressUrl, formatTon, formatUnits, hexToBytes, invariant, parseFriendlyTonAddress, parseTokenMetadata, parseTokenMetadataJson, parseTon, parseTonAddress, parseUnits, shortenTonAddress, toFriendlyAddress, toTonAddress };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TonPackageError, invariant } from "./errors.mjs";
|
|
2
|
+
import { addressesEqual, assertWorkchain, parseFriendlyTonAddress, 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, parseFriendlyTonAddress, 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
|