Architecture JSON-RPC REST API GraphQL Oracle Indexer Integration

API Architecture

NovaMoney exposes 5 APIs running on 2 ports. The JSON-RPC port is fully compatible with MetaMask, ethers.js, and all standard Ethereum tooling. The second port hosts the REST, GraphQL, Oracle, and Indexer APIs for advanced querying and integration.

5
APIs
2
Ports
22+
RPC Methods
20+
REST Endpoints
7
GraphQL Queries
NovaMoney Node
MetaMask
Wallet
ethers.js / web3.js
Libraries
Web Apps
Frontend
Mobile Apps
Backend
Smart Contracts
Oracle reads
Port 8545
JSON-RPC (eth_*, net_*, web3_*)
Port 8546
REST API  /api/v1/...
GraphQL  /graphql
Oracle  /api/v1/oracle/...
Indexer  /api/v1/indexer/...

1. JSON-RPC API (Port 8545)

The standard Ethereum JSON-RPC interface. Allows wallets (MetaMask) and libraries (ethers.js, web3.js) to interact with the blockchain: send transactions, read balances, deploy contracts, and query blocks.

Base URL: https://rpc.novamoney.site

Available Methods

MethodDescriptionExample Usage
eth_blockNumberLatest block numberGet chain height
eth_chainIdNetwork ID (7575757)MetaMask identifies the network
eth_getBalanceAccount balanceShow NVM in wallet
eth_getTransactionCountAccount nonceSign transactions
eth_getCodeContract bytecodeVerify if address is contract
eth_sendRawTransactionSend signed transactionTransfer NVM, deploy contracts
eth_callRead-only executionRead ERC-20 balanceOf()
eth_estimateGasEstimate gasCalculate fee before sending
eth_getTransactionReceiptTransaction receiptVerify if tx succeeded
eth_getTransactionByHashTransaction detailsShow from, to, value, gas
eth_getBlockByNumberBlock by numberBlock explorer
eth_getBlockByHashBlock by hashLookup by hash
eth_gasPriceGas price (20 Gwei)Calculate fees
eth_getLogsContract logs/eventsdApps read Transfer, Approval events
eth_getStorageAtContract storageRead state variables
eth_accountsNode accounts (empty)MetaMask requirement
eth_miningValidating status (true)Node status
eth_syncingSync statusSync check
eth_maxPriorityFeePerGasPriority fee (1 Gwei)EIP-1559 gas estimation
eth_feeHistoryFee historyMetaMask gas estimation
net_versionNetwork IDIdentification
net_listeningAccepting connectionsStatus
net_peerCountPeer countDiagnostics
web3_clientVersionNode versionIdentification

Usage Examples

bash# Get latest block number curl -X POST https://rpc.novamoney.site \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # Response: # {"jsonrpc":"2.0","id":1,"result":"0x1a"} # Get account balance curl -X POST https://rpc.novamoney.site \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266","latest"],"id":2}' # Response: # {"jsonrpc":"2.0","id":2,"result":"0x152d3a4abc1994100000"}
javascriptconst { ethers } = require('ethers'); const provider = new ethers.JsonRpcProvider('https://rpc.novamoney.site'); // Read balance const balance = await provider.getBalance('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'); console.log('Balance:', ethers.formatEther(balance), 'NVM'); // Send transaction const wallet = new ethers.Wallet('your_private_key', provider); const tx = await wallet.sendTransaction({ to: '0xDestination...', value: ethers.parseEther('10.0'), }); const receipt = await tx.wait(); console.log('TX confirmed in block:', receipt.blockNumber);

2. REST API (Port 8546)

Classic HTTP API with friendly endpoints. Ideal for web backends, mobile apps, and any application that wants to read blockchain data without using JSON-RPC.

Base URL: https://api.novamoney.site/api/v1/

GET /api/v1/health
Node health status.
bashcurl https://api.novamoney.site/api/v1/health

Response

json{ "status": "ok", "node": "NovaMoney/v0.1.0", "timestamp": 1711054800 }
GET /api/v1/network
Network information.
bashcurl https://api.novamoney.site/api/v1/network

Response

json{ "success": true, "data": { "chain_id": 7575757, "chain_name": "NovaMoney", "currency": "NovaMoney", "symbol": "NVM", "max_supply": "210,000,000 NVM", "block_reward": "0.5 NVM", "max_validators": 100, "latest_block": 42, "gas_price_gwei": 20 } }
GET /api/v1/stats
Network statistics.
bashcurl https://api.novamoney.site/api/v1/stats

Response

json{ "success": true, "data": { "total_blocks": 42, "avg_block_time": 4.2, "avg_gas_per_block": 0 } }
GET /api/v1/blocks
List recent blocks (paginated).
bash# First 10 blocks curl https://api.novamoney.site/api/v1/blocks # Page 2, 20 per page curl "https://api.novamoney.site/api/v1/blocks?page=2&limit=20"

Response

json{ "success": true, "data": [ { "number": 42, "hash": "0xabc...", "parent_hash": "0xdef...", "validator": "0xf39f...", "timestamp": 1711054800, "gas_used": 21000, "gas_limit": 30000000, "transaction_count": 1, "transactions": ["0x123..."] } ] }
GET /api/v1/blocks/latest
Latest produced block.
bashcurl https://api.novamoney.site/api/v1/blocks/latest
GET /api/v1/blocks/:number
Block by number.
bashcurl https://api.novamoney.site/api/v1/blocks/42
GET /api/v1/accounts/:address
Account information.
bashcurl https://api.novamoney.site/api/v1/accounts/0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266

Response

json{ "success": true, "data": { "address": "0xf39f...", "balance": "100000000000000000000000", "balance_nvm": "100000 NVM", "nonce": 5, "is_contract": false } }
GET /api/v1/transactions/:hash
Transaction details.
bashcurl https://api.novamoney.site/api/v1/transactions/0x13fe754f...

Response

json{ "success": true, "data": { "hash": "0x13fe...", "from": "0x3c44...", "to": "0x1234...", "value": "0", "gas_used": 21000, "status": "success", "block_number": 4, "contract_address": null, "logs_count": 0 } }

Usage from JavaScript & Python

javascript// Get network info const response = await fetch('https://api.novamoney.site/api/v1/network'); const data = await response.json(); console.log(data.data.latest_block); // Get account balance const account = await fetch('https://api.novamoney.site/api/v1/accounts/0xf39f...'); const accountData = await account.json(); console.log(accountData.data.balance_nvm);
pythonimport requests # Network info r = requests.get('https://api.novamoney.site/api/v1/network') print(r.json()['data']['latest_block']) # Account balance r = requests.get('https://api.novamoney.site/api/v1/accounts/0xf39f...') print(r.json()['data']['balance_nvm'])

3. GraphQL API (Port 8546)

Allows complex queries to the blockchain, requesting exactly the fields you need. Includes an interactive playground (GraphiQL) in the browser.

Access Points

  • Playground: Open https://api.novamoney.site/graphql in browser
  • API: POST https://api.novamoney.site/graphql
  • Schema: GET https://api.novamoney.site/graphql/schema

Available Queries

POST network
Network information.
graphql{ network { chainId chainName symbol latestBlock maxSupply blockReward maxValidators } }
POST block(number: Int!)
Block by number.
graphql{ block(number: 42) { number hash validator timestamp gasUsed transactionCount } }
POST latestBlock
Latest block.
graphql{ latestBlock { number hash validator transactionCount } }
POST blocks(limit: Int, offset: Int)
List of blocks.
graphql{ blocks(limit: 5, offset: 0) { number hash validator timestamp transactionCount } }
POST account(address: String!)
Account information.
graphql{ account(address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") { address balance balanceNvm nonce isContract } }
POST transaction(hash: String!)
Transaction by hash.
graphql{ transaction(hash: "0x13fe754f...") { hash from to value gasUsed status blockNumber contractAddress logsCount } }
POST logs(fromBlock, toBlock, address, limit)
Search logs/events.
graphql{ logs(fromBlock: 0, toBlock: 100, address: "0xContract...", limit: 50) { address topics data blockNumber transactionHash logIndex } }

Combined Query (the power of GraphQL)

graphql{ network { latestBlock symbol } latestBlock { number hash transactionCount } account(address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") { balanceNvm nonce } }

Usage from JavaScript & Python

javascriptconst query = `{ network { latestBlock symbol } latestBlock { number hash transactionCount } }`; const response = await fetch('https://api.novamoney.site/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query }), }); const result = await response.json(); console.log(result.data);
pythonimport requests query = """ { network { latestBlock symbol } account(address: "0xf39f...") { balanceNvm nonce } } """ r = requests.post('https://api.novamoney.site/graphql', json={'query': query}) print(r.json()['data'])

4. Oracle API (Port 8546)

Price feed system that allows smart contracts to access external asset prices (NVM/USD, ETH/USD, BTC/USD). Authorized reporters publish prices, and anyone can query them.

Base URL: https://api.novamoney.site/api/v1/oracle/

Initial Price Feeds

PairInitial PriceDescription
NVM/USD$0.01NovaMoney price in USD
NVM/ETH0.000005NVM price in ETH
ETH/USD$2,000Ethereum price
BTC/USD$65,000Bitcoin price
GET /api/v1/oracle/pairs
List all available pairs.
bashcurl https://api.novamoney.site/api/v1/oracle/pairs

Response

json{ "success": true, "data": ["NVM/USD", "NVM/ETH", "ETH/USD", "BTC/USD"], "count": 4 }
GET /api/v1/oracle/prices
All current prices.
bashcurl https://api.novamoney.site/api/v1/oracle/prices

Response

json{ "success": true, "data": [ { "pair": "NVM/USD", "price": 0.01, "decimals": 8, "timestamp": 1711054800, "source": "genesis", "round_id": 1 } ] }
GET /api/v1/oracle/prices/:pair
Price for a specific pair. Use - instead of / in the URL (e.g., NVM-USD).
bash# Note: use - in the URL, automatically converted to / curl https://api.novamoney.site/api/v1/oracle/prices/NVM-USD

Response

json{ "success": true, "data": { "pair": "NVM/USD", "price": 0.01, "decimals": 8, "timestamp": 1711054800, "source": "genesis", "round_id": 1, "is_stale": false, "age_secs": 120 } }
GET /api/v1/oracle/prices/:pair/history
Price history for a pair.
bashcurl https://api.novamoney.site/api/v1/oracle/prices/NVM-USD/history
POST /api/v1/oracle/update
Update a price (authorized reporters only).
bashcurl -X POST https://api.novamoney.site/api/v1/oracle/update \ -H "Content-Type: application/json" \ -d '{ "pair": "NVM/USD", "price": 0.015, "reporter": "system" }'

Response

json{ "success": true, "data": { "pair": "NVM/USD", "price": 0.015, "decimals": 8, "timestamp": 1711054900, "source": "system", "round_id": 2 } }
GET /api/v1/oracle/config
Oracle configuration.
bashcurl https://api.novamoney.site/api/v1/oracle/config

Response

json{ "success": true, "data": { "authorized_reporters": ["system", "genesis"], "max_staleness_secs": 3600, "min_reporters": 1 } }

Adding a New Price Pair

bashcurl -X POST https://api.novamoney.site/api/v1/oracle/update \ -H "Content-Type: application/json" \ -d '{ "pair": "SOL/USD", "price": 150.0, "reporter": "system" }'

Price Bot Example (JavaScript)

javascript// Bot that updates prices every 60 seconds async function updatePrices() { // Get real price from external API (e.g., CoinGecko) const cgResponse = await fetch( 'https://api.coingecko.com/api/v3/simple/price?ids=ethereum,bitcoin&vs_currencies=usd' ); const prices = await cgResponse.json(); // Publish to NovaMoney oracle await fetch('https://api.novamoney.site/api/v1/oracle/update', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ pair: 'ETH/USD', price: prices.ethereum.usd, reporter: 'system', }), }); await fetch('https://api.novamoney.site/api/v1/oracle/update', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ pair: 'BTC/USD', price: prices.bitcoin.usd, reporter: 'system', }), }); console.log('Prices updated:', new Date().toISOString()); } // Run every 60 seconds setInterval(updatePrices, 60000); updatePrices();

5. Indexer API (Port 8546)

Automatically indexes all blocks, transactions, events, and contracts from the blockchain. Allows searching for contract events, viewing ERC-20 token transfers, listing deployed contracts, and seeing token holders. The indexer runs in the background every 2 seconds, automatically indexing new blocks.

Base URL: https://api.novamoney.site/api/v1/indexer/

GET /api/v1/indexer/stats
Indexer statistics.
bashcurl https://api.novamoney.site/api/v1/indexer/stats

Response

json{ "success": true, "data": { "indexed_blocks": 100, "indexed_events": 45, "indexed_contracts": 3, "indexed_transfers": 12, "last_indexed_block": 100 } }
GET /api/v1/indexer/events
Search events with filters.
bash# All recent events curl https://api.novamoney.site/api/v1/indexer/events # Events from a specific contract curl "https://api.novamoney.site/api/v1/indexer/events?address=0xContract..." # Events in a block range curl "https://api.novamoney.site/api/v1/indexer/events?from_block=10&to_block=50&limit=100" # Events by signature (topic0) curl "https://api.novamoney.site/api/v1/indexer/events?event=0xddf252ad..."

Response

json{ "success": true, "data": [ { "contract_address": "0x1234...", "event_signature": "0xddf252ad...", "topics": ["0xddf252ad...", "0x000...from", "0x000...to"], "data": "0x0000...amount", "block_number": 42, "transaction_hash": "0xabc...", "log_index": 0, "timestamp": 1711054800 } ], "total": 1 }
GET /api/v1/indexer/contracts
List all deployed contracts.
bashcurl https://api.novamoney.site/api/v1/indexer/contracts

Response

json{ "success": true, "data": [ { "address": "0x5678...", "creator": "0xf39f...", "creation_tx": "0xabc...", "creation_block": 5, "event_count": 12, "transaction_count": 1 } ], "total": 1 }
GET /api/v1/indexer/contracts/:address
Contract details.
bashcurl https://api.novamoney.site/api/v1/indexer/contracts/0x5678...
GET /api/v1/indexer/contracts/:address/events
Events from a specific contract.
bashcurl "https://api.novamoney.site/api/v1/indexer/contracts/0x5678.../events?limit=50"
GET /api/v1/indexer/transfers
Search ERC-20 transfers.
bash# All transfers curl https://api.novamoney.site/api/v1/indexer/transfers # Transfers of a specific token curl "https://api.novamoney.site/api/v1/indexer/transfers?token=0xToken..." # Transfers sent from an address curl "https://api.novamoney.site/api/v1/indexer/transfers?from=0xSender..." # Transfers received by an address curl "https://api.novamoney.site/api/v1/indexer/transfers?to=0xReceiver..."

Response

json{ "success": true, "data": [ { "token_address": "0x5678...", "from": "0xf39f...", "to": "0x1234...", "value": "0x0000...amount", "block_number": 42, "transaction_hash": "0xabc...", "timestamp": 1711054800 } ], "total": 1 }
GET /api/v1/indexer/tokens/:token/transfers
Transfers for a specific token.
bashcurl https://api.novamoney.site/api/v1/indexer/tokens/0x5678.../transfers
GET /api/v1/indexer/tokens/:token/holders
Token holders.
bashcurl https://api.novamoney.site/api/v1/indexer/tokens/0x5678.../holders

Response

json{ "success": true, "data": [ { "address": "0xf39f...", "balance": "0x56bc75e2d63100000" }, { "address": "0x1234...", "balance": "0xde0b6b3a7640000" } ], "total": 2 }
GET /api/v1/indexer/reindex
Force full re-indexation from block 0.
bashcurl https://api.novamoney.site/api/v1/indexer/reindex

Response

json{ "success": true, "message": "Reindexed 100 blocks: 45 events, 3 contracts, 12 transfers" }

Dashboard Example (JavaScript)

javascriptasync function dashboard() { // Indexer stats const stats = await (await fetch('https://api.novamoney.site/api/v1/indexer/stats')).json(); console.log(`Indexed: ${stats.data.indexed_blocks} blocks, ${stats.data.indexed_contracts} contracts`); // List contracts const contracts = await (await fetch('https://api.novamoney.site/api/v1/indexer/contracts')).json(); for (const c of contracts.data) { console.log(`Contract: ${c.address} by ${c.creator} (${c.event_count} events)`); // Holders for each token const holders = await (await fetch( `https://api.novamoney.site/api/v1/indexer/tokens/${c.address}/holders` )).json(); console.log(` Holders: ${holders.total}`); } // Latest transfers const transfers = await (await fetch( 'https://api.novamoney.site/api/v1/indexer/transfers?limit=5' )).json(); for (const t of transfers.data) { console.log(`Transfer: ${t.from} -> ${t.to} (${t.value})`); } } dashboard();

Integration Examples

Starting the Node with All APIs

bash./target/release/redcripto \ --datadir ./data \ --rpc-port 8545 \ --p2p-port 30303 \ --genesis genesis.json \ --validator-key YOUR_PRIVATE_KEY \ --block-time 4
cmdtarget\debug\redcripto.exe ^ --datadir data ^ --rpc-port 8545 ^ --p2p-port 30303 ^ --genesis genesis.json ^ --validator-key YOUR_PRIVATE_KEY ^ --block-time 4

On startup you will see:

outputJSON-RPC server listening on 0.0.0.0:8545 REST API listening on http://0.0.0.0:8546/api/v1/ GraphQL playground at http://0.0.0.0:8546/graphql Oracle API at http://0.0.0.0:8546/api/v1/oracle/ Indexer API at http://0.0.0.0:8546/api/v1/indexer/

MetaMask Configuration

Connect MetaMask to NovaMoney in a few simple steps:

  1. Open MetaMask
  2. Go to Settings > Networks > Add Network
  3. Set Network Name: NovaMoney Testnet
  4. Set RPC URL: https://rpc.novamoney.site
  5. Set Chain ID: 7575757
  6. Set Currency Symbol: NVM
  7. Save and select the network

API Summary

API Port Base URL Method Primary Use
JSON-RPC 8545 https://rpc.novamoney.site POST Wallets, ethers.js
REST 8546 https://api.novamoney.site/api/v1/ GET Web apps, mobile
GraphQL 8546 https://api.novamoney.site/graphql POST (GET for playground) Complex queries
Oracle 8546 https://api.novamoney.site/api/v1/oracle/ GET/POST Price feeds
Indexer 8546 https://api.novamoney.site/api/v1/indexer/ GET Events, tokens, holders