Fee savings
Library cells can reduce forward fees and storage costs:- In jettons, the
StateInitmust be forwarded with each transfer, which increases forwarding fees. Moving the code into a library cell reduces that overhead. - A library must be hosted in the masterchain, where storage is much more expensive than in the basechain. If fewer than about 1,000 contracts share the same code, storing a copy in the basechain can be cheaper. The exact ratio depends on blockchain config parameter 18. Compare both storage and forwarding costs before choosing this approach.
code, the runtime dereferences it on first access. This makes it possible to replace part of the contract code, or even the entire code, with a library cell.
Replacing the entire code with a library cell is common in TON smart contracts. Examples include:
- USDT and other popular jetton wallet contracts
- The Order contract in multisig v2
- NFT item contracts in popular collections
code cell in an explorer.
Partial explorer snippet of a USDT jetton wallet account
SPECIAL cell, which indicates an exotic cell. The first byte equals 2, which marks a library cell. The remaining bytes contain the hash of the referenced cell.
In this form, the entire contract code consists of the 8-bit tag 2 and the 256-bit representation hash of the referenced cell.
If only part of the code should live in a library cell, move the shared function into a library instead. This works well when multiple contracts reuse the same function. The build process for that setup usually needs custom tooling.
Using @ton/core
Construct a library cell in TypeScript with the @ton/core library. The following example shows the pattern in a Blueprint project:
JettonWallet.spec.ts.
Publishing an ordinary cell in the masterchain library context
The following example comes from the multisig v2 repository.set_lib_code(lib_to_publish, 2);. This call publishes an ordinary cell with the flag set to 2, which makes the library public.
Testing in Blueprint
When testing smart contracts locally, there are two ways to register libraries in the blockchain environment: automatically and manually.Automatic library deployment
Enable automatic library detection by passing theautoDeployLibs flag when creating the blockchain:
Manual library deployment
IfautoDeployLibs is not enabled, register libraries manually:
JettonWallet.spec.ts.
Get methods for library-backed contracts
When working with a jetton wallet whose code is stored in a library cell, check its balance by executing a get method. When methods run through the HTTP API or LiteServer, the library cell is resolved automatically and the method runs against the resolved code. For local execution, pull the account state and resolve every library reference cell first. In most cases, the entire code cell is itself a library reference. To resolve a library, call the/getLibraries method.