from nacl.signing import SigningKey from tonsdk.boc import Cell, begin_cell from tonsdk.utils import sign_message as sign_message from tonsdk.utils import Address import httpx import time def sign_request(private_key: bytes, request_gas: int, messages: list, signature_offset: int = 0, subwallet_id: int = 0) -> Cell: assert len(private_key) == 32, 'Invalid private_key size' assert len(messages) < 5, 'Too many messages' request = ( begin_cell() .store_uint((int(time.time() + 300) << 32) + signature_offset, 64) .store_uint(subwallet_id, 32) .store_coins(request_gas) ) for int_message in messages: request = ( request .store_uint(int_message['send_mode'], 8) .store_ref( begin_cell() .store_uint(0x18, 6) .store_address(Address(int_message['to_address'])) .store_coins(int_message['ton_value']) .store_uint(1, 1 + 4 + 4 + 32 + 64 + 1 + 1) .store_ref( (int_message.get('payload_cell') or begin_cell().end_cell()) ) .end_cell() ) ) request = request.end_cell() signature_target = request.bytes_hash() signature_bytes = SigningKey(private_key).sign(signature_target).signature assert len(signature_bytes) == 64, 'Invalid signature size' verify_key = SigningKey(private_key).verify_key print(f'Verify key: {verify_key._key.hex()}') print(f"Verify result: {verify_key.verify(signature_target, signature_bytes)}") return begin_cell() \ .store_bytes(signature_bytes) \ .store_cell(request) \ .end_cell() if __name__ == '__main__': messages = [ { 'to_address': 'UQCVWJxM2a7O9_O9XqJOURcPzCx1zt4cw6WcXyHWyvEBKVUb', 'ton_value': 1e4, 'send_mode': 1 + 2, 'payload_cell': begin_cell().store_uint(0, 32).store_bytes(b'Hello, world!').end_cell() }, { 'to_address': 'UQCVWJxM2a7O9_O9XqJOURcPzCx1zt4cw6WcXyHWyvEBKVUb', 'ton_value': 3e4, 'send_mode': 1 + 2, 'payload_cell': begin_cell().store_uint(0, 32).store_bytes(b'Hello, world! x2').end_cell() } ] private_key = bytes.fromhex('fa112cce66146eb64d319de109f8e17f93f1edaf5eeeabe0fe72ec22a3e8c8bc') request_min_gas = float(0.1) signed_request = sign_request(private_key, int(request_min_gas * 1e9), messages) print(f'Signed request: {signed_request.to_boc().hex()}')