यह परीक्षण संस्करण है.

Mainnetपरीक्षण जेटन
TON Blockchain

Escrow Smart Contract

क्लाइंट और सेवा प्रदाता स्मार्ट कॉन्ट्रैक्ट में पैसा जमा करते हैं। काम पूरा होने और दोनों पक्षों के सहमत होने पर सेवा प्रदाता को भुगतान मिलता है।

यह कैसे काम करता है

अनुबंध तक पाँच कदम

एक आसान विज़ार्ड से स्मार्ट कॉन्ट्रैक्ट बनाएँ।

  1. कदम 1अनुबंध में भूमिकाअनुबंध में अपनी भूमिका चुनें। अनुबंध में केवल दो भूमिकाएँ हैं — क्लाइंट और सेवा प्रदाता। कोई तीसरा पक्ष मध्यस्थ नहीं है।
    9:41LTE

    अनुबंध में भूमिका

    अनुबंध में भूमिका

    क्लाइंट सेवा या सामान का ऑर्डर देने वाला है। वह 100% अग्रिम भुगतान करता है। साथ ही, चाहे तो 30% तक की वापसी योग्य जमा राशि भी।

    सेवा प्रदाता सेवा या सामान उपलब्ध कराने वाला है। वह अनुबंध राशि की वापसी योग्य जमा राशि (डिफ़ॉल्ट रूप से 30%) जमा करता है।

  2. कदम 2मुद्रा चुनेंअनुबंध की मुद्रा चुनें। GRAM — TON की मूल मुद्रा — तेज़ और छोटे सौदों के लिए है, क्योंकि यह काफ़ी अस्थिर है। USDT बड़े और लंबे सौदों के लिए अधिक स्थिर मुद्रा है।
    9:41LTE

    मुद्रा चुनें

    अनुबंध की मुद्रा

    GRAM — तेज़ निर्माण। आप एक ही लेन-देन में अनुबंध बनाकर तुरंत राशि जमा कर सकते हैं।

    USDT — दो चरणों में निर्माण। पहले अनुबंध बनाया जाता है (आपके वॉलेट में मूल मुद्रा GRAM होनी चाहिए, या वॉलेट गैसलेस लेन-देन का समर्थन करता हो; GRAM बेहतर है), फिर USDT जमा किया जाता है।USDT, GRAM की तुलना में कम अस्थिर है।

  3. कदम 3अनुबंध राशिचुनी गई मुद्रा में अनुबंध राशि दर्ज करें। काम पूरा होने के बाद यह राशि सेवा प्रदाता को ट्रांसफ़र की जाएगी।
    9:41LTE

    अनुबंध राशि

    GRAM

    अनुबंध राशि काम की कीमत है। इसे क्लाइंट जमा करता है।

    30%

    10% से 90% तक। डिफ़ॉल्ट: 30%।

    0,4%

    राशि का 0,4%, लेकिन 15 GRAM से अधिक नहीं।

  4. कदम 4वॉलेट पतेवॉलेट पते चिपकाएँ। आगे चलकर इन्हीं वॉलेट से पैसा जमा किया और निकाला जाएगा।
    9:41LTE

    वॉलेट पते

  5. कदम 5अनुबंध की जाँचडिप्लॉय से पहले अनुबंध का दर्ज किया गया डेटा जाँच लें।
    9:41LTE

    अनुबंध की जाँच

    अनुबंध की शर्तें
    मुद्रा
    GRAM
    अनुबंध राशि
    1 000 GRAM
    सेवा प्रदाता की जमा राशि
    300 GRAM · 30%
    सेवा शुल्क
    4 GRAM · 0,4%

बनाने के बाद

अनुबंध कार्ड

आप क्लाइंट हैं, मुद्रा USDT है। असली डैशबोर्ड जैसे ही कार्ड के छह स्नैपशॉट, हर कदम पर उपलब्ध सभी कार्रवाइयों के साथ।

  1. जमा का इंतज़ार
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    0 / 1 000
    सेवा प्रदाता
    0 / 300

    *साथ में अधिकतम 30% वापसी योग्य जमा राशि

    USDT

    अभी बनाया गया

    बैलेंस शून्य हैं। आप सौदे की राशि जमा कर सकते हैं, सीधे 30% तक अतिरिक्त राशि के साथ जमा कर सकते हैं, या जब तक किसी ने कुछ जमा नहीं किया है, अनुबंध हटा सकते हैं।

  2. जमा का इंतज़ार
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    1 000 / 1 000
    सेवा प्रदाता
    0 / 300

    *साथ में अधिकतम 30% वापसी योग्य जमा राशि

    USDT

    राशि जमा की, इंतज़ार है

    सौदे की राशि अनुबंध में है, सेवा प्रदाता की जमा राशि अभी नहीं आई है। जब तक स्थिति «सक्रिय» नहीं होती, आप अपना पैसा निकाल सकते हैं। 30% तक की अतिरिक्त राशि अभी भी जोड़ी जा सकती है।

  3. सक्रिय
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    1 000 / 1 000
    सेवा प्रदाता
    300 / 300
    USDT

    सेवा प्रदाता को सहमत होना होगा। राशि सौदे की राशि के पूर्ण प्रतिशत तक राउंड की जाएगी।

    *साथ में अधिकतम 30% वापसी योग्य जमा राशि

    USDT

    सेवा प्रदाता ने जमा किया

    तय की गई दोनों राशियाँ आ गई हैं — अनुबंध सक्रिय है। राशियाँ फ़्रीज़ हैं, USDT नहीं निकाला जा सकता। आप काम स्वीकार कर सकते हैं, दूसरा हिस्सा प्रस्तावित कर सकते हैं या अतिरिक्त जमा राशि (क्लाइंट की अतिरिक्त ज़मानत) जोड़ सकते हैं।

  4. सक्रिय
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    1 200 / 1 000 + 200 · 20%
    सेवा प्रदाता
    300 / 300
    USDT

    सेवा प्रदाता को सहमत होना होगा। राशि सौदे की राशि के पूर्ण प्रतिशत तक राउंड की जाएगी।

    *साथ में अधिकतम 30% वापसी योग्य जमा राशि

    USDT

    20% जमा राशि जोड़ी गई

    सौदे की राशि के ऊपर +200 USDT हैं। 30% की सीमा तक अभी 100 USDT और। निकासी अब भी बंद है: सक्रिय अनुबंध अनुबंध राशि और अतिरिक्त राशि को रोके रखता है।

  5. भुगतान प्रस्तावित 800 USDT
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    1 200 / 1 000 + 200 · 20%
    सेवा प्रदाता
    300 / 300
    USDT

    अभी 800 USDT · 80% प्रस्तावित है। इसे बदला जा सकता है।

    *साथ में अधिकतम 30% वापसी योग्य जमा राशि

    USDT

    सेवा प्रदाता को 80% प्रस्तावित किया।

    अगर सेवा प्रदाता सहमत होता है, तो उसे 800 USDT मिलेंगे। «काम स्वीकार करें» बटन गायब हो गया है; यह तभी वापस आएगा जब आप 100% सेट करेंगे। प्रस्ताव बदला जा सकता है और अतिरिक्त राशि बढ़ाई जा सकती है।

  6. पूरा हुआ 800 USDT
    1 000 USDT
    21.09.2026 का अनुबंध - EQDe…0001
    क्लाइंट (आप)
    400
    सेवा प्रदाता
    1 096

    सेवा प्रदाता सहमत हुआ

    अनुबंध पूरा हुआ: 800 USDT सेवा प्रदाता को गए, 4 USDT सेवा की रॉयल्टी है। आपके पास 400 USDT बचे हैं, जिन्हें निकाला जा सकता है।

Q&A

अक्सर पूछे जाने वाले सवाल

तीसरा पक्ष कहाँ है?

वह नहीं है। सेवा प्रदाता अपनी जमा राशि दाँव पर लगाता है। काम पूरा करना उसी के फ़ायदे में है।

डिफ़ॉल्ट रूप से सेवा प्रदाता की जमा राशि सौदे की राशि का 30% होती है। ऐसा लग सकता है कि उसे बढ़त है: वह 30% दाँव पर लगाता है और आप 100%। लेकिन मायने प्रतिशत नहीं, पैसे रखते हैं। उसके 30% उसका अपना पैसा है, और उसे खोना उसके लिए उतना ही दर्दनाक हो सकता है जितना आपके लिए अपने 100%। कोई भी अपना पैसा यूँ ही कुर्बान नहीं करता।

दूसरा जोखिम: क्लाइंट को काम मिल गया और वह पैसा न दे। तब दो विकल्प हैं। पहला — जब काम लगभग तैयार हो, पहले ही हिसाब करने का प्रस्ताव दें। दूसरा — क्लाइंट से राशि के ऊपर 30% तक अतिरिक्त राशि (जमा) रखने को कहें। अनुबंध पूरा होने के बाद क्लाइंट को उसकी जमा राशि वापस मिल जाएगी, इसलिए उसके पास सौदा (अनुबंध) बंद करने की वजह है।

मैं आप पर भरोसा क्यों करूँ?

भरोसा करने की ज़रूरत नहीं है। स्मार्ट कॉन्ट्रैक्ट सार्वजनिक है। आपके अनुबंध का पता उसके शुरुआती डेटा और कोड का हैश है। कोड बदला गया, तो पता अलग होगा।

इसे खोलकर देखा जा सकता है (उदाहरण के लिए Tonviewer में)। बस इतना है कि कोड समझना होगा — यही मुख्य समस्या है। लेकिन बदले में यह 100% सबूत है। आप कोड किसी AI मॉडल को भी दे सकते हैं। नीचे अनुबंध का कोड है, जितना हो सके उतनी सरल व्याख्या के साथ।

ContractUSDT

यह इंपोर्ट की सूची है: कॉन्स्टेंट और सहायक फ़ंक्शन।

contract_usdt.tolk
1import "@contracts/common-messages"
2import "@contracts/errors"
3import "@contracts/contract_USDT/usdt-utils"
4import "fees-management"
5import "messages"
6import "storage"

अनुबंध का संक्षिप्त विवरण।

8contract ContractUSDT {
9 author: "Alexandr_K"
10 version: "0.0.4"
11 description: "Escrow contract USDT"
12 storage: StorageUsdt
13 incomingMessages: AllowedMessage
14}

अनुबंध के साथ उपलब्ध कार्रवाइयों की सूची।

16type AllowedMessage =
17 | TransferNotificationForRecipient
18 | ChangePercent
19 | AcceptPercent
20 | RefundUsdt
21 | ErrRefund
22 | ErrMode
23 | BurnContract

सहायक फ़ंक्शन: अनुबंध सक्रिय है या नहीं। जब सभी अपनी राशि जमा कर देते हैं, तो अनुबंध सक्रिय हो जाता है — फिर पैसा यूँ ही नहीं निकाला जा सकता।

28fun StorageUsdt.isActive(self, extra: ExtraFieldsUsdt): bool {
29 if (extra.completed) {
30 return false;
31 }
32 return self.clientAmount >= extra.clientAmountInit &&
33 self.providerDeposit >= extra.providerDepositInit;
34}

बची हुई राशि के लिए फ़ंक्शन। हर संदेश के साथ लेन-देन प्रोसेस करने के लिए थोड़ा GRAM भेजा जाता है। जो बचता है, यह फ़ंक्शन लौटा देता है।

67fun sendExcessesTon(to: address, amount: coins) {
68 if (amount > MIN_MESSAGE_VALUE_BOUND) {
69 val excessesMsg = createMessage({
70 bounce: BounceMode.NoBounce,
71 dest: to,
72 value: amount,
73 });
74 excessesMsg.send(SEND_MODE_IGNORE_ERRORS);
75 }
76}

जेटन वॉलेट का पता निकालता है। यह अनुबंध के पते पर निर्भर करता है।

78fun contractUsdtWallet(): address {
79 return calcAddressOfJettonWallet(contract.getAddress());
80}

अगर ट्रांसफ़र विफल हो जाए — पैसा लौट आता है, और अनुबंध रिकॉर्ड ठीक कर देता है: किसके पास कितना है।

105fun onBouncedMessage(in: InMessageBounced) {
106 in.bouncedBody.skipBouncedPrefix();
107 val msg = lazy BounceOpToHandle.fromSlice(in.bouncedBody);
108 var storage = lazy StorageUsdt.load();
109 match (msg) {
110 TransferBounce => {
111 if (msg.queryId == QueryRole.Client as uint64) {
112 storage.clientAmount += msg.jettonAmount;
113 } else if (msg.queryId == QueryRole.Provider as uint64) {
114 storage.providerDeposit += msg.jettonAmount;
115 } else if (msg.queryId == QueryRole.Admin as uint64) {
116 var extra: ExtraFieldsUsdt = lazy storage.extra.load();
117 extra.royaltyInit += msg.jettonAmount;
118 storage.extra = extra.toCell();
119 } else {
120 // ErrRefund (QueryRole.None) и неизвестные id: учёт не уменьшали
121 return;
122 }
123 }
124 }
125 storage.save();
126}

अगर संदेश का बॉडी खाली है — कुछ नहीं करते।

131fun onInternalMessage(in: InMessage) {
132 if (in.body.isEmpty()) {
133 return;
134 }

आगे वेरिएबल की घोषणा है।

137val msg = lazy AllowedMessage.fromSlice(in.body);
138var storage: StorageUsdt = lazy StorageUsdt.load();
139val tonBalanceBeforeMsg = contract.getOriginalBalance() - in.valueCoins;
140val storageFee = MIN_TONS_FOR_STORAGE_THIS_CONTRACT -
141min(tonBalanceBeforeMsg, MIN_TONS_FOR_STORAGE_THIS_CONTRACT);
142var msgValue = in.valueCoins - storageFee - CONTRACT_GAS_CONSUMPTION;

USDT टॉप-अप: ट्रांसफ़र स्वीकार करता है और रिकॉर्ड करता है कि किसके पास कितना USDT है।

145TransferNotificationForRecipient => {
146 assert (in.senderAddress == contractUsdtWallet()) throw Errors.InvalidWallet;
147 assert (msg.transferInitiator != null) throw Errors.InvalidData;
148 if (msg.transferInitiator == storage.clientAddress) {
149 storage.clientAmount += msg.jettonAmount;
150 storage.save();
151 } else if (msg.transferInitiator == storage.providerAddress) {
152 storage.providerDeposit += msg.jettonAmount;
153 storage.save();
154 }
155 sendExcessesTon(msg.transferInitiator, msgValue);
156}

भुगतान का प्रतिशत बदलता है। काम केवल आधा हुआ है — 50% प्रस्तावित किया जा सकता है। सेवा प्रदाता सहमत हुआ — अनुबंध पूरा। नहीं — आगे बातचीत करें।

162ChangePercent => {
163 assert (msgValue > 0) throw Errors.NotEnoughGas;
164 assert (in.senderAddress == storage.clientAddress) throw Errors.UnauthorizedSender;
165 assert (msg.percent >= 0 && msg.percent <= 100) throw Errors.WrongPercent;
166 var extra: ExtraFieldsUsdt = lazy storage.extra.load();
167 assert (extra.completed == false) throw Errors.ContractIsCompleted;
168 assert (storage.isActive(extra)) throw Errors.ContractIsNotActive;
169 extra.percent = msg.percent;
170 if (msg.percent == 100) {
171 extra.completed = true;
172 storage.providerDeposit += extra.clientAmountInit - extra.royaltyInit;
173 storage.clientAmount -= extra.clientAmountInit;
174 }
175 storage.extra = extra.toCell();
176 storage.save();
177 sendExcessesTon(in.senderAddress, msgValue);
178}

अगर सेवा प्रदाता सहमत होता है, तो अनुबंध उसे उसका हिस्सा और जमा राशि देता है, बाकी आपको। 0% पर पूरा सौदा रद्द हो जाता है, सभी को अपना पैसा वापस मिल जाता है। इस स्थिति में अनुबंध को 0.4% शुल्क नहीं दिया जाता।

183AcceptPercent => {
184 assert (msgValue > 0) throw Errors.NotEnoughGas;
185 assert (in.senderAddress == storage.providerAddress) throw Errors.UnauthorizedSender;
186 var extra: ExtraFieldsUsdt = lazy storage.extra.load();
187 assert (extra.completed == false) throw Errors.ContractIsCompleted;
188 assert (extra.percent != 100) throw Errors.WrongPercent;
189 assert (msg.percent == extra.percent) throw Errors.WrongPercent;
190 extra.completed = true;
191 val percentValue = extra.clientAmountInit / 100 * msg.percent;
192 if (msg.percent == 0) {
193 extra.royaltyInit = 0;
194 }
195 storage.providerDeposit += percentValue - extra.royaltyInit;
196 storage.clientAmount -= percentValue;
197 storage.extra = extra.toCell();
198 storage.save();
199 sendExcessesTon(in.senderAddress, msgValue);
200}

सबसे बड़ा ब्लॉक — पैसे की वापसी को संभालता है।

208RefundUsdt => {
209 msgValue -= (MIN_MESSAGE_VALUE_BOUND + MIN_FORWARD_TON_AMOUNT);
210 assert (msgValue > 0) throw Errors.NotEnoughGas;
211 assert (msg.jettonAmount > 0) throw Errors.InvalidData;
212 var extra: ExtraFieldsUsdt = lazy storage.extra.load();
213 val transferRecipient: address = msg.addressRefund != null
214 ? msg.addressRefund
215 : in.senderAddress;
216 val isActive = storage.isActive(extra);
217 var queryId: uint64;
218 var jettonAmount: coins;
219 if (in.senderAddress == storage.clientAddress) {
220 queryId = QueryRole.Client;
221 if (isActive) {
222 val deposit: uint72 = (extra.clientAmountInit / 100) * 30;
223 val locked = extra.clientAmountInit + deposit;
224 assert (storage.clientAmount > locked) throw Errors.NotEnoughJettons;
225 jettonAmount = min(storage.clientAmount - locked, msg.jettonAmount);
226 } else {
227 jettonAmount = min(storage.clientAmount, msg.jettonAmount);
228 }
229 storage.clientAmount -= jettonAmount;
230 } else if (in.senderAddress == storage.providerAddress) {
231 queryId = QueryRole.Provider;
232 if (isActive) {
233 assert (
234 storage.providerDeposit > extra.providerDepositInit
235 ) throw Errors.NotEnoughJettons;
236 jettonAmount = min(
237 storage.providerDeposit - extra.providerDepositInit,
238 msg.jettonAmount,
239 );
240 } else {
241 jettonAmount = min(storage.providerDeposit, msg.jettonAmount);
242 }
243 storage.providerDeposit -= jettonAmount;
244 } else if (in.senderAddress == extra.adminAddress) {
245 queryId = QueryRole.Admin;
246 val maxRefundUsdt: uint72 = extra.completed ? extra.royaltyInit : 0;
247 jettonAmount = min(maxRefundUsdt, msg.jettonAmount);
248 extra.royaltyInit -= jettonAmount;
249 storage.extra = extra.toCell();
250 } else {
251 throw Errors.UnauthorizedSender;
252 }
253 assert (jettonAmount > 0) throw Errors.NotEnoughJettons;
254 storage.save();
255 sendAskToTransferUsdt(
256 queryId,
257 jettonAmount,
258 transferRecipient,
259 msgValue + MIN_MESSAGE_VALUE_BOUND + MIN_FORWARD_TON_AMOUNT,
260 );
261}

त्रुटि मोड। अगर वॉलेट खो गया या पैसा रिकॉर्ड से बाहर चला गया, तो एक पक्ष नियंत्रण दूसरे पक्ष को सौंप सकता है। «रिकॉर्ड से बाहर» वाली स्थिति, सच कहें तो, असंभव है, जब तक जानबूझकर ऐसा न किया जाए। फिर भी यह विकल्प रहे। वहीं वॉलेट भूल जाना या खो देना पूरी तरह संभव है।

271ErrMode => {
272 assert (msgValue > 0) throw Errors.NotEnoughGas;
273 var extra: ExtraFieldsUsdt = lazy storage.extra.load();
274 var noticeTo: address? = null;
275 var noticeAboutClient: bool = false;
276 if (in.senderAddress == storage.clientAddress) {
277 if (msg.value == ErrModeVal.ProviderFullRights as int8) {
278 extra.errMode = ErrModeVal.ProviderFullRights;
279 } else if (msg.value == ErrModeVal.BlockErrorMode as int8) {
280 extra.errMode = ErrModeVal.BlockErrorMode;
281 } else if (
282 msg.value == ErrModeVal.ClientFullRightsAfterHalfYear as int8 &&
283 extra.errMode != ErrModeVal.BlockErrorMode as int8
284 ) {
285 extra.errMode = ErrModeVal.ClientFullRightsAfterHalfYear;
286 extra.errModeAt = blockchain.now() as uint64;
287 noticeTo = storage.providerAddress;
288 noticeAboutClient = true;
289 }
290 } else if (in.senderAddress == storage.providerAddress) {
291 if (msg.value == ErrModeVal.ClientFullRights as int8) {
292 extra.errMode = ErrModeVal.ClientFullRights;
293 } else if (msg.value == ErrModeVal.BlockErrorMode as int8) {
294 extra.errMode = ErrModeVal.BlockErrorMode;
295 } else if (
296 msg.value == ErrModeVal.ProviderFullRightsAfterHalfYear as int8 &&
297 extra.errMode != ErrModeVal.BlockErrorMode as int8
298 ) {
299 extra.errMode = ErrModeVal.ProviderFullRightsAfterHalfYear;
300 extra.errModeAt = blockchain.now() as uint64;
301 noticeTo = storage.clientAddress;
302 noticeAboutClient = false;
303 }
304 } else {
305 throw Errors.UnauthorizedSender;
306 }
307 if (noticeTo != null) {
308 assert (msgValue > HALF_YEAR_NOTICE_VALUE) throw Errors.NotEnoughGas;
309 msgValue -= HALF_YEAR_NOTICE_VALUE;
310 }
311 storage.extra = extra.toCell();
312 storage.save();
313 if (noticeTo != null) {
314 sendHalfYearControlNotice(noticeTo, noticeAboutClient);
315 }
316 sendExcessesTon(in.senderAddress, msgValue);
317}
10enum ErrModeVal {
11 ClientFullRights = 1
12 ProviderFullRights = 2
13 ClientFullRightsAfterHalfYear = 16 // клиент получает полные права через полгода
14 ProviderFullRightsAfterHalfYear = 26 // исполнитель — через полгода
15 BlockErrorMode = 99
16}

ErrRefund — उन जेटन की आपातकालीन निकासी जो बिना सूचना के आए और रिकॉर्ड में नहीं आए। या जब वॉलेट खो गया हो (सही कहें तो उसका पासवर्ड खो गया हो)।

321ErrRefund => {
322 msgValue -= (MIN_MESSAGE_VALUE_BOUND + MIN_FORWARD_TON_AMOUNT);
323 assert (msgValue > 0) throw Errors.NotEnoughGas;
324 assert (msg.jettonAmount > 0) throw Errors.InvalidData;
325 val extra: ExtraFieldsUsdt = lazy storage.extra.load();
326 if (
327 !extra.allowsErrRefund(
328 in.senderAddress,
329 storage.clientAddress,
330 storage.providerAddress,
331 )
332 ) {
333 throw Errors.UnauthorizedSender;
334 }
335 val transferRecipient: address = msg.addressRefund != null
336 ? msg.addressRefund
337 : in.senderAddress;
338 sendAskToTransferUsdt(
339 QueryRole.None,
340 msg.jettonAmount as coins,
341 transferRecipient,
342 msgValue + MIN_MESSAGE_VALUE_BOUND + MIN_FORWARD_TON_AMOUNT,
343 );
344}
36fun ExtraFieldsUsdt.allowsErrRefund(
37 self,
38 sender: address,
39 client: address,
40 provider: address,
41): bool {
42 if (sender == client) {
43 if (self.errMode == ErrModeVal.ClientFullRights as int8) {
44 return true;
45 }
46 return self.errMode == ErrModeVal.ClientFullRightsAfterHalfYear as int8 &&
47 (blockchain.now() as uint64) >= self.errModeAt + HALF_YEAR;
48 }
49 if (sender == provider) {
50 if (self.errMode == ErrModeVal.ProviderFullRights as int8) {
51 return true;
52 }
53 return self.errMode == ErrModeVal.ProviderFullRightsAfterHalfYear as int8 &&
54 (blockchain.now() as uint64) >= self.errModeAt + HALF_YEAR;
55 }
56 return false;
57}

Burn — अनुबंध को नष्ट करना, ताकि खाली खोल नेटवर्क में न पड़ा रहे। इसे वही बर्न कर सकता है जिसने इसे बनाया (क्लाइंट या सेवा प्रदाता) या एडमिन — और केवल तब जब क्लाइंट और सेवा प्रदाता दोनों के बैलेंस शून्य हों।

351BurnContract => {
352 assert (msgValue > 0) throw Errors.NotEnoughGas;
353 val extra: ExtraFieldsUsdt = lazy storage.extra.load();
354 val deployer = extra.deployerAddress(storage.clientAddress, storage.providerAddress);
355 assert (
356 in.senderAddress == deployer || in.senderAddress == extra.adminAddress
357 ) throw Errors.UnauthorizedSender;
358 assert (
359 storage.clientAmount == 0 && storage.providerDeposit == 0
360 ) throw Errors.BalancesNotEmpty;
361 if (extra.completed && extra.royaltyInit > 0) {
362 val jettonTon = MIN_MESSAGE_VALUE_BOUND + MIN_FORWARD_TON_AMOUNT;
363 msgValue -= jettonTon;
364 assert (msgValue > 0) throw Errors.NotEnoughGas;
365 sendAskToTransferUsdt(
366 QueryRole.Admin,
367 extra.royaltyInit as coins,
368 extra.adminAddress,
369 msgValue + jettonTon,
370 );
371 }
372 val burn = createMessage({
373 bounce: BounceMode.NoBounce,
374 dest: in.senderAddress,
375 value: 0,
376 });
377 burn.send(SEND_MODE_CARRY_ALL_BALANCE | SEND_MODE_DESTROY);
378}
59fun ExtraFieldsUsdt.deployerAddress(self, client: address, provider: address): address {
60 if (self.mode == QueryRole.Client as int8) {
61 return client;
62 }
63 assert (self.mode == QueryRole.Provider as int8) throw Errors.UnauthorizedSender;
64 return provider;
65}

तीनों अनुबंधों का सत्यापित स्रोत कोड। कोड का हैश नेटवर्क पर मौजूद कोड से मेल खाता है। हर लिंक स्रोत को TON Verifier पर खोलता है।

ContractMinterContractUSDTContractTON