def __init_debot(self, keypair: KeyPair) -> Tuple[str, str]: """ Deploy debot and target """ signer = Signer.Keys(keys=keypair) debot_abi = Abi.from_path( path=os.path.join(SAMPLES_DIR, 'Debot.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Debot.tvc'), 'rb') as fp: debot_tvc = base64.b64encode(fp.read()).decode() # Deploy target call_set = CallSet(function_name='constructor') deploy_set = DeploySet(tvc=self.target_tvc) encode_params = ParamsOfEncodeMessage( abi=self.target_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message = async_custom_client.abi.encode_message(params=encode_params) # Check if target contract does not exists target_address = self.__check_address(address=message.address) if not target_address: process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) target = async_custom_client.processing.process_message( params=process_params) target_address = target.transaction['account_addr'] # Deploy debot call_set = CallSet( function_name='constructor', input={ 'targetAbi': self.target_abi.value.encode().hex(), 'targetAddr': target_address }) deploy_set = DeploySet(tvc=debot_tvc) encode_params = ParamsOfEncodeMessage( abi=debot_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message = async_custom_client.abi.encode_message(params=encode_params) # Check if debot contract does not exists debot_address = self.__check_address(address=message.address) if not debot_address: process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) debot = async_custom_client.processing.process_message( params=process_params) debot_address = debot.transaction['account_addr'] # Set ABI call_set = CallSet( function_name='setAbi', input={'debotAbi': debot_abi.value.encode().hex()}) async_custom_client.processing.process_message( params=ParamsOfProcessMessage( message_encode_params=ParamsOfEncodeMessage( abi=debot_abi, signer=Signer.NoSigner(), address=debot_address, call_set=call_set), send_events=False)) return debot_address, target_address
def deploy_contract(self,abi,tvc,signer,constructor_header={}): deploy_set = DeploySet(tvc=tvc) call_set = CallSet( function_name='constructor', inputs=constructor_header) deploy_message = self.async_core_client.processing.process_message( abi=abi, signer=signer, deploy_set=deploy_set, call_set=call_set,send_events=False) #self.async_core_client.processing.process_message() #log = self.async_core_client.processing.process_message(message=deploy_message,send_events=False) return deploy_message
def __init_debot5(self, count: int) -> Tuple[List[str], str]: debot_abi = Abi.from_path( path=os.path.join(SAMPLES_DIR, 'Debot5.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Debot5.tvc'), 'rb') as fp: debot_tvc = base64.b64encode(fp.read()).decode() result = async_custom_client.boc.get_code_from_tvc( params=ParamsOfGetCodeFromTvc(tvc=debot_tvc)) result = async_custom_client.boc.get_boc_hash( params=ParamsOfGetBocHash(boc=result.code)) contract_hash = result.hash call_set = CallSet( function_name='constructor', input={'codeHash': f'0x{contract_hash}'}) deploy_set = DeploySet(tvc=debot_tvc) deploy_params = ParamsOfEncodeMessage( abi=debot_abi, deploy_set=deploy_set, call_set=call_set, signer=Signer.NoSigner()) addresses = [] for i in range(count): # Set signer for deploy params keypair = async_custom_client.crypto.generate_random_sign_keys() deploy_params.signer = Signer.Keys(keys=keypair) # Calculate address message = async_custom_client.abi.encode_message( params=deploy_params) self.__check_address(address=message.address) # Deploy address process_params = ParamsOfProcessMessage( message_encode_params=deploy_params, send_events=False) result = async_custom_client.processing.process_message( params=process_params) debot_address = result.transaction['account_addr'] addresses.append(debot_address) if i > 0: continue # Set ABI call_set = CallSet( function_name='setABI', input={'dabi': debot_abi.value.encode().hex()}) async_custom_client.processing.process_message( params=ParamsOfProcessMessage( message_encode_params=ParamsOfEncodeMessage( abi=debot_abi, signer=deploy_params.signer, address=debot_address, call_set=call_set), send_events=False)) return addresses, contract_hash
def get_address(self,signer,abi,tvc,constructor_header={},workchaind_id=0): deploy_set = DeploySet(tvc=tvc) call_set = CallSet( function_name='constructor', header=constructor_header) message_source = MessageSource.from_encoding_params( abi=abi, signer=signer, deploy_set=deploy_set, call_set=call_set) state_init_source = StateInitSource.from_message( message=message_source) encoded = self.async_core_client.abi.encode_account( state_init=state_init_source) return f'{workchaind_id}:' + encoded['id']
def __init_debot2(self, keypair: KeyPair) -> str: signer = Signer.Keys(keys=keypair) debot_abi = Abi.from_path( path=os.path.join(SAMPLES_DIR, 'Debot2.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Debot2.tvc'), 'rb') as fp: debot_tvc = base64.b64encode(fp.read()).decode() call_set = CallSet( function_name='constructor', input={ 'pub': f'0x{keypair.public}', 'sec': f'0x{keypair.secret}' }) deploy_set = DeploySet(tvc=debot_tvc) encode_params = ParamsOfEncodeMessage( abi=debot_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message = async_custom_client.abi.encode_message(params=encode_params) # Check if debot contract does not exists debot_address = self.__check_address(address=message.address) if not debot_address: process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) debot = async_custom_client.processing.process_message( params=process_params) debot_address = debot.transaction['account_addr'] # Set ABI call_set = CallSet( function_name='setAbi', input={'debotAbi': debot_abi.value.encode().hex()}) async_custom_client.processing.process_message( params=ParamsOfProcessMessage( message_encode_params=ParamsOfEncodeMessage( abi=debot_abi, signer=signer, address=debot_address, call_set=call_set), send_events=False)) return debot_address
def test_encode_internal_message_deploy(self): abi = Abi.from_path(path=os.path.join(SAMPLES_DIR, 'Hello.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Hello.tvc'), 'rb') as fp: tvc = base64.b64encode(fp.read()).decode() result = async_core_client.abi.encode_internal_message( params=ParamsOfEncodeInternalMessage( abi=abi, value='0', deploy_set=DeploySet(tvc=tvc), call_set=CallSet(function_name='constructor'))) self.assertEqual( 'te6ccgECHAEABG0AAmliADYO5IoxskLmUfURre2fOB04OmP32VjPwA/lDM/Cpvh8AAAAAAAAAAAAAAAAAAIxotV8/gYBAQHAAgIDzyAFAwEB3gQAA9AgAEHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCJv8A9KQgIsABkvSg4YrtU1gw9KEJBwEK9KQg9KEIAAACASAMCgHo/38h0wABjiaBAgDXGCD5AQFw7UTQ9AWAQPQO8orXC/8B7Ucib3XtVwMB+RDyqN7tRNAg10nCAY4W9ATTP9MA7UcBb3EBb3YBb3MBb3LtV44Y9AXtRwFvcnBvc3BvdsiAIM9AydBvce1X4tM/Ae1HbxMhuSALAGCfMCD4I4ED6KiCCBt3QKC53pntRyFvUyDtVzCUgDTy8OIw0x8B+CO88rnTHwHxQAECASAYDQIBIBEOAQm6i1Xz+A8B+u1Hb2FujjvtRNAg10nCAY4W9ATTP9MA7UcBb3EBb3YBb3MBb3LtV44Y9AXtRwFvcnBvc3BvdsiAIM9AydBvce1X4t7tR28WkvIzl+1HcW9W7VfiAPgA0fgjtR/tRyBvETAByMsfydBvUe1X7UdvEsj0AO1HbxPPCz/tR28WEAAczwsA7UdvEc8Wye1UcGoCAWoVEgEJtAAa1sATAfztR29hbo477UTQINdJwgGOFvQE0z/TAO1HAW9xAW92AW9zAW9y7VeOGPQF7UcBb3Jwb3Nwb3bIgCDPQMnQb3HtV+Le7UdvZSBukjBw3nDtR28SgED0DvKK1wv/uvLgZPgA+kDRIMjJ+wSBA+hwgQCAyHHPCwEizwoAcc9A+CgUAI7PFiTPFiP6AnHPQHD6AnD6AoBAz0D4I88LH3LPQCDJIvsAXwUw7UdvEsj0AO1HbxPPCz/tR28WzwsA7UdvEc8Wye1UcGrbMAEJtGX2i8AWAfjtR29hbo477UTQINdJwgGOFvQE0z/TAO1HAW9xAW92AW9zAW9y7VeOGPQF7UcBb3Jwb3Nwb3bIgCDPQMnQb3HtV+Le0e1HbxHXCx/IghBQy+0XghCAAAAAsc8LHyHPCx/Ic88LAfgozxZyz0D4Jc8LP4Ahz0AgzzUizzG8FwB4lnHPQCHPF5Vxz0EhzeIgyXH7AFshwP+OHu1HbxLI9ADtR28Tzws/7UdvFs8LAO1HbxHPFsntVN5xatswAgEgGxkBCbtzEuRYGgD47UdvYW6OO+1E0CDXScIBjhb0BNM/0wDtRwFvcQFvdgFvcwFvcu1Xjhj0Be1HAW9ycG9zcG92yIAgz0DJ0G9x7Vfi3vgA0fgjtR/tRyBvETAByMsfydBvUe1X7UdvEsj0AO1HbxPPCz/tR28WzwsA7UdvEc8Wye1UcGrbMADK3XAh10kgwSCOKyDAAI4cI9Bz1yHXCwAgwAGW2zBfB9swltswXwfbMOME2ZbbMF8G2zDjBNngItMfNCB0uyCOFTAgghD/////uiCZMCCCEP////6639+W2zBfB9sw4CMh8UABXwc=', result.message) boc_hash = async_core_client.boc.get_boc_hash( params=ParamsOfGetBocHash(boc=result.message)) self.assertEqual(result.message_id, boc_hash.hash) parsed = async_core_client.boc.parse_message(params=ParamsOfParse( boc=result.message)) code = async_core_client.boc.get_code_from_tvc( params=ParamsOfGetCodeFromTvc(tvc=tvc)) self.assertEqual(code.code, parsed.parsed['code'])
def test_suspend_resume(self): # Data for contract deployment keypair = async_custom_client.crypto.generate_random_sign_keys() abi = Abi.from_path(path=os.path.join(SAMPLES_DIR, 'Hello.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Hello.tvc'), 'rb') as fp: tvc = base64.b64encode(fp.read()).decode() signer = Signer.Keys(keys=keypair) deploy_set = DeploySet(tvc=tvc) call_set = CallSet(function_name='constructor') # Prepare deployment params encode_params = ParamsOfEncodeMessage( abi=abi, signer=signer, deploy_set=deploy_set, call_set=call_set) encode = async_custom_client.abi.encode_message(params=encode_params) # Subscribe for address deploy transaction status transactions = [] def __callback(response_data, response_type, *args): if response_type == SubscriptionResponseType.OK: result = ResultOfSubscription(**response_data) transactions.append(result.result) self.assertEqual(encode.address, result.result['account_addr']) if response_type == SubscriptionResponseType.ERROR: logging.info(ClientError(**response_data).__str__()) subscribe_params = ParamsOfSubscribeCollection( collection='transactions', result='id account_addr', filter={'account_addr': {'eq': encode.address}, 'status_name': {'eq': 'Finalized'}}) subscribe = async_custom_client.net.subscribe_collection( params=subscribe_params, callback=__callback) # Send grams to new account to create first transaction send_grams(address=encode.address) # Give some time for subscription to receive all data time.sleep(2) # Suspend subscription async_custom_client.net.suspend() time.sleep(2) # Wait a bit for suspend # Deploy to create second transaction. # Use another client, because of error: Fetch first block failed: # Can not use network module since it is suspended second_config = ClientConfig() second_config.network.server_address = CUSTOM_BASE_URL second_client = TonClient(config=second_config) process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) second_client.processing.process_message(params=process_params) second_client.destroy_context() # Check that second transaction is not received when # subscription suspended self.assertEqual(1, len(transactions)) # Resume subscription async_custom_client.net.resume() time.sleep(2) # Wait a bit for resume # Run contract function to create third transaction call_set = CallSet(function_name='touch') encode_params = ParamsOfEncodeMessage( abi=abi, signer=signer, address=encode.address, call_set=call_set) process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) async_custom_client.processing.process_message(params=process_params) # Give some time for subscription to receive all data time.sleep(2) # Check that third transaction is now received after resume self.assertEqual(2, len(transactions)) self.assertNotEqual(transactions[0]['id'], transactions[1]['id']) # Unsubscribe async_custom_client.net.unsubscribe(params=subscribe)
def setUp(self) -> None: self.events_abi = Abi.from_json_path( path=os.path.join(SAMPLES_DIR, 'Events.abi.json')) with open(os.path.join(SAMPLES_DIR, 'Events.tvc'), 'rb') as fp: self.events_tvc = base64.b64encode(fp.read()).decode() self.deploy_set = DeploySet(tvc=self.events_tvc)
def test_encode_message(self): deploy_set = DeploySet(tvc=self.events_tvc) call_set = CallSet(function_name='constructor', header=FunctionHeader(pubkey=self.keypair.public, time=self.events_time, expire=self.events_expire)) signer = Signer.External(public_key=self.keypair.public) # Create unsigned deployment message params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) unsigned = async_core_client.abi.encode_message(params=params) self.assertEqual( 'te6ccgECFwEAA2gAAqeIAAt9aqvShfTon7Lei1PVOhUEkEEZQkhDKPgNyzeTL6YSEZTHxAj/Hd67jWQF7peccWoU/dbMCBJBB6YdPCVZcJlJkAAAF0ZyXLg19VzGRotV8/gGAQEBwAICA88gBQMBAd4EAAPQIABB2mPiBH+O713GsgL3S844tQp+62YECSCD0w6eEqy4TKTMAib/APSkICLAAZL0oOGK7VNYMPShCQcBCvSkIPShCAAAAgEgDAoByP9/Ie1E0CDXScIBjhDT/9M/0wDRf/hh+Gb4Y/hijhj0BXABgED0DvK91wv/+GJw+GNw+GZ/+GHi0wABjh2BAgDXGCD5AQHTAAGU0/8DAZMC+ELiIPhl+RDyqJXTAAHyeuLTPwELAGqOHvhDIbkgnzAg+COBA+iogggbd0Cgud6S+GPggDTyNNjTHwH4I7zyudMfAfAB+EdukvI83gIBIBINAgEgDw4AvbqLVfP/hBbo417UTQINdJwgGOENP/0z/TANF/+GH4Zvhj+GKOGPQFcAGAQPQO8r3XC//4YnD4Y3D4Zn/4YeLe+Ebyc3H4ZtH4APhCyMv/+EPPCz/4Rs8LAMntVH/4Z4AgEgERAA5biABrW/CC3Rwn2omhp/+mf6YBov/ww/DN8Mfwxb30gyupo6H0gb+j8IpA3SRg4b3whXXlwMnwAZGT9ghBkZ8KEZ0aCBAfQAAAAAAAAAAAAAAAAACBni2TAgEB9gBh8IWRl//wh54Wf/CNnhYBk9qo//DPAAxbmTwqLfCC3Rwn2omhp/+mf6YBov/ww/DN8Mfwxb2uG/8rqaOhp/+/o/ABkRe4AAAAAAAAAAAAAAAAIZ4tnwOfI48sYvRDnhf/kuP2AGHwhZGX//CHnhZ/8I2eFgGT2qj/8M8AIBSBYTAQm4t8WCUBQB/PhBbo4T7UTQ0//TP9MA0X/4Yfhm+GP4Yt7XDf+V1NHQ0//f0fgAyIvcAAAAAAAAAAAAAAAAEM8Wz4HPkceWMXohzwv/yXH7AMiL3AAAAAAAAAAAAAAAABDPFs+Bz5JW+LBKIc8L/8lx+wAw+ELIy//4Q88LP/hGzwsAye1UfxUABPhnAHLccCLQ1gIx0gAw3CHHAJLyO+Ah1w0fkvI84VMRkvI74cEEIoIQ/////byxkvI84AHwAfhHbpLyPN4=', unsigned.message) self.assertEqual('KCGM36iTYuCYynk+Jnemis+mcwi3RFCke95i7l96s4Q=', unsigned.data_to_sign) # Create detached signature sign_params = ParamsOfSign(unsigned=unsigned.data_to_sign, keys=self.keypair) signature = async_core_client.crypto.sign(params=sign_params) self.assertEqual( '6272357bccb601db2b821cb0f5f564ab519212d242cf31961fe9a3c50a30b236012618296b4f769355c0e9567cd25b366f3c037435c498c82e5305622adbc70e', signature.signature) # Attach signature to unsigned message attach_params = ParamsOfAttachSignature(abi=self.events_abi, public_key=self.keypair.public, message=unsigned.message, signature=signature.signature) signed = async_core_client.abi.attach_signature(params=attach_params) self.assertEqual( 'te6ccgECGAEAA6wAA0eIAAt9aqvShfTon7Lei1PVOhUEkEEZQkhDKPgNyzeTL6YSEbAHAgEA4bE5Gr3mWwDtlcEOWHr6slWoyQlpIWeYyw/00eKFGFkbAJMMFLWnu0mq4HSrPmktmzeeAboa4kxkFymCsRVt44dTHxAj/Hd67jWQF7peccWoU/dbMCBJBB6YdPCVZcJlJkAAAF0ZyXLg19VzGRotV8/gAQHAAwIDzyAGBAEB3gUAA9AgAEHaY+IEf47vXcayAvdLzji1Cn7rZgQJIIPTDp4SrLhMpMwCJv8A9KQgIsABkvSg4YrtU1gw9KEKCAEK9KQg9KEJAAACASANCwHI/38h7UTQINdJwgGOENP/0z/TANF/+GH4Zvhj+GKOGPQFcAGAQPQO8r3XC//4YnD4Y3D4Zn/4YeLTAAGOHYECANcYIPkBAdMAAZTT/wMBkwL4QuIg+GX5EPKoldMAAfJ64tM/AQwAao4e+EMhuSCfMCD4I4ED6KiCCBt3QKC53pL4Y+CANPI02NMfAfgjvPK50x8B8AH4R26S8jzeAgEgEw4CASAQDwC9uotV8/+EFujjXtRNAg10nCAY4Q0//TP9MA0X/4Yfhm+GP4Yo4Y9AVwAYBA9A7yvdcL//hicPhjcPhmf/hh4t74RvJzcfhm0fgA+ELIy//4Q88LP/hGzwsAye1Uf/hngCASASEQDluIAGtb8ILdHCfaiaGn/6Z/pgGi//DD8M3wx/DFvfSDK6mjofSBv6PwikDdJGDhvfCFdeXAyfABkZP2CEGRnwoRnRoIEB9AAAAAAAAAAAAAAAAAAIGeLZMCAQH2AGHwhZGX//CHnhZ/8I2eFgGT2qj/8M8ADFuZPCot8ILdHCfaiaGn/6Z/pgGi//DD8M3wx/DFva4b/yupo6Gn/7+j8AGRF7gAAAAAAAAAAAAAAAAhni2fA58jjyxi9EOeF/+S4/YAYfCFkZf/8IeeFn/wjZ4WAZPaqP/wzwAgFIFxQBCbi3xYJQFQH8+EFujhPtRNDT/9M/0wDRf/hh+Gb4Y/hi3tcN/5XU0dDT/9/R+ADIi9wAAAAAAAAAAAAAAAAQzxbPgc+Rx5YxeiHPC//JcfsAyIvcAAAAAAAAAAAAAAAAEM8Wz4HPklb4sEohzwv/yXH7ADD4QsjL//hDzws/+EbPCwDJ7VR/FgAE+GcActxwItDWAjHSADDcIccAkvI74CHXDR+S8jzhUxGS8jvhwQQighD////9vLGS8jzgAfAB+EdukvI83g==', signed.message) # Create initially signed message signer = Signer.Keys(keys=self.keypair) encode_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) signed = async_core_client.abi.encode_message(params=encode_params) self.assertEqual( 'te6ccgECGAEAA6wAA0eIAAt9aqvShfTon7Lei1PVOhUEkEEZQkhDKPgNyzeTL6YSEbAHAgEA4bE5Gr3mWwDtlcEOWHr6slWoyQlpIWeYyw/00eKFGFkbAJMMFLWnu0mq4HSrPmktmzeeAboa4kxkFymCsRVt44dTHxAj/Hd67jWQF7peccWoU/dbMCBJBB6YdPCVZcJlJkAAAF0ZyXLg19VzGRotV8/gAQHAAwIDzyAGBAEB3gUAA9AgAEHaY+IEf47vXcayAvdLzji1Cn7rZgQJIIPTDp4SrLhMpMwCJv8A9KQgIsABkvSg4YrtU1gw9KEKCAEK9KQg9KEJAAACASANCwHI/38h7UTQINdJwgGOENP/0z/TANF/+GH4Zvhj+GKOGPQFcAGAQPQO8r3XC//4YnD4Y3D4Zn/4YeLTAAGOHYECANcYIPkBAdMAAZTT/wMBkwL4QuIg+GX5EPKoldMAAfJ64tM/AQwAao4e+EMhuSCfMCD4I4ED6KiCCBt3QKC53pL4Y+CANPI02NMfAfgjvPK50x8B8AH4R26S8jzeAgEgEw4CASAQDwC9uotV8/+EFujjXtRNAg10nCAY4Q0//TP9MA0X/4Yfhm+GP4Yo4Y9AVwAYBA9A7yvdcL//hicPhjcPhmf/hh4t74RvJzcfhm0fgA+ELIy//4Q88LP/hGzwsAye1Uf/hngCASASEQDluIAGtb8ILdHCfaiaGn/6Z/pgGi//DD8M3wx/DFvfSDK6mjofSBv6PwikDdJGDhvfCFdeXAyfABkZP2CEGRnwoRnRoIEB9AAAAAAAAAAAAAAAAAAIGeLZMCAQH2AGHwhZGX//CHnhZ/8I2eFgGT2qj/8M8ADFuZPCot8ILdHCfaiaGn/6Z/pgGi//DD8M3wx/DFva4b/yupo6Gn/7+j8AGRF7gAAAAAAAAAAAAAAAAhni2fA58jjyxi9EOeF/+S4/YAYfCFkZf/8IeeFn/wjZ4WAZPaqP/wzwAgFIFxQBCbi3xYJQFQH8+EFujhPtRNDT/9M/0wDRf/hh+Gb4Y/hi3tcN/5XU0dDT/9/R+ADIi9wAAAAAAAAAAAAAAAAQzxbPgc+Rx5YxeiHPC//JcfsAyIvcAAAAAAAAAAAAAAAAEM8Wz4HPklb4sEohzwv/yXH7ADD4QsjL//hDzws/+EbPCwDJ7VR/FgAE+GcActxwItDWAjHSADDcIccAkvI74CHXDR+S8jzhUxGS8jvhwQQighD////9vLGS8jzgAfAB+EdukvI83g==', signed.message) # Sign with signing box sbox = async_core_client.crypto.get_signing_box(params=self.keypair) signer_sbox = Signer.SigningBox(handle=sbox.handle) encode_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer_sbox, deploy_set=deploy_set, call_set=call_set) signed_sbox = async_core_client.abi.encode_message( params=encode_params) async_core_client.crypto.remove_signing_box(params=sbox) self.assertEqual(signed.message, signed_sbox.message) # Create run unsigned message address = '0:05beb555e942fa744fd96f45a9ea9d0a8248208ca12421947c06e59bc997d309' call_set = CallSet(function_name='returnValue', input={'id': '0'}, header=FunctionHeader( **{ 'pubkey': self.keypair.public, 'time': self.events_time, 'expire': self.events_expire })) signer = Signer.External(public_key=self.keypair.public) encode_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, address=address, call_set=call_set) unsigned = async_core_client.abi.encode_message(params=encode_params) self.assertEqual( 'te6ccgEBAgEAeAABpYgAC31qq9KF9Oifst6LU9U6FQSQQRlCSEMo+A3LN5MvphIFMfECP8d3ruNZAXul5xxahT91swIEkEHph08JVlwmUmQAAAXRnJcuDX1XMZBW+LBKAQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=', unsigned.message) self.assertEqual('i4Hs3PB12QA9UBFbOIpkG3JerHHqjm4LgvF4MA7TDsY=', unsigned.data_to_sign) # Create detached signature sign_params = ParamsOfSign(unsigned=unsigned.data_to_sign, keys=self.keypair) signature = async_core_client.crypto.sign(params=sign_params) self.assertEqual( '5bbfb7f184f2cb5f019400b9cd497eeaa41f3d5885619e9f7d4fab8dd695f4b3a02159a1422996c1dd7d1be67898bc79c6adba6c65a18101ac5f0a2a2bb8910b', signature.signature) # Attach signature attach_params = ParamsOfAttachSignature(abi=self.events_abi, public_key=self.keypair.public, message=unsigned.message, signature=signature.signature) signed = async_core_client.abi.attach_signature(params=attach_params) self.assertEqual( 'te6ccgEBAwEAvAABRYgAC31qq9KF9Oifst6LU9U6FQSQQRlCSEMo+A3LN5MvphIMAQHhrd/b+MJ5Za+AygBc5qS/dVIPnqxCsM9PvqfVxutK+lnQEKzQoRTLYO6+jfM8TF4841bdNjLQwIDWL4UVFdxIhdMfECP8d3ruNZAXul5xxahT91swIEkEHph08JVlwmUmQAAAXRnJcuDX1XMZBW+LBKACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==', signed.message) # Create initially signed message signer = Signer.Keys(keys=self.keypair) encode_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, address=address, call_set=call_set) signed = async_core_client.abi.encode_message(params=encode_params) self.assertEqual( 'te6ccgEBAwEAvAABRYgAC31qq9KF9Oifst6LU9U6FQSQQRlCSEMo+A3LN5MvphIMAQHhrd/b+MJ5Za+AygBc5qS/dVIPnqxCsM9PvqfVxutK+lnQEKzQoRTLYO6+jfM8TF4841bdNjLQwIDWL4UVFdxIhdMfECP8d3ruNZAXul5xxahT91swIEkEHph08JVlwmUmQAAAXRnJcuDX1XMZBW+LBKACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==', signed.message)
def test_encode_account(self): # Encode account from encoded deploy message encoded_deploy_message = 'te6ccgECFwEAA2gAAqeIAAt9aqvShfTon7Lei1PVOhUEkEEZQkhDKPgNyzeTL6YSEZTHxAj/Hd67jWQF7peccWoU/dbMCBJBB6YdPCVZcJlJkAAAF0ZyXLg19VzGRotV8/gGAQEBwAICA88gBQMBAd4EAAPQIABB2mPiBH+O713GsgL3S844tQp+62YECSCD0w6eEqy4TKTMAib/APSkICLAAZL0oOGK7VNYMPShCQcBCvSkIPShCAAAAgEgDAoByP9/Ie1E0CDXScIBjhDT/9M/0wDRf/hh+Gb4Y/hijhj0BXABgED0DvK91wv/+GJw+GNw+GZ/+GHi0wABjh2BAgDXGCD5AQHTAAGU0/8DAZMC+ELiIPhl+RDyqJXTAAHyeuLTPwELAGqOHvhDIbkgnzAg+COBA+iogggbd0Cgud6S+GPggDTyNNjTHwH4I7zyudMfAfAB+EdukvI83gIBIBINAgEgDw4AvbqLVfP/hBbo417UTQINdJwgGOENP/0z/TANF/+GH4Zvhj+GKOGPQFcAGAQPQO8r3XC//4YnD4Y3D4Zn/4YeLe+Ebyc3H4ZtH4APhCyMv/+EPPCz/4Rs8LAMntVH/4Z4AgEgERAA5biABrW/CC3Rwn2omhp/+mf6YBov/ww/DN8Mfwxb30gyupo6H0gb+j8IpA3SRg4b3whXXlwMnwAZGT9ghBkZ8KEZ0aCBAfQAAAAAAAAAAAAAAAAACBni2TAgEB9gBh8IWRl//wh54Wf/CNnhYBk9qo//DPAAxbmTwqLfCC3Rwn2omhp/+mf6YBov/ww/DN8Mfwxb2uG/8rqaOhp/+/o/ABkRe4AAAAAAAAAAAAAAAAIZ4tnwOfI48sYvRDnhf/kuP2AGHwhZGX//CHnhZ/8I2eFgGT2qj/8M8AIBSBYTAQm4t8WCUBQB/PhBbo4T7UTQ0//TP9MA0X/4Yfhm+GP4Yt7XDf+V1NHQ0//f0fgAyIvcAAAAAAAAAAAAAAAAEM8Wz4HPkceWMXohzwv/yXH7AMiL3AAAAAAAAAAAAAAAABDPFs+Bz5JW+LBKIc8L/8lx+wAw+ELIy//4Q88LP/hGzwsAye1UfxUABPhnAHLccCLQ1gIx0gAw3CHHAJLyO+Ah1w0fkvI84VMRkvI74cEEIoIQ/////byxkvI84AHwAfhHbpLyPN4=' message_source = MessageSource.Encoded(message=encoded_deploy_message, abi=self.events_abi) state_init_source = StateInitSource.Message(source=message_source) encode_params = ParamsOfEncodeAccount(state_init=state_init_source) encoded = async_core_client.abi.encode_account(params=encode_params) self.assertEqual( '05beb555e942fa744fd96f45a9ea9d0a8248208ca12421947c06e59bc997d309', encoded.id) # Encode account from encoding params deploy_set = DeploySet(tvc=self.events_tvc) call_set = CallSet(function_name='constructor', header=FunctionHeader( **{ 'pubkey': self.keypair.public, 'time': self.events_time, 'expire': self.events_expire })) signer = Signer.Keys(keys=self.keypair) encoding_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message_source = MessageSource.EncodingParams(params=encoding_params) state_init_source = StateInitSource.Message(source=message_source) encode_params = ParamsOfEncodeAccount(state_init=state_init_source) encoded = async_core_client.abi.encode_account(params=encode_params) self.assertEqual( '05beb555e942fa744fd96f45a9ea9d0a8248208ca12421947c06e59bc997d309', encoded.id) # Test exception (external signer) with self.assertRaises(TonException): signer = Signer.External(public_key=self.keypair.public) encoding_params = ParamsOfEncodeMessage(abi=self.events_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message_source = MessageSource.EncodingParams( params=encoding_params) state_init_source = StateInitSource.Message(source=message_source) encode_params = ParamsOfEncodeAccount(state_init=state_init_source) async_core_client.abi.encode_account(params=encode_params) # Encode account from TVC state_init_source = StateInitSource.Tvc(tvc=self.events_tvc) encode_params = ParamsOfEncodeAccount(state_init=state_init_source) encoded = async_core_client.abi.encode_account(params=encode_params) self.assertNotEqual( '05beb555e942fa744fd96f45a9ea9d0a8248208ca12421947c06e59bc997d309', encoded.id) state_init_source = StateInitSource.Tvc(tvc=self.events_tvc, public_key=self.keypair.public) encode_params = ParamsOfEncodeAccount(state_init=state_init_source) encoded = async_core_client.abi.encode_account(params=encode_params) self.assertEqual( '05beb555e942fa744fd96f45a9ea9d0a8248208ca12421947c06e59bc997d309', encoded.id)
def __init_debot_pair(self, keypair: KeyPair) -> Tuple[str, str]: signer = Signer.Keys(keys=keypair) debot_a_abi = Abi.from_path( path=os.path.join(SAMPLES_DIR, 'DebotPairA.abi.json')) with open(os.path.join(SAMPLES_DIR, 'DebotPairA.tvc'), 'rb') as fp: debot_a_tvc = base64.b64encode(fp.read()).decode() debot_b_abi = Abi.from_path( path=os.path.join(SAMPLES_DIR, 'DebotPairB.abi.json')) with open(os.path.join(SAMPLES_DIR, 'DebotPairB.tvc'), 'rb') as fp: debot_b_tvc = base64.b64encode(fp.read()).decode() # Deploy debot B call_set = CallSet(function_name='constructor') deploy_set = DeploySet(tvc=debot_b_tvc) encode_params = ParamsOfEncodeMessage( abi=debot_b_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message = async_custom_client.abi.encode_message(params=encode_params) b_address = message.address self.__check_address(address=b_address) process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) debot_b = async_custom_client.processing.process_message( params=process_params) b_address = debot_b.transaction['account_addr'] # Set ABI call_set = CallSet( function_name='setAbi', input={'debotAbi': debot_b_abi.value.encode().hex()}) async_custom_client.processing.process_message( params=ParamsOfProcessMessage( message_encode_params=ParamsOfEncodeMessage( abi=debot_b_abi, signer=signer, address=b_address, call_set=call_set), send_events=False)) # Deploy debot A call_set = CallSet( function_name='constructor', input={ 'targetAddr': b_address }) deploy_set = DeploySet(tvc=debot_a_tvc) encode_params = ParamsOfEncodeMessage( abi=debot_a_abi, signer=signer, deploy_set=deploy_set, call_set=call_set) message = async_custom_client.abi.encode_message(params=encode_params) a_address = message.address self.__check_address(address=a_address) process_params = ParamsOfProcessMessage( message_encode_params=encode_params, send_events=False) debot_a = async_custom_client.processing.process_message( params=process_params) a_address = debot_a.transaction['account_addr'] # Set ABI call_set = CallSet( function_name='setAbi', input={'debotAbi': debot_a_abi.value.encode().hex()}) async_custom_client.processing.process_message( params=ParamsOfProcessMessage( message_encode_params=ParamsOfEncodeMessage( abi=debot_a_abi, signer=signer, address=a_address, call_set=call_set), send_events=False)) return a_address, b_address