From fd33d01be0122d5ca6e23203db60a285364418fb Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Thu, 27 Feb 2025 19:04:15 +0300 Subject: [PATCH 1/8] Head article --- .../guidelines/quick-start/getting-started.md | 162 ++++++++++++++++++ sidebars/guidelines.js | 9 + 2 files changed, 171 insertions(+) create mode 100644 docs/v3/guidelines/quick-start/getting-started.md diff --git a/docs/v3/guidelines/quick-start/getting-started.md b/docs/v3/guidelines/quick-start/getting-started.md new file mode 100644 index 00000000000..c4efbe75585 --- /dev/null +++ b/docs/v3/guidelines/quick-start/getting-started.md @@ -0,0 +1,162 @@ +# Getting started + +Welcome to The Open Network (TON) quick start guide! This guide will give you starting point for further research of TON concepts and basic practical expereince of developing application with TON exosystem. + +## Prerequisites + +- Basic programming knowledge. +- Around __30 minutes__ of your time. + +> **Note**: We will provide short explanation of core concets during guide, but if you prefer nore theoretical approuch you can checkout core concepts of TON blockhain here: [TON blockhain](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains). + +## What You'll Learn + +- Interact with TON ecosystem: Wallets and explorers. +- Setup development environment: use Blueprint SDK for developing smart-contracts using FunC, Tact and Tolk +- Send transactions and read from blockhain using your prefered programming language and availible SDK's +- Core concepts of TON blockhain and further learning-curve. +- Basic templates ready for implementation your project logick. + +### Creating a TON Wallet with TonKeeper + +1. Download [TonKeeper](https://tonkeeper.com/) from your device's app store +2. Open the app and select "Create Wallet" +3. Follow the instructions to create a new wallet +4. **IMPORTANT**: Write down your recovery phrase and store it securely. This is the only way to restore your wallet if you lose access. + +### Sending Messages and Using Devnet + +TonKeeper allows you to send transactions and messages on the TON blockchain: + +1. To send TON coins, tap the "Send" button +2. Enter the recipient's address or scan their QR code +3. Enter the amount and confirm the transaction + +For developers testing applications: + +1. Go to Settings > Features +2. Enable Developer Mode +3. Go back to Settings and select "Network" +4. Switch from "Mainnet" to "Testnet" to use the development network +5. You can request test TON coins from a [testnet faucet](https://t.me/testgiver_ton_bot) + +### Exploring the Blockchain with TonViewer + +[TonViewer](https://tonviewer.com/) is a blockchain explorer that allows you to: + +1. Check transaction history of any address +2. Verify contract deployments +3. Inspect smart contract data +4. Monitor network activity + +To use TonViewer: + +1. Visit [tonviewer.com](https://tonviewer.com/) +2. Enter an address, transaction ID, or block hash in the search bar +3. For development purposes, make sure to switch to "Testnet" view when testing applications + +## For Developers: Setting Up Your Development Environment + +### Installing Node.js and TON SDK + +1. Install Node.js (version 16 or later recommended): +- Linux: `sudo apt update && sudo apt install nodejs npm` +- macOS with Homebrew: `brew install node` +- Windows: Download from [nodejs.org](https://nodejs.org/) + +2. Verify installation: +```bash +node --version +npm --version +``` + +3. Install TON SDK: +```bash +npm install --global @ton/ton +``` + +### Setting Up Blueprint for Smart Contract Development + +[Blueprint](https://github.com/ton-community/blueprint) is a development environment for TON smart contracts: + +1. Install Blueprint: +```bash +npm install --global @ton/blueprint +``` + +2. Create a new project: +```bash +mkdir my-ton-project +cd my-ton-project +npx @ton/blueprint create +``` + +3. Follow the interactive prompts to set up your project + +## Your First TON Project: Hello World + +### Creating a Simple Smart Contract + +Let's create a simple "Hello World" contract that stores a greeting message and allows anyone to read it. + +1. If you haven't already, create a new Blueprint project: +```bash +npx @ton/blueprint create hello-world +``` + +2. Navigate to your project: +```bash +cd hello-world +``` + +3. Create a new contract in the `contracts` directory. Here's a simple example in FunC: + +```func +;; Simple Hello World Contract + +() recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure { + ;; Accept any incoming message +} + +(slice) get_greeting() method_id { + return "Hello, TON!"; +} +``` + +### Deploying to the TON Blockchain +1. Compile your contract: +```bash +npx @ton/blueprint build +``` + +2. Run the deploy script: +```bash +npx @ton/blueprint run +``` + +3. Select the deployment script and follow the prompts + +### Interacting with Your Contract + +Once deployed, you can interact with your contract: + +1. Run a script to call the `get_greeting` method: +```bash +npx @ton/blueprint run +``` + +2. Select your script to get the greeting + +## Next Steps + +Congratulations! You've set up your TON development environment and deployed your first smart contract. Here are some next steps to continue your journey: + +- Explore more complex smart contract examples in the [TON examples repository](https://github.com/ton-community/ton-docs/tree/main/examples) +- Learn about [TON virtual machine (TVM)](../../../develop/smart-contracts/environment/tvm-overview) for more advanced contract development +- Dive into [FunC programming language](../../../develop/smart-contracts/sdk/func) for writing efficient contracts +- Discover [TON payments](../../../develop/dapps/asset-processing/payments) integration for applications + +Happy building on TON! + + + diff --git a/sidebars/guidelines.js b/sidebars/guidelines.js index 2dcccd68d12..f146947691c 100644 --- a/sidebars/guidelines.js +++ b/sidebars/guidelines.js @@ -33,6 +33,15 @@ module.exports = [ 'type': 'html', 'value': '
', }, + { + 'type': 'html', + 'value': ' Quick Start ', + }, + 'v3/guidelines/quick-start/getting-started', + { + 'type': 'html', + 'value': '
', + }, { 'type': 'html', 'value': ' Smart Contracts Guidelines ', From 5fbab32b6a19a79d2f52761f4df1c65d51cd47c3 Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Fri, 28 Feb 2025 20:46:00 +0300 Subject: [PATCH 2/8] Finishing Head Article, except Next steps --- .../guidelines/quick-start/getting-started.md | 162 ------------------ .../quick-start/getting-started.mdx | 93 ++++++++++ static/img/tutorials/quick-start/active.png | Bin 0 -> 85642 bytes .../img/tutorials/quick-start/explorer1.png | Bin 0 -> 25073 bytes static/img/tutorials/quick-start/nonexist.png | Bin 0 -> 62145 bytes .../quick-start/switch-to-testnet1.jpg | Bin 0 -> 27563 bytes .../quick-start/switch-to-testnet2.jpg | Bin 0 -> 49932 bytes static/img/tutorials/quick-start/uninit.png | Bin 0 -> 62563 bytes .../tutorials/quick-start/wallet-address.jpg | Bin 0 -> 54904 bytes 9 files changed, 93 insertions(+), 162 deletions(-) delete mode 100644 docs/v3/guidelines/quick-start/getting-started.md create mode 100644 docs/v3/guidelines/quick-start/getting-started.mdx create mode 100644 static/img/tutorials/quick-start/active.png create mode 100644 static/img/tutorials/quick-start/explorer1.png create mode 100644 static/img/tutorials/quick-start/nonexist.png create mode 100644 static/img/tutorials/quick-start/switch-to-testnet1.jpg create mode 100644 static/img/tutorials/quick-start/switch-to-testnet2.jpg create mode 100644 static/img/tutorials/quick-start/uninit.png create mode 100644 static/img/tutorials/quick-start/wallet-address.jpg diff --git a/docs/v3/guidelines/quick-start/getting-started.md b/docs/v3/guidelines/quick-start/getting-started.md deleted file mode 100644 index c4efbe75585..00000000000 --- a/docs/v3/guidelines/quick-start/getting-started.md +++ /dev/null @@ -1,162 +0,0 @@ -# Getting started - -Welcome to The Open Network (TON) quick start guide! This guide will give you starting point for further research of TON concepts and basic practical expereince of developing application with TON exosystem. - -## Prerequisites - -- Basic programming knowledge. -- Around __30 minutes__ of your time. - -> **Note**: We will provide short explanation of core concets during guide, but if you prefer nore theoretical approuch you can checkout core concepts of TON blockhain here: [TON blockhain](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains). - -## What You'll Learn - -- Interact with TON ecosystem: Wallets and explorers. -- Setup development environment: use Blueprint SDK for developing smart-contracts using FunC, Tact and Tolk -- Send transactions and read from blockhain using your prefered programming language and availible SDK's -- Core concepts of TON blockhain and further learning-curve. -- Basic templates ready for implementation your project logick. - -### Creating a TON Wallet with TonKeeper - -1. Download [TonKeeper](https://tonkeeper.com/) from your device's app store -2. Open the app and select "Create Wallet" -3. Follow the instructions to create a new wallet -4. **IMPORTANT**: Write down your recovery phrase and store it securely. This is the only way to restore your wallet if you lose access. - -### Sending Messages and Using Devnet - -TonKeeper allows you to send transactions and messages on the TON blockchain: - -1. To send TON coins, tap the "Send" button -2. Enter the recipient's address or scan their QR code -3. Enter the amount and confirm the transaction - -For developers testing applications: - -1. Go to Settings > Features -2. Enable Developer Mode -3. Go back to Settings and select "Network" -4. Switch from "Mainnet" to "Testnet" to use the development network -5. You can request test TON coins from a [testnet faucet](https://t.me/testgiver_ton_bot) - -### Exploring the Blockchain with TonViewer - -[TonViewer](https://tonviewer.com/) is a blockchain explorer that allows you to: - -1. Check transaction history of any address -2. Verify contract deployments -3. Inspect smart contract data -4. Monitor network activity - -To use TonViewer: - -1. Visit [tonviewer.com](https://tonviewer.com/) -2. Enter an address, transaction ID, or block hash in the search bar -3. For development purposes, make sure to switch to "Testnet" view when testing applications - -## For Developers: Setting Up Your Development Environment - -### Installing Node.js and TON SDK - -1. Install Node.js (version 16 or later recommended): -- Linux: `sudo apt update && sudo apt install nodejs npm` -- macOS with Homebrew: `brew install node` -- Windows: Download from [nodejs.org](https://nodejs.org/) - -2. Verify installation: -```bash -node --version -npm --version -``` - -3. Install TON SDK: -```bash -npm install --global @ton/ton -``` - -### Setting Up Blueprint for Smart Contract Development - -[Blueprint](https://github.com/ton-community/blueprint) is a development environment for TON smart contracts: - -1. Install Blueprint: -```bash -npm install --global @ton/blueprint -``` - -2. Create a new project: -```bash -mkdir my-ton-project -cd my-ton-project -npx @ton/blueprint create -``` - -3. Follow the interactive prompts to set up your project - -## Your First TON Project: Hello World - -### Creating a Simple Smart Contract - -Let's create a simple "Hello World" contract that stores a greeting message and allows anyone to read it. - -1. If you haven't already, create a new Blueprint project: -```bash -npx @ton/blueprint create hello-world -``` - -2. Navigate to your project: -```bash -cd hello-world -``` - -3. Create a new contract in the `contracts` directory. Here's a simple example in FunC: - -```func -;; Simple Hello World Contract - -() recv_internal(int msg_value, cell in_msg, slice in_msg_body) impure { - ;; Accept any incoming message -} - -(slice) get_greeting() method_id { - return "Hello, TON!"; -} -``` - -### Deploying to the TON Blockchain -1. Compile your contract: -```bash -npx @ton/blueprint build -``` - -2. Run the deploy script: -```bash -npx @ton/blueprint run -``` - -3. Select the deployment script and follow the prompts - -### Interacting with Your Contract - -Once deployed, you can interact with your contract: - -1. Run a script to call the `get_greeting` method: -```bash -npx @ton/blueprint run -``` - -2. Select your script to get the greeting - -## Next Steps - -Congratulations! You've set up your TON development environment and deployed your first smart contract. Here are some next steps to continue your journey: - -- Explore more complex smart contract examples in the [TON examples repository](https://github.com/ton-community/ton-docs/tree/main/examples) -- Learn about [TON virtual machine (TVM)](../../../develop/smart-contracts/environment/tvm-overview) for more advanced contract development -- Dive into [FunC programming language](../../../develop/smart-contracts/sdk/func) for writing efficient contracts -- Discover [TON payments](../../../develop/dapps/asset-processing/payments) integration for applications - -Happy building on TON! - - - diff --git a/docs/v3/guidelines/quick-start/getting-started.mdx b/docs/v3/guidelines/quick-start/getting-started.mdx new file mode 100644 index 00000000000..99dbafb0bfc --- /dev/null +++ b/docs/v3/guidelines/quick-start/getting-started.mdx @@ -0,0 +1,93 @@ +import ThemedImage from '@theme/ThemedImage'; + +# Getting started + +Welcome to TON quick start guide! This guide will give you a starting point for further research of TON concepts and basic practical experience of developing applications with the TON ecosystem. + +## Prerequisites + +- Basic programming knowledge. +- Around __30 minutes__ of your time. + +> **Note**: We will provide a short explanation of core concepts during the guide, but if you prefer a more theoretical approach, you can check out core concepts of TON `blockchain` first here: [TON blockchain](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains). + +## What You'll Learn + +- Interact with TON ecosystem: Wallets and Explorers. +- Setup development environment: use Blueprint SDK for developing `smart-contracts` using `FunC`, `Tact`, and `Tolk` programming languages. +- Send transactions and read from the `blockchain` using your preferred programming language and available SDKs +- Core concepts of TON blockchain and further learning curve +- Basic project templates ready for implementation of your project logic. + +## Interacting with TON ecosystem + +Before we step on our way of becoming a TON developer, we should become an advanced user of TON! Let's create your own wallet, send a few transactions, and see how our actions are reflected on the `blockchain` using explorers. + +### Step 1: Create a new wallet using an app + +The simplest way to create a wallet is to visit https://ton.org/wallets and choose one of the wallet apps from the list. This page explains the difference between custodial and non-custodial wallets. With a non-custodial wallet, you own the wallet and hold its private key by yourself. With a custodial wallet, you trust somebody else to do this for you. They are all pretty similar, let's choose [MyTonWallet](https://mytonwallet.io/). Go ahead, install and run it. + +### Step 2: Mainnet and Testnet + +At this moment, you should have already created your first wallet and backed up your 24-word phrase (we will discuss its meaning later). Before we start to use it, we should discuss two variations of TON `Blockchain` that we can work with: `Mainnet` and `Testnet`. + +In the TON, the `Mainnet` and `Testnet` have distinct roles. The `Mainnet` is the primary network where actual transactions take place, carrying real economic value as they involve real cryptocurrency and staked validators executing our transactions and guarantee a very high level of security. On the other hand, the `Testnet` is a testing version of the TON `blockchain` designed for development and testing purposes. Transactions on the `testnet` do not have real economic value, making it a risk-free zone for developers to test without financial implications. It's mainly used for development, testing `smart contracts`, and trying new features. + +Since TON basic transactions are very cheap, about 1 cent per transaction, investing just $5 will be enough for hundreds of them. If you decide to work on `Mainnet`, you will have a significantly smoother experience. You can get TON coins by simply pressing the buy button in the user interface, or ask someone to send them to your address, which you can copy from the wallet app somewhere near your balance. Don't worry, sharing your public address is totally safe, unless you dont want it to be associated with you. + +If you decide to use the `Testnet` version instead, you can do this in almost the same way in any wallet by entering the settings menu and tapping a few times on the wallet icon or name at the bottom. This will open the developer menu where you can switch to the `Testnet` version of the wallet. Here is an example for MyTonWallet (version 3.3.4): + +
+
+ Screenshot of wallet settings menu +
+
+ Screenshot of network selection menu +
+
+ +For the `Testnet` version, you can request funds from [Testgiver Ton Bot](https://t.me/testgiver_ton_bot). It will take some time, but in the end, you will receive 2 TONs that will be displayed in your wallet app. + +### Step 3: Exploring the blockchain + +Congratulations! We created our first wallet and received some funds on it. Now let's take a look at how our actions are reflected in the `blockchain`. We can do this by using various [explorers](https://ton.app/explorers). An explorer is a tool that allows you to query data from the chain, investigate TON `smart-contracts`, and transactions. + +For our examples, we are going to use [TonViewer](https://tonviewer.com/). Note that in case of using `testnet`, you should manually change the explorer mode to the `testnet` version. Don't forget that these are different networks not sharing any transactions or `smart-contracts`, so your `testnet` wallet would not be visible in `mainnet` mode and vice versa. + +Let's take a look at our newly created wallet using the explorer: copy your wallet address from the app and insert it into the search line of the explorer like this: + +
+ Screenshot of explorer search interface +
+ +At this moment, your address should be in the `uninit` or `nonexisting` state depending on whether you have already received funds or not. Like any other `smart-contract`, wallets in TON need to be deployed to the network, and since this process requires some amount of transaction fees - `gas` - most wallet apps don't actually deploy the wallet `smart-contract` until you receive funds on your address and try to make your first transaction. + +
+ Screenshot of uninitialized wallet state +
+
+ Screenshot of nonexistent wallet state +
+ +As you can see, the `nonexisting` state is the default state for any address that has not been used before. `uninit` stands for an address that has some metadata such as funds, but hasn't been initialized by deployed `smart-contract` code or data. + +Let's send our first transaction to someone special - ourselves. And see how it looks on the `blockchain`. Enter the send menu in your wallet app and transfer some funds to your own address that you have copied before. In the explorer, our contract should start looking something like this: + +
+ Screenshot of active wallet state +
+ +And here we are, our wallet contract is deployed and ready to use. The first thing that we could mention is, despite the fact that we sent funds to ourselves, the balance has still been decreased by a little bit. As was mentioned before, any transaction requires some fee called `gas` depending on the amount of computation required by `smart-contract` logic, sent messages, and stored data. + +We can explore our `smart-contract` code in the corresponding tab which is represented in `TVM` byte-code - a virtual stack machine that executes byte code generated by compiling `smart-contract` programming languages: `FunC`, `Tact`, and `Tolk`. + +There is also a tab where we can execute `get-methods` provided by the `smart-contract`. Generally, these methods can be implemented in any way that doesn't change the `smart-contract` persistent data. Their primary purpose is to provide an easy way to access the contract state from outside the `blockchain`. + +The second thing to note is the contract type, `wallet_v5r1` in our case. Because some widely-used `smart-contracts` have standard implementations, most explorers are able to determine their type by analyzing the `smart-contract` code segment. + +Its important to understand that wallets are not special entities in the TON `blockchain`, which implements an actors model. A wallet is simply a `smart-contract` that doesn't have any specific rights or abilities compared to any other contract, such as one developed and deployed by you. + +Maybe you will be the one who creates and proposes the next version of wallet that will be accepted by the TON community, just as the TonKeeper Team did with the latest wallet version - `v5r1`! + +Happy creating on TON! + diff --git a/static/img/tutorials/quick-start/active.png b/static/img/tutorials/quick-start/active.png new file mode 100644 index 0000000000000000000000000000000000000000..aff1449a87ac4d13b14e0e383b2a40b157b82b7c GIT binary patch literal 85642 zcmce-Rajh2(>96(2p&R$yC%WinIsTgLU4C?cP6-72yO`)+}+(F=-|#^gWI69hv#|U zy|4f5JNWir2QagyR(G%JTGd^5-5vf_K@uB-1Oov90b5#1{2Kzoi&6vxB&3(9@GF~! zsz>mDFPuM1tGtAZ&r6dq_;+HLFB&e&_GT{bhEApk=63eBrYz3JPNt@I&KCAAC&(S5 za3z*!B{3&cLl;YXJ1P}RTT=uHCrc_$ekuu5BPvdIP97?DUO_G%K^_6Bukut(>|7#; z2k8h1R0z`IpHw_DAS<3as;*B1XN1X^$zzc;>k&-f!qco%N9gQ|Oc#qStwu}~EESZE zFVd$hN6n^eNF-TmiX=vy-uJy7K^dVN)9uoUlM{dQ>V@WUFy_OP0pZsdK_%_k7Y-Dw zH9ix&I&nBB_qt?@b=Jv|VgHp(b_P1S88>X2|4ML_djs?`?CUn%n?^4ElfRz$_=Hf@;E&bN2+1J(#>Jvh&1v282Cf;;xw8$9OU)EB ztB+PGK_O%`7tYXqqqEZcMk72dY`L4Wnp3(e59CJtY!guLkHm0#Cj6R6(sG6II^7r@ zvuf+TtoH80{5!;%;InUnCncQPXIW z(PJT^lwkTij%u3&2KcQsp!gw+ysQ!-JB4w6etwmrvgKu+sTxk{VW}RiE-D##W3eQd zrOO9=IlGZC8tNguL8Q)_ayG&m{r<;G6|8zp9@Sy_{CuFSo~JX$k&yfPX}ehK4Vc+4 z`k}6Vq?vlwm78;LI{la;>qTSZhOJBY$63ElwFWXL=}J?_Ddlsq~5$f7hd|kT?W5y zWSu$qY=-;;iA~JK`UQ{|)EK8~rm9l4jAb722HRHimt6|Ry%O|%y|*9`xoNPU$NgQU z<%)Zq?i}{+7k$90HNi*4*k*2Lx2~1-u)xeZC(^_}qW^WHp7BF3h7ME2E9el#!Zuq51KwvG- zR=r^^Q_$&NcLjmJ`OsW}f?s3gZQ}O&`bUEa3J)H;pxnu-QR8ac1-jl|2a^Fs9v$8I z!z?=&pNF>(%{VWp4pjCR?wnc75I9#(7*?!ju2^>qxPV}t*PE{qq{3v^1KoFLoxbqJ zBr&Li`8pm$uuCFZdipYN$LtI9hwAEO{~1fXwu&n@O6h)miE`xi(H>_dfN*Q8iHK4$ z`5yJJaHXwnvg+rSwW}Q432z53(EA%A_nK6ePd&ZmzP+~;7>$0;f;AVty!ikDhd>lCSO5M%LE=m12i#nZUTHi_vN*= ztXmzw-Ibj22y(SaTlb3xgWTTJI7M;_3gFGxF_j%R2Hs(ltQ)X9hzh1{h2lDI{-v(2 zkp-ZsB;8(%E>GVpr12Jqrq{&V$bJ|yk8#`%m50R2l+_=qq$vU=6b=*~2)X8+TI(a> z4;!E6Bze;!CF~wU&J>791ij?9JMkmz_(E2+GkiW%bkcX^zSdWC`qEF2(y7n*q#4NW zez`YpFX^}O&BzE_Rb#suMa@qaZR+ey9YY^>t-ZercXb;xD*JcJ&7gN!3)1|BN6ldC za_y>+HldrJ^K*ZsX;&XW+QAjLMi`sKXOPU~{}rwK)1tbd_I72#*wB z`}daqh;p|L~SqJ6k__yMTl{qx96?2}9mwl#vISh|~ z&43$)jla6H^ZZ1p;^SZqd#rDBy&}LDaE7usy!4+lVdZXEXOR9xZi@H8gwv>85 zAs`Gpe{qMiukRsukgqbwjA_=@AxbC0gZ-Vt*XumH?~AiL%iSp#_{muzwXRL%CVQFB zhCPn&!5;3zSUwJ~U@7XCdW!d3hc+5b?K4fdF+}6@=vy+alxmTQm9|3AHMH#4j=%n> zkKbjITK;XMMqo688=@wM&c&3zBotfLd?AT zkpx_`qd1OwdQ5<;(On&Yn1mVkKfhiB5)Mnk?&6>qXY`Atck_V{M{WDT6_QvUKeIlG zczRssa@!scsAscowDGO6T(mKjm*>Viu0{{9?$5tm1>z$O&o_8;$gMceUPmrkpVo9UUhcr0*s!zh1ffH}b8Tr(5_2maBqC`Fs z0?S7_8k%pe1=mrxJ+_c^fvXU#5@Fv~OE2x`&<(aM_;dj_S+Wr)^d^W9^@>t>yq`2R z0B$NsCS+xNW^EFu6p@hW4kjrB4NSyJlxaB`9P)CqsOyI@P8)3uDgqqMv%SyGE@(xY z&4eUWybX5LI`CGq?-_CW7+^7?39hpj8SKVPJ`nEhV71-VeuI)GHiM7rwxe3?=>=nt zGDloZDIPAPTUee@#HU*jaZu^vS34nFp<2_0f(lvNn?GA!f7Srf6@DFCMTW*wO(}Bo z_2lrkx4+`cDo<#%$Dh&8;`Uf~Lk*NlqqAy^l>~KPwkHlCgRZv=(?wPQ>J`1kSADZq z-puui^VidH>)66q-CPKl9l(#N{vlUWUeDfA5I^Gfw(J;b?l|h zZ7bxXcNVHD&N zGzW`rByH$8E*c(q#3SAOgO`?E_D7Q@k{#Z2gr`lxy=zMOTi9|-MfYyTd|NVarqHv; z@%o)FxR#dJT4lPdz;`P5&amDxzoAto4)Y2Mjnt?tdc9quHt8$R-_5ej$@-W80-w4{ z6%AMBO^a~FfR*JH59@Kj9uW53Y3cmD9N1^gW4#cizV_g}aribeiQuWNTwNDcl>g6+ zK&e`dL=D*0V)qfaIqMR# zRMJ~@g98a{vKy)Z{R$2F>2YMkIoY9cQhl{niu_BuroiWPC*ZZ=Y?;0vWk{C%bIj_~j>D!8l0wG0tcME2CJEh|cwXidB+?{T7BAPz6;O_ATFN zoS!+xY`>VYHv#&bQ+~1$`0mUk=pND|3osnJt}(dGy>C=VxZv*}F*U(N6x4u=vZxHm#^)t$-jzv%O| zQ4lL6@g%rX`t_ct)@X`4^IC&}QkRocl&hJdPCt1rM45%{Rzfj{#;YeUHa2+F>`P+E z*}XyLFmT!S_8VU(@aFOO3NF@0S2)}0dM{z)y+3thBcXhDLPA21f7udTwa_&5nn#UI z#hGO0vB~|^Zl$WXe%_h4bZ)tXaMPf7+k&-f%*;xxc!ILHrq`*BcdLT_a|+LhI@d4d zSGj1hd6MZZsXSNN^f5qRF!%EE%CIdP>$Najlvma-w>Hnp-A87<%0InNeqyNW8QHz% zn(ZVd`S0F%Uk(k()Ts+sE>=2`hZB~IZY=Dr#s0Pp&6#}(Zo8lixuF;?ErM+aGiI54 zocyLEI1J#2Z+a0PNN$-Vdm{bz8&9ecj-Em(-?^5x2g>50x4L(>HF|FQCNMJ4y{>1m zf4A~;ANc-ERFUYG%s4a#3}1>&M;~)NESGz`eO=oQI5&&p)msOgId(OmPe=>^p7ikWkjWCUt z3^Ap%Je@EwG$awy@;9v08_D5CwPNt;Yz7dX_2O-AB}hdHjJIbFRL&b&ECabl;jkmBH8gv$M=L(K8#dZxAk>~@?@qz^PqfReoU&?%&6i|Tp_=^OX=?Te&@A$t}%21u)4dRg&ce@&&oi; zXN$ExW?T1^o}(w9+2a1512of#hNiSu_@{7eYNEaPudj%3^Sf<90>_^)-&4!*M|cnf z_bhz5Fke}yGd7GZz`hm9L4dD$4eUB4#^uUJdgVwIuEH`wYJH)|A*I9V$|Z&gA@p9> zEU>k2*Fi_DlL{Jpv8B3I1*fi>ZDSa{8KOPLj}%55_n7llR|6P|G$*z$#eW_1XROgO zrwxY=S}D}^?E^;D{*I$_R(B5J`(&(dEAgw^j2G9M@Mj}P_dT&>0MG|=4J_aNC3?s# zU-t9w4Qj3DET0yM2vZ42NKp1fE*tro?tO(@UCx}SoK8@)mwBU6<-*c}o5`?r!7C`j zpX3Pi3Q>?hr^stfQKr!IjT-x|V;kARUmm(S{&1H7l zo#1ZN9cFxHxFTR4E}}f6ptocm&L+BI1c~*z-_eR8^dm5#-e@qQWZ%}P)asmU0#jVV z(_F}p314BM*StQbEIb|8I#-QEl(B2%4U>7%FrMrsx?kAx_Lx)x)Ej~-YFb-!W$aB& zj_fYlMZVZt^;BSSIsh{)jWP)+KN>DYQfr}i&?vUlKG3%kEm5YOxai)dvV=cf#bx}VjaAp(8GWoS-zv29XtYf@0t;rZXFKtV|fUR6q)FsCB2UAyl6 zt*HBP7>DH(7E?a|=t^eksr>Zd(y?;OJyfI2Q9(=N? z17&qXvKza1SlfGA=E@Ud1U%tMs?+i}m=4xXIdlBbLrXwx^@=f)`bw@)rrn!{Jeg;X zgc!^5G}ND*Y0&cxf@}a+H(9LIGiCjd4lag+ZB0>J{u3gy>6y+cs!ujZZuX!>>}8=% z4lhyR46!v>=VT^8eXmvMxGDX*<8W+YFae^a{QgiEAnMrcU*T=;jc5(tOro(m@i}~GNH!s4X~O8#Rqt9-J2Q7v5)|v5$t&*qKLtIwd*?{(xUWXuT_QMEJ0((iINE zx4FI$lMuJ_Q<9AN%knO4&UVS^d@!Cf_RMZRPDs#obG|EZ8?3_8=Xm)i^gY*mHk}U) zj}5jE(W%T(yPGbX@0VDl8Zj4-jMN!T4@z{5f!k!bg3GH|1IpG5=g!$^FfHiwwsv%jGW&g@xGtcedQVUfZwog)o;SvgrFr-~7Ir-dJ7R_>SBGS$6Gn zUc7D%g<~(TA4inj%9pL<;+Kh4;4TW%?WJ|R0gIQ)_( z1sc&PCRyc*WqVf@6ykex7E4%#Sn1KT+fFYLEw^#-GN;|H_Ce&VS`#x$e0o#TjcJ*< zntFK&jVuTIKg_DcQ>g8ZCuQLNfjYEqYSq7AxMBgjRCVTQ^fdkCn)#iv`V}P!W^ZX| zpgN!v>MwSZJFT0Ec>~YLKhy~tdWw{8P7EY_kUQVWZS?M{J3S1Zb$8fnG?lYgVvx)v zFDCkOG5$8-ZE(38~;UiKn zvips{eoTNQ0a>ZZy>yj<<;%yVE?i#rjNsgzo3H$K(roV8VN$L_&}qfmmV3K9k;_*L z3k&&b7?;nPuA;DiU?4KUc2T7+a`vRhIN`qM`nGibjqK3dN|DpzL!@NZ_$=fh4)ZF( zd!y>U1PurvvcOA}Ur&ZU-HRwXF4OGyyNO~+g8?;ur=7RnuZ<^+czAOy@%c6X3bcM= z3lSyjY~snTzVFY75qkzHOT=yfQ3X%#%9{FK4zt*de2k&G)}U$bU)ZjsI=(T(&F$^m z+uJi18YrG^1vvJw`0^X-1>g@CM4#y3P1!N{U|)O@ z)LQ6ryIrQUsp%+t1AHm_MQ*MU&ee98TK({q24orY%@n!b59Rm7{*Bg_R+MGS(0Mv) z`hq_Jgss$f3$*i=;~37=)P<29c^AG6 zq*HOBB-sW4aQ$yWKSEJo0(6?Lxw;MaIf!`BDdZ-!qfasXXUAs_FIL0De$vy5WMa!E zvBQy$kQm~g{Xr=|5wD+ek--EFDFOC|^tUZEhDISW zHL|o|uHq=-cia2Ct5z5;RW2F1`e>Qyl_9RRG2M%%?BkPaYC^d-6p!gXwb3;YhI<z&-`o|HpsEQ7^Z{?j^QlQWoQ`Ua^vh|)kje;{tkp|5&KzkG zPS3B6HX;;nPcmZX>wFm-P*%sc6r=Oh*H(jfAKcF0+`ApMIrXSB6=3ND+cVHBS`j{e zT>Ad)UWQN8FMZ9YDu=xi33>v`KJUO4HQl|=B#Y&LPG_SsPq|~GeKX7{JtMa8=mB^Q zTBSDF3*E@EI4Hk74+()`^d>Ix5EHp%({Q%@NGM!L-Ko5Ky+Vz{t(%|9-mmzJ zb-Te?Xm*wRuHLxBz~5qdCWgnWSZ?ddsKU@#7Q8%F-yf^OqzU*?JWdK2N z0eJB>9gqD}xT3$rZjNhPAKi|9sVW-EW{oy3hY}#mwc!eFUXI=aG27tnO3&Hih{uMS zH<*P10HeMIs%F>y&lPTu90FqX^oiSC1JM0QTQb2cn7^_Dvk)N*gZH4pG4V7?4VOm3 zmcYeyvJK|g;gz@9g^ZgwcK)<-#a|YYti2U#pL^fe4XN3?S!h}L*+*+O?@O?>xdE(C zua_Q?8_j1T8;P0evKD(nD)^kr!J;1U!d$!-cxxB!RJYw)rTCreVdEy@5C z%2RaKiD7W!o{mn!g9KyE6llLc$jwARYIf}#vthU#F$Fa>PnC~w^3*%y<=J|X-uNqD z@WKl&MsEE-zPZ7mrK2X*oRQZ&CbX=*NuH28P9m9**Ek{7Vi8TS2fobX1MzgB^Upco z>k&uq_S!gO$D}6K6W2O)jMBTREV{mgIt9E6+?r*i(rVf!%}Rd|j_Lm~V5fCMj_#P> z@td5SO@FUyZ*i#|+jQ)FRu~FpM;LV#@!YRqyZA;7%DlNn6BgJG|Asgnl6Z)LT!NJR zjrD9RDaW(VPrxTAW!l_gs&wCUH%Y;ga5PI1M6qJA^qVD)FLriqHC<2Q3%mKGa6jOh zS@Slb{jHCnzDFUbnogC2u*Q~ICTz#@WQ1|1P2l;XQN5q`>-el18}1TH4nO_m_v4Z+v~BmHZQ1Qm@?&{M<$E|l6X_I; z0v+o0aP&%bK*$o*!nh57{bWqUh`T+up;`IiSCikPRuK=poZ_t1@p`@ntq>K;sAS8j=%*+#AJ7fTYG>V{I9%7@z8p_K@=&qxtUE}I z&+0m%^h_(GHua0qdUw8u-Y?2t?BLpQkd)%!&q69QaZ&}TsrWFv8ucEy``EBbJMFbY zVP{#iZ_4no#r;9f=<`spgqT|SfZIajY#r0wPmfH?x@vf(FMn}lbaeZ6Alq~{S^eaL z3cLI46+3`6O`kbGlxB6$uPToNP!0yhg@x&`ityBl!xzH~VV@Qwlu-Ah%?5lP*qYaK z!RH{!MYLjC5?04hN zuaQJdF39hFBK|KIAUx(Vpxn!*@X41$P{`51+5%feZP9h#P_@(P)S7I$&9Ui1$%&lY z!HFkHi-R4W1bJDlR#r4a3Rz9DLyKFZF0rnUm`R!mJ!>D(wrgj&3xr|MRab-UX~n1F`fi|hXO1d*t0te>E+pBfdz97o zFHCp3QjMMdE2bT6gqy5CEiSrELE}S1hC>6{_|;A#u~D8;@Y3mYt*5f^;m+8Gi@}ZG z9Iz%Sx{KN*&-|wqfR8U3HU<%wp+rB$&*Xyabmwn2G*BIY9R)iDEpjv{gv__@jMaDKK zCe+2>{MroDMlush3^YcHPR>sA^=|MoA~oDUzp?mgj8%mo56C&ul3dDKJzqH}xA1Svu~r>6RY7el8U=%npwfE+;}tKERFj zr?;9=tVt(OFj3Q_#EPWe#=ptWS0PyPCyCWANyFDg_mr~Me$lPhp3akpjVNgzN2|t@DHVSU)Uj`^U~Pi;>GH9p0^p#lw!2hC!32h zhH50MF2SD*9-B!CF-tdY8aJ zL`q!e#B!$Vjb?>rKY^vDms5To*{HhuG)x}?1ufIxK65r^sB*hLn$`b9aA^|dwAJiY zyLj^gr|$`76@@BRr>AYD7!9On>F@~^J69rOk#roxsMsHY^KF)=GNO6zG!vg$6;9;? zwIANvEB`~AAbYudTM+qzHgsd zC)6>h$gIyil#u6!F3HYelJu}Q5AZT%M#fvU74geNxY?TeJov45$e!)@J~6tqJTuGD zj`bfNjvWX5elx;`f4j+BOwnDQX*poXttfbAkqpib5#uI^20yRGq}icEDC+W_4%7eA zP$He&-INrcc|A?PQ+1aeKwmr4f6RG5_ZHkFD6j>wpyQbipl7P7AA#%O6}|eGR>O^T z%J7dLZ4>Om$vOL*A)z&x1lkO#yrlIRWKK@bRxRAm`UqG!s8OiM;}W#25@o0!O#kp` zXg=yW>>NV^S_;0ug6qU<6-a%9TjwA7|A}PuKcX=aP3SjkEb+i+;9q(34fokF|H%I$ z;pu-gmjAmPtpB|sUE^!qVjEqORygQuCoh(Z=e==0sglbSNOJ3kfBRRq!R7#e)tKN> zIZ^^`TSA&|S~b6_qJVjrelc~r@R#vf2FEI7{1b}~x#ZH$2=7+(Br4wRs$F`UqOwIb zCty6rP}W4htpT4tI?Afb6l-Q>67$*98y3dkd0Gj{n&b4GoKx_(XA<9>u%U~%MeRY2 z#mRIga#D@=zje%WT!nJntW(o$DdJ_iL=19;zP#U%UG*(O6Yayf*ayT1r`O}-c}MKc zi$O5&e-P(BBC=lrGvfk7!=lFQX`O_q_2tb?)VUCz*nFf-rtAnrjaZek-dhM7o(*US zuCf6G0f8{V(DgRYD{%=s#_bCb<`QD(-b7=C+wN?<3%p%p$Wl5`KWp~19em+!f@4_K z;@Qwq^x8b#@@BAPRJSRsa?m*FQRpSUXq2{R)Sj_35ybEIjN$Idn{Tp^fc?Sh#sJGi zM&qfC5Qg88_5P@f+Xyi}`9xOm%Vk;>eR~!>?mWx4`VZI+PB*2<9uC@H-LENEB#f$j z!7caB+9D2eWuZcG-|{(22JrD2oj7R%vc<$oe)Dkou4VN^ZKwt8wvJJNsIp)^%mfUQ zoKQ+U&rm4N=8CH`(E@)=nLcoI_#I|Bq6m?wo8XAoJ(u4ecfB40neUmU4TIN$^(cDX z_fWQ@`zV9$H9*hATy{LAxL8fq=+jAwi%47A7hw8;WqPVvruVvWEm*gtozgZOEM3;Gd4a!V*TdO=&AJ`iJZTj z*4bO-WB*gvu2Ic5*jG!FCzDmJExciF#uVV_vG?D@QOA7QgMp)YC>sWsy%o-{6r(c7 zH~WV!iEGlJA6jb)%sxe>pMOY@d;#Za<2TV?pns}-qRixwE@BZZD_XzkR;YP`~s!Y3O3ZqXo;_JR8^0aaGqe$4`jdhL>v zTZQg}&~t!;OO?AS2AoIN_}S~joW#ohn^RitnBCZ2F4VtAS^XNyERCKsU1JFE1=jZf zVFMILG0Ew818|s^?4{vI2yNarg6Jc$KoQefNtA z70;ymqIT3}q{+sX;_2LVz#k(D%z(n0yOOHWlZ`938Hr$)CWgAsyJ%;2gXU4` zw;!lQ3aV&@fCH%xpW8Jv-IuFP#qW>J>_S;zq^RNB=l_tqe3*7&SbN)*qZyBtJ(U|J z_CPFp_>DT#B}z@td3s^1A;bZ z{8Cbt3vj{R^7xU=UXfIG&CM^R>NSuzfc&D6eSdn;+PCLFVa`ramFTra@7Ng1IK;m<-+k=zP=iFZ*f0^ z`0lx*4GrHVym_osvfe>7A1Td_IDsYE>k{b&;bfR?&E`!fyB7iJ5qNVmU}z<10Tjzh zEBSYtFSy6h^GI7UYrS?Xl$ADQx_ri=-YFxRVH}l}!n5agGkMIc3y}*R+QPH4{NPX=Ov$9eL0L>xO~n1`j^cg1llY}60*`qwbRR>YtzI4!cL+= zWyPyblS}hq_kpk&fcShtYE&z2$8qB;wcvtvE(3O7%r!}Tkyb#5Lwa#&Q&9qgg0GxfG0c_a)(h?g{-u zHn^*9z3A^~PT9)J+<(0%Yl;ep_;)Q@wkdw4(X_s4*PBK$P?d?Nq3v2IMvFj+bYdrQ zzIsH~WI(;N@U|g9e};{0_it8UhM-pvZTj46Jo`MQn*JSqnk(*sYw~SqyR8k5fK;kCKd=34b$S^=8bYez6qe4!hD^SSFCiI^t4x$$ghTfXMV z%i?n$igBpqW0($q>KRN!!r|0P?NP^OIny2&N&EBiMAyS^EI!fA^5^ch5U#CU>073U z{8#7l@6Pl@h&ZWWdduGI9^Y{%sk?0CkuQ*Gi6EpyIlGLfb7+y8mrvZQy5zdWZF+0**cnpvklKCVJ6 zT(0CGo#Eg0(COmOXCS@0+<083Wf#dUZK#ocp4bEe4*APGvBzo1lQ4<(7M9IS&o+`t zz)%IDFRIIL%Pm2E@O&q6Sdj+$g0ytrMuhhlZ^A@cT9)W%4%-$!1G~x0J2jt6rCAc@ z(4pC&A&b5=H8-Dx3@a458CSG(Nr4cyjLxX&_bGB_K1;Y}%aQn+P*1WR3O%{JF&SuK z0=iaPTvx6n`}vSGGYL;p94MQWM8fRS{Gq@&img?Ot_wJF=&#b*?8|D;LfV_-=r7Jn z)|Vmj_6SE+kgUcodjNXVQz@8sYB?87jh|(F0CEmH6!Bkg`k|hW7 zwZxwhJ4&q^5ZhNub3!%N6ITBxYm zh^trZf5V?kB5o-bYf47fk9fph=e@#r@Y?nF`vXuQEmOD@Vk?WuRs_86@#3%fB~@D1 z!f4W$0ja9l+{dll#3t~lCDmXzEVmDNC|WDq-ID48RO~LHGiiuvl8_AzPCgquVke$Tu7lZZ zKP#Yd2%{eZYg~wMe9o10WFOm%-V69nn=QL%*rMA6>F`Slg8|{cJBs&`Z$n-*8*%Pj zRU%b}zy_sdY14R{daJTy;;;?Ix&!bMxV{#0TrD$aEYw6RPgc?O!y(h#+i52Kx)vd^ zfhhQ_bcL{Wl)4DbJ>K)%T>X|kVZHT@9lbnS!BN)X$1C*z(-t)Fsl`9=v_+VJ8+EFp z0gw@9U~g1ZaFKfI!skC0P*>_RPB6CGm!s zVvA(?feptM>M2LE2kw#~iaVseKX<(iA~5LbN*}0(w>OY9-e;|+2(#h($)&KJ(3=lq zI)3Q(Vu;~?IK|~o_Wd}6o-_UHQCIgJe>dMRY%^`{LPdhN^*50Q-SQ$tx0@aksHrbu zUYdSV<~zOd7NuFbd!#DkJjLAvk`JCt1#?fgVsGFX_Oom|sqPsj5{jE@*PQDu<;*{> zuts4kRI@R_h|;5NbU2!k;PW#Kf9qpEz1SvW6e*<8GaYO2BPS*!Cl+*LEfu zMTI>_xi5y0p0-*JqjDflAhD=0ThRF-Z&;xu6tBaRf^@T!+d^A%KJA#OFm#H0)Zm;DOW^gv?2GLV=zkE&%g6aTveY10}g?V+}Lyb|c|;Er@0ST*ZG z0fbzh=2jAFYrT^V%q14Sa|KIyRv%;l6x-&B55XV}*Ln@14rb&1*o2g`ZgHvA!94me zZR_6x0A~B!6GVI`z*8l5Z$)j(xzz+~qs!ioiI)=fEcIgqV_EC$^`)4!rmHUt6jnw` zD8H;v352wuNPh{)cdMF1ksX_0yP0%Q<4eUX$TryKZ|1bbkIrebVQ_!vxPBC~5*@$GCwunRk0e zH)%}-SPcVc&uL!=iz=E{JD*Ot=O;7m;`&8?l$IK%!x;=992H3^!w6#QCNx$b zPc$kurNbk^r{IOC>?;oKgbQ3*`7SH@emJj6cp}ZLD=jICM+m4~ANpkn1T*Nv)2`o{3yrESV z3*34q_1_!xH9qdiey6wpamz16wEyAXHP;B2EN#vk>V7#eO`_-o69{T28iRHY1ucKHFD`PV zI?_s)65Su!{)+;IH2?zFqDzme|9!c|tyWlgBFA@6I`lEs<*9`|DC}Rb8Bds#rjTwc zrknZIo<%bVAEU~sLqfu{Cgf=1EH;0zG;$M<529y=uhqW;z5`?b8lz&szM+3|;Uo~= zzZum)O{djpR5E-9_u%q!*~nk@D1s3hJF#_pO)B?vZyuFlX?oae7p0w3w^<%ON!Za6 z;8ENGXwPDhied1%SQ5UuJ0LZi6;YmcyCf3`xQ_N^H>Q6Au@lJqqzi;vw{ZR&%kl0V zWUbU@?lZnBVV)5!0Y@WI(RPgfYeT-kjAb$#0RfXm8x5P(XB7ILrZJptgy?ASt^}eo%$i0YPw_pL9fCF zu{-;Qh~Zf2H|Bj46H_(W^jS`|iIs&f|8*ufEISI>3~8y6t*cet=^TEBXqB(t(Eh*U zV#Q6sET3gpRY^o*k_`MLQt}@+7tf1Z=);y2o4u1#-M5LgIsiW(5d25@VvEfr5^+k& zuu;q4K>vRvzmZ=+y(n2Vf5L_1L+O7{cE(q$(hC*480^?^tKH@NSJ%n8M8-{JzjIil zZ>Z+K9d3hF6Cr=5%t^@pKSz{WDE>kI-u1t&;r(AYC;ER(byYp)AGiJ_tTf>t{dklY z`~5+jxJA>(FD6#esO?#{Qp!RO@#C$wi=w zp`mLDM0$eS?!kB3U+9mkprD{G%*Vx*0Cjfk&5mV+*V4{*H~CvnUWHzh)39Fqr0zbS zlELzYd_o{-@Aw{k!uGD=(fjzQ3-)+{{Y*~nEK2B@%5fd(eyrlC;nphn3-+C)OJm`buLVAJV(c>A!?< z{uz|_v~R5Ev3Qrz2Yd6pgP|jfe`q!P`jsoqL7H`uJfFUSX>(?K2c`c_Yrc=ng1_q4 zDy^r}yb{i%n1A9R_LxTKQh?X=!Jg26VAVlv>xU71BG`G5O!f)WsxuJ z?!Lw6cId~qCCty{-&t2$^r{}OGlkxSsJ@N2tlPBVL_EEWoTy%J!yT+QRfj%odR-kx zcX8M|q}hw<3$Dzj!fBAhBJEJ$XrN~|51LxpV(n%o?pnU;$3vM}?XQJ!EhM(3ry^3hN`|Nkfb116MUi(@u4Rf-81=I<9kPVjCsg z&$c1KrSmP3B1$bUv9*UYEO95hN<4%fQ%LGFEB_!v1bn|&>hsnxKt-OQ4zd}TxaS2+ zktb)CPmYEghnm$6G$N!sN2I*&Z`VRjj3)NsH&kWvP+z2Q7Kp9hIIoK*Jyb^k+}cZd zE4oG(Te6Bi6+8&0{k=&9p6}z{g7_=56ag87zn0|s6wb}&L(|bk9Dki^t%b0f^)o$M z*yJqE;NAg}g4nhlD@rJ}BZ|;h{9t_GQf);Gs8_*@)Xp|au4_B<{zuaXOg^{u*xyU3 zTnARLJ9(Fs`VS}Vk+5*BK1_0io6r<|*I$=U`LuuZ! zxk~nTAznXuBST9^ZP2}&h2-AcRYPKF@u0FVQVRRym=Nc6rUNdda%##`L(yeH!o!P7 zWVzvWno|Ra?igkDQ%x$wJELhro@%NZGa(@8!r2J8$)6J7($$Z^s5w~9E%rotLc9vh&;F9D)DQK}LE@DbIyhoy% zvtNZhIWj3_Uzez3F)Xo+^e#q(=>C{lbn{Dy51F^OeQ_BDEFPbjs}n5~3?0+A-x@nL z<=V@r_peyf?GoZBBDz3utFcWEA3{8uv|Eg*+U8kZ+27*|H2E(Vz=U!Pq#b1%YstW5 zLo?A@pSb+Z8M#11)Ys`1)0Vy8{^ys}L9aePtZ-jjjAl%THg8?Do({A7Ei`@!k91>x zJGrzy&+Qi^nHq5%0--3e7oH*o8Wk+QHp7-ipbH*67DIdc^)LZV#aW*ZVk zq_yw8vA*{`x_(__Ej5p;xZW`Vrn`UDV0}6w#_!1-Lpf*Hy5+o5o|avCz9$Pit~@H! zOetuWT>r@SS=MjAerD40!TSaFwU~W+-SES! z7o#cNBP-e);Jo0Ga39zr71*|++q+jKK;mv|2cf^wwls|+vVs<~om-n-9hoVPD)*D_VjmnIx`0Uo8=bjs7UKikfbCvZo`dfXn~U1(GTd%HqgifQ+er zz21W8d!|#D(kRUGl)yOk-c3|Y!nX6PM=CXae2VYD(4(C|LO?e$CszUgnG*Cw+fIww zyIm*5{DcSUX=Rv<{wOv^Wkk$W-%D@_p!DCc*l-O7jySQI8*`^p(Z&z{z0DI88Fg=K z*=ROGS%Qxcc9ZMTWlxGpE5AOKT=ht0vyEDf0P0dEnsy>QxykCPzX;x9$p1k^{An|T z$A|j@r5?}`(3?{Sep@QYCzRO8QUYxi(T`8Bjv*$3o`ln)Y;-#%i)S&EiiS$5SS18}uP(aDz2Q4mo>I4Y@ICS4V2M zA~*kv)KK$S6MX1bq_%J{zf>>~CXg>kD1f%xCm1Iiwu*XEWeQ_HJ(=axRp0igYZB?z znWVn@$0cum#OMko-!0_e627W~Q6*PL6V*hU=#Q3P@@EF;qtv_ATO8R`)z#!5<+fva zS+b8uXCPY47Vtcx0tW784-qWp|NK6w&y;kqLgh1foGtd(e$PamO`h=pK?6{E?X-*%6l6>rRJ9xn01K#m6RVMBZEo( zR+e&Qmpi)~3fOP94C)8c9DEIVBN@DnbpY9^3CWc_6;cV81BH(8+j+>4-chnvoBhs${xbF7_6(W(AW1&YLmo>j|JndzVDn~8~I6;bGU zXd?4wqVHK5Efr_~G)bgk3{fq~bv#_ftf-EeT-ZB>aD~}LZ_U?KQ1PUB(D^Udw|QK5 z6=%0_r6R~;_~|FKn{PBQAgz&vt$vd&Jfr<+L=Hd@H z_uTuOz4lsb?{kwDnKMFhyG(*EP5Co1O(k0&^UGzIxm=7qhvzlUO0uUx+u&2)T=I6Z zg3FMT{Lqq4_DPP&ue8pxt01OlB*{T;I&Xb6wlM0u6h`?*@h2j1n{E`_q~A{)EsqT( z|K?Sg^KQB3ra-^F7sPthJYEroTFK;k73B8wU=3eo_-k#`HzVRLB`%cNG;uny*SE%H zDqfp=zI$T8t2wa!W`>-|v|_%bpqm?%jUVv_&o(A=w!(%MK}=zhRdHCgD!#IJkou&f z3Wb?|er+4hIB6|MjDoIVA9CD1BgmY(Fsk+q#XFl_ua;1k?)_si)4QuK1-2f{OD+Cn zC-t09)Xo?_@A%&}&?F4Gu?$GR{S#QDG4X*r!5Zv^)>o;)bzNt(O)gkpZ%fWg))Q36mUYt)2ZH=b=gxSUFIymCln-;eHsu z1GaXA->MCWom8tu3i3H-na(xLH{y-5ANH%A9k@*at{-OH4wiU$y3E$XADZ zP)%+B0E2p3&aH#V^d)E%+3-YX`!^G!nifWg58{S!Sck?My-C)8%3X;_`L*~H74GBc zMl5xb9Tg{MI=$-237wrU?Hr*8WG18vr+0Wsy&|QaT~3kromaHJH(WeX3rz|&MN5N~ z#L~;jTJx2h90{dLBHDGq`9e}Uml+#f$2&0{%84(GtF}GdnC-jW=u!>!d(U6n_L1B6 z3Eq~DPnfiR2pCrB7|8W?*{WXl)u+Yd@+b@SBmRC|%Rm)n5lVTwIgZ|=W=DE$Zb=UF z7*G9i^{SlWU>e%8RosI^Z2J5&hwJSanK9CtZz=QbET+?bU&3wRxpJ4MkiPWnf#Pt4 zF=Gz~E|EkWVi0UFx6R{*q>Q&DRF_E`82_NitaQ~5Ghxxe#dA+P2s6Ahcie(wbLGLy zMaR~-oZt_|sU6X|9t>KQIkpY%)X}6%M~DS=hzI88MsyN3_TSVB{s$`sL5MX3j6f+K zOpPgN?2Pn69&ufB-8psitl<=P{25zz&Cl|bN{NDVL!RJ0c=64$12DhP9!=Z3|Hgoe zbJ!iNxPULXq)K-QxxZgc)s7E~uXA3Jp(x1<03nZH6_oFq?O{}x{*ngCxswiH(Pe{@ zr^VY3+5(AJCr^C!Q%W*0atbLK46tM0mX}qn-(Ku3)Oj{r7svHCoSmM|)NrP>`i!hD zuZu2Ko0+4a%5SpDkm6Pr*3yYd2mb)4dcf~a=66(^K?@urb`||F6jiyd_98Nc2WEyE zL!1QR*3W+j4j6t5ZNY&S8>gt3RTbn3)T2XEd+$i{3nu-Ux?bbVo?U)OLnH1TC`Hll z>`yyaW{O&2angI8+I}{+f37J1~FJPqTHEC!-ueAP1 z$n5@&BgR)4z0qlq28v2Fa>C4+v{QE}o3ESJrhhZimb?UoNEkP15bI9xyqYe1EH$P; z5+)!0`4?QFiN%X;3zpd=r$Wr+{>EfCUGrOaz zzt36H*mWx=GAgr{oB3*dhH`xow-1Ds^U}Oa>do4@~QLLz3$7U zSD2*!lM_e|F&YAPHF$+9e}Jt59k2Q3BBV9ACuTC4YEbtT4t9(tm{Ptm?s2A*;V;+DwCBdxnSa(Kt|rX z3&mCS7(`kr886nU||En`olepM5MAufgVpnt#JfLJf3Vygg z2U3y3o@R|Ubtwvgtf5wFrAmAMe&y(#smsn(yi1*j8eTnH=d6&%E4nSYH(Mx1!E?l2 zEwIaqGbmxfC2+jNHnrzxUM<^x}A$Cf`7*O^T=Odnz zwbpZyFun0>OOEHpb1dhJ?@+d(s86j%JG+^F`;uYCCteQEJ6>J2LX^;+H@aqY^=5}w zSgbJ`%}H(FN^*s#dwbc@tBw#gJ<8GkhFZ|@pvQ~NEOd3=N@|Z8k^QO6%nAiy<&0mo zhH@dBZdeQqDp?C54QxPjOcjT#^O(u;dp@L7l9L{5-Luw8*lUCr&TG5B+WHj(jao%- zoyOkYxy{OK3?L;B<;wDfrK(?ZgAh9kZrsxr5=~%(hQ^Fm=L}rx^NxDkUU6q%zhKcC zmdNo2kM|3Qg2NGtWAK-rbtGJ#d{HN3E9cGrwO9^)&v$1^;8`Q2w0)dj9wrnspLu^^ zy)8M)KJa>1wOYT_W&oi^<;vi6lE|6M#O8cI%lk+Nn;Z~S*&(~9fG{Ycu%qS@j^vi$qOs8%1Ujc+?~6sV`)s2H*MBPt*2n~Dfbr7 zjl67r!c)1cSU2*fB&tcU#wyZa|N7A0qQw`iC8^JYfpaFO)jfJziS7sq4LOz`23B6TQAsG)`JbF@-)S z=kKFWK}1jEI{v`HE2`MioYL#gj=(eN?<0fKG1mQqi6Y9P(y)AYJJmf`&}9`%TBqay z#kakEEK1CN+pX!zAh>jep2!TZn?M8cP}nBLsIMXTE@fsRjML|vnO5;%J${`(5LR~CkctsCaSv`u^?g42nTNm6s2 zOSpKS5_`o%$++D4GO;bcNAuS(xHb_nud1F~Rc2#Bv5JrTsmsX*=TIN~id%)?6;|%g zZ;A&A^T~`iIpPje!zrnvw%;#H2D^E>Az2bjuV?a-jcppCH{bFusaPn+(7557c@gv& zHIu2}fCk%Kw8R}kABS`H!lPRukMs?u1(8Z{R!*FC;1Ki1tcd6%Udf%ol{z%yZ9FvfQ&%I663i zx+1tlq>1=5I*EpOdWYzjxU@Ap`sbm6BE)-NJS;pKF7`{33O%;GJ}qnc!HG&quM{&` zF*^)@-Utq1IAkbztgnamN-{c!HH3$wUPfH1GZyI>%(qHUL2G;}^p*Bfa6*2-C z!s~usK*{G1V^t4Pla}hh$oQuC3RkK>>O!kt(A@=>$HUgL*=wRHWSonz(qf>;Q4j8E zUbL&5X5xzuTmdDs-dDAYiSH>*X#XCoS9YIne$rS%*H@6{Y30W*WbfX@sX_WuTu=)~ z8KIw!7CAwhJ%@DU0&~$t@v1SZ!Z10SgCaOJPd?_eeA^s2G44vjf zi{oNY0v0WGv}`IU^!Gp5QYR-u-SD-XcErA5i%_?CRGK$!GhOgL=XEfqm&6(AE~j#) zv8z=$T2nrHU$~iy`*;$1U58D;I>?3jb!PqQwM64QEyjQ7meogF7R2miuw#xPKd#LC zm>=M`G?XZfY-P64Ma>@Gk4EgsZcaukz-RjYaP_u?9>s+Nga54VwT;&C!DvKJ`YzHJ zviN`$DehO^!g@mShmjagpA~oJo3G^8H?RqIxCzrc8%m)C-4zzvJp-lTzZ4IA1@r^n z!$ZX<%kVHiC*8O2>HYql$aJESO*x4n;{Y0(5`-yW)_PPCwn;$bR#mG_^XIfu@9~VH zk&v#~%4*j-$2cs%e|PCC`3eux!Y>{gY8JcV6jT12c!4na9eZB6!vQo1+QJG7N{dIH zzJ)yL+1$?B-%AX}Sd(gkL}(6;>HM^aes^}8lR?ZEes@;J4{i`^5P|*ztrLMn@dyJ^ zrqNtI845l#j)6wv=G>%0{ipN}w!&%8wQf`pY9Zxqj{VN1a^jT>$)2xi5$s9?JX=a* zx%u$2?x#!3sWfZKWEuKjn)Nk_AawvszEf7|w4xjBfb4b(0jNAvMg1K#*?mq^%4XWy zu3CH;^H8}lUabA^%l}ghqHSyz5J&3km}G=V@DY|W^A|1Vg-9G)KktR4dD(?F3ZP4O z7Ouv&uep2q$Mnd=&O08=v4YHXG9KwJj~0|RT-wmD7LZvGPZr z$19MM6(`)BSX#ISFjSJ$-T@IAV7dH8o;LO`YAVR z>A5~~-yAXL^pjnb zgOq{q6h&2rh_v2Q>0a_QoC=r}JumB036?aSBGGV-$*7_AZMwUujI2OCQw zLRDAV?cxzH{t{3?bYErkJ6kD2S( z3n$nIe#X*;3u)&oRNxqYu07kHU2v-wuCAfbHKyjw`>SEPz5Ux1QTd&>+*=QrmD|l# z><1$EYm#3d$`vaNq>GWcSCEr+5e(9Sx^fIXel%$$)5|Tvq_dw%(Qm zjYAJi>T7}pYpd0WMiC6v8q<7JewTZFPNiwO=>NaB4+WTj$k`GeJ||}THMhm-y8RmH z?{NBRkRp|vVP>2t+hjnv)2vkUiP#+*C438U!mXs|_QW3&iDozGn)xL5p{V9)sLp z|0kNxtLz5TPsRw-jUIL#oZKTIeiUco{EMXx#ahh~L-^v@#ihaIIu!qRY~(6>J)+9@ zGBzZo`PcveSx-{ID5C#%JVbY@~{9`wu`bn3)vNi8|Yad)21~iRbYxl zd|$nNaAsgc9=ZsH3ow?~{Xm>Tnm>M+h0yim$=(DdGZ4ArDXx^5(C(KPX{NFg`FbGz zou2g5uILev-Fw3M&_Ab%k>qAQHc|vmQb|&tT5ZYrQRfMV<~FOcLvdjvEkn4*fRr$p zpppEQ$SXFH$AV6!67`Ih8a}vLFHQYUJH{w$=4ZgW6s0XfQ%qyCXx`a}y#$s$Gg%rb zwemEbFW;~fU!RgfFtrus%$%0qQS&o7S#77u1l<} z$!z!ePA-OY;asVDOIWsn&FyORm?&B8DxPw#t_1cwMsZ3`R(suLi6;e5&y)W2naNsN z-8CV-d^1#POsW`~IS^>cW0tK<@AQ?ti@|ab%|Socy_;nI@9Qi4f2D{ZypHy7a+u#7 z|9@`1;>Bji2C2go2eS8l7e!oLT=Y{0^6XJ^1El+<^HL-@0j-9iQma_Cy3QuEjw?!7 zFMF`GdSVq;*;vployt{!^L@2>{;JGuPkQ4P=rIQIze>&AotvwskG-}XHkd{TRB+W2 z($i{67}}8F+_>aUcSr+d6@yj?0@#!#3rD%eI^UEhS9n-IMM~*b0W03Y3k2YWA7=GX zxH{{{=SrpO&Dl1O;{UThC-~F)SRU?TXB~&F;{r;$dJdORT?5mnpOg=k0eZ!7vmGt= zdi?~W%KQQjj!AY5<>>DBxFe9}O{WS#?l#4$_hnX<=#(izO4Y;*_z(=(3^zo=2i(21@FK@!=k*396K!KYi#B)pYNfvd6#qf0b20?s zYd)`d!Pk=GxOi@#8SILF*Y~gO9`+Ye*tu*+`I4Ri0Hco05guvj3ELHw^0N2DwzL%S zar$n*N<;X#t-{8BeBl86`ou{`Ak>F(WzDq~`p-#Tr?Ej%*gxKU6;r!#c(9lGo(6(3 z=Ws5sX|`)>JXd4_E*zl`8SCMu=_{BA z&8h?Y0jv+M2O!&6_MP5TMFjVb6+m~Lx`%m}Xm0Bh|0D8!du`J*S@KXT%^1}9Yct1| z?gB-*CWT4E-k8<9Pf$^nw0xfZ_@;-XGuGq1Vvrm`qx1?SeH+ou{C&pOz>fY}mp87w zOMN`moI6?Yyk8p$?&bh6wf0vJJaU< zi-5tfj0Pfg)0Iht^ux&U$*G7rc&*Hx8;twM#gVL7o_39S1d((RlY>Q+R1YFVn8#Op zaThXG-L;cX#Sf}$`?@_-K~v_7>7Y@4D0;d#mGP#fzya-+Sm@l>bszl_&_wfJJWZlK z>zjSer&=c8)6l{iA0TX}ee>k|mi7Lw|0R%Z}F>f>k`I?gqhS&9d9`Y94dJ&g0h6TU(JL99 zC<(Ta$T`XBMa|!Nv*s7qktw|i&-k`KW2O#GEwh`j>7A=3p3jJqo?W15lqEzOW}V)f zsWB{XHTnR@F=Bqm-Bn3=Wi@9aCI_%5>@t@At z1jr4|toLSOGS>K3kW2HM&by~qVIC6f&kctuNleITz1V?ZbZx5bgYkpvy^fU2#6ROpKoQe08 zO7(zTZcvjtGT2@pRf&!-hf;8v_aH02in82G%v5mM%zZg}6#RuEjmrq{0RbC2(crpK zP@w(b1yL<(S}JqpC2j%T6H%myelO0hz*Cg(mR^Mtdr_aYzyWwws*tUCz+4UDN@x{M zUDAAU3K3!63|9hku+}f6zGM|1f>p*lrda4C&sOmL08dbzn$*23hIV|OfCFp;ID;c1 zZ>&Gvymdn>TJei-Dx(V|Cs>Vci!A)|G#j(cA#l`;^B9G%kD)v*Nsz)A8p2hKIXy#mstVe zg{jC3?H2X}15{zW&$)3S1?}zIa!NRi#Ia;$);-=O7YhU};wkh`4m1ME@hsCf&W?dV zXLu|gIpz`d<)2_fWM{fJW z#TG&4&+&s(EXvjeEHOro9Ve7qh4Xn7w`}y~AWsl|xlL6^dy}5$8%`*Jjn$fZ1L`kF z4ArXg%wc$s?X#l~X~=ke7>jB;@|%!Pcnd@>aJ2JmJWQ9YX>Jd!&u^W&yK;=_Burz_ zprNI8Nl{%O?pNk!j}Ya*n{OfJ^o-_KX4v}T6cgl5QrP55%g)GNyZVh1z;gLz52f}i z_x@@vH4R85*!4d_kE)hNsjNb%eCW!pG}>JA@HyB|AN1If<1OVQzT>tFTsP#=i%T@7 zmacAO`dl+dh$QOHRAd>u!PvqyHI&yUkeW9Xk)&NWqwC0il+ja`@%#XfAP84kMUn;U z*I(%yGZNZJykdG>n?d(8-98`x&@>Y8iO2XQ6Q#C1O+(GVvDaLn%$2Z$8Y+oRU_wMC z6%r-n^V_3sZCwWAv05wt;pZrEAmdj>4Pkm=J&H?-1QHAlNV$bU-5sbFswg(`1L_}x z%Mq$%8ZzKR*eh}>HV$sCJ@|e4e8wb^3RT+&+cWWH?2BbwlU}B!-iz{=rB5iGS6vLP zw6fpHf`bPnmXBoucP8yVd8krFzs2n<&qOG}qyX=0m}t91Ro;10vQdZb&Ba~wV7F#^ z0wP3RURqrZSwnz}zR1Dm)waH^bynZRgY)NQ(qt&%=5Ck%IOEM&MKi6*9jbbvg(KCLG5_PMpS)r%vUq_4GUi_eUgwPo&uo#7a^)D7G2h|eZjWaMFr z5}KMsZZ!v+fz|jn^b020R{2yJW&B@YZ6o=PIfU>#)sl*yB(Q|_X z1TfvB2wpe`;$JdPQ=wOfbmV%X0u zWKHPQ=u_9%g6g`u#)4I0fIqFP9`VB@LcBjJdU@{IvP|u-szwiZypMc=vI*eTr1NDj z?bG3=W{R5zV5uPa$?G4W!zIk7dU9WN30i_h;%={Nj&Q%9#yxMVWtBey*Tz zMmmUd4M3=-G93G`dZ>+?kCY1QZ{JD1F&uvXoHR#~T1++Yj9|VByl&rGf}7@9d|VVS zun^}Ldm-sph{!$DaE_+#KDRP!0@qB;*PAxFn3e49%BH-L*6}kI^s}?UIl4nOax~Y0 zWtZq$z`_3K9NT1ZvVh??X3lyz74jp#u&vM`>l!Xe+Y%o#e5Z-a9nJGc5slMQb#iVI zfz-mCmp$+PIY*~-XXi$2Mmgbr+A#PLdCH*I7z!kMz^5Iwy?RP5?o1z68w?9RqB*$- zhdLMCt%;kLWvmJ7cWi&e$d^dc!G@%h2a*;-)EE1>9Jg~|KI z)&V7rxvG-7)gJ!<_Gn3FI{KCCXK%ZJ$}eA03!^W}2F;Ya2*Wo{a?`%AMmsda1w`Np zk8)$g*1<4*nwYHx6Zh<`?U&>EL-s5*dK+3NXOBMG$hrSEr3X)yskW5Wl_;qIMMD%| zgQTl02F9ir!QSO`0!aU}#ePO7CPlkx2wr;G>NlRK#t=v914FeCGJf|dj6Yr-gRnI} zlf^!D)^w-#2tE7lzIB6+e%#*hXLd$R>X2lAs}ZVhIL$RfroO_I!!MRZ1x|VGNeYls z?ZL*CUB=rjc>|}ZW>PX=a3(@|#iz;3yM%D*#7+Z+jKyYT&$JR}`qw>>G7Y`Lm+97u zyCTf$)nui*Iavx}46Z!IB;^XzqJB#Qm}`j&%ma1Pbsl_nwWT_z3SNAr&g_hEO7hVe zc8m@7zWg!|ZG9HWK^;+)p04H<(sG-gIZdHiLKYMU$2xQOcAqTf)3pam&VAS16dm%F z@Halfs#6F`pp_X!c^Hb&m0JhY3-Pps=9G>pRW{|RXSO8#4``%H4`20lDl?x%xu#fS zn<@X6Ii2*>eS@oErOlqCHej}8f zZ2GSpF#QN8uP7pv-#id&3v>BcC-{m`0BYXKUBw+U4O@sSTnH-OZ{bOP#^_vb5v)Q; zJK}SGgcM~J>ohpoo90p(eD8@QAcZ#r>a)1zk*-`=+`s8Uzj~AE@;e6gran$R5+-Px zjVwjAaV~T|cl(7)okJ#~t7C@yi}*^6+}_-*4^yJVCRCGuL?{!r#L`jwBM*bIQJ~bL zkZr$f<33S_!yb=xsZ2@P&&Iz;^Xg_oNz&-#)cckeRUNG}JS7+Cq)ZJ!mU<5CeS%#m zm>%BqR4O;eEi9N7T;GP{_wPl^aM4L5%`WU1Udf(6DhNqSN0?I09^9VYr`Nh$T&8ar ziX7sy^6N}p>$twy)a}GdRdRd&Gz;Goi~8e$S?64eA~fxVG@>&xFwug{)ONpGq7mXoD!|3_fmo%tNgWz4%tEq1U=GLo0xXD*(`bN$vj z9s8EL6fZ`$d0dc+n?vvHP%cY{N`p32C_#Lgt;P#P>|*2Taz+6^gjK9Zq9gPCU&2#2 zi|)5JD24nxUmYnB3sdqg_CLC(;t+|izCm@^TerIq$Bk5|vds?8rBJZ}MitUk4UMuF zj`-)b_mF6Ee*GqAMC92-nA`CtTE3LRf~b6LVF^PWez(RG53;!J&o_Zj$*Ix|54kJL7#BF9jb6l43kO`+AlLO{%fdE9T8u;^W+n&R z-YOY{Z)u2n0X{Q?p@~)2m~It52NDVOox#7_Fs`+|5p2WsQzJ;2i)x4b zI_EPk(Ndz{J`$W0NBnvUBxYG?7yP58Us7rpjn{-rwl6tj9t^VMd|C$OsQ58aB!TAr zX0bTaPf9nKUG6JUQs+?r2*H{B@63=DRuCOl8Adr)S0<1weqi->I-E1N;KM=&vy2@} zllvvKgugTM%K@RxMJysXX|h z2Z^~xu?BUleqFYfOj-k2_I~`6|YC{tYFu zTo>adF5skga57k1N{_t;P#)-_+;X9=4X}yFay#xvt#uM{mUQA@J!ZZ4V~+<%^_7h= z(v-^!Q1K=3$Oi|8dqz2JVvVF)lM-2J5mQJ@Nz0ZHv)u~0Uh|4|*RL`@LWqM_ui#}3 zh7aa52%nHuGCBdISbWTzTJ0PmC%LrXUxbWFStO|>RfPHm^k5FiPar#}ef0wV=Vn=# z+HpKU(_RvLeZsB>kZbT|vllPNFpuUi|0ys80K(3&V|ex3rr1d^53Jg%I@~I)%oMt= zvr+9rN@WUbvqesZ^{Z1D80fEVE8PER4_bVM!+niOK?JA2;S3cCEIdk<0<_Hh|$BG&5H3@t?q5ZBPP?QHl(#A(SPy2 z&mj>9CbI<;aFF|BmWKeI$fL{yZ(mo56PsK(Q5o(Yk%=uu4#gfSt}&-$J2-+zvH)V} zW9u2?`}YhtmQ$+3Mp)R~xB&Bs(99#~;E^7|3x<{)mV~)`RM`%WjLk-M#stF=gxvdC z#g)>qdW~6u1Kh;0{w{xdjKmNV6P&h?`lOeV~^YA->Qr( zb1Lhp@u7D_-S2HtR_Ed6T=|@f#P3H8wd|}F;CAJQz4DGU^6U)Gw8>tAhl$MFtlYm` z!aJh`2;=VNd~WJo`D>Gh$c>WvhQ-}CwEvQyzy0xU7R^Eha&<`-~m=9fa0%h|}0 zVNVI-zcixPU_ev?I~9ECp0x+vZ{3_a%?chA*0qc$X06Yw4jcqU&_TT2914p{CWj`A zPc8T4U2^fH|3{VjjVJQ`Cmj?2DzwOeW#8cq9EzvQM>L-8{Hl$u4V#O85Zr1+H}k`V zNp|SD6ms3)0RiK-F#*?IsLEq9CkdJl%w(Vfr zEeVjWWJ@*M+~o}+0-l~N<4@wl2HD+HV*(-yJ&3QGIDV3lX?geP2rPhYBAc8Eth zrxrnpg+Ms;AAUTl;p?~Q*!BxlxF`Z*86@(!tE>|Buq6a%s-`^Jx)ebhU;6O?S_*5m zzc5|#pg0*elkXiEpgrR)w5)X{AFW9GFJb@oTaeoqSsmMtd1MA@W#Sx(a8wv@#)q@M zJ?XCBOhUQwLV>4&t2#FATY;gS0jm7eMPtpOf@Y+LUCL>LztVslBCSBkGl7tdK?lux zcYi&9|FLJ%Jyc_?ty;ktGUTyt!050_Ya2V+)uJ#-khx~ZuJRz0JNJ9?6TnnPMoT7f z(b5#1=noYr?oSy2HVdeo=CaoY)LaOdAo6b`T|GXJoFB;_s&8_S41x)`0SEvP$Y2g& zhe;)262tS@e3lmDr~%d&tY=enpH*k6EcNdov{5sKmVk8bw5pRu6vF-eyB0OSW&bO@ zf{+Mjs-J2~WTZKYoA?OR?UM^{_T2Ao*g=Q*7?>Wflzzu~FeMlBKd8F&xFrxEzW+x6 zCpi=VCeDKn-MILI88iuvx5r<5LvzAJVBbos=DE4@Zqd9fUI2nU98$Cfd;@==$eHis zpI3he>-mq18?d9$IS`bSvRzp8(#tya1Draz)WLrI#2wlqzCS$~J~@#ue!tv-W;6X0 z;XOg0*?1B4p4WU(b0#mGNxn(JAKq5lev%~HODvpsQf6~vaw<<3+HF}d@=FA!iGu&Y zNWqqc6T23|?YT6JPo|}$!S8aO-0x=UN$i2}g4y_*A3P&m=s7}QA2DhFKLVGcqGJDE z0l_Q~>qx+g;j+@iy2RyEya8K>=2R{4#{oMOwl@$SzTHIOU^9&c_2Z*4sh#;stN5{5rZ-$_235A4AVgrU| zkOzX2Ed%XQVm(#bVF=)R&W_d<+GEvnS}5n3;<5|lEJ#uUf~Y?wmokdX=f5xD2Qb3B zgg!s)&d0s~zrXABD8a(SmSR^b)#L@KYZZdJ=Gm=4n(1O(9Y9B*cuHK7Fko#)x4JW- z#k4Wq&bmL@n<2W&IV`w5b)>+&(K!&_xER`Be}3(%QntI}9~ZZ)yK(vEax?xTATKLy z0^g`|&GF_Y!w!HN2HZ`x$L@43_j0sAM<>mq|2lGf{rUo9p#b}mcsE>RdzVyF5Lvsi zzMi)#!>>B{gyoL##Z!~-A0ZL$Wna8!$h&Rq2henKlfr)pzkBY$a4_G_lg z@>iMc2hEvm#WSV!e}_0*5xz0;w48v)eDu=AjaZjw5W-4u*18etLEWzRGI4$_Xk?Ee1ki`&w{| z`Hos|qp*iLy^%8d-_DYTRQ-X6es`tVI=gkzf9N|vi=N&{9oDrDg*ExzP;T@Vx9+_ zGTpbZkWjGK#Vocvvs)B;Zn~5bMV(yqH^X?o!VVJ zdM;(|@^n_+cB6~V*~m0qM=8K)GU#ixE|u4Pbo&pUxDda$9Gx$?bH9O+;Q|$t_ubkE7G7eh^0+sR zzCVzzcI@cs3CEFWRhaGKYJz_l6*Q-0J{V>=lddR|f2GE)R%EgJr&fgfQ?72L&;o@j z<)Vat>v)=Kj0qov#!+6nB6tnL z0M-hto)#6)FccXMaJg(=_-J^H&YSfPNmHC$6}$7<@y$nD+L=okb-T0S*KT+m0gf?| zT9eSkSpMXa4a&@daghbP&qJ?Mc#tNpEd+BwNs9$3*=Z{JER zEM9m%wc*jKe4ZyqL9ka(RgJ3saDyCwseJAmN7P+yXlon*zr$vo7*=Ti`f;w!%=s%M zToz|C5huE3=xdLF9unr=i`5^KIS%{ih|HsYe2N5eo{#UEKju{4 zE&vsCh7)r-akrRfsvV5#AIyA{Qi0a;fu^a6lUf-HTlv??G6ueWMCq5(#)T_)khfP@ z^fgI1K;JwL?HcWo#uq=m9wS_C2lB^5)v#ns-5T3y&}PW3==eXLT{opZa+F^@QHRBwMeKJGa*R^UVd6Tx#)y*pZ`uO|E zI;Rc%s~9w!Pc9fS_n()?!+(`dmz|70dqYW}d*n0wVn%934CTLG0AJ7*bx}B1>(aUa z0Z&CR*v|DAqwGL$`M_(wYa5Jt86w@IC~HOO^X`JY@`3j?RK%;=rzDCk1q@lji5^6x z+OrIA9=YDgP!#9sZ8yO0KNK*|wY$yZfUK?DB7d9>^&?)hD`6|y?sNINBzMdvTYDdH z`z5l?6go?J>7_nm40q!mgdRFRxjOqx zugHRtjTr}mGfz~bqds_ZSWDP1xLWjLSA?RazNHvI{ncmkslh~9=Zvr#ymO9NPR^UX zo`=Jd-Zro3>;HIX`+!`jQeS!O^l(l2II`sNN*I*wLGUEqCn-u1{^gs*HtB~KZ(o>y z^!*U@(p>o?O-P7=gG2EiLybmbsfMGhOsp1(53vcik&2qU?8IF}<-WP1kZrC1q)0$y~t2Dx&&RsOh*pdCYtsA=udZ zUu}q}#TblX;a>$-dz0_*WJ(4*aO)zo{FayMqZu`2$j!7!NSeEuO-|P&wICslhDKkn z`gpFUKd(Bvci*v0$5@0?aIj|HZ%^HF^4#x=FVyvl7i|VkPa5IxysBO1D+Pe~w{eCK zW!Svj9Ab&}aXe~t8n;*E&hvDd_n%+>c4c;7z2M=V=+nqd(=}n>Xpq^ge@gy#EMs*x zI6o_x!kgA7!y}}*3u>y{UtjuN^9U96?Qx)p2J6E`{Lt+5x6d|Wq|&wKrrIplL-zUdv2_X|9R%_mm! z^W#FH;hp10eUM~yp_Qn2-GRIUKM21`i$#?zI>@PJu)*g#Vd?^)J>vg z=8Bdmtw-_J0&Yb*z+U<_wUT>hq23tv%m^)O#QOytLMr=ARa~1uV8Zk`?F!0tF?F## zxQZ$G&-F&Mlwt7NZmVp-Gq6X{)|e7@%z+@dVnx4}KTODWhnuli?DtRzFKi9In7G=z z`_Z10*GE}IaIhBa&>%Wnl|ARm-G&`*B-lu|xn%ungu(Hdoid0c6z!1eOw-f^ zQZ&SWe6xR1cM}jB^w`91`RO4gy?ptY!-bkwrRqbMkv%&#|IkY4OH6cBG31*MJI8x2 zJDn-)q3=8zRuh^-JlQpbM*NUnu5YQ7%OI;9flm1ZqJ}%Z{;X7A-0$w2qB})$MvwMI z`4Uq7*Qzw_QN@h<3Q#`O+%IjG^b8rfw=4~LJ$X<=!(EcIkG8-iCL;ut(q4fVCF86j zmoA}ajJsV=^o4GOnHaK5jAml>5dMd6h9^QLF`Dp=(eb;#&7L@}nck^h<{CMZ+M!Vi zR5}qnK59@8KG{>m5bX-50O`#vrK|53q8_5=@e9Ub+G5_g^Bw*h-36XuZpMUqyS;j2 zC|6v`j~#)AZ#m(iQU2({YUgGBmR!yYD_D*QO*UH9* ze$>Hpb(Lypb-~v!+Lbggul>V7vnE5YMRuG2j1%j%xxC$HHyNYB^NwCcH+M`Pt6|qe z!^j0g1w(>DmWd;}GkDZ-{VM`)1!R{I! zqs?wMCr(vqVMX`D9DFVv#q3O3dtVj;G3+enYF8@LA=t^BKHY%)wI8#v0!12jO4UyTvOdWK^!nk7nU5{G)ljISI<_3q9Sd5hN zl+eP?$&0NLql^C2EV=&E>MWMD5{=ZKyKerWv8g+6-%5&p`2HPoLmD8tdFa+NUaChP zvC8xM1sj)-XoG!NXKGz^_MI7iHj$@RZ}gCSf_2+lUn4JJ{U?^7L6wnRR?yM3O{sd{ z?ZV0VK2c;xnsj_b)aZ)q(!8yQ3l;Zzb&zqV5SuK7QRkwiaN8*^hS4)f?|Z2^R#Um( zO8ga7fZ*xyuFQV7KOH?>icN~wQL`l86gUCSI-Ud3(Zg>-ah|-b(;FZiEz5*PLUBq+a(*UhzECXdGeRx|LhZ;AshNTQWVq?o zbk$sH_-ymC_1BlR>LJSxQ`*v|_gFe5UqM&7pZuB>*YLF+!ZqY7idk);hM=yEB^WXF>*KqbzXd3H`eETU90asflHs) z^94BhO_|OC1H^_1osI0!L8CR;yHXcipas*}&E)^7RzClD9^>kS3D-qkq`J8pMbd0- zz9%L#eYy(W3rb{*^OUvg#UBT+cV%B4%^4Yn(2A=FEI3PT=e?xmb6YPQzqi2JeIl*ie05gD)fr*fZGCa#s)294x7 z?!P;Qn##mZuGk+kpub_sW z^O|Alnx9mQS5%{@m}C#(cudPfDxIqO91;65imup7PiMpbqwTAsqHMc&K?Fofq+3C{ zrCSj}Ktj5^ySux)8|fapy95NJd*~dxhUPrJpT58EoWIYH#VlBBW2L6d<9Q0GAPv$#81byWt1v@R347}L zPMqKITm#WeYA4}Ie=DY%A*%85A;fv3hBk5)d)=1XdWNb>1LS`bcDz>qjbF@sI_m`MiJ+F^2lTZ~WfZ>g;KflKut1>whS?Ftk6OVdTP?$jFCDfB@_httj zX4^wHY9I;jxa|xL@f>~K`ZgvhZ2(nu#9`dg;}%SsK;Bw!lY%u7plH z#*Lc^_u*@rvRwDU&$n`wEwY^Jp-k3@XqagMCH1q@FqCKP6>t3B{P8RG?zL_x(5nGCX)(~ZI zdpJ+OO!`&$NEdwfUAKNx!6Qo}>$Gp3=H6m~ZK;p$27wlRzg{k* zqDQm;suy3EyxL1rLAl4U+TkCky+@keC3*Bjhls3eOt?Mh=!qm|=K6qnVl1?JB9;2V z2N8I^{ipe*tvnVs_IRzQtjAo$O_}p2u7O$LBs=!7>hsA0+E|_`2 zD%mw|?>5w8*)`p;#3Z4Lb=jUYY@73eKyhZFg-Gy7Yh|tC6#cAA99M%WtMft>@YuA# ziM~V$0V!(b!7xt#A4?Wh;f+w10_i<5aBE@XdHan6Jy%BG&RBc@_a)2lyE{ET=F4Zz zwMZ4sW=HOt?%HS}-}F)*he}&7hWJsc3qb-lT6?NW{9_uEMpa;L|G_A}emJORp9{Yp z5<;w@z?j=`&Wc9V>5osdtc_+^?NpYf$8iJSp&f6@-{H-kkc+AA{N(acB82@S^y50@jxGkOX4S#Hq+;#oLpUMDb?{V9Wz2@_BH5WUSe$V%; z3DLIH-D~!kcmDEj)K%j@y<4d|vR6A7c!?=|e72hw9gMwt_2A(Vfu>Z)>Tg9)cQdRQ zDpQ|7hbO9YAfij08CjgJ+miKX)5YGohdP8Rj_OvpU1 z*jebP5WF#y9b~~JdaYjkL(8H1ea(+yeu84wfAE)ERk5&~T~n#9hnA-xAHzy|No1fR zBb>`b?)%=J+nB%^mfaKo4s~T?^+~X`rsorTb0&Di`8e@3PEwk=ENby6%g|L;OM$nH z$9~Va*JCj?YUTkF2IX#ZilQBObm$|nB;hPxXv%Uo5y>Z3v{*=*#b`fTFBMyA%pYo+ zq1PH=*chHY1fquUjJ@7kn#vl!hkjn=YGa!^Gn21w=Z{?9A*m-ZopKt?8iDAPGdSJZ zCL19Vx13%NdstipRFWbp&r0g^5@HqpaYm{FVzI@DSx-;T*0T!UhF z{*=sUTx?>4l5YwuA#iw?aYN68o)da;mZ?-N*t?^yhTvxAeM*W{F6Yqn*fvOfXzVp^ z(cTO|;qeMSjc*Oc!N4M+eJ<`q9N>>Ycv%ah+F$!V!ei%?)1;TR7cgXJwZom~F3wai z?&|bV66)|~2ga-UhGf!1;BI&F!``=^P-qjdaFH}Wz^c~KXzWDi7}lHNV7p1P5+5Nm`-hFlfjVVj1k_1Cjel+ljX8GO3AlSw@w;JkR>P1XauYiIau z5wig{x``@I(u`B_4xbHMT$x>A)Dm!6n+gcbJfveS#chSEICXu|_Ph1_-92d+OLg;n z@|^xj1TFF6_2vyKCeEl&K`)VzP~W}*rF;u+D=G>GK^g=&k_$KjXAukl=0=@1{EaeLN(QN+113^*6VY@J^>OD_JPY01~ts zOD9Tbvmc2y8CkNt*J46AI}=Pt3G4;WZG4;|48JbmrJPL$iAzeczs!JhKkFJ`_hiI| z2veXO3=d1Ued({5c*geGl5=+1-J=fD4y=hOr>iUB&Q|@Jx9KU`z3seZS9!-QBN
U1ur-K;KE3s)3;E{2np`%KtP%C|c)>6beTZX6VS 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 Zs%>O!iu5w`AnKt*W=7VA6$W?y`7a#6iDCc% literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/nonexist.png b/static/img/tutorials/quick-start/nonexist.png new file mode 100644 index 0000000000000000000000000000000000000000..e111b4a0428a929285b2c84717d90e9e012a7029 GIT binary patch literal 62145 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 LSFC;UCj5T@p%#x; literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/switch-to-testnet1.jpg b/static/img/tutorials/quick-start/switch-to-testnet1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c30e089766ddef1bcd7c71deb4fc4e68db7ab13 GIT binary patch literal 27563 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 Hzo-8V_2#m2 literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/switch-to-testnet2.jpg b/static/img/tutorials/quick-start/switch-to-testnet2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d86c9cb155c6e0e1307510835b5adc3a9a7c2d2d GIT binary patch literal 49932 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 z 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 UrhlRTJo%TelKF|b`R~vF0jBLlU;qFB literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/uninit.png b/static/img/tutorials/quick-start/uninit.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcd29f64dfd07d320256f07f3c8aef6a04a2c5d GIT binary patch literal 62563 zcmd>lRX|)#(97&5B3Ma zSxiRt6-<0yeGP~GCUlY1bWyQ4b8$CvGKDj@v$r*6b~bS`HMMiLuy;9w?-YSmV*XP} z+{x6)#nRr6Le4V`f~P+ zDVt%X5u2LH8r@;NYTYWisTJH cZ7w_VC^_#lRFu&q_K?pAG$hmSLTdVZ}?(4>5 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 literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/wallet-address.jpg b/static/img/tutorials/quick-start/wallet-address.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de350c4c16f5be9114a5aea8c16082f2fbd76748 GIT binary patch literal 54904 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 kque{%um6vL Date: Wed, 5 Mar 2025 11:49:24 +0300 Subject: [PATCH 3/8] Smart contract development section draft --- .../processing-messages.mdx | 370 ++++++++++++++++++ .../program-structure.mdx | 93 +++++ .../setup-environment.mdx | 58 +++ .../storage-and-get-methods.mdx | 216 ++++++++++ .../quick-start/getting-started.mdx | 18 + sidebars/guidelines.js | 10 + 6 files changed, 765 insertions(+) create mode 100644 docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx create mode 100644 docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx create mode 100644 docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx create mode 100644 docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx new file mode 100644 index 00000000000..e931b31c0fd --- /dev/null +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -0,0 +1,370 @@ +# Processing Messages + +Now when we learned basic examples of modifying smart-contract code and using development tools we are ready move on to the main functionality of smart-contracts - sending and recieving messages. + +First thing to mention is that in TON messages are not just currency exchange actions carrying TON coins. They are also data exchange mechanism that provides opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct controll. + +## Message Types + +We already briefly discussed message types in header section, but lets denote them and briefly discuss them again again: + +1. **Internal Messages** +2. **External Messages** + +External messages are your main way of toggling smart-contract logic from outside the blockhain, usually there is no need of realization of them in smart-contract because in most cases you don't want external entry point to be accessable to anyone. This includes several standart approuches of verifying external message sender wich we will discuss here. + + +:::info +Messages in TON are not just for data exchange—they can also carry TON coins. This allows for powerful composability between different contracts. For example, our Counter contract could receive messages with coins attached to pay for operations. +::: + +## Receiving Messages in Your Contract + +In FunC, you'll handle incoming messages using special entry point functions. There are two main entry points you'll use: + +- `recv_internal()` - For messages from other contracts +- `recv_external()` - For messages from outside the blockchain + +Let's look at how to implement these in your contract. + +### Working with Internal Messages + +When another contract sends your contract a message, the `recv_internal()` function gets called automatically. Here's how it looks: + +```func +() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + ;; Your message handling code goes here +} +``` + +The parameters give you everything you need to know about the incoming message: + +- `my_balance` - Your contract's current balance +- `msg_value` - How many TON coins were attached to the message +- `in_msg_full` - The complete message in cell format (includes sender address and other service info) +- `in_msg_body` - Just the message body data (what the sender wanted to tell you) + +If we look at our Counter example project, you'll see we already have a `recv_internal()` function: + +```func +() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + if (in_msg_body.slice_empty?()) { + return (); ;; ignore empty messages + } + + int op = in_msg_body~load_uint(32); + + if (op == op::increment) { + increment(); + return (); + } + + if (op == op::deposit) { + ;; Just accept the money + return (); + } + + throw(0xffff); +} +``` + +:::tip +Make your `recv_internal()` function robust by always checking if the message body is empty before trying to read from it, as shown in the Counter example above! +::: + +### Handling External Messages + +External messages come from outside the blockchain and are processed by the `recv_external()` function: + +```func +() recv_external(slice in_msg_body) impure { + ;; Process the external message + ;; Don't forget to call accept_message()! +} +``` +:::info +Unlike internal messages, external messages won't be processed unless you explicitly call `accept_message()` in your code. This is a security feature that prevents your contract from executing unwanted external code. +::: + +In our Counter example from earlier lessons, we don't have a `recv_external()` function because our contract only needs to handle internal messages. We'll see how to implement external message handling later in this guide. + +## Processing Message Data + +Now that we know how to receive messages, let's learn how to process them. Most TON contracts follow a similar pattern: + +1. Check if the message has any data +2. Extract the operation code (op code) to determine what to do +3. Parse any additional parameters +4. Validate the sender (if necessary) +5. Perform the requested operation +6. Update contract state +7. Optionally send a response message + +Let's see how to implement these steps. + +### Reading Operation Codes + +A common pattern in TON contracts is to include a 32-bit operation code in message bodies. This tells your contract what action to perform: + +```func +() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + ;; Step 1: Check if the message is empty + if (in_msg_body.slice_empty?()) { + return (); ;; Nothing to do with empty messages + } + + ;; Step 2: Extract the operation code + int op = in_msg_body~load_uint(32); + + ;; Step 3-7: Handle the requested operation + if (op == op::increment) { + increment(); + return (); + } else if (op == op::deposit) { + ;; Just accept the money + return (); + } else { + ;; Unknown operation + throw(0xffff); + } +} +``` + +In our Counter example, we define the operation codes as constants: + +```func +const int op::increment = 1; +const int op::deposit = 2; +``` + +:::tip +It's a good practice to define your operation codes as constants at the top of your contract for better readability, as shown in the Counter example. +::: + +### Verifying the Message Sender + +For many operations, you'll want to check who sent the message before taking any action: + +```func +() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + ;; Parse the sender address from in_msg_full + slice cs = in_msg_full.begin_parse(); + int flags = cs~load_uint(4); + slice sender_address = cs~load_msg_addr(); + + ;; Check if message was sent by the owner + if (~ equal_slices(sender_address, owner_address)) { + throw(401); ;; Unauthorized - only owner can call this method + } + + ;; Continue with authorized operations + ;; ... +} +``` + +The Counter example doesn't perform sender validation because it's a simple public contract that anyone can interact with. However, if we were to extend it to include admin-only operations (like resetting the counter), we would need to check the sender address. + +:::info +While our Counter contract doesn't need owner validation, many contracts (like wallets or governance contracts) absolutely require it. Always think carefully about who should be allowed to trigger which operations. +::: +## Sending Messages + +One of the most powerful features of TON contracts is their ability to send messages to other contracts. Let's explore how to do this in FunC. + +### Creating and Sending a Basic Message + +To send a message, you'll need to: + +1. Create a message cell using `begin_cell()` +2. Fill it with the necessary data +3. Send it using `send_raw_message()` + +Here's a simple example that sends some TON coins to another address: + +```func +() send_simple_message(slice recipient_address, int amount) impure { + ;; Step 1-2: Create and fill the message cell + var msg = begin_cell() + .store_uint(0x10, 6) ;; message info (non-bounced) + .store_slice(recipient_address) ;; destination address + .store_coins(amount) ;; attach TON coins + .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; default message flags + .store_uint(0, 32) ;; empty operation code + .end_cell(); + + ;; Step 3: Send the message + send_raw_message(msg, 64); ;; mode 64: pay fees separately +} +``` + +Let's extend our Counter contract from the Example project to include a notification feature that sends a message to the owner whenever the counter reaches a multiple of 10: + +```func +() notify_owner(int counter_value) impure { + ;; Only send notification for multiples of 10 + if (counter_value % 10 != 0) { + return (); + } + + ;; Create notification message + var msg = begin_cell() + .store_uint(0x10, 6) ;; message info (non-bounced) + .store_slice(owner_address) ;; destination address + .store_coins(50000000) ;; attach 0.05 TON for notification + .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; default message flags + .store_uint(0, 32) ;; empty operation code + .store_uint(counter_value, 32) ;; send the current counter value + .store_slice("Counter milestone reached!") ;; notification message + .end_cell(); + + ;; Send the notification + send_raw_message(msg, 1); ;; mode 1: pay fees from attached amount +} + +### Understanding Message Send Modes + +When sending messages with `send_raw_message()`, the second parameter specifies the "mode" which controls how fees are paid and how remaining value is handled: + +```func +send_raw_message(msg, mode); +``` + +Here are the most common send modes: + +- `0` - Carry all remaining value from the incoming message, with the current account paying transfer fees +- `1` - Carry all the remaining value of the incoming message, but with the transfer fees deducted from the attached amount +- `2` - Carry specified value from the incoming message, with the current account paying transfer fees +- `64` - Carry specified value from the incoming message, with the transfer fees deducted from the attached amount +- `128` - Carry all the remaining balance, with the receiver paying transfer fees + +You can also combine these modes using bitwise OR. For example, `mode 65` (64 + 1) would pay fees from the attached amount and carry all remaining value. + +:::tip +In most applications, modes 1 and 64 are the most commonly used. Use mode 1 when you want to forward all remaining value, and mode 64 when you want to send a specific amount. +::: + +Let's see how we would implement the `notify_owner` function with different send modes: + +```func +;; Example using mode 64 (pay fees from attached value) +() notify_owner_mode64(int counter_value) impure { + var msg = begin_cell() + .store_uint(0x10, 6) + .store_slice(owner_address) + .store_coins(50000000) ;; 0.05 TON + .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) + .store_uint(0, 32) + .store_slice("Notification with mode 64") + .end_cell(); + + send_raw_message(msg, 64); +} + +;; Example using mode 1 (forward remaining value) +() notify_owner_mode1(int counter_value, int value_to_forward) impure { + var msg = begin_cell() + .store_uint(0x10, 6) + .store_slice(owner_address) + .store_coins(value_to_forward) + .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) + .store_uint(0, 32) + .store_slice("Notification with mode 1") + .end_cell(); + + send_raw_message(msg, 1); +} +``` + +## Blueprint SDK Message Wrapper Examples + +The Blueprint SDK simplifies message handling with wrapper methods. Here are some examples: + +### Internal Message Wrapper + +```typescript +// Wrapper method for sending tokens +export function sendTokens( + provider: ContractProvider, + via: Sender, + opts: { + to: Address; + amount: bigint; + message?: string; + } +) { + return provider.internal(via, { + value: opts.amount, + sendMode: SendMode.PAY_GAS_SEPARATELY, + body: opts.message + ? beginCell().storeUint(0, 32).storeStringTail(opts.message).endCell() + : undefined, + }); +} +``` + +### External Message Wrapper + +```typescript +// Wrapper method for external message to withdraw funds +export function withdrawFunds( + provider: ContractProvider, + via: Sender, + opts: { + amount: bigint; + to: Address; + } +) { + return provider.external(via, { + body: beginCell() + .storeUint(3, 32) // op code for withdraw + .storeCoins(opts.amount) + .storeAddress(opts.to) + .endCell(), + }); +} +``` + +### Message Listening Wrapper + +```typescript +// Listening for specific events from the contract +export function onTokenTransfer( + provider: ContractProvider, + handler: (from: Address, amount: bigint) => void +) { + return provider.on('message:in', (msg) => { + if (msg.body?.beginParse().loadUint(32) === 0x7362d09c) { // Transfer event op + const from = msg.body.beginParse().skip(32).loadAddress(); + const amount = msg.body.beginParse().skip(32 + 267).loadCoins(); + handler(from, amount); + } + }); +} +``` + +## Best Practices for Message Processing + +1. **Validate Input Data**: Always check that incoming message data meets your expectations. +2. **Handle Errors Gracefully**: Use try-catch patterns or explicit error handling. +3. **Optimize Gas Usage**: Be mindful of operations that consume more gas. +4. **Implement Replay Protection**: For external messages, prevent replay attacks using sequence numbers. +5. **Document Operation Codes**: Keep a clear registry of all operation codes used in your contract. +6. **Limit Message Value**: Set appropriate limits on message values to prevent accidental fund loss. + +By following these guidelines and understanding the message processing flow in TON smart contracts, you can build robust and secure applications on the TON blockchain. + +## Next Steps + +Now that you understand how to process messages in TON smart contracts, here are some suggestions for next steps: + +1. **Practice with Examples**: Try modifying the Counter contract to send different types of messages or respond to more complex operations. + +2. **Explore Message Bouncing**: Learn about how TON handles message bouncing when delivery fails. (TODO: add ref to bouncing messages) + +3. **Implement Multi-Contract Systems**: Build a system where several contracts communicate with each other via messages. + +4. **Learn About Gas Optimization**: Understand how message processing affects gas consumption and how to optimize your contracts. (TODO: add ref to gas optimization guide) + +5. **Study Advanced Message Patterns**: Explore more complex message patterns like notification services, multi-signature operations, or message-based governance. + +Continue to the next section to learn about handling events in TON smart contracts. (TODO: add ref to events section) diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx new file mode 100644 index 00000000000..9a3153dd788 --- /dev/null +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx @@ -0,0 +1,93 @@ +# Project structure + +In previous steps we installed and configured all tool's required for TON smart-contract development and created our first project template. Before we proceed to research and modification of smart-contract code, lets take a brief look on project structure, purpose of them and default scenarious of its use. + + +## Overview + +If you choosed purposed names in previouse steps your project structure should look like this: + +``` +Example/ +├── contracts/ # Folder containing smart contracts code +│ ├── imports/ # Library imports for contracts +│ │ └── stdlib.fc # Standard library for FunC +│ └── hello_world.fc # Main contract file +├── scripts/ # Deployment and on-chain interaction scripts +│ ├── deployHelloWorld.ts # Script to deploy the contract +│ └── incrementHelloWorld.ts # Script to interact with the contract +├── tests/ # Test folder for local contract testing +│ └── HelloWorld.spec.ts # Test specifications for the contract +└── wrappers/ # TypeScript wrappers for contract interaction + ├── HelloWorld.ts # Wrapper class for smart contract + └── HelloWorld.compile.ts # Script for contract compilation +``` + +Before we proceed to actual smart-contract development lets briefly describe project structure and explain how to use Blueprint SDK. + +### `/contracts` + +This folder contains your smart contract source code written in one of the availible programming languages used for TON blockchain smart contract development. And contains imports folder which used for libraries usually containing stdlib.fc - standart library of FunC language. + +If you open this file you can see that it's have quite humble for standart library size of 884 lines, primarely consist of functions representing assembler insertions processing previously added to stack function parameters. + +:::info Advanced, Internals +When we discussed availible for smart-contract development programming languages we allowed ourselfs a little lie. There is actually two more languages - `Fift` and `TVM-assembly`(for jedy smart-contract programmers). First one is generally purpose language as the ones that we discussed before, that just not widely used right now. Second one - is classical assembler representing TVM instructions that you can directly access through assembler insertions in high-level languages. + +Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smart-contracts writen in one of the general-purpose languages are compiled in TVM(Telegram virtual machine) byte-code, exactly the one(except data segment) that we have seen in explorer section of getting started article and then are executed on virtual machine during transaction. +::: + +### `/wrappers` + +- `HelloWorld.ts` - wrapper for smart contract. +- `HelloWorld.compile.ts` - compile config for smart-contract. + + +While @ton/ton SDK provides us interfaces of serializing and sending messages for standart smart-contracts such as wallets, if we develop our own smart-contract that will deserialize recieved messages by its own custom protocol we need to provide some wrapper object that will serialize messages sended to smart-contract, deserialize responces from get methods and serialize initial data for contract deployment. + +To run compile script excute this command in your CLI: + +```bash +npx blueprint build +``` + +Its preferred development flow to edit smart contract code and then edit its wrapper correspondly to updated protocol. + +:::info Advanced, TL-B +Often, as a developer, you want to provide description of protocol by some formal language and Ton ecosystem has standart instrument for that - TL-B language. TL-B(Type Language-Binary) schemes serves to describe binary protocol of smart-contracts somewhat similar to Protobuf technology, on current moment, unfortunatly, there is no instruments that provide generation of serialization/deserializtion interfaces, but its anyway a good practice to have one for smart-contracts with complex interfaces. +::: + + +### `/tests` + +This directory contains test files for your smart contracts, written using the Jest testing framework. It's testing playground that uses `@ton/sandbox` tool alowing you to execute multiply smart-contracts and even send messages between them, creating your local 'network' of contracts if your project requre so, and test more complex scenarious then simple unit-tests. Tests are crucial for ensuring your smart contracts behave as expected before deployment to the mainnet. + +To run your test execute following command: + +```bash +npx blueprint build +``` + +Or use interface provided by Jest plugins in your IDE or code-editor. + + +### `/scripts` + +The scripts directory contains TypeScript files that help you deploy and interact with your smart contracts on-chain using previously implemented wrappers. + +You can execute those scripts using following command, but we recommend to read corresponding [deployment section]("/ref/to/deployment/section") first. + +```bash +npx blueprint run +``` + +Also, you can always generate same structure for another smart-contract if you need so, by using folowing command: + +```bash +npx blueprint create PascalCase //dont forget to name contract in PascalCase +``` + +## Next step + +Now, when we learned how to use BLueprint SDK lets continue to designing smart-contract persistent memory layout and get methods. + diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx new file mode 100644 index 00000000000..4a601ae32e4 --- /dev/null +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx @@ -0,0 +1,58 @@ +# Setup development environment + +This guide covers basic steps of creating your first TON smart-contract using availible languages: `FunC`, `Tact`, `Tolk`. + +But before we proceed to actual coding lets install and setup all required tools! + +## Prerequsites + + - Basic programming skills. + - Familiarity with Command-line inteface. + - You preferred code-editor/IDE. + - Around __30 minutes__ of your time. + +## Setup development environment + +For this guide we will rely on [Blueprint SDK](https://github.com/ton-org/blueprint) and [Node.js](https://nodejs.org/en)/Typescript stack for writing wrappers, tests and deployments scripts for your smart-contract, because its provides easiest, ready to use environment for smart-contracts developing. Using native instruments and language-dependent SDK's for smart-contract development covered in more advanced sections here: TODO: add references + +### Step 1: Install Node.js + +First, visit [installation page](https://nodejs.org/en/download) and execute download commands in PowerShell or Bash corresponding to your operating system Windows/Linux. + +Check node version by executing following command: + +```bash +node -v +npm -v +``` +Node version should be at least `v18`. + +### Step 2: Setup Blueprint SDK + +Change directory for parent folder of you future project and run folowing command: + +```bash +npm create ton@latest +``` + +TODO: add short language description for choosing prefered one. + +This will run interactive script for creating project template, you can enter anything you want, but if you want to have same paths as this guide choose folowing: +1. Project name: Example. +2. First created contract name: HelloWorld. +3. Choose the project template: A simple counter contract (language name). + +And finally, change you current directory to generated project template folder, and install all required dependencies: + +```bash +cd ./Example +npm install +``` + +### Step 3(optional): IDE and editors support + +Ton community developed plugins providing syntax support for several IDE's and code editors. You can find them here: [Plugin List](https://docs.ton.org/v3/documentation/smart-contracts/getting-started/ide-plugins). + +Also consider installing plugins providing support for JavaScript/TypeScrypt tools for yor preferred IDE or code editor and, specificly, `Jest` for debugging smart-contract tests. + + diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx new file mode 100644 index 00000000000..6a2e162afb4 --- /dev/null +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx @@ -0,0 +1,216 @@ +# Storage and Get Methods + +While its technically possible to create smart contract on TON not having any persistant storage, almost all smart-contracts needs to persistently store its state between transactions. Understanding how storage works in TON smart contracts is essential for developing. This guide explains standart ways of managing state of smart-contract and using get methods to obtain it from utside the blockhain. + +## Cell Structure: The Backbone of TON Storage + +TON blockchain uses a data structure called "Cell" as the fundamental unit for storing data. Cells are the building blocks of the TVM (TON Virtual Machine) and have some important characteristics: + +- A cell can store up to 1023 bits (approximately 128 bytes) of data +- A cell can reference up to 4 other cells (children) +- Cells form a directed acyclic graph (DAG) structure +- Cells are immutable once created + +You can think of Cell as the following structure: + +```typescript +// Conceptual representation of a Cell +interface Cell { + bits: BitString; // Up to 1023 bits + refs: Cell[]; // Up to 4 child cells +} +``` + +## Smart Contract Storage Operations + +First thing that we should say that there is small, but important difference between smart-contract data segment and TVM storage [c4 register]("/s") exzisting only during execution of smart-contract. Remember that smart-contracts follows transaction concept - if any system or user exception was raised during execution, i.e. transaction is failed - TVM storage will not be commited to smart-contract data segment. From the realization point this means that smart-contract data segment is copied to TVM storage before starting the execution and commited back, optionally modified, in case of succesfull transaction. For simplification of guide we will not use those strict terms, instead we will describe both one as `storage` and rely on context, so, keep those facts in mind. + +There is two main instructions that provides acceess to smart-contract storage: + - get_data() returning current storage cell. + - set_data() setting current storage cell. + +In case that its inconvinient to always serialize and desirialize storage cell there is pretty standart practice to define two wrapper methods that provides corresponding logic. If you didn't change smart-contract code it should contain folowing lines: + +```func +;; load_data populates storage variables using stored data +() load_data() impure { + var ds = get_data().begin_parse(); + + ctx_id = ds~load_uint(32); + ctx_counter = ds~load_uint(32); + + ds.end_parse(); +} + +;; save_data stores storage variables as a cell into persistent storage +() save_data() impure { + set_data( + begin_cell() + .store_uint(ctx_id, 32) + .store_uint(ctx_counter, 32) + .end_cell() + ); +} +``` + +In this guide we will not dwell in detail of FunC language syntax, providing simple examples that could be understanded by person with basic programming background, but if you feel the need for a little-bit more context - check those artcile. "TODO: add ref" + +:::tip +If you have stucked on some of the examples you can find original template project with all modification performed during this guide here: +"Todo: add ref to repo" +::: + +Let's try to modify our example a little bit. First lets use a little more common approuch of passing storage members as parameters to save_data(members...) and retrieve them as (members...) get_data() moving global variables ctx_id and ctx_counter to methods bodies, also lets add 2 additional integers of 32-bit and 256-bit size into our storage: + +Result of our modifications should look like this: + +```func +;; load_data populates storage variables using stored data +(int, int, int, int) load_data() { + var ds = get_data().begin_parse(); + + int ctx_id = ds~load_uint(32); + int ctx_counter = ds~load_uint(32); + int seqno = ds~load_uint(32); + int public_key = ds~load_uint(256); + + ds.end_parse(); + + return (ctx_id, ctx_counter, seqno, public_key); +} + +;; save_data stores storage variables as a cell into persistent storage +() save_data(int ctx_id, int ctx_counter, int seqno, int public_key) impure { + set_data( + begin_cell() + .store_uint(ctx_id, 32) + .store_uint(ctx_counter, 32) + .store_uint(seqno, 32) + .store_uint(public_key, 256) + .end_cell() + ); +} +``` + +Dont forget to delete global variables 'ctx_id', 'ctx_counter' and modify usage of function like this, copying storage members locally: + +```func +var (ctx_id, ctx_counter, seqno, public_key) = load_data(); +save_data(ctx_id, ctx_counter, seqno, public_key); +``` + +## Get methods + +The primary use of get methods is reading our storage data form outside the blockhain using convinient interface, primarly to extract data that is required to prepare a transaction. + +Lets omit on current moment motivation of magical storage members 'seqno' and 'public_key' - we will discuss their meaning in later topics. Instead lets provide get method to retrieve both of them from outside the blockhain: + +```func +(int, int) get_seqno_public_key() method_id { + var (_, _, seqno, public_key) = load_data(); + return (seqno, public_key); +} +``` + +Don't forget to check correctness of changing by compiling smart contract: + +```bash +npm run build +``` + +And that's it! In practice all get methods follows this simple flow and doesnt require anthing more. Note that you can omit values returned from function using '_' syntax. + +##Updating wrapper + +Now lets update our wrapper class corresponding to new storage layout and new get method. + +First, lets modify `helloWorldConfigToCell` function and `HelloWorldConfig` type to proprely initialize our storage during deployment: + +```typescript +export type HelloWorldConfig = { + id: number; + counter: number; + seqno: number; + public_key: bigint; +}; + +export function helloWorldConfigToCell(config: HelloWorldConfig): Cell { + return beginCell() + .storeUint(config.id, 32) + .storeUint(config.counter, 32) + .storeUint(config.seqno, 32) + .storeUint(config.public_key, 256) + .endCell(); +} +``` +Second, add method to perform request for newly created get method: + +```typescript + async getSeqnoPKey(provider: ContractProvider) { + const result = await provider.get('get_seqno_public_key', []); + return [result.stack.readNumber(), result.stack.readBigNumber()]; + } +``` + +##Updating Tests + +And finally lets write simple test, checking that deployment process initialize smart contract storage and correctly retrieves it's data by get methods. + +First, lets update `before each` section and particulary `openContract` logic with the folowing one: + +```typescript +helloWorld = blockchain.openContract( + HelloWorld.createFromConfig( + { + id: 0, + counter: 0, + seqno: 0, + //it will be changed later, just initialization check + public_key: 0n + }, + code + ) +); +```typescript + +And add new test case for get methods: + +```typescript +it('should correctly initialize and return the initial data', async () => { + // Define the expected initial values (same as in beforeEach) + const expectedConfig = { + id: 0, + counter: 0, + seqno: 0, + public_key: 0n + }; + + // Verify counter value + const counter = await helloWorld.getCounter(); + expect(counter).toBe(expectedConfig.counter); + + // Verify ID value + const id = await helloWorld.getID(); + expect(id).toBe(expectedConfig.id); + + // Verify seqno and public_key values + const [seqno, publicKey] = await helloWorld.getSeqnoPKey(); + expect(seqno).toBe(expectedConfig.seqno); + expect(publicKey).toBe(expectedConfig.public_key); +}); +``` + +And now run your new test script by executing folowwing command: + +```bash +npm run test +``` + +## Next Steps + +Congratulations! We modified our first contract to execute new get method, learned about smart-contract storage and went through standart smart contract development flow. Now we can proceed to further sections explaining more complex actions upon smart contracts. At this point we will provide more short description of standart actions: edit smart-contract -> edit wrapper -> edit tests, relying on your new skills. + +Remember, that you always can find performed modification in this repository: "TODO: add ref". + +Consider reading [Func Documentation]("/s") and try to add your own get method with corresponding wrapper and test modification by yourself and proceed to next steps when you fill ready for it. + diff --git a/docs/v3/guidelines/quick-start/getting-started.mdx b/docs/v3/guidelines/quick-start/getting-started.mdx index 99dbafb0bfc..8dd40c7b431 100644 --- a/docs/v3/guidelines/quick-start/getting-started.mdx +++ b/docs/v3/guidelines/quick-start/getting-started.mdx @@ -19,6 +19,24 @@ Welcome to TON quick start guide! This guide will give you a starting point for - Core concepts of TON blockchain and further learning curve - Basic project templates ready for implementation of your project logic. +## Concept of smart-contract + +You can think of smart-contracts in TON as a program running on blockhain following well known behaivour concept of actor(node/state machine). In contrast to some other blockhains were you can call in synchronius way other contracts code, smart-contract in TON is thing in itself, and communicate with other smart-contracts on equal basis sending asynchronious messages between each other. Each processing of those queries by reciever smart-contract is considered transaction resulting in following actions: + - Sending further messages. + - Changing internal state or even code of smart-contract itself + - changing it's balance. + +Availible interaces of smart-contract are: + - Recieving internal messages from other smart-contract initiating transaction. + - Recieving external messages from outside the blockhain initiating transaction. + - Recieving get method request from outside the blockchain. + +In contrast to internal and external messages get methods are not what you can consider as transaction, those are special functions of smart contract that cannot change contract iternal state or proceed any other action except querying specific data from them. Contrary to what might seem intuitive, invoking get methods from other contracts is not possible on-chain, primarily due to the nature of blockchain technology and the need for consensus. + +:::tip +Hereinafter we will use terms `actor`, `smart-contract` and `account` interchangebly. +::: + ## Interacting with TON ecosystem Before we step on our way of becoming a TON developer, we should become an advanced user of TON! Let's create your own wallet, send a few transactions, and see how our actions are reflected on the `blockchain` using explorers. diff --git a/sidebars/guidelines.js b/sidebars/guidelines.js index f146947691c..7c349f76330 100644 --- a/sidebars/guidelines.js +++ b/sidebars/guidelines.js @@ -38,6 +38,16 @@ module.exports = [ 'value': ' Quick Start ', }, 'v3/guidelines/quick-start/getting-started', + { + type: 'category', + label: 'Developing smart-contracts', + items: [ + 'v3/guidelines/quick-start/developing-smart-contracts/setup-environment', + 'v3/guidelines/quick-start/developing-smart-contracts/program-structure', + 'v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods', + 'v3/guidelines/quick-start/developing-smart-contracts/processing-messages', + ], + }, { 'type': 'html', 'value': '
', From 5f084796220bde47ba274770055c4bdcd393bde3 Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Wed, 5 Mar 2025 11:51:41 +0300 Subject: [PATCH 4/8] Grammar, syntax, spelling errors fixes --- .../processing-messages.mdx | 8 ++-- .../program-structure.mdx | 28 ++++++------ .../setup-environment.mdx | 18 ++++---- .../storage-and-get-methods.mdx | 44 +++++++++---------- .../quick-start/getting-started.mdx | 18 ++++---- 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx index e931b31c0fd..6f57168b00a 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -1,17 +1,17 @@ # Processing Messages -Now when we learned basic examples of modifying smart-contract code and using development tools we are ready move on to the main functionality of smart-contracts - sending and recieving messages. +Now when we have learned basic examples of modifying smart-contract code and using development tools, we are ready to move on to the main functionality of smart contracts - sending and receiving messages. -First thing to mention is that in TON messages are not just currency exchange actions carrying TON coins. They are also data exchange mechanism that provides opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct controll. +First thing to mention is that in TON, messages are not just currency exchange actions carrying TON coins. They are also a data exchange mechanism that provides an opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct control. ## Message Types -We already briefly discussed message types in header section, but lets denote them and briefly discuss them again again: +We already briefly discussed message types in the header section, but let's denote them and briefly discuss them again: 1. **Internal Messages** 2. **External Messages** -External messages are your main way of toggling smart-contract logic from outside the blockhain, usually there is no need of realization of them in smart-contract because in most cases you don't want external entry point to be accessable to anyone. This includes several standart approuches of verifying external message sender wich we will discuss here. +External messages are your main way of toggling smart-contract logic from outside the blockchain. Usually, there is no need for implementation of them in smart contracts because in most cases you don't want external entry points to be accessible to anyone. This includes several standard approaches of verifying external message sender which we will discuss here. :::info diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx index 9a3153dd788..f56cb03eded 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx @@ -1,11 +1,11 @@ # Project structure -In previous steps we installed and configured all tool's required for TON smart-contract development and created our first project template. Before we proceed to research and modification of smart-contract code, lets take a brief look on project structure, purpose of them and default scenarious of its use. +In previous steps we installed and configured all tools required for TON smart-contract development and created our first project template. Before we proceed to research and modification of smart-contract code, let's take a brief look at project structure, purpose of them and default scenarios of its use. ## Overview -If you choosed purposed names in previouse steps your project structure should look like this: +If you chose proposed names in previous steps your project structure should look like this: ``` Example/ @@ -23,18 +23,18 @@ Example/ └── HelloWorld.compile.ts # Script for contract compilation ``` -Before we proceed to actual smart-contract development lets briefly describe project structure and explain how to use Blueprint SDK. +Before we proceed to actual smart-contract development let's briefly describe project structure and explain how to use Blueprint SDK. ### `/contracts` -This folder contains your smart contract source code written in one of the availible programming languages used for TON blockchain smart contract development. And contains imports folder which used for libraries usually containing stdlib.fc - standart library of FunC language. +This folder contains your smart contract source code written in one of the available programming languages used for TON blockchain smart contract development. And contains imports folder which is used for libraries usually containing stdlib.fc - standard library of FunC language. -If you open this file you can see that it's have quite humble for standart library size of 884 lines, primarely consist of functions representing assembler insertions processing previously added to stack function parameters. +If you open this file you can see that it has quite humble for a standard library, a size of 884 lines, primarily consisting of functions representing assembler insertions processing previously added to stack function parameters. :::info Advanced, Internals -When we discussed availible for smart-contract development programming languages we allowed ourselfs a little lie. There is actually two more languages - `Fift` and `TVM-assembly`(for jedy smart-contract programmers). First one is generally purpose language as the ones that we discussed before, that just not widely used right now. Second one - is classical assembler representing TVM instructions that you can directly access through assembler insertions in high-level languages. +When we discussed available for smart-contract development programming languages we allowed ourselves a little lie. There are actually two more languages - `Fift` and `TVM-assembly`(for jedi smart-contract programmers). First one is general-purpose language like the ones that we discussed before, that is just not widely used right now. Second one - is classical assembler representing TVM instructions that you can directly access through assembler insertions in high-level languages. -Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smart-contracts writen in one of the general-purpose languages are compiled in TVM(Telegram virtual machine) byte-code, exactly the one(except data segment) that we have seen in explorer section of getting started article and then are executed on virtual machine during transaction. +Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smart-contracts written in one of the general-purpose languages are compiled in TVM(Telegram virtual machine) byte-code, exactly the one(except data segment) that we have seen in explorer section of getting started article and then are executed on virtual machine during transaction. ::: ### `/wrappers` @@ -43,7 +43,7 @@ Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smar - `HelloWorld.compile.ts` - compile config for smart-contract. -While @ton/ton SDK provides us interfaces of serializing and sending messages for standart smart-contracts such as wallets, if we develop our own smart-contract that will deserialize recieved messages by its own custom protocol we need to provide some wrapper object that will serialize messages sended to smart-contract, deserialize responces from get methods and serialize initial data for contract deployment. +While @ton/ton SDK provides us interfaces of serializing and sending messages for standard smart-contracts such as wallets, if we develop our own smart-contract that will deserialize received messages by its own custom protocol we need to provide some wrapper object that will serialize messages sent to smart-contract, deserialize responses from get methods and serialize initial data for contract deployment. To run compile script excute this command in your CLI: @@ -51,16 +51,16 @@ To run compile script excute this command in your CLI: npx blueprint build ``` -Its preferred development flow to edit smart contract code and then edit its wrapper correspondly to updated protocol. +It's preferred development flow to edit smart contract code and then edit its wrapper correspondingly to updated protocol. :::info Advanced, TL-B -Often, as a developer, you want to provide description of protocol by some formal language and Ton ecosystem has standart instrument for that - TL-B language. TL-B(Type Language-Binary) schemes serves to describe binary protocol of smart-contracts somewhat similar to Protobuf technology, on current moment, unfortunatly, there is no instruments that provide generation of serialization/deserializtion interfaces, but its anyway a good practice to have one for smart-contracts with complex interfaces. +Often, as a developer, you want to provide description of protocol by some formal language and Ton ecosystem has standard instrument for that - TL-B language. TL-B(Type Language-Binary) schemes serve to describe binary protocol of smart-contracts somewhat similar to Protobuf technology. At the current moment, unfortunately, there are no instruments that provide generation of serialization/deserialization interfaces, but it's anyway a good practice to have one for smart-contracts with complex interfaces. ::: ### `/tests` -This directory contains test files for your smart contracts, written using the Jest testing framework. It's testing playground that uses `@ton/sandbox` tool alowing you to execute multiply smart-contracts and even send messages between them, creating your local 'network' of contracts if your project requre so, and test more complex scenarious then simple unit-tests. Tests are crucial for ensuring your smart contracts behave as expected before deployment to the mainnet. +This directory contains test files for your smart contracts, written using the Jest testing framework. It's testing playground that uses `@ton/sandbox` tool allowing you to execute multiple smart-contracts and even send messages between them, creating your local 'network' of contracts if your project requires so, and test more complex scenarios than simple unit-tests. Tests are crucial for ensuring your smart contracts behave as expected before deployment to the mainnet. To run your test execute following command: @@ -75,13 +75,13 @@ Or use interface provided by Jest plugins in your IDE or code-editor. The scripts directory contains TypeScript files that help you deploy and interact with your smart contracts on-chain using previously implemented wrappers. -You can execute those scripts using following command, but we recommend to read corresponding [deployment section]("/ref/to/deployment/section") first. +You can execute those scripts using following command, but we recommend to read corresponding [deployment section](/ref/to/deployment/section) first. ```bash npx blueprint run ``` -Also, you can always generate same structure for another smart-contract if you need so, by using folowing command: +Also, you can always generate same structure for another smart-contract if you need so, by using following command: ```bash npx blueprint create PascalCase //dont forget to name contract in PascalCase @@ -89,5 +89,5 @@ npx blueprint create PascalCase //dont forget to name contract in PascalCase ## Next step -Now, when we learned how to use BLueprint SDK lets continue to designing smart-contract persistent memory layout and get methods. +Now, when we learned how to use Blueprint SDK let's continue to designing smart-contract persistent memory layout and get methods. diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx index 4a601ae32e4..45f9ab70a85 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx @@ -1,14 +1,14 @@ # Setup development environment -This guide covers basic steps of creating your first TON smart-contract using availible languages: `FunC`, `Tact`, `Tolk`. +This guide covers basic steps of creating your first TON smart-contract using available languages: `FunC`, `Tact`, `Tolk`. -But before we proceed to actual coding lets install and setup all required tools! +But before we proceed to actual coding let's install and setup all required tools! -## Prerequsites +## Prerequisites - Basic programming skills. - - Familiarity with Command-line inteface. - - You preferred code-editor/IDE. + - Familiarity with Command-line interface. + - Your preferred code-editor/IDE. - Around __30 minutes__ of your time. ## Setup development environment @@ -29,7 +29,7 @@ Node version should be at least `v18`. ### Step 2: Setup Blueprint SDK -Change directory for parent folder of you future project and run folowing command: +Change directory to parent folder of your future project and run following command: ```bash npm create ton@latest @@ -37,12 +37,12 @@ npm create ton@latest TODO: add short language description for choosing prefered one. -This will run interactive script for creating project template, you can enter anything you want, but if you want to have same paths as this guide choose folowing: +This will run interactive script for creating project template, you can enter anything you want, but if you want to have same paths as this guide choose following: 1. Project name: Example. 2. First created contract name: HelloWorld. 3. Choose the project template: A simple counter contract (language name). -And finally, change you current directory to generated project template folder, and install all required dependencies: +And finally, change your current directory to generated project template folder, and install all required dependencies: ```bash cd ./Example @@ -53,6 +53,6 @@ npm install Ton community developed plugins providing syntax support for several IDE's and code editors. You can find them here: [Plugin List](https://docs.ton.org/v3/documentation/smart-contracts/getting-started/ide-plugins). -Also consider installing plugins providing support for JavaScript/TypeScrypt tools for yor preferred IDE or code editor and, specificly, `Jest` for debugging smart-contract tests. +Also consider installing plugins providing support for JavaScript/TypeScript tools for your preferred IDE or code editor and, specifically, `Jest` for debugging smart-contract tests. diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx index 6a2e162afb4..d34f26e9ae0 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx @@ -1,6 +1,6 @@ # Storage and Get Methods -While its technically possible to create smart contract on TON not having any persistant storage, almost all smart-contracts needs to persistently store its state between transactions. Understanding how storage works in TON smart contracts is essential for developing. This guide explains standart ways of managing state of smart-contract and using get methods to obtain it from utside the blockhain. +While it's technically possible to create smart contract on TON not having any persistent storage, almost all smart-contracts need to persistently store their state between transactions. Understanding how storage works in TON smart contracts is essential for developing. This guide explains standard ways of managing state of smart-contract and using get methods to obtain it from outside the blockchain. ## Cell Structure: The Backbone of TON Storage @@ -23,13 +23,13 @@ interface Cell { ## Smart Contract Storage Operations -First thing that we should say that there is small, but important difference between smart-contract data segment and TVM storage [c4 register]("/s") exzisting only during execution of smart-contract. Remember that smart-contracts follows transaction concept - if any system or user exception was raised during execution, i.e. transaction is failed - TVM storage will not be commited to smart-contract data segment. From the realization point this means that smart-contract data segment is copied to TVM storage before starting the execution and commited back, optionally modified, in case of succesfull transaction. For simplification of guide we will not use those strict terms, instead we will describe both one as `storage` and rely on context, so, keep those facts in mind. +First thing that we should say is that there is a small, but important difference between smart-contract data segment and TVM storage [c4 register]("/s") existing only during execution of smart-contract. Remember that smart-contracts follow transaction concept - if any system or user exception is raised during execution, i.e. transaction fails - TVM storage will not be committed to smart-contract data segment. From the realization point this means that smart-contract data segment is copied to TVM storage before starting the execution and committed back, optionally modified, in case of successful transaction. For simplification of this guide we will not use those strict terms, instead we will describe both as `storage` and rely on context, so, keep these facts in mind. -There is two main instructions that provides acceess to smart-contract storage: +There are two main instructions that provide access to smart-contract storage: - get_data() returning current storage cell. - set_data() setting current storage cell. -In case that its inconvinient to always serialize and desirialize storage cell there is pretty standart practice to define two wrapper methods that provides corresponding logic. If you didn't change smart-contract code it should contain folowing lines: +In case it's inconvenient to always serialize and deserialize storage cell, there is a pretty standard practice to define two wrapper methods that provide corresponding logic. If you didn't change smart-contract code it should contain following lines: ```func ;; load_data populates storage variables using stored data @@ -53,14 +53,14 @@ In case that its inconvinient to always serialize and desirialize storage cell t } ``` -In this guide we will not dwell in detail of FunC language syntax, providing simple examples that could be understanded by person with basic programming background, but if you feel the need for a little-bit more context - check those artcile. "TODO: add ref" +In this guide we will not dwell in detail of FunC language syntax, providing simple examples that could be understood by a person with basic programming background, but if you feel the need for a little-bit more context - check those articles. "TODO: add ref" :::tip -If you have stucked on some of the examples you can find original template project with all modification performed during this guide here: +If you are stuck on some of the examples you can find original template project with all modifications performed during this guide here: "Todo: add ref to repo" ::: -Let's try to modify our example a little bit. First lets use a little more common approuch of passing storage members as parameters to save_data(members...) and retrieve them as (members...) get_data() moving global variables ctx_id and ctx_counter to methods bodies, also lets add 2 additional integers of 32-bit and 256-bit size into our storage: +Let's try to modify our example a little bit. First, let's use a more common approach of passing storage members as parameters to save_data(members...) and retrieve them as (members...) get_data() moving global variables ctx_id and ctx_counter to method bodies. Also, let's add 2 additional integers of 32-bit and 256-bit size into our storage: Result of our modifications should look like this: @@ -92,7 +92,7 @@ Result of our modifications should look like this: } ``` -Dont forget to delete global variables 'ctx_id', 'ctx_counter' and modify usage of function like this, copying storage members locally: +Don't forget to delete global variables 'ctx_id', 'ctx_counter' and modify usage of the function like this, copying storage members locally: ```func var (ctx_id, ctx_counter, seqno, public_key) = load_data(); @@ -101,9 +101,9 @@ save_data(ctx_id, ctx_counter, seqno, public_key); ## Get methods -The primary use of get methods is reading our storage data form outside the blockhain using convinient interface, primarly to extract data that is required to prepare a transaction. +The primary use of get methods is reading our storage data from outside the blockchain using a convenient interface, primarily to extract data that is required to prepare a transaction. -Lets omit on current moment motivation of magical storage members 'seqno' and 'public_key' - we will discuss their meaning in later topics. Instead lets provide get method to retrieve both of them from outside the blockhain: +Let's omit at the current moment the motivation of magical storage members 'seqno' and 'public_key' - we will discuss their meaning in later topics. Instead, let's provide a get method to retrieve both of them from outside the blockchain: ```func (int, int) get_seqno_public_key() method_id { @@ -112,19 +112,19 @@ Lets omit on current moment motivation of magical storage members 'seqno' and 'p } ``` -Don't forget to check correctness of changing by compiling smart contract: +Don't forget to check the correctness of your changes by compiling the smart contract: ```bash npm run build ``` -And that's it! In practice all get methods follows this simple flow and doesnt require anthing more. Note that you can omit values returned from function using '_' syntax. +And that's it! In practice all get methods follow this simple flow and don't require anything more. Note that you can omit values returned from functions using '_' syntax. -##Updating wrapper +## Updating wrapper Now lets update our wrapper class corresponding to new storage layout and new get method. -First, lets modify `helloWorldConfigToCell` function and `HelloWorldConfig` type to proprely initialize our storage during deployment: +First, let's modify `helloWorldConfigToCell` function and `HelloWorldConfig` type to properly initialize our storage during deployment: ```typescript export type HelloWorldConfig = { @@ -143,7 +143,7 @@ export function helloWorldConfigToCell(config: HelloWorldConfig): Cell { .endCell(); } ``` -Second, add method to perform request for newly created get method: +Second, add a method to perform a request for the newly created get method: ```typescript async getSeqnoPKey(provider: ContractProvider) { @@ -152,11 +152,11 @@ Second, add method to perform request for newly created get method: } ``` -##Updating Tests +## Updating Tests -And finally lets write simple test, checking that deployment process initialize smart contract storage and correctly retrieves it's data by get methods. +And finally, let's write a simple test, checking that the deployment process initializes smart contract storage and correctly retrieves its data by get methods. -First, lets update `before each` section and particulary `openContract` logic with the folowing one: +First, let's update the `before each` section and particularly the `openContract` logic with the following one: ```typescript helloWorld = blockchain.openContract( @@ -200,7 +200,7 @@ it('should correctly initialize and return the initial data', async () => { }); ``` -And now run your new test script by executing folowwing command: +And now run your new test script by executing the following command: ```bash npm run test @@ -208,9 +208,9 @@ npm run test ## Next Steps -Congratulations! We modified our first contract to execute new get method, learned about smart-contract storage and went through standart smart contract development flow. Now we can proceed to further sections explaining more complex actions upon smart contracts. At this point we will provide more short description of standart actions: edit smart-contract -> edit wrapper -> edit tests, relying on your new skills. +Congratulations! We modified our first contract to execute a new get method, learned about smart-contract storage and went through the standard smart contract development flow. Now we can proceed to further sections explaining more complex actions upon smart contracts. At this point we will provide a more short description of standard actions: edit smart-contract -> edit wrapper -> edit tests, relying on your new skills. -Remember, that you always can find performed modification in this repository: "TODO: add ref". +Remember that you can always find the performed modifications in this repository: "TODO: add ref". -Consider reading [Func Documentation]("/s") and try to add your own get method with corresponding wrapper and test modification by yourself and proceed to next steps when you fill ready for it. +Consider reading [Func Documentation]("/s") and try to add your own get method with corresponding wrapper and test modification by yourself and proceed to next steps when you feel ready for it. diff --git a/docs/v3/guidelines/quick-start/getting-started.mdx b/docs/v3/guidelines/quick-start/getting-started.mdx index 8dd40c7b431..e16bb6410e4 100644 --- a/docs/v3/guidelines/quick-start/getting-started.mdx +++ b/docs/v3/guidelines/quick-start/getting-started.mdx @@ -21,20 +21,20 @@ Welcome to TON quick start guide! This guide will give you a starting point for ## Concept of smart-contract -You can think of smart-contracts in TON as a program running on blockhain following well known behaivour concept of actor(node/state machine). In contrast to some other blockhains were you can call in synchronius way other contracts code, smart-contract in TON is thing in itself, and communicate with other smart-contracts on equal basis sending asynchronious messages between each other. Each processing of those queries by reciever smart-contract is considered transaction resulting in following actions: +You can think of smart-contracts in TON as a program running on blockchain following well known behavior concept of actor(node/state machine). In contrast to some other blockchains where you can call in synchronous way other contracts code, smart-contract in TON is a thing in itself, and communicates with other smart-contracts on equal basis sending asynchronous messages between each other. Each processing of those queries by receiver smart-contract is considered a transaction resulting in following actions: - Sending further messages. - Changing internal state or even code of smart-contract itself - changing it's balance. -Availible interaces of smart-contract are: - - Recieving internal messages from other smart-contract initiating transaction. - - Recieving external messages from outside the blockhain initiating transaction. - - Recieving get method request from outside the blockchain. +Available interfaces of smart-contract are: + - Receiving internal messages from other smart-contract initiating transaction. + - Receiving external messages from outside the blockchain initiating transaction. + - Receiving get method request from outside the blockchain. -In contrast to internal and external messages get methods are not what you can consider as transaction, those are special functions of smart contract that cannot change contract iternal state or proceed any other action except querying specific data from them. Contrary to what might seem intuitive, invoking get methods from other contracts is not possible on-chain, primarily due to the nature of blockchain technology and the need for consensus. +In contrast to internal and external messages, get methods are not what you can consider as a transaction. Those are special functions of smart contract that cannot change contract internal state or proceed any other action except querying specific data from them. Contrary to what might seem intuitive, invoking get methods from other contracts is not possible on-chain, primarily due to the nature of blockchain technology and the need for consensus. :::tip -Hereinafter we will use terms `actor`, `smart-contract` and `account` interchangebly. +Hereinafter we will use terms `actor`, `smart-contract` and `account` interchangeably. ::: ## Interacting with TON ecosystem @@ -51,7 +51,7 @@ At this moment, you should have already created your first wallet and backed up In the TON, the `Mainnet` and `Testnet` have distinct roles. The `Mainnet` is the primary network where actual transactions take place, carrying real economic value as they involve real cryptocurrency and staked validators executing our transactions and guarantee a very high level of security. On the other hand, the `Testnet` is a testing version of the TON `blockchain` designed for development and testing purposes. Transactions on the `testnet` do not have real economic value, making it a risk-free zone for developers to test without financial implications. It's mainly used for development, testing `smart contracts`, and trying new features. -Since TON basic transactions are very cheap, about 1 cent per transaction, investing just $5 will be enough for hundreds of them. If you decide to work on `Mainnet`, you will have a significantly smoother experience. You can get TON coins by simply pressing the buy button in the user interface, or ask someone to send them to your address, which you can copy from the wallet app somewhere near your balance. Don't worry, sharing your public address is totally safe, unless you dont want it to be associated with you. +Since TON basic transactions are very cheap, about 1 cent per transaction, investing just $5 will be enough for hundreds of them. If you decide to work on `Mainnet`, you will have a significantly smoother experience. You can get TON coins by simply pressing the buy button in the user interface, or ask someone to send them to your address, which you can copy from the wallet app somewhere near your balance. Don't worry, sharing your public address is totally safe, unless you don't want it to be associated with you. If you decide to use the `Testnet` version instead, you can do this in almost the same way in any wallet by entering the settings menu and tapping a few times on the wallet icon or name at the bottom. This will open the developer menu where you can switch to the `Testnet` version of the wallet. Here is an example for MyTonWallet (version 3.3.4): @@ -103,7 +103,7 @@ There is also a tab where we can execute `get-methods` provided by the `smart-co The second thing to note is the contract type, `wallet_v5r1` in our case. Because some widely-used `smart-contracts` have standard implementations, most explorers are able to determine their type by analyzing the `smart-contract` code segment. -Its important to understand that wallets are not special entities in the TON `blockchain`, which implements an actors model. A wallet is simply a `smart-contract` that doesn't have any specific rights or abilities compared to any other contract, such as one developed and deployed by you. +It's important to understand that wallets are not special entities in the TON `blockchain`, which implements an actors model. A wallet is simply a `smart-contract` that doesn't have any specific rights or abilities compared to any other contract, such as one developed and deployed by you. Maybe you will be the one who creates and proposes the next version of wallet that will be accepted by the TON community, just as the TonKeeper Team did with the latest wallet version - `v5r1`! From bbfc6d8352beca2f4e128523ff1d922edc7eba8a Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Thu, 6 Mar 2025 15:27:07 +0300 Subject: [PATCH 5/8] Finishing internal message section --- .../processing-messages.mdx | 681 +++++++++++------- .../multi-contract-example-bright.png | Bin 0 -> 45912 bytes .../multi-contract-example-dark.png | Bin 0 -> 45912 bytes 3 files changed, 421 insertions(+), 260 deletions(-) create mode 100644 static/img/tutorials/quick-start/multi-contract-example-bright.png create mode 100644 static/img/tutorials/quick-start/multi-contract-example-dark.png diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx index 6f57168b00a..98f3d4dfeb8 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -1,116 +1,225 @@ # Processing Messages -Now when we have learned basic examples of modifying smart-contract code and using development tools, we are ready to move on to the main functionality of smart contracts - sending and receiving messages. +> **Summary:** Messages in TON are a fundamental mechanism for both value transfer and data exchange between smart contracts, enabling complex interactions both with user wallets and between contracts in the network. -First thing to mention is that in TON, messages are not just currency exchange actions carrying TON coins. They are also a data exchange mechanism that provides an opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct control. +Now that we have learned basic examples of modifying smart-contract code and using development tools, we are ready to move on to the main functionality of smart contracts - sending and receiving messages. -## Message Types +First thing to mention is that in TON, messages are not just currency exchange actions carrying TON coins. They are also a **data exchange mechanism** that provides an opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct control. -We already briefly discussed message types in the header section, but let's denote them and briefly discuss them again: +In previous sections we already discussed types of messages and their basic concepts so let's not waste time and move on to their detailed description! -1. **Internal Messages** -2. **External Messages** +--- -External messages are your main way of toggling smart-contract logic from outside the blockchain. Usually, there is no need for implementation of them in smart contracts because in most cases you don't want external entry points to be accessible to anyone. This includes several standard approaches of verifying external message sender which we will discuss here. +## External Messages +External messages are your main way of toggling smart contract logic from outside the blockchain. Usually, there is no need for implementation of them in smart contracts because in most cases you don't want external entry points to be accessible to anyone. This includes several standard approaches of verifying external message sender providing safe entry point to the TON network which we will discuss here. If this is all functionality that you want from external section - standard way is to delegate this responsibility to separate actor - `wallet` which is practically the main reason they were designed for. -:::info -Messages in TON are not just for data exchange—they can also carry TON coins. This allows for powerful composability between different contracts. For example, our Counter contract could receive messages with coins attached to pay for operations. -::: +### Wallets -## Receiving Messages in Your Contract +When we sent coins using wallet app in getting started section ("TODO: add ref") what wallet app actually performs is sending external message to your wallet smart contract which performs sending message to destination smart-contract address that you wrote in send menu. While most wallet apps during creation of wallet deploy most modern versions of wallet smart contracts - v5, providing more complex functionality, let's examine `recv_external` section of more basic one - v3: -In FunC, you'll handle incoming messages using special entry point functions. There are two main entry points you'll use: +```func +() recv_external(slice in_msg) impure { + var signature = in_msg~load_bits(512); + var cs = in_msg; + var (subwallet_id, msg_seqno) = (cs~load_uint(32), cs~load_uint(32)); + var ds = get_data().begin_parse(); + var (stored_seqno, stored_subwallet, public_key) = (ds~load_uint(32), ds~load_uint(32), ds~load_uint(256)); + ds.end_parse(); + throw_unless(33, msg_seqno == stored_seqno); + throw_unless(34, subwallet_id == stored_subwallet); + throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key)); + accept_message(); + cs~touch(); + while (cs.slice_refs()) { + var mode = cs~load_uint(8); + send_raw_message(cs~load_ref(), mode); + } + set_data(begin_cell() + .store_uint(stored_seqno + 1, 32) + .store_uint(stored_subwallet, 32) + .store_uint(public_key, 256) + .end_cell()); +} +``` -- `recv_internal()` - For messages from other contracts -- `recv_external()` - For messages from outside the blockchain +First thing to mention - is `signature` in message body and stored `public_key`. This refers to standard mechanism of asymmetric cryptography: during deployment process you create private and public key pair, store the second one in initial contract storage and then during sending external message through client sign it with private key attaching calculated `signature` to message body. Smart contract on its side checks if signature matches `public_key` and accepts external message if it is so. -Let's look at how to implement these in your contract. +Standard signature system for TON smart-contracts is `Ed25519` which is directly provided by `TVM` instruction `check_signature()`, but you can always implement another preferred algorithm by yourself. -### Working with Internal Messages +:::tip +When you entered magic 24 secret words (i.e. mnemonic phrase) during wallet creation in your app what is practically performed is concatenation of those words into one string and hashing it to create your `private key`. So remember not to show them to anyone. +::: -When another contract sends your contract a message, the `recv_internal()` function gets called automatically. Here's how it looks: +Second thing is `seqno` (sequential number) as you can see this is practically just a counter that increments each time wallet smart-contract receives external message, but why do we need one? +The reason behind that lies in blockchain nature: since all transactions are visible to anyone, potential malefactor could repeatedly send already signed transaction to your smart contract. Simplest scenario is: you transfer some amount of funds to receiver, receiver examines transaction and sends it to your contract repeatedly until you run out of funds and receiver gains almost all of them. -```func -() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { - ;; Your message handling code goes here -} -``` +Third thing is `subwallet_id` that just checks equality to the stored one, we will discuss its meaning a little bit later in internal messages section. -The parameters give you everything you need to know about the incoming message: +TODO: add send message section -- `my_balance` - Your contract's current balance -- `msg_value` - How many TON coins were attached to the message -- `in_msg_full` - The complete message in cell format (includes sender address and other service info) -- `in_msg_body` - Just the message body data (what the sender wanted to tell you) +### Implementation -If we look at our Counter example project, you'll see we already have a `recv_internal()` function: +At this point reasons behind changes that we made to our counter in previous storage and get methods section should start to be more clear! We already prepared our storage to contain `seqno`, `public_key` and `ctx_id` which will serve same task as `subwallet_id` so let's adapt wallet's `recv_external` function to our project: ```func -() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { - if (in_msg_body.slice_empty?()) { - return (); ;; ignore empty messages - } - - int op = in_msg_body~load_uint(32); - - if (op == op::increment) { - increment(); - return (); +() recv_external(slice in_msg) impure { + var signature = in_msg~load_bits(512); + var cs = in_msg; + var (ctx_id, msg_seqno) = (cs~load_uint(32), cs~load_uint(32)); + + var (stored_id, stored_seqno, public_key) = load_data() + throw_unless(33, msg_seqno == stored_seqno); + throw_unless(34, ctx_id == stored_id); + throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key)); + accept_message(); + cs~touch(); + while (cs.slice_refs()) { + var mode = cs~load_uint(8); + send_raw_message(cs~load_ref(), mode); } - - if (op == op::deposit) { - ;; Just accept the money - return (); + set_data(begin_cell() + .store_uint(stored_id, 32) + .store_uint(stored_seqno + 1, 32) + .store_uint(public_key, 256) + .end_cell()); +} +``` + +And add wrapper method to call it through our wrapper class: + +```typescript +async sendExternal( + provider: ContractProvider, + opts: { + mode: number + message: Cell, + secret_key: Buffer } - - throw(0xffff); +) { + const seqno = await this.getCounter(provider) + const id = await this.getID(provider) + + const toSign = beginCell() + .storeUint(id, 32) + .storeUint(seqno, 32) + .storeUint(opts.mode, 8) + .storeRef(opts.message) + + const signature = sign(toSign.endCell().hash(), opts.secret_key) + + return await provider.external(beginCell() + .storeBuffer(signature) + .storeBuilder(toSign) + .endCell() + ); } ``` -:::tip -Make your `recv_internal()` function robust by always checking if the message body is empty before trying to read from it, as shown in the Counter example above! -::: +Here we are preparing all required values for contract checks and add payload message that will be sent as internal message further to final receiver smart-contract. -### Handling External Messages +As you can see here we are using `provider.external()` method instead of `provider.internal()` one which requires a via argument, that now we can start to understand. The thing is that `provider.internal()` method is doing practically the same thing that we are trying to implement: since we can't directly call internal methods to test them we need to wrap them into external message and send it through some wallet. -External messages come from outside the blockchain and are processed by the `recv_external()` function: +Now let's test our implementation: -```func -() recv_external(slice in_msg_body) impure { - ;; Process the external message - ;; Don't forget to call accept_message()! -} +```typescript +it('should send an external message containing an internal message', async () => { + const receiver = await blockchain.treasury('receiver'); + + const internalMessage = beginCell() + .storeUint(0, 32) // Simple message with no specific opcode + .storeUint(42, 64) // queryID = 42 + .storeStringTail('Hello from external message!') + .endCell(); + + const messageToSend = beginCell() + .storeUint(0x18, 6) // internal message info + .storeAddress(receiver.address) // destination address + .storeCoins(toNano('0.01')) // amount to send + .storeUint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) // default message headers + .storeRef(internalMessage) // store the message content as a reference + .endCell(); + + const receiverBalanceBefore = await receiver.getBalance(); + + const result = await helloWorld.sendExternal({ + mode: SendMode.PAY_GAS_SEPARATELY, + message: messageToSend, + secret_key: keyPair.secretKey + }); + + expect(result.transactions).toHaveTransaction({ + from: undefined, // External messages have no 'from' address + to: helloWorld.address, + success: true, + }); + + expect(result.transactions).toHaveTransaction({ + from: helloWorld.address, + to: receiver.address, + success: true, + }); + + const receiverBalanceAfter = await receiver.getBalance(); + + expect(receiverBalanceAfter).toBeGreaterThan(receiverBalanceBefore); + const [seqnoAfter] = await helloWorld.getSeqnoPKey(); + expect(seqnoAfter).toBe(1); // Since it should start from 0 and increment to 1 +}); ``` -:::info -Unlike internal messages, external messages won't be processed unless you explicitly call `accept_message()` in your code. This is a security feature that prevents your contract from executing unwanted external code. -::: -In our Counter example from earlier lessons, we don't have a `recv_external()` function because our contract only needs to handle internal messages. We'll see how to implement external message handling later in this guide. +## Internal messages -## Processing Message Data +We are almost at the finish line! Let's cook a simple internal message to other contract and implement its processing on receiver side! We have already seen a counter that increases its values through external messages, now let's make it through internal one. And to make this task a little more interesting let's ensure that only one actor has access to this functionality. -Now that we know how to receive messages, let's learn how to process them. Most TON contracts follow a similar pattern: +### Actors and roles -1. Check if the message has any data -2. Extract the operation code (op code) to determine what to do -3. Parse any additional parameters -4. Validate the sender (if necessary) -5. Perform the requested operation -6. Update contract state -7. Optionally send a response message +Since TON implements actor model it's natural to think about smart-contracts relations in terms of `roles`, determining who can access smart-contract functionality or not. The most common examples of roles are: -Let's see how to implement these steps. + - `anyone`: any contract that don't have distinct role. + - `owner`: contract that has exclusive access to some crucial parts of functionality. -### Reading Operation Codes +If you look at `recv_internal()` function signature in your smart contract you can see `in_msg_full` and `in_msg_body` arguments, while the second one carries actual payload of sender which is free to fill it anyway they want, first one consists of several values describing transaction context. You can consider `in_msg_full` as some type of message **`header`**. We will not dwell in detail for each of values during this guide, what is important for us now, is that this part of message is defined by TON implementation and **always validated on sender side** and as a result cannot be fabricated. -A common pattern in TON contracts is to include a 32-bit operation code in message bodies. This tells your contract what action to perform: +What we specifically are interested in is the source address of message, by obtaining that address and comparing to stored one, that we previously saved, for example, during deployment, we can open crucial part of our smart contract functionality. Common approach looks like this: ```func +() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + ;; Parse the sender address from in_msg_full + slice cs = in_msg_full.begin_parse(); + int flags = cs~load_uint(4); + slice sender_address = cs~load_msg_addr(); + + ;; Check if message was sent by the owner + if (equal_slices(sender_address, owner_address)) { + ;;owner operations + return + } else if (equal_slices(sender_address, other_role_address)){ + ;;other role operations + return + } else { + ;;anyone else operations + return + } + + ;;no known operation were obtained for presented role + ;;0xffff is not standard exit code, but is standard practice among TON developers + throw(0xffff); +} +``` + +### Operations + +Another common pattern in TON contracts is to include a **32-bit operation code** in message bodies which tells your contract what action to perform: + +```func +const int op::increment = 1; +const int op::decrement = 2; + () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { ;; Step 1: Check if the message is empty if (in_msg_body.slice_empty?()) { - return (); ;; Nothing to do with empty messages + return; ;; Nothing to do with empty messages } ;; Step 2: Extract the operation code @@ -118,253 +227,305 @@ A common pattern in TON contracts is to include a 32-bit operation code in messa ;; Step 3-7: Handle the requested operation if (op == op::increment) { - increment(); - return (); - } else if (op == op::deposit) { + increment(); ;;call to specific operation handler + return; + } else if (op == op::decrement) { + decrement(); ;; Just accept the money - return (); - } else { - ;; Unknown operation - throw(0xffff); + return; } -} -``` - -In our Counter example, we define the operation codes as constants: -```func -const int op::increment = 1; -const int op::deposit = 2; + ;; Unknown operation + throw(0xffff); +} ``` -:::tip -It's a good practice to define your operation codes as constants at the top of your contract for better readability, as shown in the Counter example. -::: +By combining both of these patterns you can achieve a comprehensive description of your smart-contract's systems ensuring secure interaction between them and unleash full potential of TON actors model. -### Verifying the Message Sender +### Implementation -For many operations, you'll want to check who sent the message before taking any action: +First, let's create a second counter that we will be communicating with by running following command: -```func -() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { - ;; Parse the sender address from in_msg_full - slice cs = in_msg_full.begin_parse(); - int flags = cs~load_uint(4); - slice sender_address = cs~load_msg_addr(); - - ;; Check if message was sent by the owner - if (~ equal_slices(sender_address, owner_address)) { - throw(401); ;; Unauthorized - only owner can call this method - } - - ;; Continue with authorized operations - ;; ... -} +```bash +npx blueprint create ``` -The Counter example doesn't perform sender validation because it's a simple public contract that anyone can interact with. However, if we were to extend it to include admin-only operations (like resetting the counter), we would need to check the sender address. +Choose counter pattern and appreciated name in interactive menu, we will use `CounterInternal`. -:::info -While our Counter contract doesn't need owner validation, many contracts (like wallets or governance contracts) absolutely require it. Always think carefully about who should be allowed to trigger which operations. +:::tip +By the way, this is a good opportunity to try out one of the smart-contract development languages that you didn't use previously during this guide. ::: -## Sending Messages -One of the most powerful features of TON contracts is their ability to send messages to other contracts. Let's explore how to do this in FunC. +Now let's update our smart-contract to contain owner address: -### Creating and Sending a Basic Message +```func +global int ctx_id; +global int ctx_counter; +global slice owner_address; -To send a message, you'll need to: +;; load_data populates storage variables using stored data +() load_data() impure { + var ds = get_data().begin_parse(); -1. Create a message cell using `begin_cell()` -2. Fill it with the necessary data -3. Send it using `send_raw_message()` + ctx_id = ds~load_uint(32); + ctx_counter = ds~load_uint(32); + owner_address = ds~load_msg_addr(); -Here's a simple example that sends some TON coins to another address: + ds.end_parse(); +} -```func -() send_simple_message(slice recipient_address, int amount) impure { - ;; Step 1-2: Create and fill the message cell - var msg = begin_cell() - .store_uint(0x10, 6) ;; message info (non-bounced) - .store_slice(recipient_address) ;; destination address - .store_coins(amount) ;; attach TON coins - .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; default message flags - .store_uint(0, 32) ;; empty operation code - .end_cell(); - - ;; Step 3: Send the message - send_raw_message(msg, 64); ;; mode 64: pay fees separately +;; save_data stores storage variables as a cell into persistent storage +() save_data() impure { + set_data( + begin_cell() + .store_uint(ctx_id, 32) + .store_uint(ctx_counter, 32) + .store_slice(owner_address) + .end_cell() + ); } ``` -Let's extend our Counter contract from the Example project to include a notification feature that sends a message to the owner whenever the counter reaches a multiple of 10: +Update `recv_internal` to ignore any non-empty messages not sent by owner, and corresponding get method: ```func -() notify_owner(int counter_value) impure { - ;; Only send notification for multiples of 10 - if (counter_value % 10 != 0) { + () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { + if (in_msg_body.slice_empty?()) { ;; ignore all empty messages return (); } - - ;; Create notification message - var msg = begin_cell() - .store_uint(0x10, 6) ;; message info (non-bounced) - .store_slice(owner_address) ;; destination address - .store_coins(50000000) ;; attach 0.05 TON for notification - .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) ;; default message flags - .store_uint(0, 32) ;; empty operation code - .store_uint(counter_value, 32) ;; send the current counter value - .store_slice("Counter milestone reached!") ;; notification message - .end_cell(); - - ;; Send the notification - send_raw_message(msg, 1); ;; mode 1: pay fees from attached amount -} -### Understanding Message Send Modes + slice cs = in_msg_full.begin_parse(); + int flags = cs~load_uint(4); + if (flags & 1) { ;; ignore all bounced messages + return (); + } -When sending messages with `send_raw_message()`, the second parameter specifies the "mode" which controls how fees are paid and how remaining value is handled: + load_data(); ;; here we populate the storage variables + slice sender_addr = cs~load_msg_addr(); + if (equal_slices_bits(sender_addr, owner_address) != -1) { + throw(42); + } -```func -send_raw_message(msg, mode); -``` -Here are the most common send modes: + int op = in_msg_body~load_uint(32); ;; by convention, the first 32 bits of incoming message is the op + int query_id = in_msg_body~load_uint(64); ;; also by convention -- `0` - Carry all remaining value from the incoming message, with the current account paying transfer fees -- `1` - Carry all the remaining value of the incoming message, but with the transfer fees deducted from the attached amount -- `2` - Carry specified value from the incoming message, with the current account paying transfer fees -- `64` - Carry specified value from the incoming message, with the transfer fees deducted from the attached amount -- `128` - Carry all the remaining balance, with the receiver paying transfer fees + if (op == op::increase) { + int increase_by = in_msg_body~load_uint(32); + ctx_counter += increase_by; + save_data(); + return (); + } -You can also combine these modes using bitwise OR. For example, `mode 65` (64 + 1) would pay fees from the attached amount and carry all remaining value. + throw(0xffff); ;; if the message contains an op that is not known to this contract, we throw +} -:::tip -In most applications, modes 1 and 64 are the most commonly used. Use mode 1 when you want to forward all remaining value, and mode 64 when you want to send a specific amount. -::: +slice get_owner() method_id { + load_data(); + return owner_address; +} +``` -Let's see how we would implement the `notify_owner` function with different send modes: +Don't forget to update wrapper class, add new get method and update deployment part to initialize storage with owner address: ```func -;; Example using mode 64 (pay fees from attached value) -() notify_owner_mode64(int counter_value) impure { - var msg = begin_cell() - .store_uint(0x10, 6) - .store_slice(owner_address) - .store_coins(50000000) ;; 0.05 TON - .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) - .store_uint(0, 32) - .store_slice("Notification with mode 64") - .end_cell(); - - send_raw_message(msg, 64); +export type CounterInternalConfig = { + id: number; + counter: number; + owner: Address; +}; + +export function counterInternalConfigToCell(config: CounterInternalConfig): Cell { + return beginCell() + .storeUint(config.id, 32) + .storeUint(config.counter, 32) + .storeAddress(config.owner) + .endCell(); } -;; Example using mode 1 (forward remaining value) -() notify_owner_mode1(int counter_value, int value_to_forward) impure { - var msg = begin_cell() - .store_uint(0x10, 6) - .store_slice(owner_address) - .store_coins(value_to_forward) - .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) - .store_uint(0, 32) - .store_slice("Notification with mode 1") - .end_cell(); - - send_raw_message(msg, 1); +//inside CounterInternal class +async getOwnerAddress(provider: ContractProvider) { + const result = await provider.get('get_owner', []); + return result.stack.readAddress(); } ``` -## Blueprint SDK Message Wrapper Examples - -The Blueprint SDK simplifies message handling with wrapper methods. Here are some examples: - -### Internal Message Wrapper +Finally we are ready to create our multi-contract system: let's add a test that deploys `HelloWorld` smart contract, then deploys `CounterInternal` contract initialized with `HelloWorld` contract address, then sends external message containing internal one to our counter with increment operation. To see that only `HelloWorld` is able to modify counter, let's also try to send a message from another contract and ensure that it is not able to perform it: ```typescript -// Wrapper method for sending tokens -export function sendTokens( - provider: ContractProvider, - via: Sender, - opts: { - to: Address; - amount: bigint; - message?: string; - } -) { - return provider.internal(via, { - value: opts.amount, - sendMode: SendMode.PAY_GAS_SEPARATELY, - body: opts.message - ? beginCell().storeUint(0, 32).storeStringTail(opts.message).endCell() - : undefined, - }); -} +describe('Integration with HelloWorld', () => { + let codeHelloWorld: Cell; + let codeCounterInternal: Cell; + let blockchain: Blockchain; + let helloWorld: SandboxContract; + let counterInternal: SandboxContract; + let keyPair: KeyPair; + + beforeAll(async () => { + codeHelloWorld = await compile('HelloWorld'); + codeCounterInternal = await compile('CounterInternal'); + }); + + beforeEach(async () => { + blockchain = await Blockchain.create(); + + // Generate a key pair for HelloWorld + const seed = await getSecureRandomBytes(32); + keyPair = keyPairFromSeed(seed); + + // Deploy HelloWorld contract + helloWorld = blockchain.openContract( + HelloWorld.createFromConfig( + { + id: 0, + seqno: 0, + public_key: keyPair.publicKey + }, + codeHelloWorld + ) + ); + + const deployerHello = await blockchain.treasury('deployerHello'); + const deployResultHello = await helloWorld.sendDeploy(deployerHello.getSender(), toNano('1.00')); + + expect(deployResultHello.transactions).toHaveTransaction({ + from: deployerHello.address, + to: helloWorld.address, + deploy: true, + success: true, + }); + + // Deploy CounterInternal with HelloWorld as the owner + counterInternal = blockchain.openContract( + CounterInternal.createFromConfig( + { + id: 0, + counter: 0, + owner: helloWorld.address, // Set HelloWorld as the owner + }, + codeCounterInternal + ) + ); + + const deployerCounter = await blockchain.treasury('deployerCounter'); + const deployResultCounter = await counterInternal.sendDeploy(deployerCounter.getSender(), toNano('1.00')); + + expect(deployResultCounter.transactions).toHaveTransaction({ + from: deployerCounter.address, + to: counterInternal.address, + deploy: true, + success: true, + }); + }); + + it('should only allow owner to increment counter', async () => { + // Verify owner is correctly set to HelloWorld + const ownerAddress = await counterInternal.getOwnerAddress(); + expect(ownerAddress.equals(helloWorld.address)).toBe(true); + + // Get initial counter value + const counterBefore = await counterInternal.getCounter(); + + // Try to increase counter from a non-owner account (should fail) + const nonOwner = await blockchain.treasury('nonOwner'); + const increaseBy = 5; + + const nonOwnerResult = await counterInternal.sendIncrease(nonOwner.getSender(), { + increaseBy, + value: toNano('0.05'), + }); + + // This should fail since only the owner should be able to increment + expect(nonOwnerResult.transactions).toHaveTransaction({ + from: nonOwner.address, + to: counterInternal.address, + success: false, + exitCode: 42, // The error code thrown in the contract + }); + + // Counter should remain unchanged + const counterAfterNonOwner = await counterInternal.getCounter(); + expect(counterAfterNonOwner).toBe(counterBefore); + + // Create internal message to increase counter that will be sent from HelloWorld + const internalMessageBody = beginCell() + .storeUint(0x7e8764ef, 32) // op::increase opcode + .storeUint(0, 64) // queryID = 0 + .storeUint(increaseBy, 32) // increaseBy + .endCell(); + + const messageToSend = beginCell() + .storeUint(0x18, 6) // internal message info + .storeAddress(counterInternal.address) // destination address + .storeCoins(toNano('0.10')) // amount to send + .storeUint(0, 1 + 4 + 4 + 64 + 32 + 1) // default message headers + .storeUint(1, 1) + .storeRef(internalMessageBody) // store the message content as a reference + .endCell(); + + // Send external message to HelloWorld that contains internal message to CounterInternal + const result = await helloWorld.sendExternal({ + mode: SendMode.PAY_GAS_SEPARATELY, + message: messageToSend, + secret_key: keyPair.secretKey + }); + + // Verify the external message was processed successfully + expect(result.transactions).toHaveTransaction({ + from: undefined, // External messages have no 'from' address + to: helloWorld.address, + success: true, + }); + + // Verify the internal message was sent from HelloWorld to CounterInternal + expect(result.transactions).toHaveTransaction({ + from: helloWorld.address, + to: counterInternal.address, + success: true, + }); + + // Verify the counter was increased + const counterAfter = await counterInternal.getCounter(); + expect(counterAfter).toBe(counterBefore + increaseBy); + }); +}); ``` -### External Message Wrapper +Congratulations! We created our first multi-contract system and learned how to deal with basic internal messages! This example practically describes the general flow of any message chain: send external message -> toggle internal messages flow according to your system model and so on. Now, when our contracts are fully tested, we are ready to deploy our contracts and interact with them on-chain, but before we do so, there is one crucial detail that we should discuss. -```typescript -// Wrapper method for external message to withdraw funds -export function withdrawFunds( - provider: ContractProvider, - via: Sender, - opts: { - amount: bigint; - to: Address; - } -) { - return provider.external(via, { - body: beginCell() - .storeUint(3, 32) // op code for withdraw - .storeCoins(opts.amount) - .storeAddress(opts.to) - .endCell(), - }); -} -``` +### Receiving internal messages from untrusted roles -### Message Listening Wrapper +First thing to mention is that any message being processed by a receiver is considered as a transaction. When we discussed committing changes in storage contract after contract execution, we said that in case of a failed transaction all changes will be omitted. This is also true for multiple "sent" messages - if at least one of them is ill-formed or an exception occurs after calling `send_raw_message` instruction (which actually just prepares message sending that will happen after the contract ends its execution), all other messages will be cancelled. -```typescript -// Listening for specific events from the contract -export function onTokenTransfer( - provider: ContractProvider, - handler: (from: Address, amount: bigint) => void -) { - return provider.on('message:in', (msg) => { - if (msg.body?.beginParse().loadUint(32) === 0x7362d09c) { // Transfer event op - const from = msg.body.beginParse().skip(32).loadAddress(); - const amount = msg.body.beginParse().skip(32 + 267).loadCoins(); - handler(from, amount); - } - }); -} -``` +What is more important is that the concept of transaction is applicable only within one smart-contract. Since all transactions require some amount of funds to pay fees, when you're initiating a chain of messages, you need to provide funds to supply all of it. When we developed our **`multi-contract`** system, the only role that we used is **`owner`**. Since you have full control of it, you can ensure that funds will be enough to execute the full chain of transactions on the client side. + +Things start to get different when a transaction is initiated by someone else. Let's consider these abstract examples: -## Best Practices for Message Processing +
+ multi contract example scheme +
-1. **Validate Input Data**: Always check that incoming message data meets your expectations. -2. **Handle Errors Gracefully**: Use try-catch patterns or explicit error handling. -3. **Optimize Gas Usage**: Be mindful of operations that consume more gas. -4. **Implement Replay Protection**: For external messages, prevent replay attacks using sequence numbers. -5. **Document Operation Codes**: Keep a clear registry of all operation codes used in your contract. -6. **Limit Message Value**: Set appropriate limits on message values to prevent accidental fund loss. +If you have states that should be consistent between your smart contracts and the transaction chain is initiated by an uncontrolled client, it's crucial to ensure on first smart contract execution that funds will be enough to execute the entire transaction chain. +Let's examine the `A` example: imagine that the `Liquidity Pool` transaction will end up successfully and split supplied coins into halves - first one sent with requested funds, second one sent to deploy borrow register contract. If the sent funds aren't enough to execute the transaction on the borrower and it fails, you will end up giving money completely for free. -By following these guidelines and understanding the message processing flow in TON smart contracts, you can build robust and secure applications on the TON blockchain. + +A slightly better approach is presented in the `B` scheme. It's still possible to fail in a similar scenario, but at least you will end up sending funds only after ensuring that the `Borrow Register` has been deployed and notified your `Liquidity Pool` contract about it. Even if you forgot to add initial funds check, the borrower role has no potential interest in breaking your message flow. + +:::important Security Consideration +Always verify that sufficient funds are provided when working with transaction chains involving untrusted parties to maintain consistency across your contract system. +::: ## Next Steps Now that you understand how to process messages in TON smart contracts, here are some suggestions for next steps: -1. **Practice with Examples**: Try modifying the Counter contract to send different types of messages or respond to more complex operations. +1. **Practice with Examples**: Try modifying the `Counter` contract to send different types of messages or respond to more complex operations. 2. **Explore Message Bouncing**: Learn about how TON handles message bouncing when delivery fails. (TODO: add ref to bouncing messages) -3. **Implement Multi-Contract Systems**: Build a system where several contracts communicate with each other via messages. +3. **Learn About Gas Optimization**: Understand how message processing affects gas consumption and how to optimize your contracts. (TODO: add ref to gas optimization guide) -4. **Learn About Gas Optimization**: Understand how message processing affects gas consumption and how to optimize your contracts. (TODO: add ref to gas optimization guide) +4. **Study Advanced Message Patterns**: Explore more complex message patterns like notification services, multi-signature operations, or message-based governance. -5. **Study Advanced Message Patterns**: Explore more complex message patterns like notification services, multi-signature operations, or message-based governance. +5. **Deployment**: Continue to the next section to learn about deployment. -Continue to the next section to learn about handling events in TON smart contracts. (TODO: add ref to events section) diff --git a/static/img/tutorials/quick-start/multi-contract-example-bright.png b/static/img/tutorials/quick-start/multi-contract-example-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2248cdd4519358d10fca65132ac49496ce9e69 GIT binary patch literal 45912 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 K(y92}A>tp$S8(_M literal 0 HcmV?d00001 diff --git a/static/img/tutorials/quick-start/multi-contract-example-dark.png b/static/img/tutorials/quick-start/multi-contract-example-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fe55e5229d7073cab132fb1f8f4924bafe4f60db GIT binary patch literal 45912 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 G@4o;HVZht~ literal 0 HcmV?d00001 From 911e6be305c592a9dd5f7fe51d8dda94382fd548 Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Mon, 10 Mar 2025 20:13:22 +0300 Subject: [PATCH 6/8] Minor fixes, formating and references fixes --- .../processing-messages.mdx | 123 +++++++----------- .../program-structure.mdx | 26 ++-- .../setup-environment.mdx | 26 +++- .../storage-and-get-methods.mdx | 55 ++++---- .../quick-start/getting-started.mdx | 52 ++++---- 5 files changed, 130 insertions(+), 152 deletions(-) diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx index 98f3d4dfeb8..948af382f1f 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -1,66 +1,68 @@ # Processing Messages -> **Summary:** Messages in TON are a fundamental mechanism for both value transfer and data exchange between smart contracts, enabling complex interactions both with user wallets and between contracts in the network. +> **Summary:** In previous steps we modified our smart-contract interaction with `storage, `get methods` and learned basic smart-contract development flow. Now that we have learned basic examples of modifying smart-contract code and using development tools, we are ready to move on to the main functionality of smart contracts - sending and receiving messages. First thing to mention is that in TON, messages are not just currency exchange actions carrying TON coins. They are also a **data exchange mechanism** that provides an opportunity to create your own "network" of smart contracts interacting with each other and smart contracts of other network participants that are not under your direct control. -In previous sections we already discussed types of messages and their basic concepts so let's not waste time and move on to their detailed description! +:::tip +If you are stuck on some of the examples you can find original template project with all modifications performed during this guide [here](https://github.com/ton-community/ton-onboarding-sandbox/tree/main/quick-start/smart-contracts/Example). +::: --- ## External Messages -External messages are your main way of toggling smart contract logic from outside the blockchain. Usually, there is no need for implementation of them in smart contracts because in most cases you don't want external entry points to be accessible to anyone. This includes several standard approaches of verifying external message sender providing safe entry point to the TON network which we will discuss here. If this is all functionality that you want from external section - standard way is to delegate this responsibility to separate actor - `wallet` which is practically the main reason they were designed for. +`External messages` are your main way of toggling smart contract logic from outside the blockchain. Usually, there is no need for implementation of them in smart contracts because in most cases you don't want external entry points to be accessible to anyone except you. This includes several standard approaches of verifying external message sender providing safe entry point to the TON network which we will discuss here. If this is all functionality that you want from external section - standard way is to delegate this responsibility to separate actor - `wallet` which is practically the main reason they were designed for. ### Wallets -When we sent coins using wallet app in getting started section ("TODO: add ref") what wallet app actually performs is sending external message to your wallet smart contract which performs sending message to destination smart-contract address that you wrote in send menu. While most wallet apps during creation of wallet deploy most modern versions of wallet smart contracts - v5, providing more complex functionality, let's examine `recv_external` section of more basic one - v3: +When we sent coins using wallet app in [getting started](/v3/guidelines/quick-start/getting-started#step-3-exploring-the-blockchain) section what `wallet app` actually performs is sending `external message` to your `wallet` smart contract which performs sending message to destination smart-contract address that you wrote in send menu. While most wallet apps during creation of wallet deploy most modern versions of wallet smart contracts - `v5`, providing more complex functionality, let's examine `recv_external` section of more basic one - `v3`: ```func () recv_external(slice in_msg) impure { - var signature = in_msg~load_bits(512); - var cs = in_msg; - var (subwallet_id, msg_seqno) = (cs~load_uint(32), cs~load_uint(32)); - var ds = get_data().begin_parse(); - var (stored_seqno, stored_subwallet, public_key) = (ds~load_uint(32), ds~load_uint(32), ds~load_uint(256)); - ds.end_parse(); - throw_unless(33, msg_seqno == stored_seqno); - throw_unless(34, subwallet_id == stored_subwallet); - throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key)); - accept_message(); - cs~touch(); - while (cs.slice_refs()) { - var mode = cs~load_uint(8); - send_raw_message(cs~load_ref(), mode); - } - set_data(begin_cell() - .store_uint(stored_seqno + 1, 32) - .store_uint(stored_subwallet, 32) - .store_uint(public_key, 256) + var signature = in_msg~load_bits(512); + var cs = in_msg; + var (subwallet_id, msg_seqno) = (cs~load_uint(32), cs~load_uint(32)); + var ds = get_data().begin_parse(); + var (stored_seqno, stored_subwallet, public_key) = (ds~load_uint(32), ds~load_uint(32), ds~load_uint(256)); + ds.end_parse(); + throw_unless(33, msg_seqno == stored_seqno); + throw_unless(34, subwallet_id == stored_subwallet); + throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key)); + accept_message(); + cs~touch(); + while (cs.slice_refs()) { + var mode = cs~load_uint(8); + send_raw_message(cs~load_ref(), mode); + } + set_data(begin_cell() + .store_uint(stored_seqno + 1, 32) + .store_uint(stored_subwallet, 32) + .store_uint(public_key, 256) .end_cell()); -} + } ``` -First thing to mention - is `signature` in message body and stored `public_key`. This refers to standard mechanism of asymmetric cryptography: during deployment process you create private and public key pair, store the second one in initial contract storage and then during sending external message through client sign it with private key attaching calculated `signature` to message body. Smart contract on its side checks if signature matches `public_key` and accepts external message if it is so. +First thing to mention - is `signature` in message body and stored `public_key`. This refers to standard mechanism of asymmetric cryptography: during deployment process you create **private and public key pair**, store the second one in initial contract storage and then during sending external message through client **sign** it with **private key** attaching calculated `signature` to message body. Smart contract on its side checks if signature matches `public_key` and accepts external message if it is so. Standard signature system for TON smart-contracts is `Ed25519` which is directly provided by `TVM` instruction `check_signature()`, but you can always implement another preferred algorithm by yourself. :::tip -When you entered magic 24 secret words (i.e. mnemonic phrase) during wallet creation in your app what is practically performed is concatenation of those words into one string and hashing it to create your `private key`. So remember not to show them to anyone. +When you entered **magic 24 secret words** (i.e. **mnemonic phrase**) during [wallet creation](/v3/documentation/data-formats/tlb/tl-b-language) in your app what is practically performed is concatenation of those words into one string and hashing it to create your **private key**. So remember not to show them to anyone. ::: Second thing is `seqno` (sequential number) as you can see this is practically just a counter that increments each time wallet smart-contract receives external message, but why do we need one? -The reason behind that lies in blockchain nature: since all transactions are visible to anyone, potential malefactor could repeatedly send already signed transaction to your smart contract. Simplest scenario is: you transfer some amount of funds to receiver, receiver examines transaction and sends it to your contract repeatedly until you run out of funds and receiver gains almost all of them. +The reason behind that lies in blockchain nature: since all transactions are visible to anyone, potential malefactor could repeatedly send already signed transaction to your smart contract. -Third thing is `subwallet_id` that just checks equality to the stored one, we will discuss its meaning a little bit later in internal messages section. +> **Simpliest scenario:** you transfer some amount of funds to receiver, receiver examines transaction and sends it to your contract repeatedly until you run out of funds and receiver gains almost all of them. -TODO: add send message section +Third thing is `subwallet_id` that just checks equality to the stored one, we will discuss its meaning a little bit later in internal messages section. ### Implementation -At this point reasons behind changes that we made to our counter in previous storage and get methods section should start to be more clear! We already prepared our storage to contain `seqno`, `public_key` and `ctx_id` which will serve same task as `subwallet_id` so let's adapt wallet's `recv_external` function to our project: +At this point reasons behind changes that we made to our counter in previous storage and get methods [section](/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods#smart-contract-storage-operations) should start to be more clear! We already prepared our storage to contain `seqno`, `public_key` and `ctx_id` which will serve same task as `subwallet_id` so let's adapt wallet's `recv_external` function to our project: ```func () recv_external(slice in_msg) impure { @@ -132,13 +134,12 @@ it('should send an external message containing an internal message', async () => .storeStringTail('Hello from external message!') .endCell(); - const messageToSend = beginCell() - .storeUint(0x18, 6) // internal message info - .storeAddress(receiver.address) // destination address - .storeCoins(toNano('0.01')) // amount to send - .storeUint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1) // default message headers - .storeRef(internalMessage) // store the message content as a reference - .endCell(); + const messageToSend = beginCell().store(storeMessageRelaxed(internal({ + to: receiver.address, + value: toNano(0.01), + body: internalMessage, + bounce: true, + }))).endCell(); const receiverBalanceBefore = await receiver.getBalance(); @@ -168,18 +169,20 @@ it('should send an external message containing an internal message', async () => }); ``` +--- + ## Internal messages -We are almost at the finish line! Let's cook a simple internal message to other contract and implement its processing on receiver side! We have already seen a counter that increases its values through external messages, now let's make it through internal one. And to make this task a little more interesting let's ensure that only one actor has access to this functionality. +We are almost at the finish line! Let's cook a simple `internal message` to other contract and implement its processing on receiver side! We have already seen a counter that increases its values through `external messages`, now let's make it through internal one. And to make this task a little more interesting let's ensure that only one `actor` has access to this functionality. ### Actors and roles -Since TON implements actor model it's natural to think about smart-contracts relations in terms of `roles`, determining who can access smart-contract functionality or not. The most common examples of roles are: +Since TON implements actor [model](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains/#single-actor) it's natural to think about smart-contracts relations in terms of `roles`, determining who can access smart-contract functionality or not. The most common examples of roles are: - `anyone`: any contract that don't have distinct role. - `owner`: contract that has exclusive access to some crucial parts of functionality. -If you look at `recv_internal()` function signature in your smart contract you can see `in_msg_full` and `in_msg_body` arguments, while the second one carries actual payload of sender which is free to fill it anyway they want, first one consists of several values describing transaction context. You can consider `in_msg_full` as some type of message **`header`**. We will not dwell in detail for each of values during this guide, what is important for us now, is that this part of message is defined by TON implementation and **always validated on sender side** and as a result cannot be fabricated. +If you look at `recv_internal()` function signature in your smart contract you can see `in_msg_full` and `in_msg_body` arguments, while the second one carries actual payload of sender which is free to fill it anyway they want, first one consists of several values describing transaction context. You can consider `in_msg_full` as some type of message **header**. We will not dwell in detail for each of values during this guide, what is important for us now, is that this part of message is defined by TON implementation and **always validated on sender side** and as a result cannot be fabricated. What we specifically are interested in is the source address of message, by obtaining that address and comparing to stored one, that we previously saved, for example, during deployment, we can open crucial part of our smart contract functionality. Common approach looks like this: @@ -350,7 +353,7 @@ async getOwnerAddress(provider: ContractProvider) { } ``` -Finally we are ready to create our multi-contract system: let's add a test that deploys `HelloWorld` smart contract, then deploys `CounterInternal` contract initialized with `HelloWorld` contract address, then sends external message containing internal one to our counter with increment operation. To see that only `HelloWorld` is able to modify counter, let's also try to send a message from another contract and ensure that it is not able to perform it: +Finally we are ready to create our **multi-contract system**: let's add a test that deploys `HelloWorld` smart contract, then deploys `CounterInternal` contract initialized with `HelloWorld` contract address, then sends *external message* containing internal one to our counter with increment operation. To see that only `HelloWorld` is able to modify counter, let's also try to send a message from another contract and ensure that it is not able to perform it: ```typescript describe('Integration with HelloWorld', () => { @@ -491,41 +494,9 @@ describe('Integration with HelloWorld', () => { }); ``` -Congratulations! We created our first multi-contract system and learned how to deal with basic internal messages! This example practically describes the general flow of any message chain: send external message -> toggle internal messages flow according to your system model and so on. Now, when our contracts are fully tested, we are ready to deploy our contracts and interact with them on-chain, but before we do so, there is one crucial detail that we should discuss. - -### Receiving internal messages from untrusted roles - -First thing to mention is that any message being processed by a receiver is considered as a transaction. When we discussed committing changes in storage contract after contract execution, we said that in case of a failed transaction all changes will be omitted. This is also true for multiple "sent" messages - if at least one of them is ill-formed or an exception occurs after calling `send_raw_message` instruction (which actually just prepares message sending that will happen after the contract ends its execution), all other messages will be cancelled. - -What is more important is that the concept of transaction is applicable only within one smart-contract. Since all transactions require some amount of funds to pay fees, when you're initiating a chain of messages, you need to provide funds to supply all of it. When we developed our **`multi-contract`** system, the only role that we used is **`owner`**. Since you have full control of it, you can ensure that funds will be enough to execute the full chain of transactions on the client side. - -Things start to get different when a transaction is initiated by someone else. Let's consider these abstract examples: - -
- multi contract example scheme -
+Congratulations! We created our first **multi-contract** system and learned how to deal with basic `internal messages`! This example practically describes the general flow of any message chain: send `external message` -> toggle `internal messages` flow according to your system model and so on. Now, when our contracts are fully tested, we are ready to deploy our contracts and interact with them on-chain. -If you have states that should be consistent between your smart contracts and the transaction chain is initiated by an uncontrolled client, it's crucial to ensure on first smart contract execution that funds will be enough to execute the entire transaction chain. -Let's examine the `A` example: imagine that the `Liquidity Pool` transaction will end up successfully and split supplied coins into halves - first one sent with requested funds, second one sent to deploy borrow register contract. If the sent funds aren't enough to execute the transaction on the borrower and it fails, you will end up giving money completely for free. - - -A slightly better approach is presented in the `B` scheme. It's still possible to fail in a similar scenario, but at least you will end up sending funds only after ensuring that the `Borrow Register` has been deployed and notified your `Liquidity Pool` contract about it. Even if you forgot to add initial funds check, the borrower role has no potential interest in breaking your message flow. - -:::important Security Consideration -Always verify that sufficient funds are provided when working with transaction chains involving untrusted parties to maintain consistency across your contract system. +:::danger +Before considering your smart-contracts production ready and deploying them to `mainnet` take a look at [Security Measures](/v3/guidelines/smart-contracts/security/overview) describing best practice of securing your smart-contract logic. ::: -## Next Steps - -Now that you understand how to process messages in TON smart contracts, here are some suggestions for next steps: - -1. **Practice with Examples**: Try modifying the `Counter` contract to send different types of messages or respond to more complex operations. - -2. **Explore Message Bouncing**: Learn about how TON handles message bouncing when delivery fails. (TODO: add ref to bouncing messages) - -3. **Learn About Gas Optimization**: Understand how message processing affects gas consumption and how to optimize your contracts. (TODO: add ref to gas optimization guide) - -4. **Study Advanced Message Patterns**: Explore more complex message patterns like notification services, multi-signature operations, or message-based governance. - -5. **Deployment**: Continue to the next section to learn about deployment. - diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx index f56cb03eded..1bbbf65bfb0 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/program-structure.mdx @@ -1,7 +1,6 @@ # Project structure -In previous steps we installed and configured all tools required for TON smart-contract development and created our first project template. Before we proceed to research and modification of smart-contract code, let's take a brief look at project structure, purpose of them and default scenarios of its use. - +> **Summary:** In previous steps we installed and configured all tools required for TON smart-contract development and created our first project template. Before we proceed to research and modification of smart-contract code, let's take a brief look at project structure, purpose of them and default scenarios of its use. ## Overview @@ -23,18 +22,18 @@ Example/ └── HelloWorld.compile.ts # Script for contract compilation ``` -Before we proceed to actual smart-contract development let's briefly describe project structure and explain how to use Blueprint SDK. +Before we proceed to actual smart-contract development let's briefly describe project structure and explain how to use **`Blueprint SDK`**. ### `/contracts` -This folder contains your smart contract source code written in one of the available programming languages used for TON blockchain smart contract development. And contains imports folder which is used for libraries usually containing stdlib.fc - standard library of FunC language. +This folder contains your smart contract source code written in one of the available programming languages used for TON blockchain smart contract development. And contains imports folder which is used for libraries usually containing `stdlib.fc` - standard library of `FunC` language. If you open this file you can see that it has quite humble for a standard library, a size of 884 lines, primarily consisting of functions representing assembler insertions processing previously added to stack function parameters. :::info Advanced, Internals When we discussed available for smart-contract development programming languages we allowed ourselves a little lie. There are actually two more languages - `Fift` and `TVM-assembly`(for jedi smart-contract programmers). First one is general-purpose language like the ones that we discussed before, that is just not widely used right now. Second one - is classical assembler representing TVM instructions that you can directly access through assembler insertions in high-level languages. -Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smart-contracts written in one of the general-purpose languages are compiled in TVM(Telegram virtual machine) byte-code, exactly the one(except data segment) that we have seen in explorer section of getting started article and then are executed on virtual machine during transaction. +Common concept of TON smart-contract ecosystem is somewhat similar to **Java**. Smart-contracts written in one of the general-purpose languages are compiled in [TVM](/v3/documentation/tvm/tvm-overview)(TON virtual machine) `byte-code`, the one that we have seen in explorer section of getting started article and then are executed on virtual machine during transaction. ::: ### `/wrappers` @@ -42,8 +41,7 @@ Common concept of TON smart-contract ecosystem is somewhat similar to Java. Smar - `HelloWorld.ts` - wrapper for smart contract. - `HelloWorld.compile.ts` - compile config for smart-contract. - -While @ton/ton SDK provides us interfaces of serializing and sending messages for standard smart-contracts such as wallets, if we develop our own smart-contract that will deserialize received messages by its own custom protocol we need to provide some wrapper object that will serialize messages sent to smart-contract, deserialize responses from get methods and serialize initial data for contract deployment. +While `@ton/ton SDK` provides us interfaces of serializing and sending messages for standard smart-contracts such as `wallets`, if we develop our own smart-contract that will deserialize received messages by its own custom protocol we need to provide some wrapper object that will serialize messages sent to smart-contract, deserialize responses from `get method`s and serialize `initial data` for contract deployment. To run compile script excute this command in your CLI: @@ -54,13 +52,12 @@ npx blueprint build It's preferred development flow to edit smart contract code and then edit its wrapper correspondingly to updated protocol. :::info Advanced, TL-B -Often, as a developer, you want to provide description of protocol by some formal language and Ton ecosystem has standard instrument for that - TL-B language. TL-B(Type Language-Binary) schemes serve to describe binary protocol of smart-contracts somewhat similar to Protobuf technology. At the current moment, unfortunately, there are no instruments that provide generation of serialization/deserialization interfaces, but it's anyway a good practice to have one for smart-contracts with complex interfaces. +Often, as a developer, you want to provide description of protocol by some formal language and TON ecosystem has standard instrument for that: [TL-B](/v3/documentation/data-formats/tlb/tl-b-language) language. `TL-B`(Type Language-Binary) schemes serve to describe binary protocol of smart-contracts somewhat similar to **Protobuf** technology. At the current moment, unfortunately, there are no instruments that provide generation of serialization/deserialization interfaces, but it's anyway a good practice to have one for smart-contracts with complex interfaces. ::: - ### `/tests` -This directory contains test files for your smart contracts, written using the Jest testing framework. It's testing playground that uses `@ton/sandbox` tool allowing you to execute multiple smart-contracts and even send messages between them, creating your local 'network' of contracts if your project requires so, and test more complex scenarios than simple unit-tests. Tests are crucial for ensuring your smart contracts behave as expected before deployment to the mainnet. +This directory contains test files for your smart contracts, written using the **`Jest` testing framework**. It's testing playground that uses `@ton/sandbox` tool allowing you to execute multiple smart-contracts and even send messages between them, creating your local 'network' of contracts if your project requires so, and test more complex scenarios than simple **unit-tests**. Tests are crucial for ensuring your smart contracts behave as expected before deployment to the `Mainnet`. To run your test execute following command: @@ -68,12 +65,11 @@ To run your test execute following command: npx blueprint build ``` -Or use interface provided by Jest plugins in your IDE or code-editor. - +Or use interface provided by `Jest` plugins in your **IDE** or **code-editor**. ### `/scripts` -The scripts directory contains TypeScript files that help you deploy and interact with your smart contracts on-chain using previously implemented wrappers. +The scripts directory contains `TypeScript` files that help you deploy and interact with your smart contracts on-chain using previously implemented wrappers. You can execute those scripts using following command, but we recommend to read corresponding [deployment section](/ref/to/deployment/section) first. @@ -87,7 +83,3 @@ Also, you can always generate same structure for another smart-contract if you n npx blueprint create PascalCase //dont forget to name contract in PascalCase ``` -## Next step - -Now, when we learned how to use Blueprint SDK let's continue to designing smart-contract persistent memory layout and get methods. - diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx index 45f9ab70a85..f25f9c7919e 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx @@ -1,6 +1,8 @@ # Setup development environment -This guide covers basic steps of creating your first TON smart-contract using available languages: `FunC`, `Tact`, `Tolk`. +> **Summary:** In previous steps we learned concept of smart-contract and basic ways of interacting with TON blockchain through **wallet apps** and **explorers**. + +This guide covers basic steps of setting up your smart-contract development environment using **`Blueprint SDK`** and creating basic project template. But before we proceed to actual coding let's install and setup all required tools! @@ -9,11 +11,17 @@ But before we proceed to actual coding let's install and setup all required tool - Basic programming skills. - Familiarity with Command-line interface. - Your preferred code-editor/IDE. - - Around __30 minutes__ of your time. + - Around __15 minutes__ of your time. ## Setup development environment -For this guide we will rely on [Blueprint SDK](https://github.com/ton-org/blueprint) and [Node.js](https://nodejs.org/en)/Typescript stack for writing wrappers, tests and deployments scripts for your smart-contract, because its provides easiest, ready to use environment for smart-contracts developing. Using native instruments and language-dependent SDK's for smart-contract development covered in more advanced sections here: TODO: add references +For this guide we will rely on [Blueprint SDK](https://github.com/ton-org/blueprint) and [Node.js](https://nodejs.org/en)/Typescript stack for writing wrappers, tests and deployments scripts for your smart-contract, because its provides easiest, ready to use environment for smart-contracts developing. + +:::info +Using native instruments and language-dependent SDK's for smart-contract development covered in more advanced sections here: + - [Compile and build smart-contracts on TON](/v3/documentation/archive/compile#ton-compiler). + - [Creating State Init for Deployment](/v3/guidelines/smart-contracts/howto/wallet#creating-the-state-init-for-deployment). +::: ### Step 1: Install Node.js @@ -25,9 +33,14 @@ Check node version by executing following command: node -v npm -v ``` -Node version should be at least `v18`. +Node version should be at least `v18`. + -### Step 2: Setup Blueprint SDK +### Step 2: Choose smart-contract development language + +During guide we provide example on 3 languages: `Func`, `Tact` and `Tolk`. You can choose from any of them and even combine smart-contracts on different languages on latest sections. To proceed through guide there is now need of deep understanding of choosed one, basic programming skills will be enought. You can find their breaf overview here: [Programming languages](/v3/documentation/smart-contracts/overview#programming-languages) + +### Step 3: Setup Blueprint SDK Change directory to parent folder of your future project and run following command: @@ -49,10 +62,9 @@ cd ./Example npm install ``` -### Step 3(optional): IDE and editors support +### Step 4(optional): IDE and editors support Ton community developed plugins providing syntax support for several IDE's and code editors. You can find them here: [Plugin List](https://docs.ton.org/v3/documentation/smart-contracts/getting-started/ide-plugins). Also consider installing plugins providing support for JavaScript/TypeScript tools for your preferred IDE or code editor and, specifically, `Jest` for debugging smart-contract tests. - diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx index d34f26e9ae0..e5cba86b54f 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx @@ -1,15 +1,20 @@ # Storage and Get Methods -While it's technically possible to create smart contract on TON not having any persistent storage, almost all smart-contracts need to persistently store their state between transactions. Understanding how storage works in TON smart contracts is essential for developing. This guide explains standard ways of managing state of smart-contract and using get methods to obtain it from outside the blockchain. +> **Summary:** In previous steps we learned how to use `Blueprint SDK` and it's project structure. + +:::tip +If you are stuck on some of the examples you can find original template project with all modifications performed during this guide [here](https://github.com/ton-community/ton-onboarding-sandbox/tree/main/quick-start/smart-contracts/Example). +::: + +While it's technically possible to create smart contract on TON not having any persistent storage, almost all smart-contracts need to store their `state` between transactions. This guide explains standard ways of managing `state` of smart-contract and using `get methods` to obtain it from outside the blockchain. ## Cell Structure: The Backbone of TON Storage -TON blockchain uses a data structure called "Cell" as the fundamental unit for storing data. Cells are the building blocks of the TVM (TON Virtual Machine) and have some important characteristics: +TON blockchain uses a data structure called **`Cell`** as the fundamental unit for storing data. Cells are the building blocks of the `TVM` (TON Virtual Machine) and have those characteristics: -- A cell can store up to 1023 bits (approximately 128 bytes) of data -- A cell can reference up to 4 other cells (children) -- Cells form a directed acyclic graph (DAG) structure -- Cells are immutable once created +- A `Cell` can store up to 1023 bits (approximately 128 bytes) of data +- A `Cell` can reference up to 4 other `Cells` (children) +- `Cells` are immutable once created You can think of Cell as the following structure: @@ -23,15 +28,18 @@ interface Cell { ## Smart Contract Storage Operations -First thing that we should say is that there is a small, but important difference between smart-contract data segment and TVM storage [c4 register]("/s") existing only during execution of smart-contract. Remember that smart-contracts follow transaction concept - if any system or user exception is raised during execution, i.e. transaction fails - TVM storage will not be committed to smart-contract data segment. From the realization point this means that smart-contract data segment is copied to TVM storage before starting the execution and committed back, optionally modified, in case of successful transaction. For simplification of this guide we will not use those strict terms, instead we will describe both as `storage` and rely on context, so, keep these facts in mind. +First thing that we should say is that there is a small, but important difference between smart-contract `persistent data` and [TVM storage](/v3/documentation/tvm/tvm-initialization#initial-state) existing only during execution of smart-contract. Remember that smart-contracts follow **transaction** concept - if any system or user exception is raised during execution, i.e. transaction fails - `TVM storage` will not be committed to smart-contract `persistent data`. From the realization point this means that smart-contract `persistent data` is copied to `TVM storage` before starting the execution and committed back, optionally modified, in case of successful **transaction**. For simplification of this guide we will not use those strict terms, instead we will describe both as `storage` and rely on context, so, keep these facts in mind. There are two main instructions that provide access to smart-contract storage: - - get_data() returning current storage cell. - - set_data() setting current storage cell. + - `get_data()` returning current storage cell. + - `set_data()` setting current storage cell. In case it's inconvenient to always serialize and deserialize storage cell, there is a pretty standard practice to define two wrapper methods that provide corresponding logic. If you didn't change smart-contract code it should contain following lines: ```func +global int ctx_id; +global int ctx_counter; + ;; load_data populates storage variables using stored data () load_data() impure { var ds = get_data().begin_parse(); @@ -53,14 +61,7 @@ In case it's inconvenient to always serialize and deserialize storage cell, ther } ``` -In this guide we will not dwell in detail of FunC language syntax, providing simple examples that could be understood by a person with basic programming background, but if you feel the need for a little-bit more context - check those articles. "TODO: add ref" - -:::tip -If you are stuck on some of the examples you can find original template project with all modifications performed during this guide here: -"Todo: add ref to repo" -::: - -Let's try to modify our example a little bit. First, let's use a more common approach of passing storage members as parameters to save_data(members...) and retrieve them as (members...) get_data() moving global variables ctx_id and ctx_counter to method bodies. Also, let's add 2 additional integers of 32-bit and 256-bit size into our storage: +Let's try to modify our example a little bit. First, let's use a more common approach of passing storage members as parameters to `save_data(members...)` and retrieve them as `(members...) get_data()` moving global variables ctx_id and ctx_counter to method bodies. Also, let's rebane our counter to seqno and add additional integers 256-bit size into our storage: Result of our modifications should look like this: @@ -70,13 +71,12 @@ Result of our modifications should look like this: var ds = get_data().begin_parse(); int ctx_id = ds~load_uint(32); - int ctx_counter = ds~load_uint(32); int seqno = ds~load_uint(32); int public_key = ds~load_uint(256); ds.end_parse(); - return (ctx_id, ctx_counter, seqno, public_key); + return (ctx_id, seqno, public_key); } ;; save_data stores storage variables as a cell into persistent storage @@ -85,25 +85,24 @@ Result of our modifications should look like this: begin_cell() .store_uint(ctx_id, 32) .store_uint(ctx_counter, 32) - .store_uint(seqno, 32) .store_uint(public_key, 256) .end_cell() ); } ``` -Don't forget to delete global variables 'ctx_id', 'ctx_counter' and modify usage of the function like this, copying storage members locally: +Don't forget to delete global variables `ctx_id`, `ctx_counter` and modify usage of the function like this, copying storage members locally: ```func -var (ctx_id, ctx_counter, seqno, public_key) = load_data(); -save_data(ctx_id, ctx_counter, seqno, public_key); +var (ctx_id, seqno, public_key) = load_data(); +save_data(ctx_id, seqno, public_key); ``` ## Get methods The primary use of get methods is reading our storage data from outside the blockchain using a convenient interface, primarily to extract data that is required to prepare a transaction. -Let's omit at the current moment the motivation of magical storage members 'seqno' and 'public_key' - we will discuss their meaning in later topics. Instead, let's provide a get method to retrieve both of them from outside the blockchain: +Let's omit at the current moment the motivation of magical storage members `seqno` and `public_key` - we will discuss their meaning in later topics. Instead, let's provide a get method to retrieve both of them from outside the blockchain: ```func (int, int) get_seqno_public_key() method_id { @@ -122,7 +121,7 @@ And that's it! In practice all get methods follow this simple flow and don't req ## Updating wrapper -Now lets update our wrapper class corresponding to new storage layout and new get method. +Now lets update our wrapper class corresponding to new storage layout and new `get method`. First, let's modify `helloWorldConfigToCell` function and `HelloWorldConfig` type to properly initialize our storage during deployment: @@ -208,9 +207,7 @@ npm run test ## Next Steps -Congratulations! We modified our first contract to execute a new get method, learned about smart-contract storage and went through the standard smart contract development flow. Now we can proceed to further sections explaining more complex actions upon smart contracts. At this point we will provide a more short description of standard actions: edit smart-contract -> edit wrapper -> edit tests, relying on your new skills. - -Remember that you can always find the performed modifications in this repository: "TODO: add ref". +Congratulations! We modified our first contract to execute a new `get method`, learned about smart-contract storage and went through the standard smart contract development flow. Now we can proceed to further sections explaining more complex actions upon smart contracts. At this point we will provide a more short description of standard actions: edit smart-contract -> edit wrapper -> edit tests, relying on your new skills. -Consider reading [Func Documentation]("/s") and try to add your own get method with corresponding wrapper and test modification by yourself and proceed to next steps when you feel ready for it. +Consider reading your chosen [language specification](/v3/documentation/smart-contracts/overview#programming-languages) and try to add your own `get method` with corresponding wrapper and test modification by yourself and proceed to next steps when you feel ready for it. diff --git a/docs/v3/guidelines/quick-start/getting-started.mdx b/docs/v3/guidelines/quick-start/getting-started.mdx index e16bb6410e4..ba0bda94b0a 100644 --- a/docs/v3/guidelines/quick-start/getting-started.mdx +++ b/docs/v3/guidelines/quick-start/getting-started.mdx @@ -9,29 +9,29 @@ Welcome to TON quick start guide! This guide will give you a starting point for - Basic programming knowledge. - Around __30 minutes__ of your time. -> **Note**: We will provide a short explanation of core concepts during the guide, but if you prefer a more theoretical approach, you can check out core concepts of TON `blockchain` first here: [TON blockchain](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains). +> **Note**: We will provide a short explanation of core concepts during the guide, but if you prefer a more theoretical approach, you can check out core concepts of [TON blockchain](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains) first. ## What You'll Learn - Interact with TON ecosystem: Wallets and Explorers. - Setup development environment: use Blueprint SDK for developing `smart-contracts` using `FunC`, `Tact`, and `Tolk` programming languages. -- Send transactions and read from the `blockchain` using your preferred programming language and available SDKs -- Core concepts of TON blockchain and further learning curve -- Basic project templates ready for implementation of your project logic. +- Send transactions and read from the **blockchain** using your preferred programming language and available **SDKs**. +- Core concepts of **TON blockchain** and further learning curve. +- Basic templates ready for implementation of your project logic. ## Concept of smart-contract -You can think of smart-contracts in TON as a program running on blockchain following well known behavior concept of actor(node/state machine). In contrast to some other blockchains where you can call in synchronous way other contracts code, smart-contract in TON is a thing in itself, and communicates with other smart-contracts on equal basis sending asynchronous messages between each other. Each processing of those queries by receiver smart-contract is considered a transaction resulting in following actions: +You can think of smart-contracts in TON as a program running on blockchain following well known behavior concept of [actor](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains#single-actor). In contrast to some other blockchains where you can call in synchronous way other contracts code, smart-contract in TON is a thing in itself, and communicates with other smart-contracts on equal basis sending asynchronous messages between each other. Each processing of those queries by receiver smart-contract is considered a transaction resulting in following actions: - Sending further messages. - - Changing internal state or even code of smart-contract itself - - changing it's balance. + - Changing internal data or even code of smart-contract itself. + - Changing it's balance. Available interfaces of smart-contract are: - - Receiving internal messages from other smart-contract initiating transaction. - - Receiving external messages from outside the blockchain initiating transaction. - - Receiving get method request from outside the blockchain. + - Receiving **`internal messages`** from other smart-contract. + - Receiving **`external messages`** from outside the blockchain. + - Receiving **`get methods`** request from outside the blockchain. -In contrast to internal and external messages, get methods are not what you can consider as a transaction. Those are special functions of smart contract that cannot change contract internal state or proceed any other action except querying specific data from them. Contrary to what might seem intuitive, invoking get methods from other contracts is not possible on-chain, primarily due to the nature of blockchain technology and the need for consensus. +In contrast to `internal` and `external` messages, `get methods` are not what you can consider as a **transaction**. Those are special functions of smart contract that cannot change contract internal state or proceed any other action except querying specific data from contract state. Contrary to what might seem intuitive, invoking `get methods` from other contracts **is not possible**, primarily due to the nature of blockchain technology and the need for consensus. :::tip Hereinafter we will use terms `actor`, `smart-contract` and `account` interchangeably. @@ -39,21 +39,21 @@ Hereinafter we will use terms `actor`, `smart-contract` and `account` interchang ## Interacting with TON ecosystem -Before we step on our way of becoming a TON developer, we should become an advanced user of TON! Let's create your own wallet, send a few transactions, and see how our actions are reflected on the `blockchain` using explorers. +Before we step on our way of becoming a TON developer, we should become an advanced user of TON! Let's create your own `wallet`, send a few transactions, and see how our actions are reflected on the blockchain using `explorers`. ### Step 1: Create a new wallet using an app -The simplest way to create a wallet is to visit https://ton.org/wallets and choose one of the wallet apps from the list. This page explains the difference between custodial and non-custodial wallets. With a non-custodial wallet, you own the wallet and hold its private key by yourself. With a custodial wallet, you trust somebody else to do this for you. They are all pretty similar, let's choose [MyTonWallet](https://mytonwallet.io/). Go ahead, install and run it. +The simplest way to create a `wallet` is to visit https://ton.org/wallets and choose one of the wallet apps from the list. This page explains the difference between **custodial** and **non-custodial** wallets. With a **non-custodial** wallet, you own the wallet and hold its **private key** by yourself. With a **custodial** wallet, you trust somebody else to do this for you. They are all pretty similar, let's choose [MyTonWallet](https://mytonwallet.io/). Go ahead, install and run it. ### Step 2: Mainnet and Testnet -At this moment, you should have already created your first wallet and backed up your 24-word phrase (we will discuss its meaning later). Before we start to use it, we should discuss two variations of TON `Blockchain` that we can work with: `Mainnet` and `Testnet`. +At this moment, you should have already created your first wallet and backed up your **24-word phrase** (we will discuss its meaning later). Before we start to use it, we should discuss two variations of TON Blockchain that we can work with: **`Mainnet`** and **`Testnet`**. -In the TON, the `Mainnet` and `Testnet` have distinct roles. The `Mainnet` is the primary network where actual transactions take place, carrying real economic value as they involve real cryptocurrency and staked validators executing our transactions and guarantee a very high level of security. On the other hand, the `Testnet` is a testing version of the TON `blockchain` designed for development and testing purposes. Transactions on the `testnet` do not have real economic value, making it a risk-free zone for developers to test without financial implications. It's mainly used for development, testing `smart contracts`, and trying new features. +In the TON, the `Mainnet` and `Testnet` have distinct roles. The `Mainnet` is the primary network where actual transactions take place, carrying real economic value as they involve real cryptocurrency and staked validators executing our transactions and guarantee a very high level of security. On the other hand, the `Testnet` is a testing version of the TON **blockchain** designed for development and testing purposes. Transactions on the `testnet` do not have real economic value, making it a risk-free zone for developers to test without financial implications. It's mainly used for development, testing `smart contracts`, and trying new features. -Since TON basic transactions are very cheap, about 1 cent per transaction, investing just $5 will be enough for hundreds of them. If you decide to work on `Mainnet`, you will have a significantly smoother experience. You can get TON coins by simply pressing the buy button in the user interface, or ask someone to send them to your address, which you can copy from the wallet app somewhere near your balance. Don't worry, sharing your public address is totally safe, unless you don't want it to be associated with you. +Since TON basic transactions are very cheap, about 1 cent per transaction, investing just $5 will be enough for hundreds of them. If you decide to work on `Mainnet`, you will have a significantly smoother experience. You can get TON coins by simply pressing the buy button in the user interface, or ask someone to send them to your `address`, which you can copy from the wallet app somewhere near your balance. Don't worry, sharing your `address` is **totally safe**, unless you don't want it to be associated with you. -If you decide to use the `Testnet` version instead, you can do this in almost the same way in any wallet by entering the settings menu and tapping a few times on the wallet icon or name at the bottom. This will open the developer menu where you can switch to the `Testnet` version of the wallet. Here is an example for MyTonWallet (version 3.3.4): +If you decide to use the `Testnet` version instead, you can switch to it in most wallets by entering the settings menu and tapping a few times on the wallet icon or name at the bottom. This will open the developer menu where you can switch to the `Testnet` version of the wallet. Here is an example for **MyTonWallet** (version **3.3.4**):
@@ -64,7 +64,7 @@ If you decide to use the `Testnet` version instead, you can do this in almost th
-For the `Testnet` version, you can request funds from [Testgiver Ton Bot](https://t.me/testgiver_ton_bot). It will take some time, but in the end, you will receive 2 TONs that will be displayed in your wallet app. +For the `Testnet` version, you can request funds from the [Testgiver Ton Bot](https://t.me/testgiver_ton_bot). After a short wait, you will receive 2 TONs that will appear in your wallet app. ### Step 3: Exploring the blockchain @@ -80,16 +80,16 @@ Let's take a look at our newly created wallet using the explorer: copy your wall At this moment, your address should be in the `uninit` or `nonexisting` state depending on whether you have already received funds or not. Like any other `smart-contract`, wallets in TON need to be deployed to the network, and since this process requires some amount of transaction fees - `gas` - most wallet apps don't actually deploy the wallet `smart-contract` until you receive funds on your address and try to make your first transaction. -
- Screenshot of uninitialized wallet state +
+ Screenshot of nonexistent wallet state
- Screenshot of nonexistent wallet state + Screenshot of uninitialized wallet state
As you can see, the `nonexisting` state is the default state for any address that has not been used before. `uninit` stands for an address that has some metadata such as funds, but hasn't been initialized by deployed `smart-contract` code or data. -Let's send our first transaction to someone special - ourselves. And see how it looks on the `blockchain`. Enter the send menu in your wallet app and transfer some funds to your own address that you have copied before. In the explorer, our contract should start looking something like this: +Let's send our first transaction to someone special - **ourselves**. And see how it looks on the `blockchain`. Enter the send menu in your wallet app and transfer some funds to your own address that you have copied before. In the explorer, our contract should start looking something like this:
Screenshot of active wallet state @@ -101,11 +101,17 @@ We can explore our `smart-contract` code in the corresponding tab which is repre There is also a tab where we can execute `get-methods` provided by the `smart-contract`. Generally, these methods can be implemented in any way that doesn't change the `smart-contract` persistent data. Their primary purpose is to provide an easy way to access the contract state from outside the `blockchain`. -The second thing to note is the contract type, `wallet_v5r1` in our case. Because some widely-used `smart-contracts` have standard implementations, most explorers are able to determine their type by analyzing the `smart-contract` code segment. +The second thing to note is the contract type, `wallet_v5r1` in our case. Because some widely-used `smart-contracts` have standard implementations, most explorers are able to determine their type by analyzing the `smart-contract` code. It's important to understand that wallets are not special entities in the TON `blockchain`, which implements an actors model. A wallet is simply a `smart-contract` that doesn't have any specific rights or abilities compared to any other contract, such as one developed and deployed by you. Maybe you will be the one who creates and proposes the next version of wallet that will be accepted by the TON community, just as the TonKeeper Team did with the latest wallet version - `v5r1`! +## Next Steps: + + - Try to experiment with `wallet app` and `wallet smart-contract`. + - Checkout [TON concepts](/v3/concepts/dive-into-ton/ton-blockchain/blockchain-of-blockchains) if you need more context. + - Continue to [Interact with blockchain](/v3/guidelines/quick-start/interact-with-blockchain) or [Developing smart-contracts](/v3/guidelines/quick-start/developing-smart-contracts/setup-environment) according to your needs. + Happy creating on TON! From d0eeff88bc8f97ea568bf65c08e1dce3d1009300 Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Mon, 10 Mar 2025 21:14:15 +0300 Subject: [PATCH 7/8] Code sample fixes according to review --- .../processing-messages.mdx | 34 ++++++++++--------- .../storage-and-get-methods.mdx | 16 +++++---- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx index 948af382f1f..a479df46f1a 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -66,27 +66,31 @@ At this point reasons behind changes that we made to our counter in previous sto ```func () recv_external(slice in_msg) impure { + ;; retrives validating data from message body var signature = in_msg~load_bits(512); var cs = in_msg; var (ctx_id, msg_seqno) = (cs~load_uint(32), cs~load_uint(32)); - var (stored_id, stored_seqno, public_key) = load_data() + ;; retrieves stored data for validation checks + var (stored_id, stored_seqno, public_key) = load_data(); + ;; replay protection mechanism through seqno chack and incrementing throw_unless(33, msg_seqno == stored_seqno); + ;; id field for multiply addresess with same private_key throw_unless(34, ctx_id == stored_id); + ;; ed25519 signature check throw_unless(35, check_signature(slice_hash(in_msg), signature, public_key)); + ;; accepting message after all checks accept_message(); + ;; optimization technique + ;; putting message body to stack head cs~touch(); + ;; sending serialized on client side messages while (cs.slice_refs()) { var mode = cs~load_uint(8); send_raw_message(cs~load_ref(), mode); } - set_data(begin_cell() - .store_uint(stored_id, 32) - .store_uint(stored_seqno + 1, 32) - .store_uint(public_key, 256) - .end_cell()); -} -``` + save_data(stored_id, stored_seqno, public_key); +}``` And add wrapper method to call it through our wrapper class: @@ -457,14 +461,12 @@ describe('Integration with HelloWorld', () => { .storeUint(increaseBy, 32) // increaseBy .endCell(); - const messageToSend = beginCell() - .storeUint(0x18, 6) // internal message info - .storeAddress(counterInternal.address) // destination address - .storeCoins(toNano('0.10')) // amount to send - .storeUint(0, 1 + 4 + 4 + 64 + 32 + 1) // default message headers - .storeUint(1, 1) - .storeRef(internalMessageBody) // store the message content as a reference - .endCell(); + const messageToSend = beginCell().store(storeMessageRelaxed(internal({ + to: counterInternal.address, + value: toNano(0.01), + body: internalMessageBody, + bounce: true, + }))).endCell(); // Send external message to HelloWorld that contains internal message to CounterInternal const result = await helloWorld.sendExternal({ diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx index e5cba86b54f..2997eed0df0 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/storage-and-get-methods.mdx @@ -66,10 +66,12 @@ Let's try to modify our example a little bit. First, let's use a more common app Result of our modifications should look like this: ```func -;; load_data populates storage variables using stored data -(int, int, int, int) load_data() { +;; load_data retrieves variables from TVM storage cell +(int, int, int) load_data() { var ds = get_data().begin_parse(); + ;; id is required to be able to create different instances of counters + ;; since addresses in TON depend on the initial state of the contract int ctx_id = ds~load_uint(32); int seqno = ds~load_uint(32); int public_key = ds~load_uint(256); @@ -79,17 +81,17 @@ Result of our modifications should look like this: return (ctx_id, seqno, public_key); } -;; save_data stores storage variables as a cell into persistent storage -() save_data(int ctx_id, int ctx_counter, int seqno, int public_key) impure { +;; save_data stores variables as a cell into persistent storage +;; impure because of writing into TVM storage +() save_data(int ctx_id, int seqno, int public_key) impure { set_data( begin_cell() .store_uint(ctx_id, 32) - .store_uint(ctx_counter, 32) + .store_uint(seqno, 32) .store_uint(public_key, 256) .end_cell() ); -} -``` +}``` Don't forget to delete global variables `ctx_id`, `ctx_counter` and modify usage of the function like this, copying storage members locally: From 122f8def9cf4e3c3435e7934dab471fb15db6559 Mon Sep 17 00:00:00 2001 From: Alexey Ostrovsky Date: Mon, 10 Mar 2025 21:39:57 +0300 Subject: [PATCH 8/8] I'm sorry for that --- .../developing-smart-contracts/processing-messages.mdx | 2 +- .../developing-smart-contracts/setup-environment.mdx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx index a479df46f1a..7c23cbee02c 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/processing-messages.mdx @@ -89,7 +89,7 @@ At this point reasons behind changes that we made to our counter in previous sto var mode = cs~load_uint(8); send_raw_message(cs~load_ref(), mode); } - save_data(stored_id, stored_seqno, public_key); + save_data(stored_id, stored_seqno + 1, public_key); }``` And add wrapper method to call it through our wrapper class: diff --git a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx index f25f9c7919e..72a4af994f2 100644 --- a/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx +++ b/docs/v3/guidelines/quick-start/developing-smart-contracts/setup-environment.mdx @@ -51,9 +51,9 @@ npm create ton@latest TODO: add short language description for choosing prefered one. This will run interactive script for creating project template, you can enter anything you want, but if you want to have same paths as this guide choose following: -1. Project name: Example. -2. First created contract name: HelloWorld. -3. Choose the project template: A simple counter contract (language name). +1. Project name: `Example`. +2. First created contract name: `HelloWorld`. +3. Choose the project template: A simple counter contract corresponding to your choosen language. And finally, change your current directory to generated project template folder, and install all required dependencies: