Ecoer Logo

@leordev

46

Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!

steemit.com/@leordev
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS3.46%
Net Worth
3.593USD
STEEM
4.791STEEM
SBD
5.529SBD
Own SP
11.166SP

Detailed Balance

STEEM
balance
4.791STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
11.166SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
11.166SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
5.529SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "4.791 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "18183.813033 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "sbd_balance": "5.529 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

nameleordev
id524521
rank124,173
reputation217358042738
created2017-12-24T12:38:24
recovery_accountsteem
proxyNone
post_count25
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-08-18T15:09:18
last_root_post2018-07-07T12:26:39
last_vote_time2018-07-19T20:14:18
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance4.791 STEEM
savings_balance0.000 STEEM
sbd_balance5.529 SBD
savings_sbd_balance0.000 SBD
vesting_shares18183.813033 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update2018-06-19T16:54:39
last_account_update2018-07-11T20:18:45
minedNo
sbd_seconds10,009,360,251
sbd_last_interest_payment2018-07-07T09:16:24
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 524521,
  "name": "leordev",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5XZkQwa6kNaHa2cSPCm1Ydi67EwWnUC3nWRnyUDEiYh5pBt7yE",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7H2cEPZCiQ6PTL5xJr33Tc8f749MS2XY6moYxaFPeiTjPL2139",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [
      [
        "busy.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM8NYeHMANZcNutqhHdKDjgHn4BU67WhWYYz61gSWiQ9t7hth7Aw",
        1
      ]
    ]
  },
  "memo_key": "STM7beLUTtcgzBcNDUGLhbHWvTz4bhGthHW3i4SXdoxn2fUBk3BkS",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://leordev.github.io/assets/img/leo.jpg\",\"cover_image\":\"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg\",\"name\":\"Leo\",\"about\":\"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!\",\"location\":\"Fort Lauderdale, FL\",\"website\":\"https://leordev.github.io/\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://leordev.github.io/assets/img/leo.jpg\",\"cover_image\":\"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg\",\"name\":\"Leo\",\"about\":\"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!\",\"location\":\"Fort Lauderdale, FL\",\"website\":\"https://leordev.github.io/\"}}",
  "proxy": "",
  "last_owner_update": "2018-06-19T16:54:39",
  "last_account_update": "2018-07-11T20:18:45",
  "created": "2017-12-24T12:38:24",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 25,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "18183813033",
    "last_update_time": 1588939299
  },
  "downvote_manabar": {
    "current_mana": "4545953258",
    "last_update_time": 1588939299
  },
  "voting_power": 0,
  "balance": "4.791 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "5.529 SBD",
  "sbd_seconds": "10009360251",
  "sbd_seconds_last_update": "2018-08-02T01:05:00",
  "sbd_last_interest_payment": "2018-07-07T09:16:24",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "18183.813033 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 33,
  "posting_rewards": 16836,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-08-18T15:09:18",
  "last_root_post": "2018-07-07T12:26:39",
  "last_vote_time": "2018-07-19T20:14:18",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": "217358042738",
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 124173
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 0.000 SP to @leordev
2020/05/08 12:01:39
delegatorsteem
delegateeleordev
vesting shares0.000000 VESTS
Transaction InfoBlock #43196280/Trx 409f44fba7848e70e58e6992906e5b9bd0504988
View Raw JSON Data
{
  "trx_id": "409f44fba7848e70e58e6992906e5b9bd0504988",
  "block": 43196280,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T12:01:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "leordev",
      "vesting_shares": "0.000000 VESTS"
    }
  ]
}
2019/12/24 13:56:48
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorsteemitboard
permlinksteemitboard-notify-leordev-20191224t135647000z
title
bodyCongratulations @leordev! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@leordev/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@leordev) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=leordev)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #39319041/Trx bdf402c5976125d1c1ed68c7f60fae5c63fb463a
View Raw JSON Data
{
  "trx_id": "bdf402c5976125d1c1ed68c7f60fae5c63fb463a",
  "block": 39319041,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-12-24T13:56:48",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-leordev-20191224t135647000z",
      "title": "",
      "body": "Congratulations @leordev! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@leordev/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@leordev) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=leordev)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
2019/01/16 06:15:45
votergaboesquivel
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #29498275/Trx 021e3bad58b4cb5c8470a65dd593724a789b519a
View Raw JSON Data
{
  "trx_id": "021e3bad58b4cb5c8470a65dd593724a789b519a",
  "block": 29498275,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-01-16T06:15:45",
  "op": [
    "vote",
    {
      "voter": "gaboesquivel",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/12/24 16:08:12
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorsteemitboard
permlinksteemitboard-notify-leordev-20181224t160811000z
title
bodyCongratulations @leordev! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@leordev/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@leordev)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends"><img src="https://steemitimages.com/64x128/http://i.cubeupload.com/kf4SJb.png"></a></td><td><a href="https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends">Christmas Challenge - Send a gift to to your friends</a></td></tr></table> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #28848256/Trx fbbd26a9506225fd5da2c83b0e9b87300b5308f4
View Raw JSON Data
{
  "trx_id": "fbbd26a9506225fd5da2c83b0e9b87300b5308f4",
  "block": 28848256,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-12-24T16:08:12",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-leordev-20181224t160811000z",
      "title": "",
      "body": "Congratulations @leordev! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@leordev/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@leordev)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends\"><img src=\"https://steemitimages.com/64x128/http://i.cubeupload.com/kf4SJb.png\"></a></td><td><a href=\"https://steemit.com/christmas/@steemitboard/christmas-challenge-send-a-gift-to-to-your-friends\">Christmas Challenge - Send a gift to to your friends</a></td></tr></table>\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 1.237 SP to @leordev
2018/11/26 18:19:54
delegatorsteem
delegateeleordev
vesting shares2013.984142 VESTS
Transaction InfoBlock #28044939/Trx fe52bcb6eb8a0444042ffe4662c083742e626e59
View Raw JSON Data
{
  "trx_id": "fe52bcb6eb8a0444042ffe4662c083742e626e59",
  "block": 28044939,
  "trx_in_block": 40,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-26T18:19:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "leordev",
      "vesting_shares": "2013.984142 VESTS"
    }
  ]
}
2018/10/25 06:46:06
votersivachaitanya
authorleordev
permlinkeos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop
weight10000 (100.00%)
Transaction InfoBlock #27110084/Trx 2dc3cd23711d3e6d92da3327ec55fa5e8a3ba60c
View Raw JSON Data
{
  "trx_id": "2dc3cd23711d3e6d92da3327ec55fa5e8a3ba60c",
  "block": 27110084,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-25T06:46:06",
  "op": [
    "vote",
    {
      "voter": "sivachaitanya",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop",
      "weight": 10000
    }
  ]
}
2018/10/25 06:19:03
votersivachaitanya
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #27109544/Trx a3c612f4f242ab1346bcca2672552740d750aebf
View Raw JSON Data
{
  "trx_id": "a3c612f4f242ab1346bcca2672552740d750aebf",
  "block": 27109544,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-10-25T06:19:03",
  "op": [
    "vote",
    {
      "voter": "sivachaitanya",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
2018/08/28 14:21:09
required auths[]
required posting auths["leordev"]
idfollow
json["follow",{"follower":"leordev","following":"friedger","what":["blog"]}]
Transaction InfoBlock #25465571/Trx 57886178fe968a857c1a110bbeaf705522e60311
View Raw JSON Data
{
  "trx_id": "57886178fe968a857c1a110bbeaf705522e60311",
  "block": 25465571,
  "trx_in_block": 33,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-28T14:21:09",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "leordev"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"leordev\",\"following\":\"friedger\",\"what\":[\"blog\"]}]"
    }
  ]
}
2018/08/19 14:30:30
voterneogenesis
authorleordev
permlinkre-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z
weight10000 (100.00%)
Transaction InfoBlock #25206676/Trx b440d10f83a9cc9631a4fe23f194f7cb13754756
View Raw JSON Data
{
  "trx_id": "b440d10f83a9cc9631a4fe23f194f7cb13754756",
  "block": 25206676,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-19T14:30:30",
  "op": [
    "vote",
    {
      "voter": "neogenesis",
      "author": "leordev",
      "permlink": "re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z",
      "weight": 10000
    }
  ]
}
2018/08/19 05:03:27
voterneogenesis
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #25195341/Trx f2ebff6f03aa8df1ac8c9f8b2e7d4ccfb9985b59
View Raw JSON Data
{
  "trx_id": "f2ebff6f03aa8df1ac8c9f8b2e7d4ccfb9985b59",
  "block": 25195341,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-19T05:03:27",
  "op": [
    "vote",
    {
      "voter": "neogenesis",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/08/18 19:57:36
votercryptolions
authorleordev
permlinkre-friedger-auto-feed-monsters-or-the-value-of-nfts-20180818t150915871z
weight10000 (100.00%)
Transaction InfoBlock #25184428/Trx b98c00ca1395fb495668ac1cda98403c3d143bc6
View Raw JSON Data
{
  "trx_id": "b98c00ca1395fb495668ac1cda98403c3d143bc6",
  "block": 25184428,
  "trx_in_block": 45,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T19:57:36",
  "op": [
    "vote",
    {
      "voter": "cryptolions",
      "author": "leordev",
      "permlink": "re-friedger-auto-feed-monsters-or-the-value-of-nfts-20180818t150915871z",
      "weight": 10000
    }
  ]
}
leordevcustom json: follow
2018/08/18 15:09:33
required auths[]
required posting auths["leordev"]
idfollow
json["reblog",{"account":"leordev","author":"friedger","permlink":"auto-feed-monsters-or-the-value-of-nfts"}]
Transaction InfoBlock #25178667/Trx e75eb03b0491ffd54de39fd526c09879025fcb63
View Raw JSON Data
{
  "trx_id": "e75eb03b0491ffd54de39fd526c09879025fcb63",
  "block": 25178667,
  "trx_in_block": 39,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T15:09:33",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "leordev"
      ],
      "id": "follow",
      "json": "[\"reblog\",{\"account\":\"leordev\",\"author\":\"friedger\",\"permlink\":\"auto-feed-monsters-or-the-value-of-nfts\"}]"
    }
  ]
}
2018/08/18 15:09:18
parent authorfriedger
parent permlinkauto-feed-monsters-or-the-value-of-nfts
authorleordev
permlinkre-friedger-auto-feed-monsters-or-the-value-of-nfts-20180818t150915871z
title
bodyI loved it, my challenge to you or the community is to create a bot that auto battle lol!
json metadata{"community":"busy","app":"busy/2.5.6","format":"markdown","tags":["eos"],"users":[],"links":[],"image":[]}
Transaction InfoBlock #25178662/Trx fc45e32e9bc8c0c5c5e1f3fb7b1847350902a218
View Raw JSON Data
{
  "trx_id": "fc45e32e9bc8c0c5c5e1f3fb7b1847350902a218",
  "block": 25178662,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T15:09:18",
  "op": [
    "comment",
    {
      "parent_author": "friedger",
      "parent_permlink": "auto-feed-monsters-or-the-value-of-nfts",
      "author": "leordev",
      "permlink": "re-friedger-auto-feed-monsters-or-the-value-of-nfts-20180818t150915871z",
      "title": "",
      "body": "I loved it, my challenge to you or the community is to create a bot that auto battle lol!",
      "json_metadata": "{\"community\":\"busy\",\"app\":\"busy/2.5.6\",\"format\":\"markdown\",\"tags\":[\"eos\"],\"users\":[],\"links\":[],\"image\":[]}"
    }
  ]
}
2018/08/18 15:08:30
voterleordev
authorfriedger
permlinkauto-feed-monsters-or-the-value-of-nfts
weight10000 (100.00%)
Transaction InfoBlock #25178646/Trx 29c59d69a48f7edf9899535ed39f25789744df92
View Raw JSON Data
{
  "trx_id": "29c59d69a48f7edf9899535ed39f25789744df92",
  "block": 25178646,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T15:08:30",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "friedger",
      "permlink": "auto-feed-monsters-or-the-value-of-nfts",
      "weight": 10000
    }
  ]
}
2018/08/18 15:04:54
voterleordev
authorfriedger
permlinkexchange-monsters-or-how-to-implement-transfers-of-nfts-between-contract
weight10000 (100.00%)
Transaction InfoBlock #25178574/Trx edca3b9b703892edcc0da408c4476544e68951df
View Raw JSON Data
{
  "trx_id": "edca3b9b703892edcc0da408c4476544e68951df",
  "block": 25178574,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T15:04:54",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "friedger",
      "permlink": "exchange-monsters-or-how-to-implement-transfers-of-nfts-between-contract",
      "weight": 10000
    }
  ]
}
2018/08/18 14:45:15
voterleordev
authorfriedger
permlinkcollect-monsters-or-how-to-implement-non-fungible-tokens-on-eos
weight10000 (100.00%)
Transaction InfoBlock #25178181/Trx 7b4aba53898638896956b8b6ff0bdf1cdf24bc86
View Raw JSON Data
{
  "trx_id": "7b4aba53898638896956b8b6ff0bdf1cdf24bc86",
  "block": 25178181,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-18T14:45:15",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "friedger",
      "permlink": "collect-monsters-or-how-to-implement-non-fungible-tokens-on-eos",
      "weight": 10000
    }
  ]
}
2018/08/10 22:25:27
voteriscott
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #24957061/Trx b0e05214a1457d5797f7b3c4f5f6724bd5b497ad
View Raw JSON Data
{
  "trx_id": "b0e05214a1457d5797f7b3c4f5f6724bd5b497ad",
  "block": 24957061,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-10T22:25:27",
  "op": [
    "vote",
    {
      "voter": "iscott",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
2018/08/10 22:25:06
voteriscott
authorleordev
permlinkeos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop
weight10000 (100.00%)
Transaction InfoBlock #24957054/Trx e585892d6af6466baee42d31d6da867cd5bce67a
View Raw JSON Data
{
  "trx_id": "e585892d6af6466baee42d31d6da867cd5bce67a",
  "block": 24957054,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-10T22:25:06",
  "op": [
    "vote",
    {
      "voter": "iscott",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop",
      "weight": 10000
    }
  ]
}
2018/08/03 17:47:24
voterreyhaynes
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #24749981/Trx cb9157a98334f401639f6df471bb8a42e9ea145b
View Raw JSON Data
{
  "trx_id": "cb9157a98334f401639f6df471bb8a42e9ea145b",
  "block": 24749981,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-03T17:47:24",
  "op": [
    "vote",
    {
      "voter": "reyhaynes",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
2018/08/02 21:04:06
parent authorleordev
parent permlinkre-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z
authorjavierjmc
permlinkjavierjmc-re-leordev-re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t210407157z
title
bodyOh yes it makes sense to put it on the backend, didn't think about that.. and yes, I remembered this post when I read about Demux few days ago :)) maybe you can write an article about it as an upgrade of this one? Cheers! :) Posted using [Partiko Android](https://play.google.com/store/apps/details?id=io.partiko.android)
json metadata{"app":"partiko"}
Transaction InfoBlock #24725123/Trx a70e1e086dd02f9c16fc1e7399cb1cfaf5cef834
View Raw JSON Data
{
  "trx_id": "a70e1e086dd02f9c16fc1e7399cb1cfaf5cef834",
  "block": 24725123,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T21:04:06",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z",
      "author": "javierjmc",
      "permlink": "javierjmc-re-leordev-re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t210407157z",
      "title": "",
      "body": "Oh yes it makes sense to put it on the backend, didn't think about that.. and yes, I remembered this post when I read about Demux few days ago :)) maybe you can write an article about it as an upgrade of this one? Cheers! :)\n\nPosted using [Partiko Android](https://play.google.com/store/apps/details?id=io.partiko.android)",
      "json_metadata": "{\"app\":\"partiko\"}"
    }
  ]
}
2018/08/02 21:03:00
voterjavierjmc
authorleordev
permlinkre-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z
weight10000 (100.00%)
Transaction InfoBlock #24725101/Trx 6432d75ef328c5878d1684e1c0521fc19b6f8b98
View Raw JSON Data
{
  "trx_id": "6432d75ef328c5878d1684e1c0521fc19b6f8b98",
  "block": 24725101,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T21:03:00",
  "op": [
    "vote",
    {
      "voter": "javierjmc",
      "author": "leordev",
      "permlink": "re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z",
      "weight": 10000
    }
  ]
}
steemdelegated 7.501 SP to @leordev
2018/08/02 02:27:45
delegatorsteem
delegateeleordev
vesting shares12215.503976 VESTS
Transaction InfoBlock #24702803/Trx b4f5133f062b7c62eac513556280a5488c571277
View Raw JSON Data
{
  "trx_id": "b4f5133f062b7c62eac513556280a5488c571277",
  "block": 24702803,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T02:27:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "leordev",
      "vesting_shares": "12215.503976 VESTS"
    }
  ]
}
leordevclaimed reward balance: 1.992 STEEM, 1.014 SBD, 3.457 SP
2018/08/02 01:05:00
accountleordev
reward steem1.992 STEEM
reward sbd1.014 SBD
reward vests5629.446589 VESTS
Transaction InfoBlock #24701148/Trx df21e8ea1ace2b55ba399a1e6ca05770096b0350
View Raw JSON Data
{
  "trx_id": "df21e8ea1ace2b55ba399a1e6ca05770096b0350",
  "block": 24701148,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T01:05:00",
  "op": [
    "claim_reward_balance",
    {
      "account": "leordev",
      "reward_steem": "1.992 STEEM",
      "reward_sbd": "1.014 SBD",
      "reward_vests": "5629.446589 VESTS"
    }
  ]
}
2018/08/02 01:02:57
parent authorjavierjmc
parent permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t190333219z
authorleordev
permlinkre-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z
title
bodySo in my example redux is on the backend with nodejs. You should handle this in the backend always before serve to your frontend, then you will have no problems regarding filters on the front! But now we should go for Demux, this is the juice: https://medium.com/eosio/introducing-demux-deterministic-databases-off-chain-verified-by-the-eosio-blockchain-bd860c49b017?source=linkShare-d63a4db2f83e-1532996516
json metadata{"community":"busy","app":"busy/2.5.4","format":"markdown","tags":["eos"],"users":[],"links":["https://medium.com/eosio/introducing-demux-deterministic-databases-off-chain-verified-by-the-eosio-blockchain-bd860c49b017?source=linkShare-d63a4db2f83e-1532996516"],"image":[]}
Transaction InfoBlock #24701107/Trx c3f014441c0c7a8130c30452c2107917c763d28e
View Raw JSON Data
{
  "trx_id": "c3f014441c0c7a8130c30452c2107917c763d28e",
  "block": 24701107,
  "trx_in_block": 48,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-02T01:02:57",
  "op": [
    "comment",
    {
      "parent_author": "javierjmc",
      "parent_permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t190333219z",
      "author": "leordev",
      "permlink": "re-javierjmc-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180802t010256895z",
      "title": "",
      "body": "So in my example redux is on the backend with nodejs. You should handle this in the backend always before serve to your frontend, then you will have no problems regarding filters on the front! But now we should go for Demux, this is the juice: https://medium.com/eosio/introducing-demux-deterministic-databases-off-chain-verified-by-the-eosio-blockchain-bd860c49b017?source=linkShare-d63a4db2f83e-1532996516",
      "json_metadata": "{\"community\":\"busy\",\"app\":\"busy/2.5.4\",\"format\":\"markdown\",\"tags\":[\"eos\"],\"users\":[],\"links\":[\"https://medium.com/eosio/introducing-demux-deterministic-databases-off-chain-verified-by-the-eosio-blockchain-bd860c49b017?source=linkShare-d63a4db2f83e-1532996516\"],\"image\":[]}"
    }
  ]
}
2018/08/01 03:10:42
voterfschoell
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24674885/Trx ebca8d5b171f22bb7574739bd1887d7ae250bc8c
View Raw JSON Data
{
  "trx_id": "ebca8d5b171f22bb7574739bd1887d7ae250bc8c",
  "block": 24674885,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-08-01T03:10:42",
  "op": [
    "vote",
    {
      "voter": "fschoell",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/27 19:03:33
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorjavierjmc
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t190333219z
title
bodyThis is brilliant indeed!! Immutable states is the way to go, beautiful way to handle it. I wonder though how well it will perform when the dapp scales since a lot of filtering is done in the frontend, am I correct or I understood it wrong?
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24550415/Trx 568e3583a3a42a0aee84a430dcfbb0071a9415d5
View Raw JSON Data
{
  "trx_id": "568e3583a3a42a0aee84a430dcfbb0071a9415d5",
  "block": 24550415,
  "trx_in_block": 33,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-27T19:03:33",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "javierjmc",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t190333219z",
      "title": "",
      "body": "This is brilliant indeed!! Immutable states is the way to go, beautiful way to handle it. I wonder though how well it will perform when the dapp scales since a lot of filtering is done in the frontend, am I correct or I understood it wrong?",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/27 02:45:30
votersunburntcat17
authorleordev
permlinkre-eosdac-temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements-20180719t200255408z
weight10000 (100.00%)
Transaction InfoBlock #24530863/Trx 30993249ce1843f45f6e87ca3377bb063873160b
View Raw JSON Data
{
  "trx_id": "30993249ce1843f45f6e87ca3377bb063873160b",
  "block": 24530863,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-27T02:45:30",
  "op": [
    "vote",
    {
      "voter": "sunburntcat17",
      "author": "leordev",
      "permlink": "re-eosdac-temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements-20180719t200255408z",
      "weight": 10000
    }
  ]
}
2018/07/27 01:41:06
voterdabble
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24529578/Trx 902481e7cad47aa6bac8064f80f8938c0fb9ecb7
View Raw JSON Data
{
  "trx_id": "902481e7cad47aa6bac8064f80f8938c0fb9ecb7",
  "block": 24529578,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-27T01:41:06",
  "op": [
    "vote",
    {
      "voter": "dabble",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/27 01:41:00
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authordabble
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t014059608z
title
bodyGreat! I learned many things from this article.
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24529576/Trx 56b87baf93a681f146923aa8492c175bb08e1341
View Raw JSON Data
{
  "trx_id": "56b87baf93a681f146923aa8492c175bb08e1341",
  "block": 24529576,
  "trx_in_block": 60,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-27T01:41:00",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "dabble",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180727t014059608z",
      "title": "",
      "body": "Great! I learned many things from this article.",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
leordevreceived 0.001 SP curation reward for @cypherglass / under-the-hood-of-cypherglass-windshield
2018/07/26 20:00:48
curatorleordev
reward2.027309 VESTS
comment authorcypherglass
comment permlinkunder-the-hood-of-cypherglass-windshield
Transaction InfoBlock #24522785/Virtual Operation #24
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 24522785,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 24,
  "timestamp": "2018-07-26T20:00:48",
  "op": [
    "curation_reward",
    {
      "curator": "leordev",
      "reward": "2.027309 VESTS",
      "comment_author": "cypherglass",
      "comment_permlink": "under-the-hood-of-cypherglass-windshield"
    }
  ]
}
2018/07/19 20:14:18
voterleordev
authorlukestokes
permlink2859d6d2-88ff-11e8-98cd-0242ac110003
weight10000 (100.00%)
Transaction InfoBlock #24321619/Trx 2eaf62c803de068b8c4ec78b63f4131a93032303
View Raw JSON Data
{
  "trx_id": "2eaf62c803de068b8c4ec78b63f4131a93032303",
  "block": 24321619,
  "trx_in_block": 36,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-19T20:14:18",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "lukestokes",
      "permlink": "2859d6d2-88ff-11e8-98cd-0242ac110003",
      "weight": 10000
    }
  ]
}
2018/07/19 20:12:54
voterleordev
authorcypherglass
permlinkunder-the-hood-of-cypherglass-windshield
weight10000 (100.00%)
Transaction InfoBlock #24321591/Trx e5e1dcf11da5eda3b4f7e8d9e5418db06c564b77
View Raw JSON Data
{
  "trx_id": "e5e1dcf11da5eda3b4f7e8d9e5418db06c564b77",
  "block": 24321591,
  "trx_in_block": 34,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-19T20:12:54",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "cypherglass",
      "permlink": "under-the-hood-of-cypherglass-windshield",
      "weight": 10000
    }
  ]
}
2018/07/19 20:02:54
parent authoreosdac
parent permlinktemporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements
authorleordev
permlinkre-eosdac-temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements-20180719t200255408z
title
bodyNice and quick response to fix the issue! Congrats! Also, I appreciate the shout out to MonstersEOS! :D Actually we need to thank the players, they were desperate because they could not feed their monsters! hehehe
json metadata{"tags":["eosdac"],"app":"steemit/0.1"}
Transaction InfoBlock #24321391/Trx a82b55eea791828f1267edf2d33432dc64b2e522
View Raw JSON Data
{
  "trx_id": "a82b55eea791828f1267edf2d33432dc64b2e522",
  "block": 24321391,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-19T20:02:54",
  "op": [
    "comment",
    {
      "parent_author": "eosdac",
      "parent_permlink": "temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements",
      "author": "leordev",
      "permlink": "re-eosdac-temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements-20180719t200255408z",
      "title": "",
      "body": "Nice and quick response to fix the issue! Congrats! Also, I appreciate the shout out to MonstersEOS! :D Actually we need to thank the players, they were desperate because they could not feed their monsters! hehehe",
      "json_metadata": "{\"tags\":[\"eosdac\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/19 19:58:48
voterleordev
authoreosdac
permlinktemporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements
weight10000 (100.00%)
Transaction InfoBlock #24321309/Trx 32a97a48dfbd22a511cc69f4dbd1b6b8314a380b
View Raw JSON Data
{
  "trx_id": "32a97a48dfbd22a511cc69f4dbd1b6b8314a380b",
  "block": 24321309,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-19T19:58:48",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "eosdac",
      "permlink": "temporary-public-node-outage-eu2-eosdac-io-technical-story-and-improvements",
      "weight": 10000
    }
  ]
}
2018/07/19 01:02:57
curatorleordev
reward16.225155 VESTS
comment authorjdisalvatore
comment permlinkhow-much-an-eos-airdrop-costs-or-horus-airdrop-update
Transaction InfoBlock #24298608/Virtual Operation #4
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 24298608,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 4,
  "timestamp": "2018-07-19T01:02:57",
  "op": [
    "curation_reward",
    {
      "curator": "leordev",
      "reward": "16.225155 VESTS",
      "comment_author": "jdisalvatore",
      "comment_permlink": "how-much-an-eos-airdrop-costs-or-horus-airdrop-update"
    }
  ]
}
2018/07/17 04:33:51
voterwillpark
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #24245296/Trx 227d66a75da766f14cb0abcf136c34103f27668a
View Raw JSON Data
{
  "trx_id": "227d66a75da766f14cb0abcf136c34103f27668a",
  "block": 24245296,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-17T04:33:51",
  "op": [
    "vote",
    {
      "voter": "willpark",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
2018/07/14 23:37:57
voterdjjaron
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #24181789/Trx a7fec2bd76efd8f34d8776aa141c1da45c118779
View Raw JSON Data
{
  "trx_id": "a7fec2bd76efd8f34d8776aa141c1da45c118779",
  "block": 24181789,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-14T23:37:57",
  "op": [
    "vote",
    {
      "voter": "djjaron",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
leordevreceived 1.992 STEEM, 1.014 SBD, 3.446 SP author reward for @leordev / eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
2018/07/14 12:26:39
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
sbd payout1.014 SBD
steem payout1.992 STEEM
vesting payout5611.194125 VESTS
Transaction InfoBlock #24168363/Virtual Operation #17
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 24168363,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 17,
  "timestamp": "2018-07-14T12:26:39",
  "op": [
    "author_reward",
    {
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "sbd_payout": "1.014 SBD",
      "steem_payout": "1.992 STEEM",
      "vesting_payout": "5611.194125 VESTS"
    }
  ]
}
2018/07/12 01:23:33
voterleordev
authorjdisalvatore
permlinkhow-much-an-eos-airdrop-costs-or-horus-airdrop-update
weight10000 (100.00%)
Transaction InfoBlock #24097531/Trx 92bbf37938b2f11761872043a382732838a6a459
View Raw JSON Data
{
  "trx_id": "92bbf37938b2f11761872043a382732838a6a459",
  "block": 24097531,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-12T01:23:33",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "jdisalvatore",
      "permlink": "how-much-an-eos-airdrop-costs-or-horus-airdrop-update",
      "weight": 10000
    }
  ]
}
2018/07/11 20:26:33
required auths[]
required posting auths["leordev"]
idfollow
json["follow",{"follower":"leordev","following":"johnwilliamson","what":["blog"]}]
Transaction InfoBlock #24091593/Trx f00f6a3e8ffbab47d77cdfa02fa73a0cbe32a720
View Raw JSON Data
{
  "trx_id": "f00f6a3e8ffbab47d77cdfa02fa73a0cbe32a720",
  "block": 24091593,
  "trx_in_block": 33,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:26:33",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "leordev"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"leordev\",\"following\":\"johnwilliamson\",\"what\":[\"blog\"]}]"
    }
  ]
}
2018/07/11 20:24:06
voterleordev
authorsublimate
permlinkre-cetos-we-have-lost-the-first-battle-but-never-failed-the-war-20180628t020101171z
weight10000 (100.00%)
Transaction InfoBlock #24091544/Trx 1ddd7abaef80398a90c730e67d03a27a060ef418
View Raw JSON Data
{
  "trx_id": "1ddd7abaef80398a90c730e67d03a27a060ef418",
  "block": 24091544,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:24:06",
  "op": [
    "vote",
    {
      "voter": "leordev",
      "author": "sublimate",
      "permlink": "re-cetos-we-have-lost-the-first-battle-but-never-failed-the-war-20180628t020101171z",
      "weight": 10000
    }
  ]
}
leordevupdated their account properties
2018/07/11 20:18:45
accountleordev
posting{"weight_threshold":1,"account_auths":[["busy.app",1]],"key_auths":[["STM8NYeHMANZcNutqhHdKDjgHn4BU67WhWYYz61gSWiQ9t7hth7Aw",1]]}
memo keySTM7beLUTtcgzBcNDUGLhbHWvTz4bhGthHW3i4SXdoxn2fUBk3BkS
json metadata{"profile":{"profile_image":"https://leordev.github.io/assets/img/leo.jpg","cover_image":"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg","name":"Leo","about":"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!","location":"Fort Lauderdale, FL","website":"https://leordev.github.io/"}}
Transaction InfoBlock #24091437/Trx 7eb17fee2716e97b6f6150f43b2d2413bed0d424
View Raw JSON Data
{
  "trx_id": "7eb17fee2716e97b6f6150f43b2d2413bed0d424",
  "block": 24091437,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:18:45",
  "op": [
    "account_update",
    {
      "account": "leordev",
      "posting": {
        "weight_threshold": 1,
        "account_auths": [
          [
            "busy.app",
            1
          ]
        ],
        "key_auths": [
          [
            "STM8NYeHMANZcNutqhHdKDjgHn4BU67WhWYYz61gSWiQ9t7hth7Aw",
            1
          ]
        ]
      },
      "memo_key": "STM7beLUTtcgzBcNDUGLhbHWvTz4bhGthHW3i4SXdoxn2fUBk3BkS",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://leordev.github.io/assets/img/leo.jpg\",\"cover_image\":\"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg\",\"name\":\"Leo\",\"about\":\"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!\",\"location\":\"Fort Lauderdale, FL\",\"website\":\"https://leordev.github.io/\"}}"
    }
  ]
}
2018/07/11 20:16:18
required auths[]
required posting auths["leordev"]
idfollow
json["follow",{"follower":"leordev","following":"lukestokes","what":["blog"]}]
Transaction InfoBlock #24091388/Trx 5489e90c383d163d78758e34a3e3ff359cf226d9
View Raw JSON Data
{
  "trx_id": "5489e90c383d163d78758e34a3e3ff359cf226d9",
  "block": 24091388,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:16:18",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "leordev"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"leordev\",\"following\":\"lukestokes\",\"what\":[\"blog\"]}]"
    }
  ]
}
2018/07/11 20:09:51
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorlukestokes
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180711t200950835z
title
bodyFantastic post! I love that you educated while also giving all the details in a tutorial style. Very nicely done. Following for more.
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24091259/Trx 2a1bcbcdd165b5622f73caa410a6d6eb97101252
View Raw JSON Data
{
  "trx_id": "2a1bcbcdd165b5622f73caa410a6d6eb97101252",
  "block": 24091259,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:09:51",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "lukestokes",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180711t200950835z",
      "title": "",
      "body": "Fantastic post! I love that you educated while also giving all the details in a tutorial style. Very nicely done. Following for more.",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/11 20:09:18
voterlukestokes
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24091248/Trx e582b73399266943d846ff527580c390476294d9
View Raw JSON Data
{
  "trx_id": "e582b73399266943d846ff527580c390476294d9",
  "block": 24091248,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T20:09:18",
  "op": [
    "vote",
    {
      "voter": "lukestokes",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/11 14:37:27
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorsteemitboard
permlinksteemitboard-notify-leordev-20180711t143726000z
title
bodyCongratulations @leordev! You have completed the following achievement on Steemit and have been rewarded with new badge(s) : [![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@leordev) Award for the number of upvotes received <sub>_Click on the badge to view your Board of Honor._</sub> <sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub> **Do not miss the last post from @steemitboard:** [SteemitBoard World Cup Contest - Croatia vs England](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-croatia-vs-england) --- **Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!** Collect World Cup badges and win free SBD Support the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1) --- > Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #24084614/Trx f004dbc3ff501a3db6be9a6ca3bbcd759571e008
View Raw JSON Data
{
  "trx_id": "f004dbc3ff501a3db6be9a6ca3bbcd759571e008",
  "block": 24084614,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-11T14:37:27",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-leordev-20180711t143726000z",
      "title": "",
      "body": "Congratulations @leordev! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :\n\n[![](https://steemitimages.com/70x80/http://steemitboard.com/notifications/voted.png)](http://steemitboard.com/@leordev) Award for the number of upvotes received\n\n<sub>_Click on the badge to view your Board of Honor._</sub>\n<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>\n\n\n\n**Do not miss the last post from @steemitboard:**\n[SteemitBoard World Cup Contest - Croatia vs England](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-croatia-vs-england)\n\n---\n**Participate in the [SteemitBoard World Cup Contest](https://steemit.com/steemitboard/@steemitboard/steemitboard-world-cup-contest-collect-badges-and-win-free-sbd)!**\nCollect World Cup badges and win free SBD\nSupport the Gold Sponsors of the contest: [@good-karma](https://v2.steemconnect.com/sign/account-witness-vote?witness=good-karma&approve=1) and [@lukestokes](https://v2.steemconnect.com/sign/account-witness-vote?witness=lukestokes.mhth&approve=1)\n\n---\n\n> Do you like [SteemitBoard's project](https://steemit.com/@steemitboard)? Then **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
2018/07/10 04:03:03
voterkirill-yurkov
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24043135/Trx f402b9af2a6b55d049e54e3a30992658c70a57c2
View Raw JSON Data
{
  "trx_id": "f402b9af2a6b55d049e54e3a30992658c70a57c2",
  "block": 24043135,
  "trx_in_block": 42,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-10T04:03:03",
  "op": [
    "vote",
    {
      "voter": "kirill-yurkov",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/09 21:55:48
parent authormobicfly
parent permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180708t165159657z
authorleordev
permlinkre-mobicfly-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180709t215547103z
title
bodyI don't think you will have access to `eosio` account in jungle. change `-p eosio` for `-p youraccount`
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24035793/Trx 3f819e53229fa95fd2bbde172adcb0b03d198974
View Raw JSON Data
{
  "trx_id": "3f819e53229fa95fd2bbde172adcb0b03d198974",
  "block": 24035793,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T21:55:48",
  "op": [
    "comment",
    {
      "parent_author": "mobicfly",
      "parent_permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180708t165159657z",
      "author": "leordev",
      "permlink": "re-mobicfly-re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180709t215547103z",
      "title": "",
      "body": "I don't think you will have access to `eosio` account in jungle. change `-p eosio` for `-p youraccount`",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/09 18:38:18
votersafirin
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24031845/Trx c8ab92713fd982a702e2e62a4059e053f149ad86
View Raw JSON Data
{
  "trx_id": "c8ab92713fd982a702e2e62a4059e053f149ad86",
  "block": 24031845,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T18:38:18",
  "op": [
    "vote",
    {
      "voter": "safirin",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/09 12:26:00
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authorjohnwilliamson
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180709t122559667z
title
bodyBloody genius, it feels so obvious now! Makes so much sense.
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24024404/Trx eb5ada2a82a81bcbaa28a93daa164159ab650479
View Raw JSON Data
{
  "trx_id": "eb5ada2a82a81bcbaa28a93daa164159ab650479",
  "block": 24024404,
  "trx_in_block": 44,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T12:26:00",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "johnwilliamson",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180709t122559667z",
      "title": "",
      "body": "Bloody genius, it feels so obvious now! Makes so much sense.",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/09 12:25:39
voterjohnwilliamson
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #24024397/Trx e373c446954725a55c812f8681db88c095d114aa
View Raw JSON Data
{
  "trx_id": "e373c446954725a55c812f8681db88c095d114aa",
  "block": 24024397,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T12:25:39",
  "op": [
    "vote",
    {
      "voter": "johnwilliamson",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/09 10:49:27
votercmichel
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight5600 (56.00%)
Transaction InfoBlock #24022474/Trx 2389305aa98db041c44deb7bad62b88cd6fe6948
View Raw JSON Data
{
  "trx_id": "2389305aa98db041c44deb7bad62b88cd6fe6948",
  "block": 24022474,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T10:49:27",
  "op": [
    "vote",
    {
      "voter": "cmichel",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 5600
    }
  ]
}
2018/07/09 01:47:06
parent authorleordev
parent permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
authorjoehitt
permlinkre-leordev-eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet-20180709t014706600z
title
bodyThanks Leo! I had assumed that the token owner always owned the RAM so this caused me to go back and look at eosio.token.cpp. So it looks like in the standard eosio.token, when you get an airdrop, the token contract (party 1) owns the RAM. But if the holder (party 2) then does any other transfer, say to party 3, party 2 is now owns the row of RAM in party 1's multi-index. This is really interesting becuase I did not realize that multi-index had row-level ram ownership. However this party 2 ownership appears to take place only if party 3 did not previously have an entry for that token. If party 3 did own some of ABC token already, then to_acnts.modify is called, in which case the existing RAM owner is maintained. Does this all sound correct?
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24011629/Trx 802035c66a8134e2a469976248941b9152a277f6
View Raw JSON Data
{
  "trx_id": "802035c66a8134e2a469976248941b9152a277f6",
  "block": 24011629,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T01:47:06",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "author": "joehitt",
      "permlink": "re-leordev-eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet-20180709t014706600z",
      "title": "",
      "body": "Thanks Leo!  I had assumed that the token owner always owned the RAM so this caused me to go back and look at eosio.token.cpp.  So it looks like in the standard eosio.token, when you get an airdrop, the token contract (party 1) owns the RAM.  But if the holder (party 2) then does any other transfer, say to party 3, party 2 is now owns the row of RAM in party 1's multi-index.  This is really interesting becuase I did not realize that multi-index had row-level ram ownership.  However this party 2 ownership appears to take place only if party 3 did not previously have an entry for that token.  If party 3 did own some of ABC token already, then to_acnts.modify is called, in which case the existing RAM owner is maintained.  Does this all sound correct?",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/09 01:46:48
voterjoehitt
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #24011623/Trx 560b9fea7b937b78806600138841eda6dd30a272
View Raw JSON Data
{
  "trx_id": "560b9fea7b937b78806600138841eda6dd30a272",
  "block": 24011623,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-09T01:46:48",
  "op": [
    "vote",
    {
      "voter": "joehitt",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}
2018/07/08 16:52:03
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authormobicfly
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180708t165159657z
title
bodythanks for the tutorial, after deploy the contract, I encountered an error: cleos push action todo addtodo '[1, "estset"]' -p eosio Error 3050000: action exception but no further details about it. I am running this on jungle testnet. is there any possible reason for this? thanks!
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #24000929/Trx 43f7e208ddef6f7de473836d96d5adcb5a9946c6
View Raw JSON Data
{
  "trx_id": "43f7e208ddef6f7de473836d96d5adcb5a9946c6",
  "block": 24000929,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T16:52:03",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "mobicfly",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180708t165159657z",
      "title": "",
      "body": "thanks for the tutorial, after deploy the contract, I encountered an error:\ncleos push action todo addtodo '[1, \"estset\"]'  -p eosio\nError 3050000: action exception\n\nbut no further details about it.   I am running this on jungle testnet.  is there any possible reason for this? thanks!",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/08 14:00:42
voterjavierjmc
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23997502/Trx e9e82f8b0fead753f63d133b42504370b589db54
View Raw JSON Data
{
  "trx_id": "e9e82f8b0fead753f63d133b42504370b589db54",
  "block": 23997502,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T14:00:42",
  "op": [
    "vote",
    {
      "voter": "javierjmc",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/08 02:12:27
voterkwonjs77
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23983340/Trx 873c5029f896a114b116e3ec1b7a171c1268590e
View Raw JSON Data
{
  "trx_id": "873c5029f896a114b116e3ec1b7a171c1268590e",
  "block": 23983340,
  "trx_in_block": 35,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-08T02:12:27",
  "op": [
    "vote",
    {
      "voter": "kwonjs77",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 21:38:36
votercptnsolo
authorleordev
permlinkeos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop
weight10000 (100.00%)
Transaction InfoBlock #23977866/Trx f634c473a5ebea0525743701f198d68c547e56f0
View Raw JSON Data
{
  "trx_id": "f634c473a5ebea0525743701f198d68c547e56f0",
  "block": 23977866,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T21:38:36",
  "op": [
    "vote",
    {
      "voter": "cptnsolo",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop",
      "weight": 10000
    }
  ]
}
2018/07/07 14:27:24
votertwittering
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23969245/Trx 7d98a91f81cd630aa47b10ba6dc7c288f526cf69
View Raw JSON Data
{
  "trx_id": "7d98a91f81cd630aa47b10ba6dc7c288f526cf69",
  "block": 23969245,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T14:27:24",
  "op": [
    "vote",
    {
      "voter": "twittering",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 14:23:18
votereosrio
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23969163/Trx f6deabf5bf47e8c399a3c3ba663f7140f7697dd8
View Raw JSON Data
{
  "trx_id": "f6deabf5bf47e8c399a3c3ba663f7140f7697dd8",
  "block": 23969163,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T14:23:18",
  "op": [
    "vote",
    {
      "voter": "eosrio",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 14:22:45
voterigorls
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23969152/Trx 27060e1e4c3c3bf9e79123a3ab251ae9708bd384
View Raw JSON Data
{
  "trx_id": "27060e1e4c3c3bf9e79123a3ab251ae9708bd384",
  "block": 23969152,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T14:22:45",
  "op": [
    "vote",
    {
      "voter": "igorls",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
promotedpostsent 0.001 SBD to @leordev- "Hello, our user. We have created a system to deliver the article to more people. Resteem to 14.500+ Followers | @promotedpost Upvote ⏩(3500SP) | Upvote with min +200 Different account | Our post will ..."
2018/07/07 13:34:33
frompromotedpost
toleordev
amount0.001 SBD
memoHello, our user. We have created a system to deliver the article to more people. Resteem to 14.500+ Followers | @promotedpost Upvote ⏩(3500SP) | Upvote with min +200 Different account | Our post will be more popular and you will find new friends | Send 1 SBD or 1 STEEM to @promotedpost (URL as memo) Service Active
Transaction InfoBlock #23968189/Trx 5702d4f8b8f25e1d4cafe5d41f41efe14339330c
View Raw JSON Data
{
  "trx_id": "5702d4f8b8f25e1d4cafe5d41f41efe14339330c",
  "block": 23968189,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T13:34:33",
  "op": [
    "transfer",
    {
      "from": "promotedpost",
      "to": "leordev",
      "amount": "0.001 SBD",
      "memo": "Hello, our user. We have created a system to deliver the article to more people. Resteem to 14.500+ Followers | @promotedpost Upvote ⏩(3500SP) | Upvote with min +200 Different account | Our post will be more popular and you will find new friends | Send 1 SBD or 1 STEEM to @promotedpost (URL as memo) Service Active"
    }
  ]
}
2018/07/07 13:28:45
voternatp
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23968073/Trx 0d1131fd3a2a033f026855e0c139ea2a8f608932
View Raw JSON Data
{
  "trx_id": "0d1131fd3a2a033f026855e0c139ea2a8f608932",
  "block": 23968073,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T13:28:45",
  "op": [
    "vote",
    {
      "voter": "natp",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 12:53:48
voterifttt
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23967374/Trx cb47667a10389b09286b8fdc028c0461fc697297
View Raw JSON Data
{
  "trx_id": "cb47667a10389b09286b8fdc028c0461fc697297",
  "block": 23967374,
  "trx_in_block": 44,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:53:48",
  "op": [
    "vote",
    {
      "voter": "ifttt",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 12:46:57
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authornatp
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180707t124352830z
title
bodyThank you for this article. I think it will help developers understand that RAM is not the end all be all and there are ways around it.
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #23967237/Trx b5da95f32b34cb7f3f7dff15bc4fa7e9e5ec5ba1
View Raw JSON Data
{
  "trx_id": "b5da95f32b34cb7f3f7dff15bc4fa7e9e5ec5ba1",
  "block": 23967237,
  "trx_in_block": 28,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:46:57",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "natp",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180707t124352830z",
      "title": "",
      "body": "Thank you for this article.  I think it will help developers understand that RAM is not the end all be all and there are ways around it.",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/07 12:46:27
parent authorleordev
parent permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
authornatp
permlinkre-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180707t124625748z
title
bodyThank you for this article. I think it will help developers understand that RAM is not the end all be all and there are ways around it.
json metadata{"tags":["eos"],"app":"steemit/0.1"}
Transaction InfoBlock #23967227/Trx 5222e362301e9651534916681591f27c31cdd4c9
View Raw JSON Data
{
  "trx_id": "5222e362301e9651534916681591f27c31cdd4c9",
  "block": 23967227,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:46:27",
  "op": [
    "comment",
    {
      "parent_author": "leordev",
      "parent_permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "author": "natp",
      "permlink": "re-leordev-eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3-20180707t124625748z",
      "title": "",
      "body": "Thank you for this article.  I think it will help developers understand that RAM is not the end all be all and there are ways around it.",
      "json_metadata": "{\"tags\":[\"eos\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2018/07/07 12:46:00
voterdan
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight9300 (93.00%)
Transaction InfoBlock #23967218/Trx 4bc9c6f2da504fda663bdc0b3a24379c968045cc
View Raw JSON Data
{
  "trx_id": "4bc9c6f2da504fda663bdc0b3a24379c968045cc",
  "block": 23967218,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:46:00",
  "op": [
    "vote",
    {
      "voter": "dan",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 9300
    }
  ]
}
2018/07/07 12:42:30
voterkesarito
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23967148/Trx 6541378ad30f3373696a94a33da1f54a67f31aa1
View Raw JSON Data
{
  "trx_id": "6541378ad30f3373696a94a33da1f54a67f31aa1",
  "block": 23967148,
  "trx_in_block": 32,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:42:30",
  "op": [
    "vote",
    {
      "voter": "kesarito",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 12:36:36
votercmadh
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight10000 (100.00%)
Transaction InfoBlock #23967030/Trx db7cd756c7821eab52ec9a855780fe4648783785
View Raw JSON Data
{
  "trx_id": "db7cd756c7821eab52ec9a855780fe4648783785",
  "block": 23967030,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:36:36",
  "op": [
    "vote",
    {
      "voter": "cmadh",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 10000
    }
  ]
}
2018/07/07 12:33:21
voterluigi-tecnologo
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
weight1300 (13.00%)
Transaction InfoBlock #23966966/Trx 2c3491396d1522788a9f9fff73033bd2929be42b
View Raw JSON Data
{
  "trx_id": "2c3491396d1522788a9f9fff73033bd2929be42b",
  "block": 23966966,
  "trx_in_block": 35,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:33:21",
  "op": [
    "vote",
    {
      "voter": "luigi-tecnologo",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "weight": 1300
    }
  ]
}
2018/07/07 12:26:39
parent author
parent permlinkeos
authorleordev
permlinkeos-todo-dapp-free-ram-model-and-state-management-eos-redux-3
titleEOS Todo Dapp - Free RAM Model and State Management - EOS + Redux = <3
body![](https://cdn.steemitimages.com/DQmcBeuKJS7Dx29mydRCjYiBYQ8CaC9dKqshseFs23im6BL/image.png) You probably heard about the benefits of working with immutable states. That's the whole base of the blockchain, in ugly words, a big immutable database (decentralized of course). I'm not entering in details of the advantages of immutability, it's already changing the world and you can see it in our lovely EOS blockchain. Now, inspired by the amazing [DecentTwitter FREE RAM Dapp](http://decentwitter.com/) built by @kesarito and also by our outrageous EOS RAM price, I was studying and playing with Free RAM models and what should go inside EOS `multi_index` tables and what does not. ## Functional Programming FTW Working a lot in the last years with functional languages like Elixir and Elm, you have something in common: Immutability. The state is immutable and you actually use functions to update the state. You are not really updating a state, you are always creating a new one as it's immutable. I would like to pick [The Elm Architecture](https://guide.elm-lang.org/architecture/) in this example, as it is the perfect fit for browsers (which I think is the best use case in how to handle a million things running in parallel - and that's what EOS will achieve soon). So this is the Elm Model-View-Update Architecture: ![](https://cdn.steemitimages.com/DQmd2fKtnS1jPEy7ADQenY5DTNjaKTetxBPnGqPwoL3ixsC/image.png) Does it not look like the **EOS Blockchain**? ![eos-blockchain.png](https://cdn.steemitimages.com/DQmNnAywJKEx34ueW9uPPF6SwGrGcVozEwQkaFMSX2qBrM6/eos-blockchain.png) *My dirty analogy of The Elm Architecture to EOS Blockchain Action/State update flow* Explaining my flow: 1. Actions: an user (or oracle) sign and push an action 2. Update State: this is our smart contract validating and updating the tables **(OPTIONAL!)** 3. Transaction: if your smart contract ran fine a new transaction is generated and added to the next block 4. Everything above on top of EOS Blockchain which is generating blocks (with or without new transactions) Yeah ok, maybe I'm just forcing something here but you will understand what I want to get if you follow me along. ## Optional RAM usage and introducing Redux to handle Data In the above EOS Blockchain actions flow step 2 I said that update table is optional. And indeed it is, check `DecentTwitter` contract actions now: ``` void tweet(std::string msg) {} void reply(std::string id, std::string msg) {} void avatar(std::string msg) {} ``` Fantastic! It just has empty body actions. It does not update any contract table, actually this contract has no table at all. You know what it means? There's no RAM cost. Free RAM Dapp! The question here is: how to extract/generate state and handle the action data for more complex cases like an edit action? That's where I came up with Redux idea to handle the state. Redux was heavily inspired on Elm Architecture and that's why I introduced the whole Elm story above. So what we want to do to have a safe and well-managed immutable state application from the blockchain is: 1. Listen to EOS blockchain actions relevant to our dapp, usually our contract actions only 2. Every time this new action arrives we dispatch a Redux action 3. Redux will handle the state update based on the action I think nothing like a real example to illustrate the case. Let's create a FREE RAM **TO-DO List** Dapp! (cliche...) ## EOS To-Do List Dapp This Dapp should allow us to handle our tasks in a to-do list fashion! ### EOS Smart Contract This is a *twenty-ish* lines contract, super simple: ``` #include <eosiolib/eosio.hpp> using namespace eosio; using std::string; class todo : public eosio::contract { public: todo(account_name self) :eosio::contract(self) {} void addtodo(uint64_t id, string text) {} void edittodo(uint64_t id, string text) {} void toggletodo(uint64_t id) {} }; EOSIO_ABI( todo, (addtodo)(edittodo)(toggletodo) ) ``` The contract has three simple empty body actions: 1. addtodo - allows you to create a new task on your todo list 2. edittodo - allows you to edit a task description on your todo list 3. toggletodo - allows you to mark a task as completed or unmark the completed flag ### Node.js Backend EOS Blockchain Listener with Redux store management Here I will explain how Redux will work and how I came up with this integration. If you can't understand it at all, please check https://redux.js.org/ - the Introduction and Basics chapter, real quick! First step: setup the actions we want to listen from EOS Blockchain, in my case I deployed the above todo contract in an account called `todo` in my single local node: ``` // actions mapping const ACTION_ADD_TODO = 'addtodo' const ACTION_EDIT_TODO = 'edittodo' const ACTION_TOGGLE_TODO = 'toggletodo' const CONTRACT_ACTIONS = [ { account: 'todo', actions: [ACTION_ADD_TODO, ACTION_EDIT_TODO, ACTION_TOGGLE_TODO] } ] ``` Second step: setup our initial state, how we want our store to look like. In our case it's just a simple `todo` list: ``` // state const initialState = { todos: [] } ``` From the above state we will listen the EOS Blockchain actions to decide how to store and manage the data. Third step: setup the application reducer. Reducer (what originates the Redux name) is just a function that takes state and action as arguments, and returns the **next state** of the app. (Note the next state here, it's very important. Remember we are immutable, we don't change anything.) This is the application reducer code: ``` // reducer const appReducer = (state = initialState, action) => { switch (action.type) { case ACTION_ADD_TODO: return addTodoReducer(state, action) case ACTION_EDIT_TODO: return editTodoReducer(state, action) case ACTION_TOGGLE_TODO: return toggleTodoReducer(state, action) default: // return the current state // if the action is unknown return state } } ``` So in the above code we check the action type (action name from EOS) to decide which reducer we will call to update our state, if it's an unknown/not-mapped action it just ignores and returns the same state. Add Todo reducer function - it checks if the id was never used and add to our todo list. Each todo has the fields `id`, `text`, `author` and `completed`: ``` const addTodoReducer = (state, action) => { // check and do not add new todo if this todo id // already exists if (state.todos.filter(todo => todo.id === action.data.id).length > 0) return state const newTodo = { id: action.data.id, text: action.data.text, author: action.authorization[0].actor, completed: false } const newTodos = [ ...state.todos, newTodo ] return { ...state, todos: newTodos } } ``` It's important to note above that we **NEVER** change the current state, we always create and return a new one. We do that because we are, again, immutable. It also allows us to have cool features like time-traveler debug, undo actions etc. Edit todo reducer - here we simply update the text of a todo, ONLY IF the actor for this action is the same as the one that created this todo task: ``` const editTodoReducer = (state, action) => { const updatedTodos = state.todos.map(todo => { if (todo.id === action.data.id && todo.author === action.authorization[0].actor) { return { ...todo, text: action.data.text // update text } } else { return todo } }) return { ...state, todos: updatedTodos } } ``` Toggle todo reducer - same as edit todo, it verifies if the actor is the same as the author of the task, this time it just toggles the `completed` boolean field: ``` const toggleTodoReducer = (state, action) => { const updatedTodos = state.todos.map(todo => { if (todo.id === action.data.id && todo.author === action.authorization[0].actor) { return { ...todo, completed: !todo.completed // toggle boolean } } else { return todo } }) return { ...state, todos: updatedTodos } } ``` Now the only thing left is to initialize the store! Here's the simple code: ``` // initialize redux store const store = createStore(appReducer) // Log the initial state console.log('>>> initial state: \n', store.getState(), '\n\n') // Every time the state changes, log it store.subscribe(() => console.log('>>> updated state: \n', store.getState(), '\n\n') ) ``` Actually only the first couple lines of the code is relevant. I'm just logging the initial state which prints this: ``` >>> initial state: { todos: [] } ``` And subscribing the state which prints the full state each time that we update the state. The cool thing about Redux subscription is that you could use it to serve websockets to dapp users or write to your database, and so on. The possibilities are endless. Finally the last step is to dispatch the Redux actions every time that we have a relevant action. The blockchain listener that I built is not relevant, because you probably have yours already done, but what I'm basically doing is listening to each new block in the chain, checking if it has any transaction inside this block, selecting all the actions of it and finally filtering and dispatching each one to our reducer: ``` const filterAndDispatchAction = (newAction, trxId, block) => { const action = { type: newAction.name, account: newAction.account, authorization: newAction.authorization, data: newAction.data } const subscribed = CONTRACT_ACTIONS.find(item => ( item.account === action.account && item.actions.indexOf(action.type) >= 0 )) if (subscribed) { console.log(`\nDispatching Action from Block ${block} - Trx ${trxId}:\n`, action, '\n\n') store.dispatch(action) } } ``` Remember the initial `CONTRACT_ACTIONS` we created in the beginning of this? Yes, it's finally being used to filter the relevant actions that you want. Also the `store` variable that contains the Redux state handler, is being used to dispatch the action received from the blockchain to our Redux store. This is how everything connects. If everything goes right you will see the following log in the console: ``` Dispatching Action from Block 81 - Trx a57a690978b78b18a3a5b2869d7734eb3da127147f256ff0ff74022f9adabd08: { type: 'addtodo', account: 'todo', authorization: [ { actor: 'eosio', permission: 'active' } ], data: { id: 1, text: 'I need to add a database' } } >>> updated state: { todos: [ { id: 1, text: 'I need to add a database', author: 'eosio', completed: false } ] } ``` ## Playing Todo Dapp using our backend Node.js Redux store application The whole code is in this repository: https://github.com/leordev/eos-redux-todo You can use the blockchain listener idea, it's super simple there and probably needs some polishing. Also I should refactor this code into different files, I just kept it simple with everything inside index.js ### Instructions to Deploy the Contract ``` cleos create account eosio todo OWNERPUBKEY ACTIVEPUBKEY cd eos-redux-todo/todo eosiocpp -o todo.wast todo.cpp eosiocpp -g todo.abi todo.cpp cleos set contract todo ../todo ``` ### Instructions to Init the Nodejs Redux Store Application ``` cd eos-redux-todo npm install node index.js ``` ### Demoing ![eos-redux-demo.gif](https://cdn.steemitimages.com/DQmVCf9pvM6xggzMihcCCiMmHBPDhgo2sQki3HnhGrC9bds/eos-redux-demo.gif) ## Wrapping it Up That's it folks, that's the best way that I found to handle store management from EOS Blockchain Actions, using Redux which is a very popular and solid tool created by [Dan Abramov](https://twitter.com/dan_abramov) from Facebook team. This is a nice library and has a lot of functionalities out-of-the-box like the subscription, it's easy to implement undo and time-traveling states. It's very mature and you have nice tooling around it like [redux-logger](https://github.com/evgenyrodionov/redux-logger) and [redux-devtools](https://github.com/reduxjs/redux-devtools). The 100% free RAM model is an interesting approach but I think it has some flaws. E.g. the way I'm filtering the editing/toggling in the todo record by author, I think it should be blocked in the EOS chain not allowing the transaction to be created, but actually we don't have a table inside the contract to match the todo ids with the respective authors. So if we have other apps consuming this contract it could wrongly consider that the todo was edited by a bad actor if it does not take care of this very same filter rule that we did in our application. I would love to hear your feedbacks in how you are managing this and your thoughts in this approach. After we have solid progress in this Redux integration and some use cases with standardized actions I could wrap it up in a JS library and integrate with eosjs. That would be nice, just not sure if it makes sense yet. See you all!
json metadata{"tags":["eos","blockchain","smartcontracts","freeram"],"users":["kesarito"],"image":["https://cdn.steemitimages.com/DQmcBeuKJS7Dx29mydRCjYiBYQ8CaC9dKqshseFs23im6BL/image.png","https://cdn.steemitimages.com/DQmd2fKtnS1jPEy7ADQenY5DTNjaKTetxBPnGqPwoL3ixsC/image.png","https://cdn.steemitimages.com/DQmNnAywJKEx34ueW9uPPF6SwGrGcVozEwQkaFMSX2qBrM6/eos-blockchain.png","https://cdn.steemitimages.com/DQmVCf9pvM6xggzMihcCCiMmHBPDhgo2sQki3HnhGrC9bds/eos-redux-demo.gif"],"links":["http://decentwitter.com/","https://guide.elm-lang.org/architecture/","https://redux.js.org/","https://github.com/leordev/eos-redux-todo","https://twitter.com/dan_abramov","https://github.com/evgenyrodionov/redux-logger","https://github.com/reduxjs/redux-devtools"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #23966832/Trx f20c1339a03a0dc4a6a5ef82cce05b57331ea20a
View Raw JSON Data
{
  "trx_id": "f20c1339a03a0dc4a6a5ef82cce05b57331ea20a",
  "block": 23966832,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T12:26:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "eos",
      "author": "leordev",
      "permlink": "eos-todo-dapp-free-ram-model-and-state-management-eos-redux-3",
      "title": "EOS Todo Dapp - Free RAM Model and State Management - EOS + Redux = <3",
      "body": "![](https://cdn.steemitimages.com/DQmcBeuKJS7Dx29mydRCjYiBYQ8CaC9dKqshseFs23im6BL/image.png)\n\nYou probably heard about the benefits of working with immutable states. That's the whole base of the blockchain, in ugly words, a big immutable database (decentralized of course). I'm not entering in details of the advantages of immutability, it's already changing the world and you can see it in our lovely EOS blockchain.\n\nNow, inspired by the amazing [DecentTwitter FREE RAM Dapp](http://decentwitter.com/) built by @kesarito and also by our outrageous EOS RAM price, I was studying and playing with Free RAM models and what should go inside EOS `multi_index` tables and what does not.\n\n## Functional Programming FTW\n\nWorking a lot in the last years with functional languages like Elixir and Elm, you have something in common: Immutability. The state is immutable and you actually use functions to update the state. You are not really updating a state, you are always creating a new one as it's immutable.\n\nI would like to pick [The Elm Architecture](https://guide.elm-lang.org/architecture/) in this example, as it is the perfect fit for browsers (which I think is the best use case in how to handle a million things running in parallel - and that's what EOS will achieve soon). So this is the Elm Model-View-Update Architecture:\n\n![](https://cdn.steemitimages.com/DQmd2fKtnS1jPEy7ADQenY5DTNjaKTetxBPnGqPwoL3ixsC/image.png)\n\nDoes it not look like the **EOS Blockchain**?\n\n![eos-blockchain.png](https://cdn.steemitimages.com/DQmNnAywJKEx34ueW9uPPF6SwGrGcVozEwQkaFMSX2qBrM6/eos-blockchain.png)\n*My dirty analogy of The Elm Architecture to EOS Blockchain Action/State update flow*\n\nExplaining my flow:\n\n1. Actions: an user (or oracle) sign and push an action\n2. Update State: this is our smart contract validating and updating the tables **(OPTIONAL!)**\n3. Transaction: if your smart contract ran fine a new transaction is generated and added to the next block\n4. Everything above on top of EOS Blockchain which is generating blocks (with or without new transactions)\n\nYeah ok, maybe I'm just forcing something here but you will understand what I want to get if you follow me along.\n\n## Optional RAM usage and introducing Redux to handle Data\n\nIn the above EOS Blockchain actions flow step 2 I said that update table is optional. And indeed it is, check `DecentTwitter` contract actions now:\n\n```\n      void tweet(std::string msg) {}\n      void reply(std::string id, std::string msg) {}\n      void avatar(std::string msg) {}\n```\n\nFantastic! It just has empty body actions. It does not update any contract table, actually this contract has no table at all. You know what it means? There's no RAM cost. Free RAM Dapp!\n\nThe question here is: how to extract/generate state and handle the action data for more complex cases like an edit action? That's where I came up with Redux idea to handle the state. Redux was heavily inspired on Elm Architecture and that's why I introduced the whole Elm story above.\n\nSo what we want to do to have a safe and well-managed immutable state application from the blockchain is:\n\n1. Listen to EOS blockchain actions relevant to our dapp, usually our contract actions only\n2. Every time this new action arrives we dispatch a Redux action\n3. Redux will handle the state update based on the action\n\nI think nothing like a real example to illustrate the case. Let's create a FREE RAM **TO-DO List** Dapp! (cliche...)\n\n## EOS To-Do List Dapp\n\nThis Dapp should allow us to handle our tasks in a to-do list fashion!\n\n### EOS Smart Contract\n\nThis is a *twenty-ish* lines contract, super simple:\n\n```\n#include <eosiolib/eosio.hpp>\n\nusing namespace eosio;\nusing std::string;\n\nclass todo : public eosio::contract {\n  public:\n      todo(account_name self)\n      :eosio::contract(self)\n      {}\n\n      void addtodo(uint64_t id, string text) {}\n      void edittodo(uint64_t id, string text) {}\n      void toggletodo(uint64_t id) {}\n\n};\n\nEOSIO_ABI( todo, (addtodo)(edittodo)(toggletodo) )\n```\n\nThe contract has three simple empty body actions:\n\n1. addtodo - allows you to create a new task on your todo list\n2. edittodo - allows you to edit a task description on your todo list\n3. toggletodo - allows you to mark a task as completed or unmark the completed flag\n\n### Node.js Backend EOS Blockchain Listener with Redux store management\n\nHere I will explain how Redux will work and how I came up with this integration. If you can't understand it at all, please check https://redux.js.org/ - the Introduction and Basics chapter, real quick!\n\nFirst step: setup the actions we want to listen from EOS Blockchain, in my case I deployed the above todo contract in an account called `todo` in my single local node:\n\n```\n// actions mapping\nconst ACTION_ADD_TODO = 'addtodo'\nconst ACTION_EDIT_TODO = 'edittodo'\nconst ACTION_TOGGLE_TODO = 'toggletodo'\n\nconst CONTRACT_ACTIONS = [\n  {\n    account: 'todo',\n    actions: [ACTION_ADD_TODO, ACTION_EDIT_TODO, ACTION_TOGGLE_TODO]\n  }\n]\n```\n\nSecond step: setup our initial state, how we want our store to look like. In our case it's just a simple `todo` list: \n\n```\n// state\nconst initialState = {\n  todos: []\n}\n```\n\nFrom the above state we will listen the EOS Blockchain actions to decide how to store and manage the data.\n\nThird step: setup the application reducer. Reducer (what originates the Redux name) is just a function that takes state and action as arguments, and returns the **next state** of the app. (Note the next state here, it's very important. Remember we are immutable, we don't change anything.)\n\nThis is the application reducer code:\n\n```\n// reducer\nconst appReducer = (state = initialState, action) => {\n  switch (action.type) {\n    case ACTION_ADD_TODO:\n      return addTodoReducer(state, action)\n    case ACTION_EDIT_TODO:\n      return editTodoReducer(state, action)\n    case ACTION_TOGGLE_TODO:\n      return toggleTodoReducer(state, action)\n    default:\n      // return the current state\n      // if the action is unknown\n      return state\n  }\n}\n```\n\nSo in the above code we check the action type (action name from EOS) to decide which reducer we will call to update our state, if it's an unknown/not-mapped action it just ignores and returns the same state. \n\nAdd Todo reducer function - it checks if the id was never used and add to our todo list. Each todo has the fields `id`, `text`, `author` and `completed`:\n\n```\nconst addTodoReducer = (state, action) => {\n  \n  // check and do not add new todo if this todo id\n  // already exists\n  if (state.todos.filter(todo => todo.id === action.data.id).length > 0)\n    return state\n  \n  const newTodo = {\n    id: action.data.id,\n    text: action.data.text,\n    author: action.authorization[0].actor,\n    completed: false\n  }\n\n  const newTodos = [ ...state.todos, newTodo ]\n\n  return { ...state, todos: newTodos }\n}\n```\n\nIt's important to note above that we **NEVER** change the current state, we always create and return a new one. We do that because we are, again, immutable. It also allows us to have cool features like time-traveler debug, undo actions etc.\n\nEdit todo reducer - here we simply update the text of a todo, ONLY IF the actor for this action is the same as the one that created this todo task:\n\n```\nconst editTodoReducer = (state, action) => {\n  const updatedTodos = state.todos.map(todo => {\n    if (todo.id === action.data.id &&\n      todo.author === action.authorization[0].actor) {\n      return {\n        ...todo,\n        text: action.data.text  // update text\n      }\n    } else {\n      return todo\n    }\n  })\n\n  return { ...state, todos: updatedTodos }\n}\n```\n\nToggle todo reducer - same as edit todo, it verifies if the actor is the same as the author of the task, this time it just toggles the `completed` boolean field:\n\n```\nconst toggleTodoReducer = (state, action) => {\n  const updatedTodos = state.todos.map(todo => {\n    if (todo.id === action.data.id &&\n      todo.author === action.authorization[0].actor) {\n      return {\n        ...todo,\n        completed: !todo.completed  // toggle boolean\n      }\n    } else {\n      return todo\n    }\n  })\n\n  return { ...state, todos: updatedTodos }\n}\n```\n\nNow the only thing left is to initialize the store! Here's the simple code:\n\n```\n// initialize redux store\nconst store = createStore(appReducer)\n\n// Log the initial state\nconsole.log('>>> initial state: \\n', store.getState(), '\\n\\n')\n\n// Every time the state changes, log it\nstore.subscribe(() =>\n  console.log('>>> updated state: \\n', store.getState(), '\\n\\n')\n)\n```\n\nActually only the first couple lines of the code is relevant. I'm just logging the initial state which prints this:\n\n```\n>>> initial state:\n { todos: [] }\n```\n\nAnd subscribing the state which prints the full state each time that we update the state. The cool thing about Redux subscription is that you could use it to serve websockets to dapp users or write to your database, and so on. The possibilities are endless.\n\nFinally the last step is to dispatch the Redux actions every time that we have a relevant action. The blockchain listener that I built is not relevant, because you probably have yours already done, but what I'm basically doing is listening to each new block in the chain, checking if it has any transaction inside this block, selecting all the actions of it and finally filtering and dispatching each one to our reducer:\n\n```\nconst filterAndDispatchAction = (newAction, trxId, block) => {\n  const action = {\n    type: newAction.name,\n    account: newAction.account,\n    authorization: newAction.authorization,\n    data: newAction.data\n  }\n\n  const subscribed = CONTRACT_ACTIONS.find(item => (\n    item.account === action.account &&\n      item.actions.indexOf(action.type) >= 0\n  ))\n\n  if (subscribed) {\n    console.log(`\\nDispatching Action from Block ${block} - Trx ${trxId}:\\n`,\n      action, '\\n\\n')\n    store.dispatch(action)\n  }\n\n}\n```\n\nRemember the initial `CONTRACT_ACTIONS` we created in the beginning of this? Yes, it's finally being used to filter the relevant actions that you want.\n\nAlso the `store` variable that contains the Redux state handler, is being used to dispatch the action received from the blockchain to our Redux store. This is how everything connects. If everything goes right you will see the following log in the console:\n\n```\nDispatching Action from Block 81 - Trx a57a690978b78b18a3a5b2869d7734eb3da127147f256ff0ff74022f9adabd08:\n { type: 'addtodo',\n  account: 'todo',\n  authorization: [ { actor: 'eosio', permission: 'active' } ],\n  data: { id: 1, text: 'I need to add a database' } }\n\n\n>>> updated state:\n { todos:\n   [ { id: 1,\n       text: 'I need to add a database',\n       author: 'eosio',\n       completed: false } ] }\n```\n\n## Playing Todo Dapp using our backend Node.js Redux store application\n\nThe whole code is in this repository: https://github.com/leordev/eos-redux-todo \n\nYou can use the blockchain listener idea, it's super simple there and probably needs some polishing. Also I should refactor this code into different files, I just kept it simple with everything inside index.js\n\n### Instructions to Deploy the Contract\n\n```\ncleos create account eosio todo OWNERPUBKEY ACTIVEPUBKEY\ncd eos-redux-todo/todo\neosiocpp -o todo.wast todo.cpp\neosiocpp -g todo.abi todo.cpp\ncleos set contract todo ../todo\n```\n\n### Instructions to Init the Nodejs Redux Store Application\n\n```\ncd eos-redux-todo\nnpm install\nnode index.js \n```\n\n### Demoing\n\n![eos-redux-demo.gif](https://cdn.steemitimages.com/DQmVCf9pvM6xggzMihcCCiMmHBPDhgo2sQki3HnhGrC9bds/eos-redux-demo.gif)\n\n## Wrapping it Up\n\nThat's it folks, that's the best way that I found to handle store management from EOS Blockchain Actions, using Redux which is a very popular and solid tool created by [Dan Abramov](https://twitter.com/dan_abramov) from Facebook team. This is a nice library and has a lot of functionalities out-of-the-box like the subscription, it's easy to implement undo and time-traveling states. It's very mature and you have nice tooling around it like [redux-logger](https://github.com/evgenyrodionov/redux-logger) and [redux-devtools](https://github.com/reduxjs/redux-devtools).\n\nThe 100% free RAM model is an interesting approach but I think it has some flaws. E.g. the way I'm filtering the editing/toggling in the todo record by author, I think it should be blocked in the EOS chain not allowing the transaction to be created, but actually we don't have a table inside the contract to match the todo ids with the respective authors. So if we have other apps consuming this contract it could wrongly consider that the todo was edited by a bad actor if it does not take care of this very same filter rule that we did in our application.\n\nI would love to hear your feedbacks in how you are managing this and your thoughts in this approach. After we have solid progress in this Redux integration and some use cases with standardized actions I could wrap it up in a JS library and integrate with eosjs. That would be nice, just not sure if it makes sense yet. See you all!",
      "json_metadata": "{\"tags\":[\"eos\",\"blockchain\",\"smartcontracts\",\"freeram\"],\"users\":[\"kesarito\"],\"image\":[\"https://cdn.steemitimages.com/DQmcBeuKJS7Dx29mydRCjYiBYQ8CaC9dKqshseFs23im6BL/image.png\",\"https://cdn.steemitimages.com/DQmd2fKtnS1jPEy7ADQenY5DTNjaKTetxBPnGqPwoL3ixsC/image.png\",\"https://cdn.steemitimages.com/DQmNnAywJKEx34ueW9uPPF6SwGrGcVozEwQkaFMSX2qBrM6/eos-blockchain.png\",\"https://cdn.steemitimages.com/DQmVCf9pvM6xggzMihcCCiMmHBPDhgo2sQki3HnhGrC9bds/eos-redux-demo.gif\"],\"links\":[\"http://decentwitter.com/\",\"https://guide.elm-lang.org/architecture/\",\"https://redux.js.org/\",\"https://github.com/leordev/eos-redux-todo\",\"https://twitter.com/dan_abramov\",\"https://github.com/evgenyrodionov/redux-logger\",\"https://github.com/reduxjs/redux-devtools\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2018/07/07 11:19:57
voterdrop-bear-beryl
authorleordev
permlinkeos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop
weight10000 (100.00%)
Transaction InfoBlock #23965498/Trx f31a2b45b7a7a6ece25eb1c291b2e6b2a638fc9a
View Raw JSON Data
{
  "trx_id": "f31a2b45b7a7a6ece25eb1c291b2e6b2a638fc9a",
  "block": 23965498,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T11:19:57",
  "op": [
    "vote",
    {
      "voter": "drop-bear-beryl",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-2-tokens-claiming-and-achieving-zero-cost-airdrop",
      "weight": 10000
    }
  ]
}
steemdelegated 10.984 SP to @leordev
2018/07/07 10:50:09
delegatorsteem
delegateeleordev
vesting shares17886.254596 VESTS
Transaction InfoBlock #23964902/Trx 9f6d9dc633936dadff89624ae59d706fa7f50e6f
View Raw JSON Data
{
  "trx_id": "9f6d9dc633936dadff89624ae59d706fa7f50e6f",
  "block": 23964902,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T10:50:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "leordev",
      "vesting_shares": "17886.254596 VESTS"
    }
  ]
}
leordevclaimed reward balance: 2.701 STEEM, 4.037 SBD, 6.620 SP
2018/07/07 09:16:24
accountleordev
reward steem2.701 STEEM
reward sbd4.037 SBD
reward vests10779.484162 VESTS
Transaction InfoBlock #23963027/Trx a3bce3ca4965120f42ddd9d1898b023c2cba84e6
View Raw JSON Data
{
  "trx_id": "a3bce3ca4965120f42ddd9d1898b023c2cba84e6",
  "block": 23963027,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-07T09:16:24",
  "op": [
    "claim_reward_balance",
    {
      "account": "leordev",
      "reward_steem": "2.701 STEEM",
      "reward_sbd": "4.037 SBD",
      "reward_vests": "10779.484162 VESTS"
    }
  ]
}
2018/07/04 00:29:51
votermuguika
authorleordev
permlinkeos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet
weight10000 (100.00%)
Transaction InfoBlock #23866226/Trx 4c5177b5c11457d4ca47cca3777719efad8bec70
View Raw JSON Data
{
  "trx_id": "4c5177b5c11457d4ca47cca3777719efad8bec70",
  "block": 23866226,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-07-04T00:29:51",
  "op": [
    "vote",
    {
      "voter": "muguika",
      "author": "leordev",
      "permlink": "eos-ram-and-bandwith-analysis-airdropping-steps-on-junglenet",
      "weight": 10000
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://leordev.github.io/assets/img/leo.jpg","cover_image":"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg","name":"Leo","about":"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!","location":"Fort Lauderdale, FL","website":"https://leordev.github.io/"}
JSON METADATA
profile{"profile_image":"https://leordev.github.io/assets/img/leo.jpg","cover_image":"https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg","name":"Leo","about":"Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!","location":"Fort Lauderdale, FL","website":"https://leordev.github.io/"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://leordev.github.io/assets/img/leo.jpg",
      "cover_image": "https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg",
      "name": "Leo",
      "about": "Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!",
      "location": "Fort Lauderdale, FL",
      "website": "https://leordev.github.io/"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://leordev.github.io/assets/img/leo.jpg",
      "cover_image": "https://nofilmschool.com/sites/default/files/styles/article_wide/public/ideas_0.jpg",
      "name": "Leo",
      "about": "Fullstack developer that loves to learn new stuff and code - felt in love with functional programming and blockchain!",
      "location": "Fort Lauderdale, FL",
      "website": "https://leordev.github.io/"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM5XZkQwa6kNaHa2cSPCm1Ydi67EwWnUC3nWRnyUDEiYh5pBt7yE1/1
Active
Single Signature
Public Keys
STM7H2cEPZCiQ6PTL5xJr33Tc8f749MS2XY6moYxaFPeiTjPL21391/1
Posting
Single Signature
Public Keys
STM8NYeHMANZcNutqhHdKDjgHn4BU67WhWYYz61gSWiQ9t7hth7Aw1/1
App Permissions
Memo
STM7beLUTtcgzBcNDUGLhbHWvTz4bhGthHW3i4SXdoxn2fUBk3BkS
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5XZkQwa6kNaHa2cSPCm1Ydi67EwWnUC3nWRnyUDEiYh5pBt7yE",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7H2cEPZCiQ6PTL5xJr33Tc8f749MS2XY6moYxaFPeiTjPL2139",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [
      [
        "busy.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM8NYeHMANZcNutqhHdKDjgHn4BU67WhWYYz61gSWiQ9t7hth7Aw",
        1
      ]
    ]
  },
  "memo": "STM7beLUTtcgzBcNDUGLhbHWvTz4bhGthHW3i4SXdoxn2fUBk3BkS"
}

Witness Votes

0 / 30
No active witness votes.
[]