importjsonimportosimporturllib.requestNODE_URL=os.getenv('NODE_URL','https://reference.symboltest.net:3001')print(f'Using node {NODE_URL}')defget_account_info(account_identifier):""" Fetch account information by address or public key. Args: account_identifier: The account address or public key Returns: Dictionary containing the account information """account_path=f'/accounts/{account_identifier}'try:account_url=f'{NODE_URL}{account_path}'withurllib.request.urlopen(account_url)asresponse:account_info=json.loads(response.read().decode())returnaccount_info['account']excepturllib.error.HTTPErroraserr:iferr.status==404:print(f'Address does not exist: {err}')eliferr.status==409:print(f'Address is not properly formatted: {err}')else:print(f'Unexpected error: {err}')raiseSystemExit(1)fromerrdefget_mosaic_names(mosaic_ids):""" Fetch friendly names for a set of mosaics. Args: mosaic_ids: List of mosaic IDs as integers Returns: Dictionary mapping mosaic IDs to their namespace names """mosaic_ids_hex=[f'{mosaic_id:016X}'formosaic_idinmosaic_ids]request_body=json.dumps({'mosaicIds':mosaic_ids_hex}).encode()request=urllib.request.Request(f'{NODE_URL}/namespaces/mosaic/names',data=request_body,headers={'Content-Type':'application/json'})withurllib.request.urlopen(request)asresponse:names_info=json.loads(response.read().decode())# Build a dictionary mapping mosaic IDs to their namesnames_map={}forentryinnames_info['mosaicNames']:entry_id=int(entry['mosaicId'],16)names_map[entry_id]=entry['names']returnnames_mapdefget_mosaics_info(mosaic_ids):""" Fetch information for multiple mosaics in a single request. Args: mosaic_ids: List of mosaic IDs as integers Returns: Dictionary mapping mosaic IDs to their properties """mosaic_ids_hex=[f'{mosaic_id:016X}'formosaic_idinmosaic_ids]request_body=json.dumps({'mosaicIds':mosaic_ids_hex}).encode()request=urllib.request.Request(f'{NODE_URL}/mosaics',data=request_body,headers={'Content-Type':'application/json'})withurllib.request.urlopen(request)asresponse:mosaics_info=json.loads(response.read().decode())# Build a dictionary mapping mosaic IDs to their propertiesmosaics_map={}forentryinmosaics_info:entry_id=int(entry['mosaic']['id'],16)mosaics_map[entry_id]=entry['mosaic']returnmosaics_mapdefformat_amount(amount,divisibility):""" Format an atomic amount with decimal places. Args: amount: The atomic amount as an integer divisibility: Number of decimal places Returns: Formatted amount as a string """ifdivisibility==0:returnstr(amount)whole_part=amount//(10**divisibility)fractional_part=amount%(10**divisibility)returnf'{whole_part}.{fractional_part:0{divisibility}d}'# The account address to queryADDRESS=os.getenv('ADDRESS','TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ')print(f'Fetching account information from {ADDRESS}')try:# Get account informationaccount=get_account_info(ADDRESS)# Display balances for all mosaics the account holdsaccount_mosaics=account['mosaics']ifnotaccount_mosaics:print('Account holds no mosaics')else:print(f'Account holds {len(account_mosaics)} mosaic(s):')# Fetch mosaic properties and names for all mosaicsacc_mosaic_ids=[int(m['id'],16)forminaccount_mosaics]acc_mosaic_names=get_mosaic_names(acc_mosaic_ids)acc_mosaics_info=get_mosaics_info(acc_mosaic_ids)formosaic_entryinaccount_mosaics:mosaic_id=int(mosaic_entry['id'],16)balance=int(mosaic_entry['amount'])# Get mosaic propertiesinfo=acc_mosaics_info[mosaic_id]mosaic_divisibility=info['divisibility']# Format and display the balanceformatted_balance=format_amount(balance,mosaic_divisibility)mosaic_id_hex=f'0x{mosaic_id:016X}'# Display mosaic ID and names (if available)names=acc_mosaic_names.get(mosaic_id,[])ifnames:names_str=', '.join(names)print(f'- Mosaic {mosaic_id_hex} ({names_str})')else:print(f'- Mosaic {mosaic_id_hex}')print(f' Balance: {formatted_balance}')print(f' Balance (atomic): {balance}')print(f' Divisibility: {mosaic_divisibility}')excepturllib.error.URLErrorase:print(e.reason)
constNODE_URL=process.env.NODE_URL||'https://reference.symboltest.net:3001';console.log('Using node',NODE_URL);/** * Fetch account information by address or public key. * @param {string} accountIdentifier - Account address or public key * @returns {Promise<object>} The account information */asyncfunctiongetAccountInfo(accountIdentifier){constaccountPath=`/accounts/${accountIdentifier}`;constaccountResponse=awaitfetch(`${NODE_URL}${accountPath}`);if(!accountResponse.ok){if(404===accountResponse.status){console.error('Address does not exist:',accountResponse.statusText);}elseif(409===accountResponse.status){console.error('Address is not properly formatted:',accountResponse.statusText);}else{console.error('Unexpected error:',accountResponse.statusText);}process.exit(1);}constaccountInfo=awaitaccountResponse.json();returnaccountInfo.account;}/** * Fetch friendly names for a set of mosaics. * @param {bigint[]} mosaicIds - Array of mosaic IDs * @returns {Promise<Map>} Map of mosaic IDs to their namespace names */asyncfunctiongetMosaicNames(mosaicIds){constmosaicIdsHex=mosaicIds.map(id=>id.toString(16).toUpperCase().padStart(16,'0'));constresponse=awaitfetch(`${NODE_URL}/namespaces/mosaic/names`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mosaicIds:mosaicIdsHex})});constnamesInfo=awaitresponse.json();// Build a map from mosaic IDs to their namesconstnamesMap=newMap();for(constentryofnamesInfo.mosaicNames){constmosaicId=BigInt(`0x${entry.mosaicId}`);namesMap.set(mosaicId,entry.names);}returnnamesMap;}/** * Fetch information for multiple mosaics in a single request. * @param {bigint[]} mosaicIds - Array of mosaic IDs * @returns {Promise<Map>} Map of mosaic IDs to their properties */asyncfunctiongetMosaicsInfo(mosaicIds){constmosaicIdsHex=mosaicIds.map(id=>id.toString(16).toUpperCase().padStart(16,'0'));constresponse=awaitfetch(`${NODE_URL}/mosaics`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mosaicIds:mosaicIdsHex})});constmosaicsInfo=awaitresponse.json();// Build a map from mosaic IDs to their propertiesconstmosaicsMap=newMap();for(constentryofmosaicsInfo){constmosaicId=BigInt(`0x${entry.mosaic.id}`);mosaicsMap.set(mosaicId,entry.mosaic);}returnmosaicsMap;}/** * Format an atomic amount with decimal places. * @param {bigint} amount - The atomic amount * @param {number} divisibility - Number of decimal places * @returns {string} The formatted amount */functionformatAmount(amount,divisibility){if(0===divisibility)returnamount.toString();constdivisor=10n**BigInt(divisibility);constwholePart=amount/divisor;constfractionalPart=amount%divisor;constfractionalStr=fractionalPart.toString().padStart(divisibility,'0');return`${wholePart}.${fractionalStr}`;}// The account address to queryconstADDRESS=process.env.ADDRESS||'TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ';console.log('Fetching account information from',ADDRESS);try{// Get account informationconstaccount=awaitgetAccountInfo(ADDRESS);// Display balances for all mosaics the account holdsconstaccountMosaics=account.mosaics;if(0===accountMosaics.length){console.log('Account holds no mosaics');}else{console.log(`Account holds ${accountMosaics.length} mosaic(s):`);// Fetch mosaic properties and names for all mosaicsconstmosaicIds=accountMosaics.map(m=>BigInt(`0x${m.id}`));constmosaicNames=awaitgetMosaicNames(mosaicIds);constmosaicsInfo=awaitgetMosaicsInfo(mosaicIds);for(constmosaicEntryofaccountMosaics){constmosaicId=BigInt(`0x${mosaicEntry.id}`);constbalance=BigInt(mosaicEntry.amount);// Get mosaic propertiesconstinfo=mosaicsInfo.get(mosaicId);constdivisibility=info.divisibility;// Format and display the balanceconstformattedBalance=formatAmount(balance,divisibility);constmosaicIdHex=`0x${mosaicId.toString(16).toUpperCase().padStart(16,'0')}`;// Display mosaic ID and names (if available)constnames=mosaicNames.get(mosaicId)||[];if(0<names.length){console.log(`- Mosaic ${mosaicIdHex} (${names.join(', ')})`);}else{console.log(`- Mosaic ${mosaicIdHex}`);}console.log(` Balance: ${formattedBalance}`);console.log(` Balance (atomic): ${balance.toString()}`);console.log(` Divisibility: ${divisibility}`);}}}catch(e){console.error(e.message,'| Cause:',e.cause?.code??'unknown');}
//JAVA 21+//DEPS org.symbol:symbol-sdk:3.3.1importjava.io.IOException;importjava.math.BigInteger;importjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.net.http.HttpResponse.BodyHandlers;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.node.ArrayNode;importcom.fasterxml.jackson.databind.node.ObjectNode;finalclassQueryBalance{privatestaticfinalObjectMapperJSON_MAPPER=newObjectMapper();privatestaticfinalStringNODE_URL=System.getenv().getOrDefault("NODE_URL","https://reference.symboltest.net:3001");/** * Fetch account information by address or public key. */privatestaticJsonNodegetAccountInfo(finalStringaccountIdentifier)throwsIOException,InterruptedException{finalStringaccountPath=String.format("/accounts/%s",accountIdentifier);finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+accountPath)).GET().build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());if(200!=response.statusCode()){if(404==response.statusCode())System.out.printf("Address does not exist: %s%n",response.body());elseif(409==response.statusCode())System.out.printf("Address is not properly formatted: %s%n",response.body());elseSystem.out.printf("Unexpected error: %s%n",response.body());System.exit(1);}returnJSON_MAPPER.readTree(response.body()).get("account");}/** * Fetch friendly names for a set of mosaics. */privatestaticMap<BigInteger,List<String>>getMosaicNames(finalList<BigInteger>mosaicIds)throwsIOException,InterruptedException{finalObjectNoderequestBody=JSON_MAPPER.createObjectNode();finalArrayNodemosaicIdsHex=requestBody.putArray("mosaicIds");for(finalBigIntegermosaicId:mosaicIds)mosaicIdsHex.add(String.format("%016X",mosaicId));finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+"/namespaces/mosaic/names")).header("Content-Type","application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody.toString())).build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());finalJsonNodenamesInfo=JSON_MAPPER.readTree(response.body());// Build a map from mosaic IDs to their namesfinalMap<BigInteger,List<String>>namesMap=newHashMap<>();for(finalJsonNodeentry:namesInfo.get("mosaicNames")){finalBigIntegermosaicId=newBigInteger(entry.get("mosaicId").asText(),16);finalList<String>names=newArrayList<>();for(finalJsonNodename:entry.get("names"))names.add(name.asText());namesMap.put(mosaicId,names);}returnnamesMap;}/** * Fetch information for multiple mosaics in a single request. */privatestaticMap<BigInteger,JsonNode>getMosaicsInfo(finalList<BigInteger>mosaicIds)throwsIOException,InterruptedException{finalObjectNoderequestBody=JSON_MAPPER.createObjectNode();finalArrayNodemosaicIdsHex=requestBody.putArray("mosaicIds");for(finalBigIntegermosaicId:mosaicIds)mosaicIdsHex.add(String.format("%016X",mosaicId));finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+"/mosaics")).header("Content-Type","application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody.toString())).build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());finalJsonNodemosaicsInfo=JSON_MAPPER.readTree(response.body());// Build a map from mosaic IDs to their propertiesfinalMap<BigInteger,JsonNode>mosaicsMap=newHashMap<>();for(finalJsonNodeentry:mosaicsInfo){finalJsonNodemosaic=entry.get("mosaic");finalBigIntegermosaicId=newBigInteger(mosaic.get("id").asText(),16);mosaicsMap.put(mosaicId,mosaic);}returnmosaicsMap;}/** * Format an atomic amount with decimal places. */privatestaticStringformatAmount(finalBigIntegeramount,finalintdivisibility){if(0==divisibility)returnamount.toString();finalBigIntegerdivisor=BigInteger.TEN.pow(divisibility);finalBigInteger[]parts=amount.divideAndRemainder(divisor);returnString.format("%s.%0"+divisibility+"d",parts[0],parts[1]);}publicstaticvoidmain(finalString[]args){newQueryBalance().run();}privatevoidrun(){System.out.printf("Using node %s%n",NODE_URL);// The account address to queryfinalStringaddress=System.getenv().getOrDefault("ADDRESS","TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ");System.out.printf("Fetching account information from %s%n",address);try{// Get account informationfinalJsonNodeaccount=getAccountInfo(address);// Display balances for all mosaics the account holdsfinalJsonNodeaccountMosaics=account.get("mosaics");if(accountMosaics.isEmpty()){System.out.println("Account holds no mosaics");}else{System.out.printf("Account holds %d mosaic(s):%n",accountMosaics.size());// Fetch mosaic properties and names for all mosaicsfinalList<BigInteger>mosaicIds=newArrayList<>();for(finalJsonNodemosaicEntry:accountMosaics)mosaicIds.add(newBigInteger(mosaicEntry.get("id").asText(),16));finalMap<BigInteger,List<String>>mosaicNames=getMosaicNames(mosaicIds);finalMap<BigInteger,JsonNode>mosaicsInfo=getMosaicsInfo(mosaicIds);for(finalJsonNodemosaicEntry:accountMosaics){finalBigIntegermosaicId=newBigInteger(mosaicEntry.get("id").asText(),16);finalBigIntegerbalance=newBigInteger(mosaicEntry.get("amount").asText());// Get mosaic propertiesfinalJsonNodeinfo=mosaicsInfo.get(mosaicId);finalintdivisibility=info.get("divisibility").asInt();// Format and display the balancefinalStringformattedBalance=formatAmount(balance,divisibility);finalStringmosaicIdHex=String.format("0x%016X",mosaicId);// Display mosaic ID and names (if available)finalList<String>names=mosaicNames.getOrDefault(mosaicId,List.of());if(names.isEmpty())System.out.printf("- Mosaic %s%n",mosaicIdHex);elseSystem.out.printf("- Mosaic %s (%s)%n",mosaicIdHex,String.join(", ",names));System.out.printf(" Balance: %s%n",formattedBalance);System.out.printf(" Balance (atomic): %s%n",balance);System.out.printf(" Divisibility: %d%n",divisibility);}}}catch(finalExceptionex){System.out.println(ex.getMessage());}}}
defget_account_info(account_identifier):""" Fetch account information by address or public key. Args: account_identifier: The account address or public key Returns: Dictionary containing the account information """account_path=f'/accounts/{account_identifier}'try:account_url=f'{NODE_URL}{account_path}'withurllib.request.urlopen(account_url)asresponse:account_info=json.loads(response.read().decode())returnaccount_info['account']excepturllib.error.HTTPErroraserr:iferr.status==404:print(f'Address does not exist: {err}')eliferr.status==409:print(f'Address is not properly formatted: {err}')else:print(f'Unexpected error: {err}')raiseSystemExit(1)fromerr
/** * Fetch account information by address or public key. * @param {string} accountIdentifier - Account address or public key * @returns {Promise<object>} The account information */asyncfunctiongetAccountInfo(accountIdentifier){constaccountPath=`/accounts/${accountIdentifier}`;constaccountResponse=awaitfetch(`${NODE_URL}${accountPath}`);if(!accountResponse.ok){if(404===accountResponse.status){console.error('Address does not exist:',accountResponse.statusText);}elseif(409===accountResponse.status){console.error('Address is not properly formatted:',accountResponse.statusText);}else{console.error('Unexpected error:',accountResponse.statusText);}process.exit(1);}constaccountInfo=awaitaccountResponse.json();returnaccountInfo.account;}
/** * Fetch account information by address or public key. */privatestaticJsonNodegetAccountInfo(finalStringaccountIdentifier)throwsIOException,InterruptedException{finalStringaccountPath=String.format("/accounts/%s",accountIdentifier);finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+accountPath)).GET().build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());if(200!=response.statusCode()){if(404==response.statusCode())System.out.printf("Address does not exist: %s%n",response.body());elseif(409==response.statusCode())System.out.printf("Address is not properly formatted: %s%n",response.body());elseSystem.out.printf("Unexpected error: %s%n",response.body());System.exit(1);}returnJSON_MAPPER.readTree(response.body()).get("account");}
defget_mosaic_names(mosaic_ids):""" Fetch friendly names for a set of mosaics. Args: mosaic_ids: List of mosaic IDs as integers Returns: Dictionary mapping mosaic IDs to their namespace names """mosaic_ids_hex=[f'{mosaic_id:016X}'formosaic_idinmosaic_ids]request_body=json.dumps({'mosaicIds':mosaic_ids_hex}).encode()request=urllib.request.Request(f'{NODE_URL}/namespaces/mosaic/names',data=request_body,headers={'Content-Type':'application/json'})withurllib.request.urlopen(request)asresponse:names_info=json.loads(response.read().decode())# Build a dictionary mapping mosaic IDs to their namesnames_map={}forentryinnames_info['mosaicNames']:entry_id=int(entry['mosaicId'],16)names_map[entry_id]=entry['names']returnnames_map
/** * Fetch friendly names for a set of mosaics. * @param {bigint[]} mosaicIds - Array of mosaic IDs * @returns {Promise<Map>} Map of mosaic IDs to their namespace names */asyncfunctiongetMosaicNames(mosaicIds){constmosaicIdsHex=mosaicIds.map(id=>id.toString(16).toUpperCase().padStart(16,'0'));constresponse=awaitfetch(`${NODE_URL}/namespaces/mosaic/names`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mosaicIds:mosaicIdsHex})});constnamesInfo=awaitresponse.json();// Build a map from mosaic IDs to their namesconstnamesMap=newMap();for(constentryofnamesInfo.mosaicNames){constmosaicId=BigInt(`0x${entry.mosaicId}`);namesMap.set(mosaicId,entry.names);}returnnamesMap;}
/** * Fetch friendly names for a set of mosaics. */privatestaticMap<BigInteger,List<String>>getMosaicNames(finalList<BigInteger>mosaicIds)throwsIOException,InterruptedException{finalObjectNoderequestBody=JSON_MAPPER.createObjectNode();finalArrayNodemosaicIdsHex=requestBody.putArray("mosaicIds");for(finalBigIntegermosaicId:mosaicIds)mosaicIdsHex.add(String.format("%016X",mosaicId));finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+"/namespaces/mosaic/names")).header("Content-Type","application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody.toString())).build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());finalJsonNodenamesInfo=JSON_MAPPER.readTree(response.body());// Build a map from mosaic IDs to their namesfinalMap<BigInteger,List<String>>namesMap=newHashMap<>();for(finalJsonNodeentry:namesInfo.get("mosaicNames")){finalBigIntegermosaicId=newBigInteger(entry.get("mosaicId").asText(),16);finalList<String>names=newArrayList<>();for(finalJsonNodename:entry.get("names"))names.add(name.asText());namesMap.put(mosaicId,names);}returnnamesMap;}
モザイクは64ビットの数値である モザイク ID によって識別されますが、これは読みにくく覚えにくい場合があります。
利便性を高めるために、モザイクを人間が読み取り可能な ネームスペース エイリアスにリンクさせることができます。
defget_mosaics_info(mosaic_ids):""" Fetch information for multiple mosaics in a single request. Args: mosaic_ids: List of mosaic IDs as integers Returns: Dictionary mapping mosaic IDs to their properties """mosaic_ids_hex=[f'{mosaic_id:016X}'formosaic_idinmosaic_ids]request_body=json.dumps({'mosaicIds':mosaic_ids_hex}).encode()request=urllib.request.Request(f'{NODE_URL}/mosaics',data=request_body,headers={'Content-Type':'application/json'})withurllib.request.urlopen(request)asresponse:mosaics_info=json.loads(response.read().decode())# Build a dictionary mapping mosaic IDs to their propertiesmosaics_map={}forentryinmosaics_info:entry_id=int(entry['mosaic']['id'],16)mosaics_map[entry_id]=entry['mosaic']returnmosaics_map
/** * Fetch information for multiple mosaics in a single request. * @param {bigint[]} mosaicIds - Array of mosaic IDs * @returns {Promise<Map>} Map of mosaic IDs to their properties */asyncfunctiongetMosaicsInfo(mosaicIds){constmosaicIdsHex=mosaicIds.map(id=>id.toString(16).toUpperCase().padStart(16,'0'));constresponse=awaitfetch(`${NODE_URL}/mosaics`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mosaicIds:mosaicIdsHex})});constmosaicsInfo=awaitresponse.json();// Build a map from mosaic IDs to their propertiesconstmosaicsMap=newMap();for(constentryofmosaicsInfo){constmosaicId=BigInt(`0x${entry.mosaic.id}`);mosaicsMap.set(mosaicId,entry.mosaic);}returnmosaicsMap;}
/** * Fetch information for multiple mosaics in a single request. */privatestaticMap<BigInteger,JsonNode>getMosaicsInfo(finalList<BigInteger>mosaicIds)throwsIOException,InterruptedException{finalObjectNoderequestBody=JSON_MAPPER.createObjectNode();finalArrayNodemosaicIdsHex=requestBody.putArray("mosaicIds");for(finalBigIntegermosaicId:mosaicIds)mosaicIdsHex.add(String.format("%016X",mosaicId));finalHttpRequestrequest=HttpRequest.newBuilder(URI.create(NODE_URL+"/mosaics")).header("Content-Type","application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody.toString())).build();finalHttpResponse<String>response=HttpClient.newHttpClient().send(request,BodyHandlers.ofString());finalJsonNodemosaicsInfo=JSON_MAPPER.readTree(response.body());// Build a map from mosaic IDs to their propertiesfinalMap<BigInteger,JsonNode>mosaicsMap=newHashMap<>();for(finalJsonNodeentry:mosaicsInfo){finalJsonNodemosaic=entry.get("mosaic");finalBigIntegermosaicId=newBigInteger(mosaic.get("id").asText(),16);mosaicsMap.put(mosaicId,mosaic);}returnmosaicsMap;}
defformat_amount(amount,divisibility):""" Format an atomic amount with decimal places. Args: amount: The atomic amount as an integer divisibility: Number of decimal places Returns: Formatted amount as a string """ifdivisibility==0:returnstr(amount)whole_part=amount//(10**divisibility)fractional_part=amount%(10**divisibility)returnf'{whole_part}.{fractional_part:0{divisibility}d}'
/** * Format an atomic amount with decimal places. * @param {bigint} amount - The atomic amount * @param {number} divisibility - Number of decimal places * @returns {string} The formatted amount */functionformatAmount(amount,divisibility){if(0===divisibility)returnamount.toString();constdivisor=10n**BigInt(divisibility);constwholePart=amount/divisor;constfractionalPart=amount%divisor;constfractionalStr=fractionalPart.toString().padStart(divisibility,'0');return`${wholePart}.${fractionalStr}`;}
/** * Format an atomic amount with decimal places. */privatestaticStringformatAmount(finalBigIntegeramount,finalintdivisibility){if(0==divisibility)returnamount.toString();finalBigIntegerdivisor=BigInteger.TEN.pow(divisibility);finalBigInteger[]parts=amount.divideAndRemainder(divisor);returnString.format("%s.%0"+divisibility+"d",parts[0],parts[1]);}
# The account address to queryADDRESS=os.getenv('ADDRESS','TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ')print(f'Fetching account information from {ADDRESS}')try:# Get account informationaccount=get_account_info(ADDRESS)# Display balances for all mosaics the account holdsaccount_mosaics=account['mosaics']ifnotaccount_mosaics:print('Account holds no mosaics')else:print(f'Account holds {len(account_mosaics)} mosaic(s):')# Fetch mosaic properties and names for all mosaicsacc_mosaic_ids=[int(m['id'],16)forminaccount_mosaics]acc_mosaic_names=get_mosaic_names(acc_mosaic_ids)acc_mosaics_info=get_mosaics_info(acc_mosaic_ids)formosaic_entryinaccount_mosaics:mosaic_id=int(mosaic_entry['id'],16)balance=int(mosaic_entry['amount'])# Get mosaic propertiesinfo=acc_mosaics_info[mosaic_id]mosaic_divisibility=info['divisibility']# Format and display the balanceformatted_balance=format_amount(balance,mosaic_divisibility)mosaic_id_hex=f'0x{mosaic_id:016X}'# Display mosaic ID and names (if available)names=acc_mosaic_names.get(mosaic_id,[])ifnames:names_str=', '.join(names)print(f'- Mosaic {mosaic_id_hex} ({names_str})')else:print(f'- Mosaic {mosaic_id_hex}')print(f' Balance: {formatted_balance}')print(f' Balance (atomic): {balance}')print(f' Divisibility: {mosaic_divisibility}')excepturllib.error.URLErrorase:print(e.reason)
// The account address to queryconstADDRESS=process.env.ADDRESS||'TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ';console.log('Fetching account information from',ADDRESS);try{// Get account informationconstaccount=awaitgetAccountInfo(ADDRESS);// Display balances for all mosaics the account holdsconstaccountMosaics=account.mosaics;if(0===accountMosaics.length){console.log('Account holds no mosaics');}else{console.log(`Account holds ${accountMosaics.length} mosaic(s):`);// Fetch mosaic properties and names for all mosaicsconstmosaicIds=accountMosaics.map(m=>BigInt(`0x${m.id}`));constmosaicNames=awaitgetMosaicNames(mosaicIds);constmosaicsInfo=awaitgetMosaicsInfo(mosaicIds);for(constmosaicEntryofaccountMosaics){constmosaicId=BigInt(`0x${mosaicEntry.id}`);constbalance=BigInt(mosaicEntry.amount);// Get mosaic propertiesconstinfo=mosaicsInfo.get(mosaicId);constdivisibility=info.divisibility;// Format and display the balanceconstformattedBalance=formatAmount(balance,divisibility);constmosaicIdHex=`0x${mosaicId.toString(16).toUpperCase().padStart(16,'0')}`;// Display mosaic ID and names (if available)constnames=mosaicNames.get(mosaicId)||[];if(0<names.length){console.log(`- Mosaic ${mosaicIdHex} (${names.join(', ')})`);}else{console.log(`- Mosaic ${mosaicIdHex}`);}console.log(` Balance: ${formattedBalance}`);console.log(` Balance (atomic): ${balance.toString()}`);console.log(` Divisibility: ${divisibility}`);}}}catch(e){console.error(e.message,'| Cause:',e.cause?.code??'unknown');}
// The account address to queryfinalStringaddress=System.getenv().getOrDefault("ADDRESS","TBIL6D6RURP45YQRWV6Q7YVWIIPLQGLZQFHWFEQ");System.out.printf("Fetching account information from %s%n",address);try{// Get account informationfinalJsonNodeaccount=getAccountInfo(address);// Display balances for all mosaics the account holdsfinalJsonNodeaccountMosaics=account.get("mosaics");if(accountMosaics.isEmpty()){System.out.println("Account holds no mosaics");}else{System.out.printf("Account holds %d mosaic(s):%n",accountMosaics.size());// Fetch mosaic properties and names for all mosaicsfinalList<BigInteger>mosaicIds=newArrayList<>();for(finalJsonNodemosaicEntry:accountMosaics)mosaicIds.add(newBigInteger(mosaicEntry.get("id").asText(),16));finalMap<BigInteger,List<String>>mosaicNames=getMosaicNames(mosaicIds);finalMap<BigInteger,JsonNode>mosaicsInfo=getMosaicsInfo(mosaicIds);for(finalJsonNodemosaicEntry:accountMosaics){finalBigIntegermosaicId=newBigInteger(mosaicEntry.get("id").asText(),16);finalBigIntegerbalance=newBigInteger(mosaicEntry.get("amount").asText());// Get mosaic propertiesfinalJsonNodeinfo=mosaicsInfo.get(mosaicId);finalintdivisibility=info.get("divisibility").asInt();// Format and display the balancefinalStringformattedBalance=formatAmount(balance,divisibility);finalStringmosaicIdHex=String.format("0x%016X",mosaicId);// Display mosaic ID and names (if available)finalList<String>names=mosaicNames.getOrDefault(mosaicId,List.of());if(names.isEmpty())System.out.printf("- Mosaic %s%n",mosaicIdHex);elseSystem.out.printf("- Mosaic %s (%s)%n",mosaicIdHex,String.join(", ",names));System.out.printf(" Balance: %s%n",formattedBalance);System.out.printf(" Balance (atomic): %s%n",balance);System.out.printf(" Divisibility: %d%n",divisibility);}}}catch(finalExceptionex){System.out.println(ex.getMessage());}