# The data model: blocks, transactions, transfers, and outputs ## Overview This section introduces the data model used in monero-javascript. Refer to the [API specification](https://moneroecosystem.org/monero-java/monero-spec.pdf) or [JSDocs](https://moneroecosystem.org/monero-javascript/MoneroTxWallet.html) for more information.


Blocks have transactions which can have incoming transfers, an outgoing transfer, and outputs.

## JSON The following JSON demonstrates the data model as a serialized transaction which sends funds to two accounts in the same wallet, so it has both an outgoing transfer and incoming transfers. ```json { "height": 582106, "timestamp": 1589742946, "txs": [ { "hash": "0b30d7b7510a1aed88c87464dffdcfe9d24feffc8798e30e887e3c9c3558a814", "isMinerTx": false, "fee": 268180000, "relay": true, "isRelayed": true, "isConfirmed": true, "numConfirmations": 238, "unlockTime": 0, "isDoubleSpendSeen": false, "isFailed": false, "isLocked": false, "isIncoming": true, "isOutgoing": true, "outgoingAmount": 100000, "incomingAmount": 100000, "inTxPool": false, "incomingTransfers": [ { "amount": 50000, "accountIndex": 1, "numSuggestedConfirmations": 1, "subaddressIndex": 0, "address": "73FUi8tkbeuBFSqhXzeMbd1WuMXJmdc3yeaGwx2f1NFaYzzypQ7a9scgn7JAtNagKPe4qCwE4S7wwB9ibJKv4RXnE8dtAva", "isIncoming": true }, { "amount": 50000, "accountIndex": 2, "numSuggestedConfirmations": 1, "subaddressIndex": 0, "address": "7AnBDQp5ZMEWvwMxzNthWhNEvLsvTkYwp6dxnDmC88hqcLwqaD2cYmESAtqqJ9myXE6PLz5oqrApnUtqTW69mWevCZJUhWV", "isIncoming": true } ], "outgoingTransfer": { "amount": 100000, "accountIndex": 0, "numSuggestedConfirmations": 1, "subaddressIndices": [ 0 ], "addresses": [ "55bcxMRhBWea6xxsot8moF1rdPprjJR2x4mfnNnTGgBJFgXa4gWXmWAYdUBKiRcJxy9AUAGJEg28DejvWdJU2VgUDrUvCHG" ], "destinations": [ { "address": "73FUi8tkbeuBFSqhXzeMbd1WuMXJmdc3yeaGwx2f1NFaYzzypQ7a9scgn7JAtNagKPe4qCwE4S7wwB9ibJKv4RXnE8dtAva", "amount": 50000 }, { "address": "7AnBDQp5ZMEWvwMxzNthWhNEvLsvTkYwp6dxnDmC88hqcLwqaD2cYmESAtqqJ9myXE6PLz5oqrApnUtqTW69mWevCZJUhWV", "amount": 50000 } ], "isIncoming": false }, "outputs": [ { "keyImage": { "hex": "4c19ea96bc3bb9d69c477a6cdb7a76650729edfff22a2017dc5e6ea7d94c6116" }, "amount": 509403744036, "index": 2657543, "accountIndex": 0, "subaddressIndex": 0, "isSpent": true, "isFrozen": false }, { "keyImage": { "hex": "2033769e0c1e1727bca816dbd175a4b086a2fd828f33af1a023e41920963e90f" }, "amount": 50000, "index": 2657544, "accountIndex": 1, "subaddressIndex": 0, "isSpent": false, "isFrozen": false }, { "keyImage": { "hex": "6df01e19842955a13fd8908753527fe2266e2c3ce393badfd053823aab57f8e7" }, "amount": 50000, "index": 2657542, "accountIndex": 2, "subaddressIndex": 0, "isSpent": false, "isFrozen": false } ] } ] } ``` The top level is a block which contains transactions. Transactions can have incoming transfers and an outgoing transfer. The outgoing transfer may have destination addresses and amounts (note: this information is only saved locally with the wallet file and is not stored on the blockchain). Transactions can also have outputs received by the wallet.