import{PrivateKey}from'symbol-sdk';import{Address,SymbolFacade,descriptors,generateNamespaceId,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);});constresponse=awaitfetch(`${NODE_URL}/transactionStatus/${transactionHash}`);if(!response.ok){if(404===response.status){console.log(' Transaction status: unknown');continue;}thrownewError(`HTTP ${response.status}`);}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}`);}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());try{// 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 subnamespace nameconstrootNamespaceName=process.env.ROOT_NAMESPACE||'ns_root';constsubnamespaceName=process.env.SUBNAMESPACE||`sub_${Date.now()}`;constfullNamespaceName=`${rootNamespaceName}.${subnamespaceName}`;console.log('Creating subnamespace:',fullNamespaceName);// Generate the parent namespace ID from the root nameconstparentId=generateNamespaceId(rootNamespaceName);constparentIdHex=parentId.toString(16).toUpperCase().padStart(16,'0');console.log('Parent namespace ID:',`0x${parentIdHex}`);// Build the transactionconsttransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.NamespaceRegistrationTransactionV1Descriptor(newmodels.NamespaceId(0n),models.NamespaceRegistrationType.CHILD,undefined,newmodels.NamespaceId(parentId),subnamespaceName),signerKeyPair.publicKey,feeMultiplier,2*60*60);// Sign transaction and generate final payloadconstsignature=facade.signTransaction(signerKeyPair,transaction);constjsonPayload=facade.transactionFactory.static.attachSignature(transaction,signature);console.log('Built transaction:');console.dir(transaction.toJson(),{colors:true});consttransactionHash=facade.hashTransaction(transaction).toString();console.log('Transaction hash:',transactionHash);// Announce transactionawaitannounceTransaction(jsonPayload,'namespace registration');// Wait for confirmationawaitwaitForConfirmation(transactionHash,'namespace registration');// Retrieve the namespaceconstnamespaceId=generateNamespaceId(subnamespaceName,parentId);constnamespaceIdHex=namespaceId.toString(16).toUpperCase().padStart(16,'0');console.log('Child namespace ID:',`${namespaceId} (0x${namespaceIdHex})`);constnamespacePath=`/namespaces/${namespaceIdHex}`;console.log('Fetching namespace information from',namespacePath);constnamespaceResponse=awaitfetch(`${NODE_URL}${namespacePath}`);constnamespaceJSON=awaitnamespaceResponse.json();constnamespaceInfo=namespaceJSON.namespace;console.log('Namespace information:');console.log(' Registration type:',namespaceInfo.registrationType);constownerAddress=Address.fromDecodedAddressHexString(namespaceInfo.ownerAddress);console.log(' Owner address:',ownerAddress.toString());console.log(' Parent ID:',namespaceInfo.parentId);console.log(' Depth:',namespaceInfo.depth);console.log(' Level 0:',namespaceInfo.level0);if(1<=namespaceInfo.depth)console.log(' Level 1:',namespaceInfo.level1);if(2<=namespaceInfo.depth&&namespaceInfo.level2)console.log(' Level 2:',namespaceInfo.level2);console.log(' Start height:',namespaceInfo.startHeight);console.log(' End height:',namespaceInfo.endHeight);}catch(e){console.error(e.message);}
# Build the subnamespace nameroot_namespace_name=os.getenv('ROOT_NAMESPACE','ns_root')subnamespace_name=os.getenv('SUBNAMESPACE',f'sub_{int(time.time())}')full_namespace_name=(f'{root_namespace_name}.{subnamespace_name}')print(f'Creating subnamespace: {full_namespace_name}')# Generate the parent namespace ID from the root namespace nameparent_id=generate_namespace_id(root_namespace_name)print(f' Parent namespace ID: 0x{parent_id:016X}')
// Build the subnamespace nameconstrootNamespaceName=process.env.ROOT_NAMESPACE||'ns_root';constsubnamespaceName=process.env.SUBNAMESPACE||`sub_${Date.now()}`;constfullNamespaceName=`${rootNamespaceName}.${subnamespaceName}`;console.log('Creating subnamespace:',fullNamespaceName);// Generate the parent namespace ID from the root nameconstparentId=generateNamespaceId(rootNamespaceName);constparentIdHex=parentId.toString(16).toUpperCase().padStart(16,'0');console.log('Parent namespace ID:',`0x${parentIdHex}`);
// Build the subnamespace namefinalStringrootNamespaceName=System.getenv().getOrDefault("ROOT_NAMESPACE","ns_root");finalStringsubnamespaceName=System.getenv().getOrDefault("SUBNAMESPACE","sub_"+System.currentTimeMillis());finalStringfullNamespaceName=rootNamespaceName+"."+subnamespaceName;System.out.printf("Creating subnamespace: %s%n",fullNamespaceName);// Generate the parent namespace ID from the root namefinallongparentId=IdGenerator.generateNamespaceId(rootNamespaceName);System.out.printf("Parent namespace ID: 0x%016X%n",parentId);
# Build the transactiontransaction=facade.create_transaction_from_descriptor({'type':'namespace_registration_transaction_v1','registration_type':'child','parent_id':parent_id,'name':subnamespace_name},signer_key_pair.public_key,fee_multiplier,2*60*60)
// Build the transactionconsttransaction=facade.createTransactionFromTypedDescriptor(newdescriptors.NamespaceRegistrationTransactionV1Descriptor(newmodels.NamespaceId(0n),models.NamespaceRegistrationType.CHILD,undefined,newmodels.NamespaceId(parentId),subnamespaceName),signerKeyPair.publicKey,feeMultiplier,2*60*60);
// Build the transactionfinalTransactiontransaction=facade.createTransactionFromTypedDescriptor(newNamespaceRegistrationTransactionV1Descriptor(newNamespaceId(0),NamespaceRegistrationType.CHILD,null,newNamespaceId(parentId),subnamespaceName.getBytes(StandardCharsets.UTF_8)),signerKeyPair.getPublicKey(),feeMultiplier,2*60*60);