Шаблон, написанный на Python, представляет собой готовое решение для работы со смарт-контрактами в блокчейне TON с использованием библиотеки pytoniq. Проект предлагает минимально необходимую, но полноценную среду для разработки смарт-контрактов на языке Func, включая развёртывание, отправку сообщений и утилитарные модули.
project_root/
├── contracts/ # Исходные коды смарт-контрактов (.fc)
├── core/ # Основные абстракции, такие как Contract и Wallet
├── model/ # Схемы данных и конфигурации
├── service/ # Высокоуровневые сервисные классы
└── utils/ # Вспомогательные утилиты
Абстракция над смарт-контрактом в сети TON. Предоставляет методы:
- Развёртывание контракта
- Отправка внутренних сообщений
- Вызов get-методов
contract = Contract(...)
contract.deploy()contract.send_internal_message("method", params)result = contract.run_get_method("method_name", args)Обёртка над кошельком TON, управляющая взаимодействием со смарт-контрактами. Инициализируется заранее заданными параметрами конфигурации.
wallet = AdminWallet(config)
wallet.send_message(contract_address, payload)Высокоуровневый API для развёртывания контрактов с интеграцией ядра проекта.
from src.core.contract import Contract
from src.model.schemas import StateInit, AbstractMessage
class DeployService:
async def deploy_smart_contract_via_client(self, state_init: StateInit) -> AbstractMessage:
print("[DEPLOY SERVICE] = [Start Deploying Smart Contract]")
result: AbstractMessage = await Contract(state_init = state_init).deploy_smart_contract_via_client()
print(f"[DEPLOY SERVICE] = [{result.message}]")
return result
async def deploy_smart_contract_via_tonapi(self, state_init: StateInit) -> AbstractMessage:
print("[DEPLOY SERVICE] = [Start Deploying Smart Contract]")
result: AbstractMessage = await Contract(state_init = state_init).deploy_smart_contract_via_tonapi()
print(f"[DEPLOY SERVICE] = [{result.message}]")
return resultasync def send_internal_message_via_client(
self,
destination: str,
amount: int,
body: Cell = Cell.empty(),
state_init: StateInit = None
) -> AbstractMessage:
if self.provider_config is None:
try:
async with LiteClient.from_mainnet_config(trust_level = 2) as provider:
wallet_v4r2: WalletV4R2 = await self.as_wallet_v4r2(provider = provider)
await wallet_v4r2.transfer(
destination = destination,
amount = amount,
body = body,
state_init = state_init
)
return AbstractMessage(
message = "Success: External message was sent",
exit_code = 0
)
except(Exception) as ex:
return AbstractMessage(
message = f"Error: External message was not sent - {ex}",
exit_code = -1
)async def run_get_method(self, method_name: str) -> int:
wallet = AdminWallet()
if wallet.provider_config is None:
async with LiteClient.from_mainnet_config(trust_level = 2) as provider:
pytoniq_wallet = await AdminWallet().as_wallet_v4r2(provider = provider)
result = await pytoniq_wallet.run_get_method(
method = method_name,
stack = []
)
return result
async with LiteClient.from_mainnet_config(trust_level = wallet.provider_config) as provider:
pytoniq_wallet = await AdminWallet().as_wallet_v4r2(provider = provider)
result = await pytoniq_wallet.run_get_method(
method = method_name,
stack = []
)
return resultasync def send_message_to_smart_contract(
self,
body: Cell,
amount: int = DEFAULT_AMOUNT
) -> AbstractMessage:
wallet = AdminWallet()
result = await wallet.send_internal_message_via_client(
destination = self.address,
amount = amount,
body = body
)
return resultasync def deploy_smart_contract_via_client(
self,
amount: int = DEFAULT_AMOUNT
) -> AbstractMessage:
wallet = AdminWallet()
result = await wallet.send_internal_message_via_client(
destination = self.address,
amount = amount,
state_init = PytoniqStateInit(
data = self.state_init.data,
code = self.state_init.code
)
)
return resultОсновная логика инициализации и развёртывания контракта:
async def main():
state_init = StateInit(
code = await from_boc_to_cell(CODE_BOC_FORMAT),
data = await as_init_data(number = 0)
)
contract = await Contract.create(state_init)
result = await contract.deploy_smart_contract_via_client()
print(result.message)- Дуров Н. Telegram Open Network, 2 марта 2019, 132 страницы