importjsonimportosimporttimeimporturllib.requestfromsymbolchain.CryptoTypesimportPrivateKeyfromsymbolchain.facade.SymbolFacadeimportSymbolFacadefromsymbolchain.scimportAmountfromsymbolchain.symbol.IdGeneratorimport(generate_mosaic_alias_id,generate_namespace_path)fromsymbolchain.symbol.NetworkimportNetworkTimestampNODE_URL=os.getenv('NODE_URL','https://reference.symboltest.net:3001')print(f'Using node {NODE_URL}')# Helper function to announce a transactiondefannounce_transaction(payload,label):print(f'Announcing {label} to /transactions')request=urllib.request.Request(f'{NODE_URL}/transactions',data=payload.encode(),headers={'Content-Type':'application/json'},method='PUT')withurllib.request.urlopen(request)asannounce_response:print(f' Response: {announce_response.read().decode()}')# Helper function to wait for transaction confirmationdefwait_for_confirmation(tx_hash,label):print(f'Waiting for {label} confirmation...')forattemptinrange(60):time.sleep(1)try:url=f'{NODE_URL}/transactionStatus/{tx_hash}'withurllib.request.urlopen(url)asconfirm_response:status=json.loads(confirm_response.read().decode())print(f" Transaction status: {status['group']}")ifstatus['group']=='confirmed':print(f'{label} confirmed in {attempt} seconds')returnifstatus['group']=='failed':raiseRuntimeError(f"{label} failed: {status['code']}")excepturllib.error.HTTPError:print(' Transaction status: unknown')raiseTimeoutError(f'{label} not confirmed after 60 seconds')SIGNER_PRIVATE_KEY=os.getenv('SIGNER_PRIVATE_KEY','0000000000000000000000000000000000000000000000000000000000000000')signer_key_pair=SymbolFacade.KeyPair(PrivateKey(SIGNER_PRIVATE_KEY))facade=SymbolFacade('testnet')signer_address=facade.network.public_key_to_address(signer_key_pair.public_key)print(f'Signer address: {signer_address}')namespace_name=os.getenv('NAMESPACE_NAME','my_namespace')print(f'Namespace name: {namespace_name}')namespace_id=generate_namespace_path(namespace_name)[-1]print(f'Namespace ID: {namespace_id} ({hex(namespace_id)})')# Target mosaic ID to link the namespace tomosaic_id=int(os.getenv('MOSAIC_ID','0x45C8C3733983AAC2'),16)print(f'Mosaic ID: {mosaic_id} ({hex(mosaic_id)})')try:# Fetch current network timetime_path='/node/time'print(f'Fetching current network time from {time_path}')withurllib.request.urlopen(f'{NODE_URL}{time_path}')asresponse:response_json=json.loads(response.read().decode())receive_timestamp=(response_json['communicationTimestamps']['receiveTimestamp'])timestamp=NetworkTimestamp(int(receive_timestamp))print(f' Network time: {timestamp.timestamp} ms since nemesis')# Fetch recommended feesfee_path='/network/fees/transaction'print(f'Fetching recommended fees from {fee_path}')withurllib.request.urlopen(f'{NODE_URL}{fee_path}')asresponse:response_json=json.loads(response.read().decode())median_multiplier=response_json['medianFeeMultiplier']minimum_multiplier=response_json['minFeeMultiplier']fee_multiplier=max(median_multiplier,minimum_multiplier)print(f' Fee multiplier: {fee_multiplier}')# Build the alias transactiontransaction=facade.transaction_factory.create({'type':'mosaic_alias_transaction_v1','signer_public_key':signer_key_pair.public_key,'deadline':timestamp.add_hours(2).timestamp,'namespace_id':namespace_id,'mosaic_id':mosaic_id,'alias_action':'link'})transaction.fee=Amount(fee_multiplier*transaction.size)# Sign transaction and generate final payloadjson_payload=facade.transaction_factory.attach_signature(transaction,facade.sign_transaction(signer_key_pair,transaction))print('Mosaic alias transaction:')print(json.dumps(transaction.to_json(),indent=2))transaction_hash=facade.hash_transaction(transaction)print(f'Transaction hash: {transaction_hash}')# Announce and confirm transactionannounce_transaction(json_payload,'mosaic alias transaction')wait_for_confirmation(transaction_hash,'mosaic alias transaction')# Retrieve the namespace to verify the aliasnamespace_path=f'/namespaces/{namespace_id:x}'print(f'Fetching namespace information from {namespace_path}')withurllib.request.urlopen(f'{NODE_URL}{namespace_path}')asresponse:response_json=json.loads(response.read().decode())namespace_info=response_json['namespace']print('Alias information:')alias_type=namespace_info['alias']['type']print(f' Alias type: {alias_type}')ifalias_type==1:# MOSAIC typealiased_mosaic_id=namespace_info['alias']['mosaicId']print(f' Linked mosaic ID: {aliased_mosaic_id}')# Send a transfer using the alias instead of a raw mosaic IDprint(f'Using alias in transfer: {namespace_name}')# Convert namespace to mosaic alias IDmosaic_alias_id=generate_mosaic_alias_id(namespace_name)print(f'Mosaic ID (alias):'f' {mosaic_alias_id} ({hex(mosaic_alias_id)})')test_transaction=facade.transaction_factory.create({'type':'transfer_transaction_v1','signer_public_key':signer_key_pair.public_key,'deadline':timestamp.add_hours(2).timestamp,'recipient_address':facade.network.public_key_to_address(signer_key_pair.public_key),'mosaics':[{'mosaic_id':mosaic_alias_id,'amount':1}]})test_transaction.fee=Amount(fee_multiplier*test_transaction.size)test_json_payload=facade.transaction_factory.attach_signature(test_transaction,facade.sign_transaction(signer_key_pair,test_transaction))print('Test transaction:')print(json.dumps(test_transaction.to_json(),indent=2))test_transaction_hash=facade.hash_transaction(test_transaction)print(f'Transaction hash: {test_transaction_hash}')announce_transaction(test_json_payload,'test transaction')wait_for_confirmation(test_transaction_hash,'test transaction')exceptExceptionase:print(e)
import{PrivateKey}from'symbol-sdk';import{NetworkTimestamp,SymbolFacade,generateMosaicAliasId,generateNamespacePath,models}from'symbol-sdk/symbol';constNODE_URL=process.env.NODE_URL||'https://reference.symboltest.net:3001';console.log('Using node',NODE_URL);// Helper function to announce a transactionasyncfunctionannounceTransaction(payload,label){console.log(`Announcing ${label} to /transactions`);constresponse=awaitfetch(`${NODE_URL}/transactions`,{method:'PUT',headers:{'Content-Type':'application/json'},body:payload});console.log(' Response:',awaitresponse.text());}// Helper function to wait for transaction confirmationasyncfunctionwaitForConfirmation(transactionHash,label){console.log(`Waiting for ${label} confirmation...`);for(letattempt=0;60>attempt;attempt++){awaitnewPromise(resolve=>{setTimeout(resolve,1000);});try{constresponse=awaitfetch(`${NODE_URL}/transactionStatus/${transactionHash}`);conststatus=awaitresponse.json();console.log(' Transaction status:',status.group);if('confirmed'===status.group){console.log(`${label} confirmed in`,attempt,'seconds');return;}if('failed'===status.group)thrownewError(`${label} failed: ${status.code}`);}catch(e){if(e.message.includes('failed'))throwe;console.log(' Transaction status: unknown');}}thrownewError(`${label} not confirmed after 60 seconds`);}constSIGNER_PRIVATE_KEY=process.env.SIGNER_PRIVATE_KEY||'0000000000000000000000000000000000000000000000000000000000000000';constsignerKeyPair=newSymbolFacade.KeyPair(newPrivateKey(SIGNER_PRIVATE_KEY));constfacade=newSymbolFacade('testnet');constsignerAddress=facade.network.publicKeyToAddress(signerKeyPair.publicKey);console.log('Signer address:',signerAddress.toString());constnamespaceName=process.env.NAMESPACE_NAME||'my_namespace';console.log('Namespace name:',namespaceName);constnsPath=generateNamespacePath(namespaceName);constnamespaceId=nsPath[nsPath.length-1];console.log('Namespace ID:',`${namespaceId} (0x${namespaceId.toString(16)})`);// Target mosaic ID to link the namespace toconstmosaicId=BigInt(process.env.MOSAIC_ID||'0x45C8C3733983AAC2');console.log('Mosaic ID:',`${mosaicId} (0x${mosaicId.toString(16)})`);try{// Fetch current network timeconsttimePath='/node/time';console.log('Fetching current network time from',timePath);consttimeResponse=awaitfetch(`${NODE_URL}${timePath}`);consttimeJSON=awaittimeResponse.json();constreceiveTimestamp=timeJSON.communicationTimestamps.receiveTimestamp;consttimestamp=newNetworkTimestamp(receiveTimestamp);console.log(' Network time:',timestamp.timestamp,'ms since nemesis');// Fetch recommended feesconstfeePath='/network/fees/transaction';console.log('Fetching recommended fees from',feePath);constfeeResponse=awaitfetch(`${NODE_URL}${feePath}`);constfeeJSON=awaitfeeResponse.json();constmedianMultiplier=feeJSON.medianFeeMultiplier;constminimumMultiplier=feeJSON.minFeeMultiplier;constfeeMultiplier=Math.max(medianMultiplier,minimumMultiplier);console.log(' Fee multiplier:',feeMultiplier);// Build the alias transactionconsttransaction=facade.transactionFactory.create({type:'mosaic_alias_transaction_v1',signerPublicKey:signerKeyPair.publicKey.toString(),deadline:timestamp.addHours(2).timestamp,namespaceId,mosaicId,aliasAction:'link'});transaction.fee=newmodels.Amount(feeMultiplier*transaction.size);// Sign transaction and generate final payloadconstjsonPayload=facade.transactionFactory.static.attachSignature(transaction,facade.signTransaction(signerKeyPair,transaction));console.log('Built transaction:');console.dir(transaction.toJson(),{colors:true});consttransactionHash=facade.hashTransaction(transaction).toString();console.log('Transaction hash:',transactionHash);// Announce and confirm transactionawaitannounceTransaction(jsonPayload,'mosaic alias transaction');awaitwaitForConfirmation(transactionHash,'mosaic alias transaction');// Retrieve the namespace to verify the aliasconstnamespacePath=`/namespaces/${namespaceId.toString(16)}`;console.log('Fetching namespace information from',namespacePath);constnamespaceResponse=awaitfetch(`${NODE_URL}${namespacePath}`);constnamespaceJSON=awaitnamespaceResponse.json();constnamespaceInfo=namespaceJSON.namespace;console.log('Alias information:');console.log(' Alias type:',namespaceInfo.alias.type);if(1===namespaceInfo.alias.type){// MOSAIC typeconsole.log(' Linked mosaic ID:',namespaceInfo.alias.mosaicId);}// Send a transfer using the alias instead of a raw mosaic IDconsole.log('Using alias in transfer:',namespaceName);// Convert namespace to mosaic alias IDconstmosaicAliasId=generateMosaicAliasId(namespaceName);console.log(' Mosaic ID (alias):',`${mosaicAliasId} (0x${mosaicAliasId.toString(16)})`);consttest_transaction=facade.transactionFactory.create({type:'transfer_transaction_v1',signerPublicKey:signerKeyPair.publicKey.toString(),deadline:timestamp.addHours(2).timestamp,recipientAddress:facade.network.publicKeyToAddress(signerKeyPair.publicKey).toString(),mosaics:[{mosaicId:mosaicAliasId,amount:1n}]});test_transaction.fee=newmodels.Amount(feeMultiplier*test_transaction.size);consttestJsonPayload=facade.transactionFactory.static.attachSignature(test_transaction,facade.signTransaction(signerKeyPair,test_transaction));console.log('Test transaction:');console.dir(test_transaction.toJson(),{colors:true});consttestTransactionHash=facade.hashTransaction(test_transaction).toString();console.log('Transaction hash:',testTransactionHash);awaitannounceTransaction(testJsonPayload,'test transaction');awaitwaitForConfirmation(testTransactionHash,'test transaction');}catch(e){console.error(e.message);}
namespace_name=os.getenv('NAMESPACE_NAME','my_namespace')print(f'Namespace name: {namespace_name}')namespace_id=generate_namespace_path(namespace_name)[-1]print(f'Namespace ID: {namespace_id} ({hex(namespace_id)})')# Target mosaic ID to link the namespace tomosaic_id=int(os.getenv('MOSAIC_ID','0x45C8C3733983AAC2'),16)print(f'Mosaic ID: {mosaic_id} ({hex(mosaic_id)})')
constnamespaceName=process.env.NAMESPACE_NAME||'my_namespace';console.log('Namespace name:',namespaceName);constnsPath=generateNamespacePath(namespaceName);constnamespaceId=nsPath[nsPath.length-1];console.log('Namespace ID:',`${namespaceId} (0x${namespaceId.toString(16)})`);// Target mosaic ID to link the namespace toconstmosaicId=BigInt(process.env.MOSAIC_ID||'0x45C8C3733983AAC2');console.log('Mosaic ID:',`${mosaicId} (0x${mosaicId.toString(16)})`);
# Fetch current network timetime_path='/node/time'print(f'Fetching current network time from {time_path}')withurllib.request.urlopen(f'{NODE_URL}{time_path}')asresponse:response_json=json.loads(response.read().decode())receive_timestamp=(response_json['communicationTimestamps']['receiveTimestamp'])timestamp=NetworkTimestamp(int(receive_timestamp))print(f' Network time: {timestamp.timestamp} ms since nemesis')# Fetch recommended feesfee_path='/network/fees/transaction'print(f'Fetching recommended fees from {fee_path}')withurllib.request.urlopen(f'{NODE_URL}{fee_path}')asresponse:response_json=json.loads(response.read().decode())median_multiplier=response_json['medianFeeMultiplier']minimum_multiplier=response_json['minFeeMultiplier']fee_multiplier=max(median_multiplier,minimum_multiplier)print(f' Fee multiplier: {fee_multiplier}')
# Build the alias transactiontransaction=facade.transaction_factory.create({'type':'mosaic_alias_transaction_v1','signer_public_key':signer_key_pair.public_key,'deadline':timestamp.add_hours(2).timestamp,'namespace_id':namespace_id,'mosaic_id':mosaic_id,'alias_action':'link'})transaction.fee=Amount(fee_multiplier*transaction.size)
// Build the alias transactionconsttransaction=facade.transactionFactory.create({type:'mosaic_alias_transaction_v1',signerPublicKey:signerKeyPair.publicKey.toString(),deadline:timestamp.addHours(2).timestamp,namespaceId,mosaicId,aliasAction:'link'});transaction.fee=newmodels.Amount(feeMultiplier*transaction.size);
# Sign transaction and generate final payloadjson_payload=facade.transaction_factory.attach_signature(transaction,facade.sign_transaction(signer_key_pair,transaction))print('Mosaic alias transaction:')print(json.dumps(transaction.to_json(),indent=2))transaction_hash=facade.hash_transaction(transaction)print(f'Transaction hash: {transaction_hash}')# Announce and confirm transactionannounce_transaction(json_payload,'mosaic alias transaction')wait_for_confirmation(transaction_hash,'mosaic alias transaction')
// Sign transaction and generate final payloadconstjsonPayload=facade.transactionFactory.static.attachSignature(transaction,facade.signTransaction(signerKeyPair,transaction));console.log('Built transaction:');console.dir(transaction.toJson(),{colors:true});consttransactionHash=facade.hashTransaction(transaction).toString();console.log('Transaction hash:',transactionHash);// Announce and confirm transactionawaitannounceTransaction(jsonPayload,'mosaic alias transaction');awaitwaitForConfirmation(transactionHash,'mosaic alias transaction');
# Retrieve the namespace to verify the aliasnamespace_path=f'/namespaces/{namespace_id:x}'print(f'Fetching namespace information from {namespace_path}')withurllib.request.urlopen(f'{NODE_URL}{namespace_path}')asresponse:response_json=json.loads(response.read().decode())namespace_info=response_json['namespace']print('Alias information:')alias_type=namespace_info['alias']['type']print(f' Alias type: {alias_type}')ifalias_type==1:# MOSAIC typealiased_mosaic_id=namespace_info['alias']['mosaicId']print(f' Linked mosaic ID: {aliased_mosaic_id}')
// Retrieve the namespace to verify the aliasconstnamespacePath=`/namespaces/${namespaceId.toString(16)}`;console.log('Fetching namespace information from',namespacePath);constnamespaceResponse=awaitfetch(`${NODE_URL}${namespacePath}`);constnamespaceJSON=awaitnamespaceResponse.json();constnamespaceInfo=namespaceJSON.namespace;console.log('Alias information:');console.log(' Alias type:',namespaceInfo.alias.type);if(1===namespaceInfo.alias.type){// MOSAIC typeconsole.log(' Linked mosaic ID:',namespaceInfo.alias.mosaicId);}
# Send a transfer using the alias instead of a raw mosaic IDprint(f'Using alias in transfer: {namespace_name}')# Convert namespace to mosaic alias IDmosaic_alias_id=generate_mosaic_alias_id(namespace_name)print(f'Mosaic ID (alias):'f' {mosaic_alias_id} ({hex(mosaic_alias_id)})')test_transaction=facade.transaction_factory.create({'type':'transfer_transaction_v1','signer_public_key':signer_key_pair.public_key,'deadline':timestamp.add_hours(2).timestamp,'recipient_address':facade.network.public_key_to_address(signer_key_pair.public_key),'mosaics':[{'mosaic_id':mosaic_alias_id,'amount':1}]})test_transaction.fee=Amount(fee_multiplier*test_transaction.size)test_json_payload=facade.transaction_factory.attach_signature(test_transaction,facade.sign_transaction(signer_key_pair,test_transaction))print('Test transaction:')print(json.dumps(test_transaction.to_json(),indent=2))test_transaction_hash=facade.hash_transaction(test_transaction)print(f'Transaction hash: {test_transaction_hash}')announce_transaction(test_json_payload,'test transaction')wait_for_confirmation(test_transaction_hash,'test transaction')
// Send a transfer using the alias instead of a raw mosaic IDconsole.log('Using alias in transfer:',namespaceName);// Convert namespace to mosaic alias IDconstmosaicAliasId=generateMosaicAliasId(namespaceName);console.log(' Mosaic ID (alias):',`${mosaicAliasId} (0x${mosaicAliasId.toString(16)})`);consttest_transaction=facade.transactionFactory.create({type:'transfer_transaction_v1',signerPublicKey:signerKeyPair.publicKey.toString(),deadline:timestamp.addHours(2).timestamp,recipientAddress:facade.network.publicKeyToAddress(signerKeyPair.publicKey).toString(),mosaics:[{mosaicId:mosaicAliasId,amount:1n}]});test_transaction.fee=newmodels.Amount(feeMultiplier*test_transaction.size);consttestJsonPayload=facade.transactionFactory.static.attachSignature(test_transaction,facade.signTransaction(signerKeyPair,test_transaction));console.log('Test transaction:');console.dir(test_transaction.toJson(),{colors:true});consttestTransactionHash=facade.hashTransaction(test_transaction).toString();console.log('Transaction hash:',testTransactionHash);awaitannounceTransaction(testJsonPayload,'test transaction');awaitwaitForConfirmation(testTransactionHash,'test transaction');