76 lines
3.9 KiB
Python
76 lines
3.9 KiB
Python
from decimal import Decimal
|
|
from time import time
|
|
|
|
from tonsdk.boc import Cell, begin_cell
|
|
from tonsdk.contract import Contract
|
|
from tonsdk.contract.wallet import WalletContract
|
|
from tonsdk.utils import Address
|
|
|
|
WALLET_V3_CR3_CODE_HEX = 'b5ee9c7241021001000162000114ff00f4a413f4bcf2c80b01020120020f02014803080202ce0407020120050600510ccc741d35c87e900c3e910c7b513420405035c874ffcc19aea6f0003cb41a750c341ffc00a456f8a000730074c7c860802ab06ea65b0874c1f50c007ec0380860802aa82ea384cc407cb81a75350c087ec100743b47bb54fb55380c0c7000372103fcbc20002349521d74ac2009801d401d022f00101e85b8020120090c0201200a0b0019bb39ced44d08020d721d3ff3080011b8c97ed44d0d31f3080201580d0e001bb71e3da89a1020481ae43a61e610001bb49f3da89a1020281ae43a7fe61000f6f28308d71820d31fd31fd31f3001f823bbf2d06ced44d0d31fd3ffd31fd3ff305151baf2e0695132baf2e06924f901541066f910f2e069f8007054715226ed44ed45ed479131ed67ed65ed64747fed118e1104d430d023c000917f9170e2f002045023ed41edf101f2ff04a4c8cb1f13cbffcb1fcbffcb0fc9ed542675fc7e'
|
|
|
|
|
|
class WalletV3CR3(WalletContract):
|
|
def __init__(self, **kwargs):
|
|
kwargs['code'] = Cell.one_from_boc(WALLET_V3_CR3_CODE_HEX)
|
|
kwargs['subwallet_id'] = kwargs.get('subwallet_id', 0)
|
|
super().__init__(**kwargs)
|
|
|
|
def create_data_cell(self):
|
|
return (
|
|
begin_cell()
|
|
.store_uint(0, 32)
|
|
.store_bytes(self.options['public_key'])
|
|
.store_uint(self.options['subwallet_id'], 32)
|
|
.store_uint(0, 256)
|
|
.end_cell()
|
|
)
|
|
|
|
def create_signing_message(self, seqno=None, timeout=60) -> Cell:
|
|
seqno = seqno or 0
|
|
return begin_cell().store_uint(self.options['subwallet_id'], 32).store_uint(int(time() + timeout), 32).store_uint(seqno, 32).end_cell()
|
|
|
|
def create_transfer_message(self, recipients_list: list, seqno: int, timeout=60, dummy_signature=False) -> dict:
|
|
signing_message = begin_cell().store_cell(self.create_signing_message(seqno=seqno, timeout=timeout))
|
|
_commands = begin_cell()
|
|
for i, recipient in enumerate(recipients_list):
|
|
if not recipient: continue
|
|
payload_cell = Cell()
|
|
if recipient.get('payload'):
|
|
if type(recipient['payload']) == str:
|
|
if len(recipient['payload']) > 0:
|
|
payload_cell.bits.write_uint(0, 32)
|
|
payload_cell.bits.write_string(recipient['payload'])
|
|
elif hasattr(recipient['payload'], 'refs'):
|
|
payload_cell = recipient['payload']
|
|
else:
|
|
payload_cell.bits.write_bytes(recipient['payload'])
|
|
|
|
order_header = Contract.create_internal_message_header(
|
|
Address(recipient['address']), Decimal(recipient['amount'])
|
|
)
|
|
order = Contract.create_common_msg_info(
|
|
order_header, recipient.get('state_init'), payload_cell
|
|
)
|
|
_commands = _commands.store_ref(
|
|
begin_cell()
|
|
.store_uint(0xAAC1, 32)
|
|
.store_uint8(recipient.get('send_mode', 0))
|
|
.store_ref(order).end_cell()
|
|
)
|
|
|
|
signing_message = signing_message.store_ref(_commands.end_cell())
|
|
return self.create_external_message(signing_message.end_cell(), seqno, dummy_signature)
|
|
|
|
def create_upgrade_message(self, new_code: Cell, new_data: Cell) -> dict:
|
|
signing_message = begin_cell().store_cell(self.create_signing_message())
|
|
_commands = begin_cell()
|
|
_commands = _commands.store_ref(
|
|
begin_cell()
|
|
.store_uint(0xAAA0, 32)
|
|
.store_ref(new_code)
|
|
.store_ref(new_data)
|
|
.end_cell()
|
|
)
|
|
signing_message = signing_message.store_ref(_commands.end_cell())
|
|
return self.create_external_message(signing_message.end_cell(), 0, True)
|