73 lines
2.8 KiB
Python
73 lines
2.8 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
|
|
from tonsdk.contract.token.ft import JettonWallet
|
|
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': 1e6,
|
|
'send_mode': 1 + 2,
|
|
'payload_cell': begin_cell().store_uint(0, 32).store_bytes(b'Hello, world!').end_cell()
|
|
},
|
|
{
|
|
'to_address': 'EQAMIO92T5hO1A7KYffU7h6wMo8MO3e10PBKIKVX3S_JlcB4', # $CATS jetton wallet
|
|
'ton_value': 5e7,
|
|
'send_mode': 1 + 2,
|
|
'payload_cell': JettonWallet().create_transfer_body(
|
|
Address('UQBGou1AJF1OkNqb4LB3H-_sdmvehkBHJguzrAB8kZ5sPKDF'), 1e9, forward_amount=1,
|
|
forward_payload=bytes(4) + b'Airdrop'
|
|
)
|
|
}
|
|
]
|
|
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()}')
|