universal-wallet-contract/signer/test_tx.py

69 lines
2.6 KiB
Python

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()}')