A development environment for TON blockchain for writing, testing, and deploying smart contracts.
- Quick start
- Overview
- Features overview
- Contract development
- Configuration
- Contributors
- License
- Donations
Run the command in terminal to create a new project and follow the on-screen instructions:
npm create ton@latestBlueprint is an all-in-one development environment designed to enhance the process of creating, testing, and deploying smart contracts on TON blockchain using FunC, Tolk, and Tact languages.
- Create a development environment from template -
npm create ton@latest - Streamlined workflow for building, testing and deploying smart contracts
- Dead simple deployment to mainnet/testnet using your favorite wallet (eg. Tonkeeper)
- Blazing fast testing of multiple smart contracts in an isolated blockchain running in-process
- Compiling FunC with https://github.com/ton-community/func-js
- Compiling Tolk with https://github.com/ton-blockchain/tolk-js
- Compiling Tact with https://github.com/tact-lang/tact
- Testing smart contracts with https://github.com/ton-org/sandbox
- Deploying smart contracts with TON Connect 2 or a
ton://deeplink
- Node.js with a recent version like v18. Version can be verified with
node -v - IDE with TON support:
- Visual Studio Code with the FunC plugin or Tolk plugin
- IntelliJ IDEA with the TON Development plugin
- Run and follow the on-screen instructions: Â
npm create ton@latest or Ânpx create-ton@latest - From the project directory run Â
npm/yarn install to install dependencies
contracts/- Source code for all smart contracts and their importswrappers/- TypeScript interface classes for all contracts (implementingContractfrom @ton/core)- include message [de]serialization primitives, getter wrappers and compilation functions
- used by the test suite and client code to interact with the contracts from TypeScript
compilables/- Compilations scripts for contractstests/- TypeScript test suite for all contracts (relying on Sandbox for in-process tests)scripts/- Deployment scripts to mainnet/testnet and other scripts interacting with live contractsbuild/- Compilation artifacts created here after running a build command
- You need a compilation script in
compilables/<CONTRACT>.compile.ts- example - Run interactive: Â Â
npx blueprint build or Âyarn blueprint build - Non-interactive: Â
npx/yarn blueprint build <CONTRACT>Â OR build all contracts Âyarn blueprint build --all- Example:
yarn blueprint build counter
- Example:
- Build results are generated in
build/<CONTRACT>.compiled.json - Tact generated files are located in
build/<CONTRACT>directory
- Run in terminal: Â
npx blueprint test or Âyarn blueprint test - Alternative method: Â
npm test or Âyarn test - You can specify test file to run: Â
npm/yarn test <CONTRACT>- Example:
yarn test counter
- Example:
Learn more about writing tests from the Sandbox's documentation - here.
- You need a deployment script in
scripts/deploy<CONTRACT>.ts- example - Run interactive: Â Â
npx blueprint run or Âyarn blueprint run - Non-interactive: Â
npx/yarn blueprint run deploy<CONTRACT> --<NETWORK> --<DEPLOY_METHOD>- Example:
yarn blueprint run deployCounter --mainnet --tonconnect
- Example:
- Custom scripts should be located in
scriptsfolder - Script file must have exported function
run
export async function run(provider: NetworkProvider) {
//
}- Script can be run using
npx/yarn blueprint run <SCRIPT>command
FunC version can be updated using npx/yarn blueprint set func command
Run in terminal:  npx blueprint help  or  yarn blueprint help
Before developing, make sure that your current working directory is located in the root of the project created using npm create ton@latest
- Run interactive: Â Â
npx blueprint create or Âyarn blueprint create - Non-interactive: Â
npx/yarn blueprint create <CONTRACT> --type <TYPE>(type can befunc-empty,tolk-empty,tact-empty,func-counter,tolk-counter,tact-counter)- Example:
yarn blueprint create MyNewContract --type func-empty
- Example:
- Implement the standalone FunC root contract in
contracts/<CONTRACT>.fc - Implement shared FunC imports (if breaking code to multiple files) in
contracts/imports/*.fc - Implement wrapper TypeScript class in
wrappers/<CONTRACT>.tsto encode messages and decode getters
- Implement the contract in
contracts/<CONTRACT>.tolk; if you wish, split into multiple files - Implement wrapper TypeScript class in
wrappers/<CONTRACT>.tsto encode messages and decode getters
- Implement the contract in
contracts/<CONTRACT>.tact - Wrappers will be automatically generated in
build/<CONTRACT>/tact_<CONTRACT>.ts
- Implement TypeScript tests in
tests/<CONTRACT>.spec.ts - Rely on the wrapper TypeScript class from
wrappers/<CONTRACT>.tsto interact with the contract
Learn more about writing tests from the Sandbox's documentation - here.
A config may be created in order to control some of blueprint's features. If a config is needed, create a blueprint.config.ts file in the root of your project with something like this:
import { Config } from '@ton/blueprint';
export const config: Config = {
// config contents
};It is important that the config is exported, is named config, and is not default exported.
Config's features are explained below.
Blueprint has a plugin system to allow the community to develop their own additions for the ecosystem without the need to change blueprint's code.
In order to use plugins, add a plugins array to your config:
import { Config } from '@ton/blueprint';
import { ScaffoldPlugin } from 'blueprint-scaffold';
export const config: Config = {
plugins: [new ScaffoldPlugin()],
};(This example shows how to add the scaffold plugin)
Here are some of the plugins developed by the community:
- scaffold - allows developers to quickly create a simple dapp automatically using the wrappers' code
- misti - simplifies workflow with the Misti static analyzer
A custom network may be specified by using the --custom flags, which you can read about by running blueprint help run, but it can be tiresome to use these at all times. Instead, to specify a custom network to always be used (unless --custom flags are present), add a network object to your config:
import { Config } from '@ton/blueprint';
export const config: Config = {
network: {
endpoint: 'https://toncenter.com/api/v2/jsonRPC',
type: 'mainnet',
version: 'v2',
key: 'YOUR_API_KEY',
},
};The above config parameters are equivalent to the arguments in the following command:
npx blueprint run --custom https://toncenter.com/api/v2/jsonRPC --custom-version v2 --custom-type mainnet --custom-key YOUR_API_KEYProperties of the network object have the same semantics as the --custom flags with respective names (see blueprint help run).
You can also use custom network to verify contracts, like so:
npx blueprint verify --custom https://toncenter.com/api/v2/jsonRPC --custom-version v2 --custom-type mainnet --custom-key YOUR_API_KEY(or similarly using the config), however custom type MUST be specified as either mainnet or testnet when verifying.
Special thanks to @qdevstudio for their logo for blueprint.
MIT
TON - EQAQR1d1Q4NaE5EefwUMdrr1QvXg-8mDB0XI2-fwDBD0nYxC