VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS52.87%
Net Worth
15.769USD
STEEM
0.109STEEM
SBD
31.731SBD
Own SP
9.176SP
Detailed Balance
| STEEM | ||
| balance | 0.109STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 9.176SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 0.000SP | SP |
| Effective Power | 9.176SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 31.731SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.109 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "14924.662433 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "0.000000 VESTS",
"sbd_balance": "31.731 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | xenetics |
| id | 578855 |
| rank | 138,346 |
| reputation | 190970083598 |
| created | 2018-01-08T01:55:39 |
| recovery_account | steem |
| proxy | None |
| post_count | 89 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-08-30T12:42:21 |
| last_root_post | 2018-08-30T12:42:21 |
| last_vote_time | 2018-08-31T13:03:39 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.109 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 31.731 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 14924.662433 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 0.000000 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2018-01-10T14:07:51 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 2018-09-16T03:32:48 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM6cMRQxFkj2y4bQgURNSM6wX6uM9XpnyPqV5ZJiNxAgdQxx5Jca",
1
]
],
"weight_threshold": 1
},
"balance": "0.109 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2018-01-08T01:55:39",
"curation_rewards": 37,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 3731165609,
"last_update_time": 1588959333
},
"guest_bloggers": [],
"id": 578855,
"json_metadata": "{\"profile\":{\"profile_image\":\"https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg\",\"name\":\"xenetics\",\"about\":\"Software Engineer in Toyko, Japan\",\"location\":\"Tokyo\",\"website\":\"https://www.github.com/lmiller1990\"}}",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "2018-01-10T14:07:51",
"last_owner_update": "1970-01-01T00:00:00",
"last_post": "2018-08-30T12:42:21",
"last_root_post": "2018-08-30T12:42:21",
"last_vote_time": "2018-08-31T13:03:39",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM63f1ezaskwr6N4s2Qk8HYbTGJ1nXvqY79U9AVg8E64wz3k3U9R",
"mined": false,
"name": "xenetics",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6oC1amoXZvwnysPvEPqWfK2jxfQxCht2rbsVQv91k6w1AqiH7i",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 89,
"post_history": [],
"posting": {
"account_auths": [
[
"busy.app",
1
],
[
"utopian.app",
1
]
],
"key_auths": [
[
"STM6vNnS2y4MjVZpbm2fnsPYaZ5jK1oXTSYdbEteGfa3YqPZ8nW23",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg\",\"name\":\"xenetics\",\"about\":\"Software Engineer in Toyko, Japan\",\"location\":\"Tokyo\",\"website\":\"https://www.github.com/lmiller1990\"}}",
"posting_rewards": 13495,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "0.000000 VESTS",
"recovery_account": "steem",
"reputation": "190970083598",
"reset_account": "null",
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"sbd_balance": "31.731 SBD",
"sbd_last_interest_payment": "2018-09-16T03:32:48",
"sbd_seconds": "0",
"sbd_seconds_last_update": "2018-09-16T03:32:48",
"tags_usage": [],
"to_withdraw": 0,
"transfer_history": [],
"vesting_balance": "0.000 STEEM",
"vesting_shares": "14924.662433 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "14924662433",
"last_update_time": 1588959333
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 138346
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2025/12/30 15:01:39
2025/12/30 15:01:39
| author | johnasp96 |
| body | Deleted |
| json metadata | {"app":"steemit/0.2"} |
| parent author | xenetics |
| parent permlink | re-johnasp96-im-here-20180108t150148195z |
| permlink | re-xenetics-re-johnasp96-im-here-20180108t151005422z |
| title | |
| Transaction Info | Block #102170940/Trx e473897b7cff04080d3a738fbb6da538da594e8f |
View Raw JSON Data
{
"block": 102170940,
"op": [
"comment",
{
"author": "johnasp96",
"body": "Deleted",
"json_metadata": "{\"app\":\"steemit/0.2\"}",
"parent_author": "xenetics",
"parent_permlink": "re-johnasp96-im-here-20180108t150148195z",
"permlink": "re-xenetics-re-johnasp96-im-here-20180108t151005422z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2025-12-30T15:01:39",
"trx_id": "e473897b7cff04080d3a738fbb6da538da594e8f",
"trx_in_block": 0,
"virtual_op": 0
}2020/05/08 17:35:33
2020/05/08 17:35:33
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 0.000000 VESTS |
| Transaction Info | Block #43202797/Trx 6bec42012a1a3e5fdd3ef0f5b8ed1a3d51b95719 |
View Raw JSON Data
{
"block": 43202797,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "0.000000 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T17:35:33",
"trx_id": "6bec42012a1a3e5fdd3ef0f5b8ed1a3d51b95719",
"trx_in_block": 6,
"virtual_op": 0
}arthur.grafo4replied to @xenetics / q62eyj2020/02/21 18:50:00
arthur.grafo4replied to @xenetics / q62eyj
2020/02/21 18:50:00
| author | arthur.grafo4 |
| body | So glad to discover you - though I did not find you here, but on Medium. I am struggling to understand your first article but I am not a coder and I will have to find those who can help me in that field. What I am curious about, since it affects my ability to create a platform, is what are the costs (for instance, Steem has to pay for blocks to be created, so I assume they charge a fee?) Do I just get a coder to create according to your lessons, or do I have to contact those who run Steem to make some kind of arrangement? Where would I find them? Basically, as must be obvious to you, I know very little about creating a platform, just so-so at using one. What I do know is how to run a business. For me to handle that side of it so that I can decide whether I should create a platform, is information as to costs and how to get permission, if needed. Are platforms like Palnet made in the manner you are teaching in your lessons? I hope you will reply, as all those I have approached on Steemit have not shown me the courtesy of a reply. |
| json metadata | {"app":"steemit/0.2"} |
| parent author | xenetics |
| parent permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| permlink | q62eyj |
| title | |
| Transaction Info | Block #41020736/Trx 9272e67004315da29957244a0606fc7284efcaca |
View Raw JSON Data
{
"block": 41020736,
"op": [
"comment",
{
"author": "arthur.grafo4",
"body": "So glad to discover you - though I did not find you here, but on Medium.\n\nI am struggling to understand your first article but I am not a coder and I will have to find those who can help me in that field.\n\nWhat I am curious about, since it affects my ability to create a platform, is what are the costs (for instance, Steem has to pay for blocks to be created, so I assume they charge a fee?)\n\nDo I just get a coder to create according to your lessons, or do I have to contact those who run Steem to make some kind of arrangement? Where would I find them?\n\nBasically, as must be obvious to you, I know very little about creating a platform, just so-so at using one. What I do know is how to run a business. For me to handle that side of it so that I can decide whether I should create a platform, is information as to costs and how to get permission, if needed. Are platforms like Palnet made in the manner you are teaching in your lessons?\n\nI hope you will reply, as all those I have approached on Steemit have not shown me the courtesy of a reply.",
"json_metadata": "{\"app\":\"steemit/0.2\"}",
"parent_author": "xenetics",
"parent_permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"permlink": "q62eyj",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2020-02-21T18:50:00",
"trx_id": "9272e67004315da29957244a0606fc7284efcaca",
"trx_in_block": 2,
"virtual_op": 0
}2020/01/08 03:01:48
2020/01/08 03:01:48
| author | steemitboard |
| body | Congratulations @xenetics! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@xenetics/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/@xenetics) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=xenetics)_</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"]} |
| parent author | xenetics |
| parent permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| permlink | steemitboard-notify-xenetics-20200108t030147000z |
| title | |
| Transaction Info | Block #39737187/Trx d226ab0f92343133537974e1f6fadfd54a917df1 |
View Raw JSON Data
{
"block": 39737187,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @xenetics! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@xenetics/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/@xenetics) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=xenetics)_</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\"]}",
"parent_author": "xenetics",
"parent_permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"permlink": "steemitboard-notify-xenetics-20200108t030147000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2020-01-08T03:01:48",
"trx_id": "d226ab0f92343133537974e1f6fadfd54a917df1",
"trx_in_block": 6,
"virtual_op": 0
}2019/01/08 03:49:39
2019/01/08 03:49:39
| author | steemitboard |
| body | Congratulations @xenetics! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@xenetics/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@xenetics)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steem/@steemitboard/steemwhales-has-officially-moved-to-steemitboard-ranking"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png"></a></td><td><a href="https://steemit.com/steem/@steemitboard/steemwhales-has-officially-moved-to-steemitboard-ranking">SteemWhales has officially moved to SteemitBoard Ranking</a></td></tr><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-01-07"><img src="https://steemitimages.com/64x128/http://i.cubeupload.com/7CiQEO.png"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-01-07">SteemitBoard - Witness Update</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"]} |
| parent author | xenetics |
| parent permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| permlink | steemitboard-notify-xenetics-20190108t034938000z |
| title | |
| Transaction Info | Block #29265133/Trx 2eb81b4f0b9852ad37c4edad8310a231f01cfa1f |
View Raw JSON Data
{
"block": 29265133,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @xenetics! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@xenetics/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@xenetics)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steem/@steemitboard/steemwhales-has-officially-moved-to-steemitboard-ranking\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png\"></a></td><td><a href=\"https://steemit.com/steem/@steemitboard/steemwhales-has-officially-moved-to-steemitboard-ranking\">SteemWhales has officially moved to SteemitBoard Ranking</a></td></tr><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-01-07\"><img src=\"https://steemitimages.com/64x128/http://i.cubeupload.com/7CiQEO.png\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-witness-update-2019-01-07\">SteemitBoard - Witness Update</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\"]}",
"parent_author": "xenetics",
"parent_permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"permlink": "steemitboard-notify-xenetics-20190108t034938000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-01-08T03:49:39",
"trx_id": "2eb81b4f0b9852ad37c4edad8310a231f01cfa1f",
"trx_in_block": 1,
"virtual_op": 0
}2018/12/03 05:01:24
2018/12/03 05:01:24
| author | xenetics |
| permlink | hi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan |
| voter | prospector |
| weight | 10000 (100.00%) |
| Transaction Info | Block #28230502/Trx 29b6f9eb8df43899e65655c09a312316ca9a5035 |
View Raw JSON Data
{
"block": 28230502,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "hi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan",
"voter": "prospector",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-12-03T05:01:24",
"trx_id": "29b6f9eb8df43899e65655c09a312316ca9a5035",
"trx_in_block": 11,
"virtual_op": 0
}2018/11/30 13:05:36
2018/11/30 13:05:36
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 2013.551191 VESTS |
| Transaction Info | Block #28153813/Trx 8718db9da5df159e0a3806d0cdefb9adb88a9643 |
View Raw JSON Data
{
"block": 28153813,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "2013.551191 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-11-30T13:05:36",
"trx_id": "8718db9da5df159e0a3806d0cdefb9adb88a9643",
"trx_in_block": 19,
"virtual_op": 0
}2018/09/16 03:53:30
2018/09/16 03:53:30
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 15401.158356 VESTS |
| Transaction Info | Block #25999985/Trx 98f1c26654b7e4e86cca28520f16e7d3793fec3a |
View Raw JSON Data
{
"block": 25999985,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "15401.158356 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-09-16T03:53:30",
"trx_id": "98f1c26654b7e4e86cca28520f16e7d3793fec3a",
"trx_in_block": 0,
"virtual_op": 0
}xeneticsclaimed reward balance: 0.108 STEEM, 0.136 SP2018/09/16 03:32:48
xeneticsclaimed reward balance: 0.108 STEEM, 0.136 SP
2018/09/16 03:32:48
| account | xenetics |
| reward sbd | 0.000 SBD |
| reward steem | 0.108 STEEM |
| reward vests | 220.517941 VESTS |
| Transaction Info | Block #25999571/Trx 6f33085da5fabf66c63e0af2d384b283cae77f49 |
View Raw JSON Data
{
"block": 25999571,
"op": [
"claim_reward_balance",
{
"account": "xenetics",
"reward_sbd": "0.000 SBD",
"reward_steem": "0.108 STEEM",
"reward_vests": "220.517941 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-09-16T03:32:48",
"trx_id": "6f33085da5fabf66c63e0af2d384b283cae77f49",
"trx_in_block": 21,
"virtual_op": 0
}xeneticsreceived 0.108 STEEM, 0.136 SP author reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt2018/09/03 15:57:27
xeneticsreceived 0.108 STEEM, 0.136 SP author reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
2018/09/03 15:57:27
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| sbd payout | 0.000 SBD |
| steem payout | 0.108 STEEM |
| vesting payout | 220.517941 VESTS |
| Transaction Info | Block #25640179/Virtual Operation #12 |
View Raw JSON Data
{
"block": 25640179,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.108 STEEM",
"vesting_payout": "220.517941 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-09-03T15:57:27",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 12
}xeneticsupvoted (100.00%) @jeffbernst / simplefol-io-a-simple-cryptocurrency-portfolio-app2018/08/31 13:04:30
xeneticsupvoted (100.00%) @jeffbernst / simplefol-io-a-simple-cryptocurrency-portfolio-app
2018/08/31 13:04:30
| author | jeffbernst |
| permlink | simplefol-io-a-simple-cryptocurrency-portfolio-app |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25550394/Trx e22f997c71fb802befdf853b131a1fbfcbe9a8cc |
View Raw JSON Data
{
"block": 25550394,
"op": [
"vote",
{
"author": "jeffbernst",
"permlink": "simplefol-io-a-simple-cryptocurrency-portfolio-app",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-31T13:04:30",
"trx_id": "e22f997c71fb802befdf853b131a1fbfcbe9a8cc",
"trx_in_block": 10,
"virtual_op": 0
}xeneticsupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/31 13:03:39
xeneticsupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/31 13:03:39
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25550377/Trx bcac1d7e0244b1865dfd6a24ad273f8440aa3d38 |
View Raw JSON Data
{
"block": 25550377,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-31T13:03:39",
"trx_id": "bcac1d7e0244b1865dfd6a24ad273f8440aa3d38",
"trx_in_block": 34,
"virtual_op": 0
}jeffbernstupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:10:33
jeffbernstupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:10:33
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | jeffbernst |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521725/Trx e2f6f71fd6a9b13e171609c442d75654fd1471d9 |
View Raw JSON Data
{
"block": 25521725,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "jeffbernst",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:10:33",
"trx_id": "e2f6f71fd6a9b13e171609c442d75654fd1471d9",
"trx_in_block": 25,
"virtual_op": 0
}golfingglugupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:10:27
golfingglugupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:10:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | golfingglug |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521723/Trx de68f1d87cdb671706b858583c34802cf50d042a |
View Raw JSON Data
{
"block": 25521723,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "golfingglug",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:10:27",
"trx_id": "de68f1d87cdb671706b858583c34802cf50d042a",
"trx_in_block": 9,
"virtual_op": 0
}andrei8upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:10:27
andrei8upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:10:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | andrei8 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521723/Trx 4dc98f00a22d858fd2ce6135e614ec7de671b0d5 |
View Raw JSON Data
{
"block": 25521723,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "andrei8",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:10:27",
"trx_id": "4dc98f00a22d858fd2ce6135e614ec7de671b0d5",
"trx_in_block": 7,
"virtual_op": 0
}vorovskoy44upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:08:27
vorovskoy44upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:08:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | vorovskoy44 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521683/Trx 9a8fccbdf3ce9e1be23af91e27438dc9850f2a21 |
View Raw JSON Data
{
"block": 25521683,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "vorovskoy44",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:08:27",
"trx_id": "9a8fccbdf3ce9e1be23af91e27438dc9850f2a21",
"trx_in_block": 14,
"virtual_op": 0
}stimulusmaybeupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:08:27
stimulusmaybeupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:08:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | stimulusmaybe |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521683/Trx f1abff32ebde433c1bcdc15071053a09fb5cbc56 |
View Raw JSON Data
{
"block": 25521683,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "stimulusmaybe",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:08:27",
"trx_id": "f1abff32ebde433c1bcdc15071053a09fb5cbc56",
"trx_in_block": 10,
"virtual_op": 0
}silicaundoupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:06:27
silicaundoupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:06:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | silicaundo |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521643/Trx 30e592b6b22375be7c4bc0407bcfa48a2a4ac320 |
View Raw JSON Data
{
"block": 25521643,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "silicaundo",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:06:27",
"trx_id": "30e592b6b22375be7c4bc0407bcfa48a2a4ac320",
"trx_in_block": 8,
"virtual_op": 0
}dzheymssupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:04:27
dzheymssupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:04:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | dzheymss |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521603/Trx 5e20564297ec567cead14524a20e0ee8095a2632 |
View Raw JSON Data
{
"block": 25521603,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "dzheymss",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:04:27",
"trx_id": "5e20564297ec567cead14524a20e0ee8095a2632",
"trx_in_block": 24,
"virtual_op": 0
}seca17upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:04:27
seca17upvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:04:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | seca17 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521603/Trx a4f01b34026b7a91ee0becfb034b0a3f5dd5fa8d |
View Raw JSON Data
{
"block": 25521603,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "seca17",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:04:27",
"trx_id": "a4f01b34026b7a91ee0becfb034b0a3f5dd5fa8d",
"trx_in_block": 23,
"virtual_op": 0
}trubadurkirupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:02:27
trubadurkirupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:02:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | trubadurkir |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521563/Trx 81de460dd5bd53c2001e7b8756b74649dc3a5010 |
View Raw JSON Data
{
"block": 25521563,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "trubadurkir",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:02:27",
"trx_id": "81de460dd5bd53c2001e7b8756b74649dc3a5010",
"trx_in_block": 22,
"virtual_op": 0
}honeycheekupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 13:00:27
honeycheekupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 13:00:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | honeycheek |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521523/Trx 47ae3c55ef245797f3abd6961b3514b0e79245e8 |
View Raw JSON Data
{
"block": 25521523,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "honeycheek",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T13:00:27",
"trx_id": "47ae3c55ef245797f3abd6961b3514b0e79245e8",
"trx_in_block": 11,
"virtual_op": 0
}headerharemupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 12:58:27
headerharemupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 12:58:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | headerharem |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521483/Trx dfd70efc7c4af79a63244eb6569b7cdcf4cf8492 |
View Raw JSON Data
{
"block": 25521483,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "headerharem",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:58:27",
"trx_id": "dfd70efc7c4af79a63244eb6569b7cdcf4cf8492",
"trx_in_block": 52,
"virtual_op": 0
}magichiveupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 12:58:27
magichiveupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 12:58:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | magichive |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521483/Trx 3ed345c9e14e032b8927eaa4d5a810bf1ff0aefb |
View Raw JSON Data
{
"block": 25521483,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "magichive",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:58:27",
"trx_id": "3ed345c9e14e032b8927eaa4d5a810bf1ff0aefb",
"trx_in_block": 42,
"virtual_op": 0
}barcodemailupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 12:54:27
barcodemailupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 12:54:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | barcodemail |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521403/Trx a4ca57c23fefbe09694b4b48e8d47eb107a6d952 |
View Raw JSON Data
{
"block": 25521403,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "barcodemail",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:54:27",
"trx_id": "a4ca57c23fefbe09694b4b48e8d47eb107a6d952",
"trx_in_block": 39,
"virtual_op": 0
}putridgameteupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 12:52:27
putridgameteupvoted (100.00%) @xenetics / na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 12:52:27
| author | xenetics |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| voter | putridgamete |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521363/Trx 371416f1cd9a0d7729d4d780675a778b19c37574 |
View Raw JSON Data
{
"block": 25521363,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"voter": "putridgamete",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:52:27",
"trx_id": "371416f1cd9a0d7729d4d780675a778b19c37574",
"trx_in_block": 14,
"virtual_op": 0
}xeneticsupvoted (100.00%) @pacokam8 / rakan-league-of-legends-review2018/08/30 12:48:42
xeneticsupvoted (100.00%) @pacokam8 / rakan-league-of-legends-review
2018/08/30 12:48:42
| author | pacokam8 |
| permlink | rakan-league-of-legends-review |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25521288/Trx 63a05fd5d4c8b90d55090a03f5514df83b2cad44 |
View Raw JSON Data
{
"block": 25521288,
"op": [
"vote",
{
"author": "pacokam8",
"permlink": "rakan-league-of-legends-review",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:48:42",
"trx_id": "63a05fd5d4c8b90d55090a03f5514df83b2cad44",
"trx_in_block": 6,
"virtual_op": 0
}xeneticspublished a new post: na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl2018/08/30 12:42:21
xeneticspublished a new post: na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
2018/08/30 12:42:21
| author | xenetics |
| body | This is an analysis and some predictions for various "first" markets (blood/dragon/turret/baron) for the upcoming NA LCS semifinals on the 1st and 2nd of September, 2018, with betting recommendations following the analysis. ## Cloud9 vs TSM Cloud9 vs TSM looks to be an exciting game. Let's take a look at some data, and what markets might be promising. First, the team's overall performance:  TSM have an extra 6 games on C9 - a tiebreaker to progress to the playoffs, and their five game quarterfinal match against Echo Fox. At the end of the regular season, C9 had one game up on TSM. C9 has won their last 8 games straight. C9 and TSM's win rates over the entire split are 56% and 61% respectively - a weighted average of 53% to 47%, too close to call. However, for the last eight games, the numbers tell a different story: 68% to 31%. Cloud9 is hot stuff. The odds are 1.44 : 2.62 in favor of C9, which reflects this. Both are around 0.8 to 0.9 EV, so I wouldn't put money on either. How about first bloods?  Both have achieved a high % of first bloods in recent games. They also follow similar trends through the season. The odds here are 1.72 : 2, for C9 : TSM. Sampling the entire split (displayed as -1 games), last 8 and 4 games gives us: ``` === cloud9 vs team solomid - first_blood last -1 games === Relative % 53.78 : 46.22 cloud9 : team solomid 1.72 : 2 cloud9 ev: 0.92 team solomid ev: 0.92 === cloud9 vs team solomid - first_blood last 8 games === Relative % 68.75 : 31.25 cloud9 : team solomid 1.72 : 2 cloud9 ev: 1.18 <------------------- High EV team solomid ev: 0.62 === cloud9 vs team solomid - first_blood last 4 games === Relative % 62.5 : 37.5 cloud9 : team solomid 1.72 : 2 cloud9 ev: 1.08 team solomid ev: 0.75 ``` C9 might be a candidate for an FB bet - the latter part of the split, combined with the odds, gives solid EV. First dragon isn't anything right home about, even both ways throughout the season. First turret is a bit more interesting:  C9 have maintained their first turret percentage at well over 50% throughout the entire season! TSM, on the other hand, has been hanging around the low 40s. FT is more often than not in the bot lane, since ADCs are basically chosen for their turret taking abilities, plus they have a second player helping them. This reflects both C9's stellar bottom lane, especially Sneaky, the definition of consistency, as well as TSM's underperforming European duo. ``` === cloud9 vs team solomid - first_turret last -1 games === Relative % 65.33 : 34.67 cloud9 : team solomid 1.72 : 2.0 cloud9 ev: 1.12 <------------------- High EV team solomid ev: 0.69 === cloud9 vs team solomid - first_turret last 8 games === Relative % 75.0 : 25.0 cloud9 : team solomid 1.72 : 2.0 cloud9 ev: 1.29 <------------------- High EV team solomid ev: 0.5 === cloud9 vs team solomid - first_turret last 4 games === Relative % 75.0 : 25.0 cloud9 : team solomid 1.72 : 2.0 cloud9 ev: 1.29 <------------------- High EV team solomid ev: 0.5 ``` A snapshot of the odds, and calculated EV at any point during the split show C9 as a strong case for a FT bet. Let's look at first baron next. TSM has a ever so slightly positive EV over the latter half of the split regarding first baron, but given the strong correlation between first baron and winning the game, which TSM is not favored to do, I'm not sure it's a good bet. FB and FT have a very minimal correlation to the actual result of the game (~0.1), so I'm happy to bet on either regardless of what I expect to be the final result. Since first baron has a high correlation with victory in NA (around 0.65 for the top teams), I would like to weigh first baron more heavily in the future. Things I would like to include in the weighting are the matchup and recent game history. ## Team Liquid vs 100 Thieves What looks like two of the top teams this split meet in the semifinals. Their overall wins put them at a 49% : 51% weighted average win percentage, for 100 and TL respectively. That changes to 43% : 57% considering the last 8 games, still a close contest, but factors in the recent win stream for TL. Looking at the running victories for both teams:  TL is on fire, with 5 straight wins. 100 had a similar streak earlier, although I haven't checked which team it was against. Let's take a look at first blood:  100 fell of pretty heavily in their last few games, but other than that, maintained a healthy 60-70% throughout the split. TL, on the other hand, hovered around 50%, and shot up recently. With the odds at 1.72 : 2 for LT and 100 respectively, 100 maintains a positive EV at all points of the split. ``` === team liquid vs 100 thieves - first_blood last -1 games === Relative % 47.34 : 52.66 team liquid : 100 thieves 1.72 : 2 team liquid ev: 0.81 100 thieves ev: 1.05 === team liquid vs 100 thieves - first_blood last 8 games === Relative % 31.25 : 68.75 team liquid : 100 thieves 1.72 : 2 team liquid ev: 0.54 100 thieves ev: 1.38 <------------------- High EV === team liquid vs 100 thieves - first_blood last 4 games === Relative % 37.5 : 62.5 team liquid : 100 thieves 1.72 : 2 team liquid ev: 0.64 100 thieves ev: 1.25 <------------------- High EV ``` Their recent downtrend, along with TL's recent uptrend makes me a little less confident, but since FB is impacted by a long of factors, like champion selection, I'd say 100 is still a solid choice. My personal win rate with FB is around 45%, so as long as the EV is sufficiently positive, it's a long term winner. First turret tells a very different story:  Until 3/4 of the way through the split, the teams were fairly close. TL, however, has pulled away to become to FT kings, and again we observe a downward trend for 100. The lack of consistency is shown in the EV: ``` === team liquid vs 100 thieves - first_turret last -1 games === Relative % 48.31 : 51.69 team liquid : 100 thieves 1.66 : 2.1 team liquid ev: 0.8 100 thieves ev: 1.09 === team liquid vs 100 thieves - first_turret last 8 games === Relative % 50.0 : 50.0 team liquid : 100 thieves 1.66 : 2.1 team liquid ev: 0.83 100 thieves ev: 1.05 === team liquid vs 100 thieves - first_turret last 4 games === Relative % 50.0 : 50.0 team liquid : 100 thieves 1.66 : 2.1 team liquid ev: 0.83 100 thieves ev: 1.05 ``` Positive EV on 10. I prefer to bet on a minimum EV of 1.1, so this is really on the fence for me. I'll think about it a little more. How about first dragon?  TL are the first dragon KINGS. Mainly because of Xmithie, arguably the best jungler in the league, sitting at a cool 70% for most of the split. 100 have a very low percentage - their botlane is solid, especially mid and late game, but they certainly don't play for the first 10 minutes. TL, on the other hand, basically have Doublelift carry every game. This dominant bottom lane, in combination with Xmithie's dominance in the jungle, leads to a ludicrously high FD percentage. The EV also reflects this: ``` === team liquid vs 100 thieves - first_dragon last -1 games === Relative % 64.37 : 35.63 team liquid : 100 thieves 1.72 : 2.0 team liquid ev: 1.11 <------------------- High EV 100 thieves ev: 0.71 === team liquid vs 100 thieves - first_dragon last 8 games === Relative % 75.0 : 25.0 team liquid : 100 thieves 1.72 : 2.0 team liquid ev: 1.29 <------------------- High EV 100 thieves ev: 0.5 === team liquid vs 100 thieves - first_dragon last 4 games === Relative % 87.5 : 12.5 team liquid : 100 thieves 1.72 : 2.0 team liquid ev: 1.5 <------------------- High EV 100 thieves ev: 0.25 ``` Looks like a good bet. First baron is interesting. 100's ongoing downtrend is revealed here, too:  Until recently, it's about 50% for each team. How about some EVs? ``` === team liquid vs 100 thieves - first_baron last -1 games === Relative % 48.91 : 51.09 team liquid : 100 thieves 1.61 : 2.2 team liquid ev: 0.79 100 thieves ev: 1.12 <------------------- High EV === team liquid vs 100 thieves - first_baron last 8 games === Relative % 62.5 : 37.5 team liquid : 100 thieves 1.61 : 2.2 team liquid ev: 1.01 100 thieves ev: 0.82 === team liquid vs 100 thieves - first_baron last 4 games === Relative % 50.0 : 50.0 team liquid : 100 thieves 1.61 : 2.2 team liquid ev: 0.8 100 thieves ev: 1.1 ``` Pretty inconsistent, no clear winner here. ## Conclusion Cloud9 has a strong history of taking first turret all split, compared to TSM and their struggling bottom lane. FT is a good bet for C9 this weekend. 100 Thieves also look to be a solid choice for first blood against TL. TL's strong bottom lane and excellent jungle presence puts them as the main contender for first dragon. C9 and TL as the favourites for the respective games, with the postive EV are particularly good picks. - C9 for FT - 100 for FB - TL for FD |
| json metadata | {"tags":["leagueoflegends","esports","gambling","betting","tipping"],"image":["https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_semis.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_fb.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_ft.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_victories.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fb.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_ft.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fd.png?raw=true","https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fbaron.png?raw=true"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | leagueoflegends |
| permlink | na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl |
| title | NA LCS semifinals betting predictions - C9 vs TSM, 100 vs TL |
| Transaction Info | Block #25521161/Trx 21b3036fc50a60c983e88ab0a9b566a45cf22b45 |
View Raw JSON Data
{
"block": 25521161,
"op": [
"comment",
{
"author": "xenetics",
"body": "This is an analysis and some predictions for various \"first\" markets (blood/dragon/turret/baron) for the upcoming NA LCS semifinals on the 1st and 2nd of September, 2018, with betting recommendations following the analysis.\n\n## Cloud9 vs TSM\n\nCloud9 vs TSM looks to be an exciting game. Let's take a look at some data, and what markets might be promising. First, the team's overall performance:\n\n\n\nTSM have an extra 6 games on C9 - a tiebreaker to progress to the playoffs, and their five game quarterfinal match against Echo Fox. At the end of the regular season, C9 had one game up on TSM. C9 has won their last 8 games straight.\n\nC9 and TSM's win rates over the entire split are 56% and 61% respectively - a weighted average of 53% to 47%, too close to call. However, for the last eight games, the numbers tell a different story: 68% to 31%. Cloud9 is hot stuff. The odds are 1.44 : 2.62 in favor of C9, which reflects this. Both are around 0.8 to 0.9 EV, so I wouldn't put money on either.\n\nHow about first bloods?\n\n\n\nBoth have achieved a high % of first bloods in recent games. They also follow similar trends through the season. The odds here are 1.72 : 2, for C9 : TSM. Sampling the entire split (displayed as -1 games), last 8 and 4 games gives us:\n\n```\n=== cloud9 vs team solomid - first_blood last -1 games ===\nRelative %\t 53.78 : 46.22\ncloud9 : team solomid 1.72 : 2\ncloud9 \tev: 0.92\nteam solomid \tev: 0.92\n\n=== cloud9 vs team solomid - first_blood last 8 games ===\nRelative %\t 68.75 : 31.25\ncloud9 : team solomid 1.72 : 2\ncloud9 \tev: 1.18 \t<------------------- High EV\nteam solomid \tev: 0.62\n\n=== cloud9 vs team solomid - first_blood last 4 games ===\nRelative %\t 62.5 : 37.5\ncloud9 : team solomid 1.72 : 2\ncloud9 \tev: 1.08\nteam solomid \tev: 0.75\n```\n\nC9 might be a candidate for an FB bet - the latter part of the split, combined with the odds, gives solid EV.\n\nFirst dragon isn't anything right home about, even both ways throughout the season. First turret is a bit more interesting:\n\n\n\nC9 have maintained their first turret percentage at well over 50% throughout the entire season! TSM, on the other hand, has been hanging around the low 40s. FT is more often than not in the bot lane, since ADCs are basically chosen for their turret taking abilities, plus they have a second player helping them. This reflects both C9's stellar bottom lane, especially Sneaky, the definition of consistency, as well as TSM's underperforming European duo.\n\n```\n=== cloud9 vs team solomid - first_turret last -1 games ===\nRelative %\t 65.33 : 34.67\ncloud9 : team solomid 1.72 : 2.0\ncloud9 \tev: 1.12 \t<------------------- High EV\nteam solomid \tev: 0.69\n\n=== cloud9 vs team solomid - first_turret last 8 games ===\nRelative %\t 75.0 : 25.0\ncloud9 : team solomid 1.72 : 2.0\ncloud9 \tev: 1.29 \t<------------------- High EV\nteam solomid \tev: 0.5\n\n=== cloud9 vs team solomid - first_turret last 4 games ===\nRelative %\t 75.0 : 25.0\ncloud9 : team solomid 1.72 : 2.0\ncloud9 \tev: 1.29 \t<------------------- High EV\nteam solomid \tev: 0.5\n```\n\nA snapshot of the odds, and calculated EV at any point during the split show C9 as a strong case for a FT bet. Let's look at first baron next.\n\nTSM has a ever so slightly positive EV over the latter half of the split regarding first baron, but given the strong correlation between first baron and winning the game, which TSM is not favored to do, I'm not sure it's a good bet. FB and FT have a very minimal correlation to the actual result of the game (~0.1), so I'm happy to bet on either regardless of what I expect to be the final result. \n\nSince first baron has a high correlation with victory in NA (around 0.65 for the top teams), I would like to weigh first baron more heavily in the future. Things I would like to include in the weighting are the matchup and recent game history.\n\n## Team Liquid vs 100 Thieves\n\nWhat looks like two of the top teams this split meet in the semifinals. Their overall wins put them at a 49% : 51% weighted average win percentage, for 100 and TL respectively. That changes to 43% : 57% considering the last 8 games, still a close contest, but factors in the recent win stream for TL.\n\nLooking at the running victories for both teams:\n\n\n\nTL is on fire, with 5 straight wins. 100 had a similar streak earlier, although I haven't checked which team it was against.\n\nLet's take a look at first blood:\n\n\n\n100 fell of pretty heavily in their last few games, but other than that, maintained a healthy 60-70% throughout the split. TL, on the other hand, hovered around 50%, and shot up recently. With the odds at 1.72 : 2 for LT and 100 respectively, 100 maintains a positive EV at all points of the split.\n\n```\n=== team liquid vs 100 thieves - first_blood last -1 games ===\nRelative %\t 47.34 : 52.66\nteam liquid : 100 thieves 1.72 : 2\nteam liquid \tev: 0.81\n100 thieves \tev: 1.05\n\n=== team liquid vs 100 thieves - first_blood last 8 games ===\nRelative %\t 31.25 : 68.75\nteam liquid : 100 thieves 1.72 : 2\nteam liquid \tev: 0.54\n100 thieves \tev: 1.38 \t<------------------- High EV\n\n=== team liquid vs 100 thieves - first_blood last 4 games ===\nRelative %\t 37.5 : 62.5\nteam liquid : 100 thieves 1.72 : 2\nteam liquid \tev: 0.64\n100 thieves \tev: 1.25 \t<------------------- High EV\n```\n\nTheir recent downtrend, along with TL's recent uptrend makes me a little less confident, but since FB is impacted by a long of factors, like champion selection, I'd say 100 is still a solid choice. My personal win rate with FB is around 45%, so as long as the EV is sufficiently positive, it's a long term winner.\n\nFirst turret tells a very different story:\n\n\n\nUntil 3/4 of the way through the split, the teams were fairly close. TL, however, has pulled away to become to FT kings, and again we observe a downward trend for 100. The lack of consistency is shown in the EV:\n\n```\n=== team liquid vs 100 thieves - first_turret last -1 games ===\nRelative %\t 48.31 : 51.69\nteam liquid : 100 thieves 1.66 : 2.1\nteam liquid \tev: 0.8\n100 thieves \tev: 1.09\n\n=== team liquid vs 100 thieves - first_turret last 8 games ===\nRelative %\t 50.0 : 50.0\nteam liquid : 100 thieves 1.66 : 2.1\nteam liquid \tev: 0.83\n100 thieves \tev: 1.05\n\n=== team liquid vs 100 thieves - first_turret last 4 games ===\nRelative %\t 50.0 : 50.0\nteam liquid : 100 thieves 1.66 : 2.1\nteam liquid \tev: 0.83\n100 thieves \tev: 1.05\n```\n\nPositive EV on 10. I prefer to bet on a minimum EV of 1.1, so this is really on the fence for me. I'll think about it a little more.\n\nHow about first dragon?\n\n\n\nTL are the first dragon KINGS. Mainly because of Xmithie, arguably the best jungler in the league, sitting at a cool 70% for most of the split. 100 have a very low percentage - their botlane is solid, especially mid and late game, but they certainly don't play for the first 10 minutes. TL, on the other hand, basically have Doublelift carry every game. This dominant bottom lane, in combination with Xmithie's dominance in the jungle, leads to a ludicrously high FD percentage.\n\nThe EV also reflects this:\n\n```\n=== team liquid vs 100 thieves - first_dragon last -1 games ===\nRelative %\t 64.37 : 35.63\nteam liquid : 100 thieves 1.72 : 2.0\nteam liquid \tev: 1.11 \t<------------------- High EV\n100 thieves \tev: 0.71\n\n=== team liquid vs 100 thieves - first_dragon last 8 games ===\nRelative %\t 75.0 : 25.0\nteam liquid : 100 thieves 1.72 : 2.0\nteam liquid \tev: 1.29 \t<------------------- High EV\n100 thieves \tev: 0.5\n\n=== team liquid vs 100 thieves - first_dragon last 4 games ===\nRelative %\t 87.5 : 12.5\nteam liquid : 100 thieves 1.72 : 2.0\nteam liquid \tev: 1.5 \t<------------------- High EV\n100 thieves \tev: 0.25\n```\n\nLooks like a good bet.\n\nFirst baron is interesting. 100's ongoing downtrend is revealed here, too:\n\n\n\nUntil recently, it's about 50% for each team. How about some EVs?\n\n```\n=== team liquid vs 100 thieves - first_baron last -1 games ===\nRelative %\t 48.91 : 51.09\nteam liquid : 100 thieves 1.61 : 2.2\nteam liquid \tev: 0.79\n100 thieves \tev: 1.12 \t<------------------- High EV\n\n=== team liquid vs 100 thieves - first_baron last 8 games ===\nRelative %\t 62.5 : 37.5\nteam liquid : 100 thieves 1.61 : 2.2\nteam liquid \tev: 1.01\n100 thieves \tev: 0.82\n\n=== team liquid vs 100 thieves - first_baron last 4 games ===\nRelative %\t 50.0 : 50.0\nteam liquid : 100 thieves 1.61 : 2.2\nteam liquid \tev: 0.8\n100 thieves \tev: 1.1\n```\n\nPretty inconsistent, no clear winner here.\n\n## Conclusion\n\nCloud9 has a strong history of taking first turret all split, compared to TSM and their struggling bottom lane. FT is a good bet for C9 this weekend. 100 Thieves also look to be a solid choice for first blood against TL. TL's strong bottom lane and excellent jungle presence puts them as the main contender for first dragon. C9 and TL as the favourites for the respective games, with the postive EV are particularly good picks.\n\n- C9 for FT\n- 100 for FB\n- TL for FD",
"json_metadata": "{\"tags\":[\"leagueoflegends\",\"esports\",\"gambling\",\"betting\",\"tipping\"],\"image\":[\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_semis.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_fb.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_ft.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_victories.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fb.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_ft.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fd.png?raw=true\",\"https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fbaron.png?raw=true\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "leagueoflegends",
"permlink": "na-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl",
"title": "NA LCS semifinals betting predictions - C9 vs TSM, 100 vs TL"
}
],
"op_in_trx": 0,
"timestamp": "2018-08-30T12:42:21",
"trx_id": "21b3036fc50a60c983e88ab0a9b566a45cf22b45",
"trx_in_block": 27,
"virtual_op": 0
}2018/08/28 03:45:48
2018/08/28 03:45:48
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | clayjohn |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25452879/Trx fdc1636963c9d5a6e3f89ad48d339611d95f0e3c |
View Raw JSON Data
{
"block": 25452879,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "clayjohn",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-28T03:45:48",
"trx_id": "fdc1636963c9d5a6e3f89ad48d339611d95f0e3c",
"trx_in_block": 3,
"virtual_op": 0
}2018/08/27 18:46:24
2018/08/27 18:46:24
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | remlaps2 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25442101/Trx 0a279e077654452aa1c860f4cd6593613bf63dee |
View Raw JSON Data
{
"block": 25442101,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "remlaps2",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:24",
"trx_id": "0a279e077654452aa1c860f4cd6593613bf63dee",
"trx_in_block": 5,
"virtual_op": 0
}2018/08/27 18:46:21
2018/08/27 18:46:21
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | cub2 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25442100/Trx 7ff5827dd091d1816662ed179e5a5ea22f524014 |
View Raw JSON Data
{
"block": 25442100,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "cub2",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:21",
"trx_id": "7ff5827dd091d1816662ed179e5a5ea22f524014",
"trx_in_block": 35,
"virtual_op": 0
}2018/08/27 18:46:21
2018/08/27 18:46:21
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | remlaps-lite |
| weight | 6500 (65.00%) |
| Transaction Info | Block #25442100/Trx aee180b03523cf83fc54dac83fc7b11443401241 |
View Raw JSON Data
{
"block": 25442100,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "remlaps-lite",
"weight": 6500
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:21",
"trx_id": "aee180b03523cf83fc54dac83fc7b11443401241",
"trx_in_block": 2,
"virtual_op": 0
}2018/08/27 18:46:18
2018/08/27 18:46:18
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | cmp2020-lite |
| weight | 6500 (65.00%) |
| Transaction Info | Block #25442099/Trx 40b9df73466a38bb809bdca18692ab5ffaa67ca4 |
View Raw JSON Data
{
"block": 25442099,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "cmp2020-lite",
"weight": 6500
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:18",
"trx_id": "40b9df73466a38bb809bdca18692ab5ffaa67ca4",
"trx_in_block": 28,
"virtual_op": 0
}2018/08/27 18:46:15
2018/08/27 18:46:15
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | rgkmb-unofficial |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25442098/Trx c6f9edda88b3e8792b7a435c84cc14a523d8b300 |
View Raw JSON Data
{
"block": 25442098,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "rgkmb-unofficial",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:15",
"trx_id": "c6f9edda88b3e8792b7a435c84cc14a523d8b300",
"trx_in_block": 14,
"virtual_op": 0
}2018/08/27 18:46:15
2018/08/27 18:46:15
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | rgkmb |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25442098/Trx a185efa0b1a3b5dcf488cab64dfa318cd3460124 |
View Raw JSON Data
{
"block": 25442098,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "rgkmb",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:15",
"trx_id": "a185efa0b1a3b5dcf488cab64dfa318cd3460124",
"trx_in_block": 1,
"virtual_op": 0
}2018/08/27 18:46:12
2018/08/27 18:46:12
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | astronomyizfun |
| weight | 6500 (65.00%) |
| Transaction Info | Block #25442097/Trx e00fc9963b42ee9e708146aa11f89485f7d98526 |
View Raw JSON Data
{
"block": 25442097,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "astronomyizfun",
"weight": 6500
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:46:12",
"trx_id": "e00fc9963b42ee9e708146aa11f89485f7d98526",
"trx_in_block": 38,
"virtual_op": 0
}2018/08/27 18:38:45
2018/08/27 18:38:45
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | jaff8 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25441948/Trx 99f53693f2ee3e81404e81f05c53e30b173f64f4 |
View Raw JSON Data
{
"block": 25441948,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "jaff8",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T18:38:45",
"trx_id": "99f53693f2ee3e81404e81f05c53e30b173f64f4",
"trx_in_block": 24,
"virtual_op": 0
}2018/08/27 16:25:39
2018/08/27 16:25:39
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | statsexpert |
| weight | 6000 (60.00%) |
| Transaction Info | Block #25439286/Trx bc8db0ab94d52401b028bd7915bbb437ad5b3219 |
View Raw JSON Data
{
"block": 25439286,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "statsexpert",
"weight": 6000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:25:39",
"trx_id": "bc8db0ab94d52401b028bd7915bbb437ad5b3219",
"trx_in_block": 8,
"virtual_op": 0
}2018/08/27 16:25:36
2018/08/27 16:25:36
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | jeffbernst |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25439285/Trx 7962a9e43a03fcc5c20afafeabbdb4ec5c2912af |
View Raw JSON Data
{
"block": 25439285,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "jeffbernst",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:25:36",
"trx_id": "7962a9e43a03fcc5c20afafeabbdb4ec5c2912af",
"trx_in_block": 31,
"virtual_op": 0
}2018/08/27 16:18:48
2018/08/27 16:18:48
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 15653.427533 VESTS |
| Transaction Info | Block #25439149/Trx 5ea9c7e5c4dc7817676e896896e97e3f9305c232 |
View Raw JSON Data
{
"block": 25439149,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "15653.427533 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:18:48",
"trx_id": "5ea9c7e5c4dc7817676e896896e97e3f9305c232",
"trx_in_block": 40,
"virtual_op": 0
}2018/08/27 16:18:30
2018/08/27 16:18:30
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | yuxi |
| weight | 1000 (10.00%) |
| Transaction Info | Block #25439143/Trx 1f45bdd3311f02f50e506b1af214ad0392581d3c |
View Raw JSON Data
{
"block": 25439143,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "yuxi",
"weight": 1000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:18:30",
"trx_id": "1f45bdd3311f02f50e506b1af214ad0392581d3c",
"trx_in_block": 12,
"virtual_op": 0
}2018/08/27 16:12:48
2018/08/27 16:12:48
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | simplymike |
| weight | 2000 (20.00%) |
| Transaction Info | Block #25439029/Trx cffbe88295c02638e3247f2fcab57ba844e7876c |
View Raw JSON Data
{
"block": 25439029,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "simplymike",
"weight": 2000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:12:48",
"trx_id": "cffbe88295c02638e3247f2fcab57ba844e7876c",
"trx_in_block": 31,
"virtual_op": 0
}2018/08/27 16:11:33
2018/08/27 16:11:33
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | corvushilt |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25439004/Trx ff64beae4bba3ef0e2d0aaee98faf2a6248b256c |
View Raw JSON Data
{
"block": 25439004,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "corvushilt",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T16:11:33",
"trx_id": "ff64beae4bba3ef0e2d0aaee98faf2a6248b256c",
"trx_in_block": 27,
"virtual_op": 0
}2018/08/27 15:57:36
2018/08/27 15:57:36
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | ghazi48 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25438725/Trx abc9624dd5ec3217c9c998b4adc67559cd70cca7 |
View Raw JSON Data
{
"block": 25438725,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "ghazi48",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T15:57:36",
"trx_id": "abc9624dd5ec3217c9c998b4adc67559cd70cca7",
"trx_in_block": 37,
"virtual_op": 0
}2018/08/27 15:57:36
2018/08/27 15:57:36
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25438725/Trx 5135d9cc92279424659c59796d81b4b348d14d78 |
View Raw JSON Data
{
"block": 25438725,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T15:57:36",
"trx_id": "5135d9cc92279424659c59796d81b4b348d14d78",
"trx_in_block": 2,
"virtual_op": 0
}2018/08/27 15:57:27
2018/08/27 15:57:27
| author | xenetics |
| body |  Image: Fintech News. This part of the series focused on authentication. In the previous article, I demonstrated how to post to the Steem blockchain by hardcoding your credentials. This time, we will create a login feature, so a user only needs to enter their initials once. This will be the first article to introduce a server, using Express for Node.js, and JWT (JSON Web Token) for authentication. Part 1, Storybook, Vue and Steem.js is [here](https://medium.com/@lachlanmiller_52885/build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js-a25bd7629a14) and Part 2, posting a comment to the blockchain is [here](https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain). The source code for this part is [here](https://github.com/lmiller1990/steem-blog-series/tree/part-3-login). ## Install the Server Dependencies First, install `express`, the server framework we will be using, along with `jsonwebtoken` and `body-parser` by running `yarn add express jsonwebtoken body-parser --save`. Next, create a `server` directory inside `src`, and inside of `server` a `index.js`. This is where the server will run from. I also recommend installing `nodemon`, which automatically restarts the server after each change - otherwise you would have to manually kill and restart it. You can install `nodemon` globally by running `yarn global add nodemon`. ## Setting up the Express Backend Before doing any work on the front end, let's set up JWT authentication. This is not an Node.js/Express tutorial, but it's fairly easy either way. If you need to, check some basic guides about Express first. I will, however, explain JWT authentication as we go. I will be using `curl`, a command line tool that is available on Mac OS and Unix systems, but not Windows by default. You can install it for Windows, the site is [here](https://curl.haxx.se/download.html) and the several guides are [here](https://stackoverflow.com/questions/9507353/how-do-i-install-set-up-and-use-curl-on-windows). In `src/server/index.js`, add the following minimal Express application: ```js const express = require('express') const bodyParser = require('body-parser') const jwt = require('jsonwebtoken') const app = express() app.use(bodyParser.json()) app.post('/api/login', (req, res) => { res.sendStatus(403) }) app.listen(5000, () => console.log('Listening on port 5000.')) ``` We create a single `/api/login` endpoint, which current returns 403 (forbidden status code) no matter what. Let's test it out, to make sure it's working. Run `nodemon src/server/index.js` in one terminal, and in another use the follow curl command: ```sh curl http://localhost:5000/api/login \ -X POST ``` If everything went well, curl should have returned `Forbidden`. If not, check everything is typed correctly. ## Validating the User on the Server Let's talk about JWT for a second. Basically, the client will attempt to log in using some credentials, in our case a Steem username and password. Once we authenticate the user, using Steem.js, the server will generated a "JSON Web Token" using `jsonwebtoken`, which we installed earlier. We then send the token back to the client. On all subsequent requests, the client will include the token. If the token is successfully validated by the `jsonwebtoken`, the request is allowed. Our workflow wiil be something like this: 1. Client sends username/password to the server's `api/login` endpoint. 2. The server validates the login using `Steem.js`. 3. If the credentials are correct, create a token and send it back, with any extra information. 4. Now the client is "logged in". The client should resend the token each request to prove is it the authenticated user, and not a hacker/someone impersonating the real user's identity. Let's update the `login` endpoint to achieve the second step above. There is a lot of new code - the explanation follows. ```js app.post('/api/login', async (req, res) => { const { username, password } = req.body // get posting public key const account = await steem.api.getAccountsAsync([ username ]) const pubKey = account[0].posting.key_auths[0][0] // // for a given username/password combo, // response contains { posting: 'private key', postingPubkey: 'pub key' } // const { posting } = steem.auth.getPrivateKeys(username, password, ['posting']) // // See if the private key is a match to the public key const isValid = steem.auth.wifIsValid(posting, pubKey) if (isValid) { res.json({ username }) } else { res.sendStatus(403) } }) ``` There is a lot going on here. First, we extract the `username` and `password` from the request body. Next we use the `getAccounts` method (documentation [here](https://github.com/steemit/steem-js/tree/master/doc#get-accounts), which returns a bunch of public information about the account. We are interested in the posting public key. You can see the previous article for more details on what other fields are in this response. Next, we get the private keys based on the `username` and `password` combination. Note that even if the username or password is wrong, the `getPrivateKeys` method still returns as public/private key combination - the will just be incorrect. Now we validate the two keys using `wifIsValid` (documentation [here](https://github.com/steemit/steem-js/tree/master/doc#wif-is-valid)). If the keys are a match, we return the original `username` - otherwise, the original `403 forbidden`. Note we still have not touched on the JSON Web Token - that will come next, once we make sure this is working. Test it out using curl like this: ```sh curl http://localhost:5000/api/login \ -X POST \ -d '{ "username": "your username", "password": "your password" }' \ -H "Content-Type: application/json" \ ``` Try your real password - you should get your username in the response. Next, change your password, and you should get the `403 forbidden` status. ## Implementing JWT Now we can verify a user, the next step is to generate the JWT. Generating the token is extremely simple. Inside of `if (isValid)`, add the following: ```js if (isValid) { // // Sign the JWT // jwt.sign({ username }, 'ca214cc74cc32fafdca98b12e27663e8', (err, token) => { if (err) throw err res.json({ token }) }) } else { res.sendStatus(403) } ``` The documentation for `jwt.sign` is [here](https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback). The first argument can be any payload - it is common to use a username or id. The second argument is a _secret key_ - this is something unique to your application, that you should not share. For this tutorial, I generated a random 16 digit hex number. You should never check this into source control or share it with anyone, or your server's security can be compromised. Finally, the `token` is returned to the user. All subsequent requests (such as posting) will require this token to be sent from the client. Once the client has this token, however, they will not need to log in again until the token expires. You can set the expiry date in the third argument, an `options` object. This is in the documentation linked above. Try running the `curl` command again now. If you supply a correct username/password combination, you should get a response like this: ``` {"token":"32JidGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ey4142VybmFtZSI6InhlbmV0aWNzMTIzIiwiaWF0IjoxNTM1Mzc2MzI0fQ.4jp2LLAeDNUeUBHFFAs6vWhg1B6ftsI6ut7QRF3wdc4"} ``` This token is used for authentication. To see it in action, create another endpoint, `/api/posts`: ```js app.post('/api/posts', verifyToken, (req, res) => { jwt.verify(req.token, 'ca214cc74cc32fafdca98b12e27663e8', (err, auth) => { if (err) res.sendStatus(403, { err }) res.json({ auth }) }) }) ``` The match method for `json.sign` is `jwt.verify`. Using the token created earlier, and the secret key, it can determine if the token was originally received when the user successfully authenticated, or if it is a malicious party trying to compromise the application. You may have noticed we refer to `req.token` - this will be sent by the client. Also, we add a `verifyToken` middleware. Basically, before executing the `jwt.verify` logic, we will call `verifyToken`. This method will check if the client correctly included the JWT. It looks like this: ```js function verifyToken(req, res, next) { // // Get auth header value // const bearerHeader = req.headers['authorization'] // // check if bearer not defined // Payload looks like this: // Authorization: bearer xxxxxxxxxxxx // if (typeof bearerHeader !== 'undefined') { const bearer = bearerHeader.split(' ') req.token = bearer[1] next() } else { res.sendStatus(403) } } ``` The JWT has to be included in a specific format. The format is `Authorization: bearer [token]`. To get the token from the request, we first access the `bearer [token]` part using `req.headers['authorization']`. If it exists, we get the token part using `split`, and add it to the `request`. The `request` will then be passed on to the `app.post('/api/posts')` method. If the token is not present, we just return `403 Forbidden`. To see if it works, run a new `curl` request that looks like this: ```sh curl http://localhost:5000/api/posts \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer [your key does here]" ``` We are posting to the `/api/posts` endpoint, with the correct token. If you did everything correctly, the response should look something like `{"auth":{"username":"xenetics123","iat":1535377462}}`. Notice we did NOT include our username or password, just the token - which requires the username and password to be created in the first place. This is just for a test - in the next part of the series, we will implement the logic to post to the Steem blockchain at `/api/posts`, and return a status to reflect the post was successful. ## Writing Tests for the Server Code Now JWT authentication is working, let's finish up with some unit tests. First, a small tweak to `src/server/index.js` is needed to let us run the server on a different port to the main application, and easily restart it between tests. Update the part of `src/server/index.js` where the server is created: ``` function boot(port) { return app.listen(port, () => console.log(`Listening on port ${port}.`)) } if (!module.parent) { boot(5000) } module.exports = { boot } ``` This way, the server will only run if there is no `module.parent` - basically, when it is not being required in another file. Create a directory called `server` in `tests/unit/specs/server` and add a `index.spec.js` file. Before writing the actual tests, we have some housekeeping to do. ## Mocking steem.js Testing is not the main purpose of this series, so I will not provide an in depth explanation of how exactly the tests are working. Trying things out yourself is the best way to learn. Either way, tests are part of any development workflow, so I'm going to go over them quickly anyway. We _know_ steem.js and the functions it provides are working correctly - it has its own set of unit tests, written by the developers of the library. We want to test the our own code. That means we _mock_ the steem.js api - `getPrivateKeys`, `wifIsValid` and so forth. Jest allows us to mock a node module like so: ```js const http = require('http') const { boot } = require('../../../../src/server/index.js') let mockWifIsValid = false jest.mock('steem', function() { return { auth: { getPrivateKeys: () => ({ posting: 'mock' }), wifIsValid: () => mockWifIsValid }, api: { getAccountsAsync: () => [{ posting: { key_auths: [[ 'mock' ]] } }], setOptions: jest.fn() } } }) ``` We declared a global `mockWifIsValid` variable. This lets us simulate a correct or incorrect username/password combination by saying `mockWifIsValid = true` or `mockWifIsValid = false`. Now the actual tests - first one for the case of incorrect credentials: ```js describe('server', () => { let server beforeEach(() => server = boot(4000)) afterEach(() => server.close()) describe('POST /api/login', () => { it('returns a 403 if username/password is invalid', (done) => { mockWifIsValid = false const options = { hostname: 'localhost', port: 4000, path: '/api/login', method: 'POST' } const req = http.request(options, (res) => { res.setEncoding('utf8') res.on('data', () => { expect(res.statusCode).toBe(403) done() }) }) req.end() }) }) }) ``` Kind of long, but it's worth it to be confident the application is working correctly as we develop. `beforeEach` test, we start the server, and `afterEach` we close it. Then to simulate incorrect credentials, `mockWifIsValid` is set to `false`. After making the request using Node's `http` module, we `expect(res.statusCode).toBe(403)`. Next, the passing case: ```js it('returns a JWT if the username/password is valid', (done) => { mockWifIsValid = true const options = { hostname: 'localhost', port: 4000, path: '/api/login', method: 'POST', headers: { 'content-type': 'application/json' } } const req = http.request(options, (res) => { res.setEncoding('utf8') res.on('data', (chunk) => { expect(JSON.parse(chunk)).toHaveProperty('token') done() }) }) req.write('{ "username": "test user" }') req.end() }) ``` We don't need to verify what the `token` is. As long as the `token` property is present in the response, I'm confident that the `jsonwebtoken` module is working correctly. This test can be run individually using `yarn jest --runTestsByPath test/unit/spec/server/index.test.js`. If you did everything correctly, they should pass. Run the entire suite using `yarn unit`. ## Conclusion This was a pretty long article with a long of information. It covered: - what JWT is and how it works - setting up Express and working with Node.js - how to use `getAccountsAsync` to get account details - using `getPrivateKeys` to get keys using a username/password - verifying the validity of the keys using `wifIsValid` - writing tests using Jest and `jest.mock` The next part will focus on integrating the Vue frontend from the previous article, and the server we created here, to allow a user to log in, then post without retyping their password by using JWT authentication. The source code for this part is [here](https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain). |
| json metadata | {"tags":["utopian-io","steem","steemdev","javascript","programming"],"image":["https://steemitimages.com/0x0/https://cdn-images-1.medium.com/max/800/1*IM14RDpJNKz2hW69iTQLCQ.jpeg"],"links":["https://medium.com/@lachlanmiller_52885/build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js-a25bd7629a14","https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain","https://github.com/lmiller1990/steem-blog-series/tree/part-3-login","https://curl.haxx.se/download.html","https://stackoverflow.com/questions/9507353/how-do-i-install-set-up-and-use-curl-on-windows","https://github.com/steemit/steem-js/tree/master/doc#get-accounts","https://github.com/steemit/steem-js/tree/master/doc#wif-is-valid","https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | utopian-io |
| permlink | build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt |
| title | Build social media platform with the Steem Blockchain #3 — Server Side Auth with Steem.js and JWT |
| Transaction Info | Block #25438722/Trx 21acc9bdb3c4fd48b4b6b038b2a89e8a0964edda |
View Raw JSON Data
{
"block": 25438722,
"op": [
"comment",
{
"author": "xenetics",
"body": "\nImage: Fintech News.\n\nThis part of the series focused on authentication. In the previous article, I demonstrated how to post to the Steem blockchain by hardcoding your credentials. This time, we will create a login feature, so a user only needs to enter their initials once. This will be the first article to introduce a server, using Express for Node.js, and JWT (JSON Web Token) for authentication.\n\nPart 1, Storybook, Vue and Steem.js is [here](https://medium.com/@lachlanmiller_52885/build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js-a25bd7629a14) and Part 2, posting a comment to the blockchain is [here](https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain). The source code for this part is [here](https://github.com/lmiller1990/steem-blog-series/tree/part-3-login).\n\n## Install the Server Dependencies\n\nFirst, install `express`, the server framework we will be using, along with `jsonwebtoken` and `body-parser` by running `yarn add express jsonwebtoken body-parser --save`. Next, create a `server` directory inside `src`, and inside of `server` a `index.js`. This is where the server will run from. I also recommend installing `nodemon`, which automatically restarts the server after each change - otherwise you would have to manually kill and restart it. You can install `nodemon` globally by running `yarn global add nodemon`.\n\n## Setting up the Express Backend\n\nBefore doing any work on the front end, let's set up JWT authentication. This is not an Node.js/Express tutorial, but it's fairly easy either way. If you need to, check some basic guides about Express first. I will, however, explain JWT authentication as we go.\n\nI will be using `curl`, a command line tool that is available on Mac OS and Unix systems, but not Windows by default. You can install it for Windows, the site is [here](https://curl.haxx.se/download.html) and the several guides are [here](https://stackoverflow.com/questions/9507353/how-do-i-install-set-up-and-use-curl-on-windows).\n\nIn `src/server/index.js`, add the following minimal Express application:\n\n```js\nconst express = require('express')\nconst bodyParser = require('body-parser')\nconst jwt = require('jsonwebtoken')\n\nconst app = express()\napp.use(bodyParser.json())\n\napp.post('/api/login', (req, res) => {\n res.sendStatus(403)\n})\n\napp.listen(5000, () => console.log('Listening on port 5000.'))\n```\n\nWe create a single `/api/login` endpoint, which current returns 403 (forbidden status code) no matter what. Let's test it out, to make sure it's working. Run `nodemon src/server/index.js` in one terminal, and in another use the follow curl command:\n\n```sh\ncurl http://localhost:5000/api/login \\\n -X POST \n```\n\nIf everything went well, curl should have returned `Forbidden`. If not, check everything is typed correctly.\n\n## Validating the User on the Server\n\nLet's talk about JWT for a second. Basically, the client will attempt to log in using some credentials, in our case a Steem username and password. Once we authenticate the user, using Steem.js, the server will generated a \"JSON Web Token\" using `jsonwebtoken`, which we installed earlier. We then send the token back to the client. On all subsequent requests, the client will include the token. If the token is successfully validated by the `jsonwebtoken`, the request is allowed. Our workflow wiil be something like this:\n\n1. Client sends username/password to the server's `api/login` endpoint.\n2. The server validates the login using `Steem.js`. \n3. If the credentials are correct, create a token and send it back, with any extra information.\n4. Now the client is \"logged in\". The client should resend the token each request to prove is it the authenticated user, and not a hacker/someone impersonating the real user's identity.\n\nLet's update the `login` endpoint to achieve the second step above. There is a lot of new code - the explanation follows.\n\n```js\napp.post('/api/login', async (req, res) => {\n const { username, password } = req.body \n\n // get posting public key\n const account = await steem.api.getAccountsAsync([ username ])\n const pubKey = account[0].posting.key_auths[0][0]\n\n // \n // for a given username/password combo,\n // response contains { posting: 'private key', postingPubkey: 'pub key' }\n // \n const { posting } = steem.auth.getPrivateKeys(username, password, ['posting'])\n //\n // See if the private key is a match to the public key\n const isValid = steem.auth.wifIsValid(posting, pubKey)\n \n if (isValid) {\n res.json({ username })\n } else {\n res.sendStatus(403)\n }\n})\n```\n\nThere is a lot going on here. First, we extract the `username` and `password` from the request body. Next we use the `getAccounts` method (documentation [here](https://github.com/steemit/steem-js/tree/master/doc#get-accounts), which returns a bunch of public information about the account. We are interested in the posting public key. You can see the previous article for more details on what other fields are in this response.\n\nNext, we get the private keys based on the `username` and `password` combination. Note that even if the username or password is wrong, the `getPrivateKeys` method still returns as public/private key combination - the will just be incorrect. Now we validate the two keys using `wifIsValid` (documentation [here](https://github.com/steemit/steem-js/tree/master/doc#wif-is-valid)). If the keys are a match, we return the original `username` - otherwise, the original `403 forbidden`. Note we still have not touched on the JSON Web Token - that will come next, once we make sure this is working.\n\nTest it out using curl like this:\n\n```sh\ncurl http://localhost:5000/api/login \\\n -X POST \\\n -d '{ \"username\": \"your username\", \"password\": \"your password\" }' \\\n -H \"Content-Type: application/json\" \\\n```\n\nTry your real password - you should get your username in the response. Next, change your password, and you should get the `403 forbidden` status.\n\n## Implementing JWT\n\nNow we can verify a user, the next step is to generate the JWT. Generating the token is extremely simple. Inside of `if (isValid)`, add the following:\n\n```js\nif (isValid) {\n // \n // Sign the JWT\n //\n jwt.sign({ username }, 'ca214cc74cc32fafdca98b12e27663e8', (err, token) => {\n if (err) throw err\n\n res.json({ token })\n })\n \n} else {\n res.sendStatus(403)\n}\n```\n\nThe documentation for `jwt.sign` is [here](https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback). The first argument can be any payload - it is common to use a username or id. The second argument is a _secret key_ - this is something unique to your application, that you should not share. For this tutorial, I generated a random 16 digit hex number. You should never check this into source control or share it with anyone, or your server's security can be compromised.\n\nFinally, the `token` is returned to the user. All subsequent requests (such as posting) will require this token to be sent from the client. Once the client has this token, however, they will not need to log in again until the token expires. You can set the expiry date in the third argument, an `options` object. This is in the documentation linked above.\n\nTry running the `curl` command again now. If you supply a correct username/password combination, you should get a response like this:\n\n```\n{\"token\":\"32JidGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ey4142VybmFtZSI6InhlbmV0aWNzMTIzIiwiaWF0IjoxNTM1Mzc2MzI0fQ.4jp2LLAeDNUeUBHFFAs6vWhg1B6ftsI6ut7QRF3wdc4\"}\n```\n\nThis token is used for authentication. To see it in action, create another endpoint, `/api/posts`:\n\n```js\napp.post('/api/posts', verifyToken, (req, res) => {\n jwt.verify(req.token, 'ca214cc74cc32fafdca98b12e27663e8', (err, auth) => {\n if (err) res.sendStatus(403, { err })\n\n res.json({ auth })\n })\n})\n```\n\nThe match method for `json.sign` is `jwt.verify`. Using the token created earlier, and the secret key, it can determine if the token was originally received when the user successfully authenticated, or if it is a malicious party trying to compromise the application. \n\nYou may have noticed we refer to `req.token` - this will be sent by the client. Also, we add a `verifyToken` middleware. Basically, before executing the `jwt.verify` logic, we will call `verifyToken`. This method will check if the client correctly included the JWT. It looks like this:\n\n```js\nfunction verifyToken(req, res, next) {\n // \n // Get auth header value\n //\n const bearerHeader = req.headers['authorization']\n\n //\n // check if bearer not defined\n // Payload looks like this:\n // Authorization: bearer xxxxxxxxxxxx\n //\n if (typeof bearerHeader !== 'undefined') {\n const bearer = bearerHeader.split(' ')\n req.token = bearer[1]\n next()\n } else {\n res.sendStatus(403)\n }\n}\n```\n\nThe JWT has to be included in a specific format. The format is `Authorization: bearer [token]`. To get the token from the request, we first access the `bearer [token]` part using `req.headers['authorization']`. If it exists, we get the token part using `split`, and add it to the `request`. The `request` will then be passed on to the `app.post('/api/posts')` method. If the token is not present, we just return `403 Forbidden`.\n\nTo see if it works, run a new `curl` request that looks like this:\n\n```sh\ncurl http://localhost:5000/api/posts \\\n -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer [your key does here]\"\n```\n\nWe are posting to the `/api/posts` endpoint, with the correct token. If you did everything correctly, the response should look something like `{\"auth\":{\"username\":\"xenetics123\",\"iat\":1535377462}}`. Notice we did NOT include our username or password, just the token - which requires the username and password to be created in the first place. This is just for a test - in the next part of the series, we will implement the logic to post to the Steem blockchain at `/api/posts`, and return a status to reflect the post was successful.\n\n## Writing Tests for the Server Code\n\nNow JWT authentication is working, let's finish up with some unit tests. First, a small tweak to `src/server/index.js` is needed to let us run the server on a different port to the main application, and easily restart it between tests. Update the part of `src/server/index.js` where the server is created:\n\n```\nfunction boot(port) {\n return app.listen(port, () => console.log(`Listening on port ${port}.`))\n}\n\nif (!module.parent) {\n boot(5000)\n}\n\nmodule.exports = { boot }\n```\n\nThis way, the server will only run if there is no `module.parent` - basically, when it is not being required in another file.\n\nCreate a directory called `server` in `tests/unit/specs/server` and add a `index.spec.js` file. Before writing the actual tests, we have some housekeeping to do.\n\n## Mocking steem.js\n\nTesting is not the main purpose of this series, so I will not provide an in depth explanation of how exactly the tests are working. Trying things out yourself is the best way to learn. Either way, tests are part of any development workflow, so I'm going to go over them quickly anyway.\n\nWe _know_ steem.js and the functions it provides are working correctly - it has its own set of unit tests, written by the developers of the library. We want to test the our own code. That means we _mock_ the steem.js api - `getPrivateKeys`, `wifIsValid` and so forth. Jest allows us to mock a node module like so:\n\n```js\nconst http = require('http')\nconst { boot } = require('../../../../src/server/index.js')\n\nlet mockWifIsValid = false\n\njest.mock('steem', function() {\n return {\n auth: {\n getPrivateKeys: () => ({ posting: 'mock' }),\n wifIsValid: () => mockWifIsValid\n },\n\n api: {\n getAccountsAsync: () => [{\n posting: { key_auths: [[ 'mock' ]] }\n }],\n setOptions: jest.fn()\n }\n }\n})\n```\n\nWe declared a global `mockWifIsValid` variable. This lets us simulate a correct or incorrect username/password combination by saying `mockWifIsValid = true` or `mockWifIsValid = false`. Now the actual tests - first one for the case of incorrect credentials:\n\n```js\ndescribe('server', () => {\n let server\n\n beforeEach(() => server = boot(4000))\n afterEach(() => server.close())\n\n describe('POST /api/login', () => {\n it('returns a 403 if username/password is invalid', (done) => {\n mockWifIsValid = false\n\n const options = {\n hostname: 'localhost',\n port: 4000,\n path: '/api/login',\n method: 'POST'\n }\n const req = http.request(options, (res) => {\n res.setEncoding('utf8')\n res.on('data', () => {\n expect(res.statusCode).toBe(403)\n done()\n })\n })\n\n req.end()\n })\n })\n})\n```\n\nKind of long, but it's worth it to be confident the application is working correctly as we develop. `beforeEach` test, we start the server, and `afterEach` we close it. Then to simulate incorrect credentials, `mockWifIsValid` is set to `false`. After making the request using Node's `http` module, we `expect(res.statusCode).toBe(403)`.\n\nNext, the passing case:\n\n```js\nit('returns a JWT if the username/password is valid', (done) => {\n mockWifIsValid = true\n\n const options = {\n hostname: 'localhost',\n port: 4000,\n path: '/api/login',\n method: 'POST',\n headers: { 'content-type': 'application/json' }\n }\n const req = http.request(options, (res) => {\n res.setEncoding('utf8')\n res.on('data', (chunk) => {\n expect(JSON.parse(chunk)).toHaveProperty('token')\n done()\n })\n })\n\n req.write('{ \"username\": \"test user\" }')\n req.end()\n})\n```\n\nWe don't need to verify what the `token` is. As long as the `token` property is present in the response, I'm confident that the `jsonwebtoken` module is working correctly.\n\nThis test can be run individually using `yarn jest --runTestsByPath test/unit/spec/server/index.test.js`. If you did everything correctly, they should pass. Run the entire suite using `yarn unit`.\n\n## Conclusion\n\nThis was a pretty long article with a long of information. It covered:\n\n- what JWT is and how it works\n- setting up Express and working with Node.js\n- how to use `getAccountsAsync` to get account details\n- using `getPrivateKeys` to get keys using a username/password \n- verifying the validity of the keys using `wifIsValid`\n- writing tests using Jest and `jest.mock`\n\nThe next part will focus on integrating the Vue frontend from the previous article, and the server we created here, to allow a user to log in, then post without retyping their password by using JWT authentication.\n\nThe source code for this part is [here](https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain).",
"json_metadata": "{\"tags\":[\"utopian-io\",\"steem\",\"steemdev\",\"javascript\",\"programming\"],\"image\":[\"https://steemitimages.com/0x0/https://cdn-images-1.medium.com/max/800/1*IM14RDpJNKz2hW69iTQLCQ.jpeg\"],\"links\":[\"https://medium.com/@lachlanmiller_52885/build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js-a25bd7629a14\",\"https://steemit.com/utopian-io/@xenetics/build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain\",\"https://github.com/lmiller1990/steem-blog-series/tree/part-3-login\",\"https://curl.haxx.se/download.html\",\"https://stackoverflow.com/questions/9507353/how-do-i-install-set-up-and-use-curl-on-windows\",\"https://github.com/steemit/steem-js/tree/master/doc#get-accounts\",\"https://github.com/steemit/steem-js/tree/master/doc#wif-is-valid\",\"https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "utopian-io",
"permlink": "build-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt",
"title": "Build social media platform with the Steem Blockchain #3 — Server Side Auth with Steem.js and JWT"
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T15:57:27",
"trx_id": "21acc9bdb3c4fd48b4b6b038b2a89e8a0964edda",
"trx_in_block": 31,
"virtual_op": 0
}2018/08/27 15:55:06
2018/08/27 15:55:06
| author | alexpmorris |
| permlink | howto-encrypt-and-decrypt-bitshares-memos-in-either-javascript-or-java |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25438675/Trx c928862a22dbcd62386ee3450441e05f1dcabdd2 |
View Raw JSON Data
{
"block": 25438675,
"op": [
"vote",
{
"author": "alexpmorris",
"permlink": "howto-encrypt-and-decrypt-bitshares-memos-in-either-javascript-or-java",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T15:55:06",
"trx_id": "c928862a22dbcd62386ee3450441e05f1dcabdd2",
"trx_in_block": 53,
"virtual_op": 0
}xeneticsupvoted (100.00%) @inertia / using-radiator-on-testnet2018/08/27 15:54:21
xeneticsupvoted (100.00%) @inertia / using-radiator-on-testnet
2018/08/27 15:54:21
| author | inertia |
| permlink | using-radiator-on-testnet |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #25438660/Trx 0da54bcf939e74bfce47072512f9b675c5f3ba0b |
View Raw JSON Data
{
"block": 25438660,
"op": [
"vote",
{
"author": "inertia",
"permlink": "using-radiator-on-testnet",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-08-27T15:54:21",
"trx_id": "0da54bcf939e74bfce47072512f9b675c5f3ba0b",
"trx_in_block": 3,
"virtual_op": 0
}2018/06/14 11:46:39
2018/06/14 11:46:39
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js |
| voter | boyanpro |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23313698/Trx b5eebcabea333f35e1eab991b4424915e95ccbd4 |
View Raw JSON Data
{
"block": 23313698,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js",
"voter": "boyanpro",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-14T11:46:39",
"trx_id": "b5eebcabea333f35e1eab991b4424915e95ccbd4",
"trx_in_block": 42,
"virtual_op": 0
}2018/06/14 11:46:30
2018/06/14 11:46:30
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| voter | boyanpro |
| weight | 10000 (100.00%) |
| Transaction Info | Block #23313695/Trx c65ecc097156570a1985b43b5233a02f491f1658 |
View Raw JSON Data
{
"block": 23313695,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"voter": "boyanpro",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-06-14T11:46:30",
"trx_id": "c65ecc097156570a1985b43b5233a02f491f1658",
"trx_in_block": 3,
"virtual_op": 0
}2018/05/26 14:51:27
2018/05/26 14:51:27
| author | xenetics |
| permlink | hi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan |
| voter | chanceb |
| weight | 10000 (100.00%) |
| Transaction Info | Block #22770909/Trx d28d3e597f63d55b3fe9bfb456c0ff1d14bfcb89 |
View Raw JSON Data
{
"block": 22770909,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "hi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan",
"voter": "chanceb",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-05-26T14:51:27",
"trx_id": "d28d3e597f63d55b3fe9bfb456c0ff1d14bfcb89",
"trx_in_block": 78,
"virtual_op": 0
}2018/05/24 18:20:42
2018/05/24 18:20:42
| author | xenetics |
| permlink | steem-development-1-first-step-into-developing-an-app-with-the-steem-blockchain |
| voter | chanceb |
| weight | 10000 (100.00%) |
| Transaction Info | Block #22717507/Trx 6c63210ff9933b95cefd25dd6103d95bc829a0b9 |
View Raw JSON Data
{
"block": 22717507,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "steem-development-1-first-step-into-developing-an-app-with-the-steem-blockchain",
"voter": "chanceb",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-05-24T18:20:42",
"trx_id": "6c63210ff9933b95cefd25dd6103d95bc829a0b9",
"trx_in_block": 48,
"virtual_op": 0
}2018/05/23 23:39:39
2018/05/23 23:39:39
| author | chanceb |
| body | Great tutorial, Thank you!!! I used this info for building my react app! |
| json metadata | {"tags":["utopian-io"],"app":"steemit/0.1"} |
| parent author | xenetics |
| parent permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| permlink | re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180523t233938449z |
| title | |
| Transaction Info | Block #22695446/Trx 4efe0e339681dc3aa55af401f89df595cf5de64a |
View Raw JSON Data
{
"block": 22695446,
"op": [
"comment",
{
"author": "chanceb",
"body": "Great tutorial, Thank you!!! I used this info for building my react app!",
"json_metadata": "{\"tags\":[\"utopian-io\"],\"app\":\"steemit/0.1\"}",
"parent_author": "xenetics",
"parent_permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"permlink": "re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180523t233938449z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-05-23T23:39:39",
"trx_id": "4efe0e339681dc3aa55af401f89df595cf5de64a",
"trx_in_block": 17,
"virtual_op": 0
}2018/05/23 21:46:27
2018/05/23 21:46:27
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| voter | chanceb |
| weight | 10000 (100.00%) |
| Transaction Info | Block #22693182/Trx af2884adfee5cce7679012dbf239d3730f3a5166 |
View Raw JSON Data
{
"block": 22693182,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"voter": "chanceb",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-05-23T21:46:27",
"trx_id": "af2884adfee5cce7679012dbf239d3730f3a5166",
"trx_in_block": 67,
"virtual_op": 0
}2018/05/17 03:48:00
2018/05/17 03:48:00
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 2034.813120 VESTS |
| Transaction Info | Block #22498858/Trx a8068e21b67c99b6c020079dec043cf12712d86e |
View Raw JSON Data
{
"block": 22498858,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "2034.813120 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-17T03:48:00",
"trx_id": "a8068e21b67c99b6c020079dec043cf12712d86e",
"trx_in_block": 24,
"virtual_op": 0
}geniuslocireplied to @xenetics / re-xenetics-test-20180330t150346958z2018/03/30 15:03:48
geniuslocireplied to @xenetics / re-xenetics-test-20180330t150346958z
2018/03/30 15:03:48
| author | geniusloci |
| body | Hi Lachlan, would love to get in touch with you (project related) could you drop me a mail? [email protected] hear you soon :) |
| json metadata | {"tags":["test"],"app":"steemit/0.1"} |
| parent author | xenetics |
| parent permlink | test |
| permlink | re-xenetics-test-20180330t150346958z |
| title | |
| Transaction Info | Block #21130863/Trx 1ef64b49864acd91a0e22db87b0e6c74d516ddc4 |
View Raw JSON Data
{
"block": 21130863,
"op": [
"comment",
{
"author": "geniusloci",
"body": "Hi Lachlan, would love to get in touch with you (project related) could you drop me a mail? [email protected] hear you soon :)",
"json_metadata": "{\"tags\":[\"test\"],\"app\":\"steemit/0.1\"}",
"parent_author": "xenetics",
"parent_permlink": "test",
"permlink": "re-xenetics-test-20180330t150346958z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-03-30T15:03:48",
"trx_id": "1ef64b49864acd91a0e22db87b0e6c74d516ddc4",
"trx_in_block": 5,
"virtual_op": 0
}2018/03/26 20:25:12
2018/03/26 20:25:12
| author | earthangel |
| body | Wow ten years!!! That's so cool. Sorry I'm replying your comment this late, I just saw it. Thanks for the offer, will definitely ask you for tips. Followed you as well |
| json metadata | {"tags":["tutorial"],"app":"steemit/0.1"} |
| parent author | xenetics |
| parent permlink | re-earthangel-learning-japanese-20180108t142936696z |
| permlink | re-xenetics-re-earthangel-learning-japanese-20180326t202503065z |
| title | |
| Transaction Info | Block #21022128/Trx e547e75ede68df5bd5534c1cd744e0b5035ecf01 |
View Raw JSON Data
{
"block": 21022128,
"op": [
"comment",
{
"author": "earthangel",
"body": "Wow ten years!!! That's so cool. Sorry I'm replying your comment this late, I just saw it. Thanks for the offer, will definitely ask you for tips. Followed you as well",
"json_metadata": "{\"tags\":[\"tutorial\"],\"app\":\"steemit/0.1\"}",
"parent_author": "xenetics",
"parent_permlink": "re-earthangel-learning-japanese-20180108t142936696z",
"permlink": "re-xenetics-re-earthangel-learning-japanese-20180326t202503065z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-03-26T20:25:12",
"trx_id": "e547e75ede68df5bd5534c1cd744e0b5035ecf01",
"trx_in_block": 33,
"virtual_op": 0
}earthangelupvoted (100.00%) @xenetics / re-earthangel-learning-japanese-20180108t142936696z2018/03/26 20:23:27
earthangelupvoted (100.00%) @xenetics / re-earthangel-learning-japanese-20180108t142936696z
2018/03/26 20:23:27
| author | xenetics |
| permlink | re-earthangel-learning-japanese-20180108t142936696z |
| voter | earthangel |
| weight | 10000 (100.00%) |
| Transaction Info | Block #21022093/Trx d8b8b07ebd3b50802f3205ecc4b2a9104182d591 |
View Raw JSON Data
{
"block": 21022093,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "re-earthangel-learning-japanese-20180108t142936696z",
"voter": "earthangel",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-03-26T20:23:27",
"trx_id": "d8b8b07ebd3b50802f3205ecc4b2a9104182d591",
"trx_in_block": 38,
"virtual_op": 0
}2018/02/18 17:35:36
2018/02/18 17:35:36
| author | xenetics |
| permlink | steem-development-2-make-a-javascript-app-using-the-steem-blockchain |
| voter | kmastermind |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19983576/Trx cac474721cd02e346f14f1959e3b21dae068c4c5 |
View Raw JSON Data
{
"block": 19983576,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "steem-development-2-make-a-javascript-app-using-the-steem-blockchain",
"voter": "kmastermind",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-18T17:35:36",
"trx_id": "cac474721cd02e346f14f1959e3b21dae068c4c5",
"trx_in_block": 11,
"virtual_op": 0
}2018/02/08 12:23:18
2018/02/08 12:23:18
| author | xenetics |
| permlink | test |
| voter | dtubix |
| weight | 5000 (50.00%) |
| Transaction Info | Block #19689599/Trx 39fba890cc0b5e70eb808db89253616242abdc7e |
View Raw JSON Data
{
"block": 19689599,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "test",
"voter": "dtubix",
"weight": 5000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-08T12:23:18",
"trx_id": "39fba890cc0b5e70eb808db89253616242abdc7e",
"trx_in_block": 9,
"virtual_op": 0
}2018/02/06 13:27:57
2018/02/06 13:27:57
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| voter | globalhshvillage |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19633497/Trx ba59d4b2ff2208a6f78b992442d85ab981b567ae |
View Raw JSON Data
{
"block": 19633497,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"voter": "globalhshvillage",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-06T13:27:57",
"trx_id": "ba59d4b2ff2208a6f78b992442d85ab981b567ae",
"trx_in_block": 46,
"virtual_op": 0
}2018/02/06 10:12:15
2018/02/06 10:12:15
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| voter | tokyowomanslife |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19629586/Trx 900a71de5d0420cf86b6f9111f9b31eceaaa1920 |
View Raw JSON Data
{
"block": 19629586,
"op": [
"vote",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"voter": "tokyowomanslife",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-02-06T10:12:15",
"trx_id": "900a71de5d0420cf86b6f9111f9b31eceaaa1920",
"trx_in_block": 47,
"virtual_op": 0
}2018/02/04 13:24:18
2018/02/04 13:24:18
| delegatee | xenetics |
| delegator | steem |
| vesting shares | 15980.668965 VESTS |
| Transaction Info | Block #19575850/Trx 6ed133912b1f4329c82617f76e63dddf14f8b11a |
View Raw JSON Data
{
"block": 19575850,
"op": [
"delegate_vesting_shares",
{
"delegatee": "xenetics",
"delegator": "steem",
"vesting_shares": "15980.668965 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-04T13:24:18",
"trx_id": "6ed133912b1f4329c82617f76e63dddf14f8b11a",
"trx_in_block": 7,
"virtual_op": 0
}xeneticsclaimed reward balance: 9.621 SBD, 2.540 SP2018/02/04 12:22:15
xeneticsclaimed reward balance: 9.621 SBD, 2.540 SP
2018/02/04 12:22:15
| account | xenetics |
| reward sbd | 9.621 SBD |
| reward steem | 0.000 STEEM |
| reward vests | 4130.468434 VESTS |
| Transaction Info | Block #19574609/Trx f69a2026864e8a7c2c14c75cc821e6ecc779a6b6 |
View Raw JSON Data
{
"block": 19574609,
"op": [
"claim_reward_balance",
{
"account": "xenetics",
"reward_sbd": "9.621 SBD",
"reward_steem": "0.000 STEEM",
"reward_vests": "4130.468434 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-04T12:22:15",
"trx_id": "f69a2026864e8a7c2c14c75cc821e6ecc779a6b6",
"trx_in_block": 48,
"virtual_op": 0
}xeneticsreceived 9.205 SBD, 2.433 SP author reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain2018/02/03 07:05:00
xeneticsreceived 9.205 SBD, 2.433 SP author reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
2018/02/03 07:05:00
| author | xenetics |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| sbd payout | 9.205 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 3956.559412 VESTS |
| Transaction Info | Block #19539577/Virtual Operation #17 |
View Raw JSON Data
{
"block": 19539577,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"sbd_payout": "9.205 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "3956.559412 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-03T07:05:00",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 17
}utopian.payreceived 1.621 SP benefactor reward from @xenetics2018/02/03 07:05:00
utopian.payreceived 1.621 SP benefactor reward from @xenetics
2018/02/03 07:05:00
| author | xenetics |
| benefactor | utopian.pay |
| permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| sbd payout | 0.000 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 2637.024344 VESTS |
| Transaction Info | Block #19539577/Virtual Operation #16 |
View Raw JSON Data
{
"block": 19539577,
"op": [
"comment_benefactor_reward",
{
"author": "xenetics",
"benefactor": "utopian.pay",
"permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"sbd_payout": "0.000 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "2637.024344 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-03T07:05:00",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 16
}xeneticsreceived 0.003 SP curation reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain2018/02/03 07:05:00
xeneticsreceived 0.003 SP curation reward for @xenetics / build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
2018/02/03 07:05:00
| comment author | xenetics |
| comment permlink | build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain |
| curator | xenetics |
| reward | 4.091581 VESTS |
| Transaction Info | Block #19539577/Virtual Operation #14 |
View Raw JSON Data
{
"block": 19539577,
"op": [
"curation_reward",
{
"comment_author": "xenetics",
"comment_permlink": "build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain",
"curator": "xenetics",
"reward": "4.091581 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-03T07:05:00",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 14
}xeneticsreceived 0.049 SBD, 0.014 SP author reward for @xenetics / instagram-clone-steem2018/02/02 13:32:42
xeneticsreceived 0.049 SBD, 0.014 SP author reward for @xenetics / instagram-clone-steem
2018/02/02 13:32:42
| author | xenetics |
| permlink | instagram-clone-steem |
| sbd payout | 0.049 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 22.504520 VESTS |
| Transaction Info | Block #19518561/Virtual Operation #25 |
View Raw JSON Data
{
"block": 19518561,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "instagram-clone-steem",
"sbd_payout": "0.049 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "22.504520 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:32:42",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 25
}xeneticsreceived 0.009 SBD, 0.003 SP author reward for @xenetics / re-jeffbernst-my-first-steem-js-adventure-part-3-jquery-dates-and-more-promises-almost-done-20180126t064046098z2018/02/02 06:40:45
xeneticsreceived 0.009 SBD, 0.003 SP author reward for @xenetics / re-jeffbernst-my-first-steem-js-adventure-part-3-jquery-dates-and-more-promises-almost-done-20180126t064046098z
2018/02/02 06:40:45
| author | xenetics |
| permlink | re-jeffbernst-my-first-steem-js-adventure-part-3-jquery-dates-and-more-promises-almost-done-20180126t064046098z |
| sbd payout | 0.009 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 4.091789 VESTS |
| Transaction Info | Block #19510333/Virtual Operation #13 |
View Raw JSON Data
{
"block": 19510333,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "re-jeffbernst-my-first-steem-js-adventure-part-3-jquery-dates-and-more-promises-almost-done-20180126t064046098z",
"sbd_payout": "0.009 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "4.091789 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T06:40:45",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 13
}xeneticsreceived 0.001 SP curation reward for @zaiageist / dance-games-overtraining2018/02/01 22:15:33
xeneticsreceived 0.001 SP curation reward for @zaiageist / dance-games-overtraining
2018/02/01 22:15:33
| comment author | zaiageist |
| comment permlink | dance-games-overtraining |
| curator | xenetics |
| reward | 2.045930 VESTS |
| Transaction Info | Block #19500242/Virtual Operation #11 |
View Raw JSON Data
{
"block": 19500242,
"op": [
"curation_reward",
{
"comment_author": "zaiageist",
"comment_permlink": "dance-games-overtraining",
"curator": "xenetics",
"reward": "2.045930 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-01T22:15:33",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 11
}xeneticsreceived 0.151 SBD, 0.039 SP author reward for @xenetics / 20180125t162049464z-post2018/02/01 16:20:51
xeneticsreceived 0.151 SBD, 0.039 SP author reward for @xenetics / 20180125t162049464z-post
2018/02/01 16:20:51
| author | xenetics |
| permlink | 20180125t162049464z-post |
| sbd payout | 0.151 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 63.424655 VESTS |
| Transaction Info | Block #19493164/Virtual Operation #5 |
View Raw JSON Data
{
"block": 19493164,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "20180125t162049464z-post",
"sbd_payout": "0.151 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "63.424655 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-01T16:20:51",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 5
}2018/01/31 15:32:45
2018/01/31 15:32:45
| author | xenetics |
| permlink | bitcoin |
| sbd payout | 0.196 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 71.612338 VESTS |
| Transaction Info | Block #19463449/Virtual Operation #7 |
View Raw JSON Data
{
"block": 19463449,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "bitcoin",
"sbd_payout": "0.196 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "71.612338 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-31T15:32:45",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 7
}xeneticsreceived 0.011 SBD, 0.004 SP author reward for @xenetics / re-jeffbernst-designing-my-first-full-stack-javascript-project-in-sketch-20180124t145005156z2018/01/31 14:50:06
xeneticsreceived 0.011 SBD, 0.004 SP author reward for @xenetics / re-jeffbernst-designing-my-first-full-stack-javascript-project-in-sketch-20180124t145005156z
2018/01/31 14:50:06
| author | xenetics |
| permlink | re-jeffbernst-designing-my-first-full-stack-javascript-project-in-sketch-20180124t145005156z |
| sbd payout | 0.011 SBD |
| steem payout | 0.000 STEEM |
| vesting payout | 6.138209 VESTS |
| Transaction Info | Block #19462596/Virtual Operation #4 |
View Raw JSON Data
{
"block": 19462596,
"op": [
"author_reward",
{
"author": "xenetics",
"permlink": "re-jeffbernst-designing-my-first-full-stack-javascript-project-in-sketch-20180124t145005156z",
"sbd_payout": "0.011 SBD",
"steem_payout": "0.000 STEEM",
"vesting_payout": "6.138209 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-31T14:50:06",
"trx_id": "0000000000000000000000000000000000000000",
"trx_in_block": 4294967295,
"virtual_op": 4
}2018/01/29 02:43:00
2018/01/29 02:43:00
| author | utopian-io |
| permlink | re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z |
| voter | xenetics |
| weight | 10000 (100.00%) |
| Transaction Info | Block #19390521/Trx 7ebec23d9938a9a36afc224bb56cad753e24e798 |
View Raw JSON Data
{
"block": 19390521,
"op": [
"vote",
{
"author": "utopian-io",
"permlink": "re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z",
"voter": "xenetics",
"weight": 10000
}
],
"op_in_trx": 0,
"timestamp": "2018-01-29T02:43:00",
"trx_id": "7ebec23d9938a9a36afc224bb56cad753e24e798",
"trx_in_block": 21,
"virtual_op": 0
}2018/01/29 02:43:00
2018/01/29 02:43:00
| author | xenetics |
| body | Thanks! |
| json metadata | {"tags":["utopian-io"],"app":"steemit/0.1"} |
| parent author | utopian-io |
| parent permlink | re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z |
| permlink | re-utopian-io-re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180129t024259440z |
| title | |
| Transaction Info | Block #19390521/Trx 207a14a2efa4164f55c9a2f9b28dfbec46fa2849 |
View Raw JSON Data
{
"block": 19390521,
"op": [
"comment",
{
"author": "xenetics",
"body": "Thanks!",
"json_metadata": "{\"tags\":[\"utopian-io\"],\"app\":\"steemit/0.1\"}",
"parent_author": "utopian-io",
"parent_permlink": "re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z",
"permlink": "re-utopian-io-re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180129t024259440z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-01-29T02:43:00",
"trx_id": "207a14a2efa4164f55c9a2f9b28dfbec46fa2849",
"trx_in_block": 8,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress52.87%
{
"voting_manabar": {
"current_mana": "14924662433",
"last_update_time": 1588959333
},
"downvote_manabar": {
"current_mana": 3731165609,
"last_update_time": 1588959333
},
"rc_account": {
"account": "xenetics",
"max_rc": "16945411406",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "18958962597",
"last_update_time": 1588959333
}
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"profile_image":"https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg","name":"xenetics","about":"Software Engineer in Toyko, Japan","location":"Tokyo","website":"https://www.github.com/lmiller1990"} |
| JSON METADATA | |
| profile | {"profile_image":"https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg","name":"xenetics","about":"Software Engineer in Toyko, Japan","location":"Tokyo","website":"https://www.github.com/lmiller1990"} |
{
"posting_json_metadata": {
"profile": {
"profile_image": "https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg",
"name": "xenetics",
"about": "Software Engineer in Toyko, Japan",
"location": "Tokyo",
"website": "https://www.github.com/lmiller1990"
}
},
"json_metadata": {
"profile": {
"profile_image": "https://pbs.twimg.com/profile_images/917376611799900160/OKKp8l_W_400x400.jpg",
"name": "xenetics",
"about": "Software Engineer in Toyko, Japan",
"location": "Tokyo",
"website": "https://www.github.com/lmiller1990"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM6oC1amoXZvwnysPvEPqWfK2jxfQxCht2rbsVQv91k6w1AqiH7i1/1
Active
Single Signature
Public Keys
STM6cMRQxFkj2y4bQgURNSM6wX6uM9XpnyPqV5ZJiNxAgdQxx5Jca1/1
Posting
Single Signature
Public Keys
STM6vNnS2y4MjVZpbm2fnsPYaZ5jK1oXTSYdbEteGfa3YqPZ8nW231/1
Memo
STM63f1ezaskwr6N4s2Qk8HYbTGJ1nXvqY79U9AVg8E64wz3k3U9R
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6oC1amoXZvwnysPvEPqWfK2jxfQxCht2rbsVQv91k6w1AqiH7i",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM6cMRQxFkj2y4bQgURNSM6wX6uM9XpnyPqV5ZJiNxAgdQxx5Jca",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [
[
"busy.app",
1
],
[
"utopian.app",
1
]
],
"key_auths": [
[
"STM6vNnS2y4MjVZpbm2fnsPYaZ5jK1oXTSYdbEteGfa3YqPZ8nW23",
1
]
],
"weight_threshold": 1
},
"memo": "STM63f1ezaskwr6N4s2Qk8HYbTGJ1nXvqY79U9AVg8E64wz3k3U9R"
}Witness Votes
0 / 30
No active witness votes.
[]