Ecoer Logo

@xenetics

46

Software Engineer in Toyko, Japan

steemit.com/@xenetics
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
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
9.176SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
9.176SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
31.731SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "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

namexenetics
id578855
rank138,346
reputation190970083598
created2018-01-08T01:55:39
recovery_accountsteem
proxyNone
post_count89
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-08-30T12:42:21
last_root_post2018-08-30T12:42:21
last_vote_time2018-08-31T13:03:39
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.109 STEEM
savings_balance0.000 STEEM
sbd_balance31.731 SBD
savings_sbd_balance0.000 SBD
vesting_shares14924.662433 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-01-10T14:07:51
minedNo
sbd_seconds0
sbd_last_interest_payment2018-09-16T03:32:48
savings_sbd_last_interest_payment1970-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

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
2025/12/30 15:01:39
authorjohnasp96
bodyDeleted
json metadata{"app":"steemit/0.2"}
parent authorxenetics
parent permlinkre-johnasp96-im-here-20180108t150148195z
permlinkre-xenetics-re-johnasp96-im-here-20180108t151005422z
title
Transaction InfoBlock #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
}
steemdelegated 0.000 SP to @xenetics
2020/05/08 17:35:33
delegateexenetics
delegatorsteem
vesting shares0.000000 VESTS
Transaction InfoBlock #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
}
2020/02/21 18:50:00
authorarthur.grafo4
bodySo 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 authorxenetics
parent permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
permlinkq62eyj
title
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authorxenetics
parent permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
permlinksteemitboard-notify-xenetics-20200108t030147000z
title
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authorxenetics
parent permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
permlinksteemitboard-notify-xenetics-20190108t034938000z
title
Transaction InfoBlock #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
authorxenetics
permlinkhi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan
voterprospector
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 1.238 SP to @xenetics
2018/11/30 13:05:36
delegateexenetics
delegatorsteem
vesting shares2013.551191 VESTS
Transaction InfoBlock #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
}
steemdelegated 9.469 SP to @xenetics
2018/09/16 03:53:30
delegateexenetics
delegatorsteem
vesting shares15401.158356 VESTS
Transaction InfoBlock #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 SP
2018/09/16 03:32:48
accountxenetics
reward sbd0.000 SBD
reward steem0.108 STEEM
reward vests220.517941 VESTS
Transaction InfoBlock #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
}
2018/09/03 15:57:27
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
sbd payout0.000 SBD
steem payout0.108 STEEM
vesting payout220.517941 VESTS
Transaction InfoBlock #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
}
2018/08/31 13:04:30
authorjeffbernst
permlinksimplefol-io-a-simple-cryptocurrency-portfolio-app
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/31 13:03:39
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:10:33
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterjeffbernst
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:10:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
votergolfingglug
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:10:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterandrei8
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:08:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
votervorovskoy44
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:08:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterstimulusmaybe
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:06:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
votersilicaundo
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:04:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterdzheymss
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:04:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterseca17
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:02:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
votertrubadurkir
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 13:00:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterhoneycheek
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:58:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterheaderharem
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:58:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
votermagichive
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:54:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterbarcodemail
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:52:27
authorxenetics
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
voterputridgamete
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:48:42
authorpacokam8
permlinkrakan-league-of-legends-review
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/30 12:42:21
authorxenetics
bodyThis 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_semis.png?raw=true) 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? ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_fb.png?raw=true) 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_ft.png?raw=true) 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_victories.png?raw=true) 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fb.png?raw=true) 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_ft.png?raw=true) 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? ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fd.png?raw=true) 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: ![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fbaron.png?raw=true) 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 permlinkleagueoflegends
permlinkna-lcs-semifinals-betting-predictions-c9-vs-tsm-100-vs-tl
titleNA LCS semifinals betting predictions - C9 vs TSM, 100 vs TL
Transaction InfoBlock #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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_semis.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_fb.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/c9_tsm_ft.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_victories.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fb.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_ft.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fd.png?raw=true)\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![](https://github.com/lmiller1990/gamblor/blob/master/articles/graphs/100_tl_fbaron.png?raw=true)\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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterclayjohn
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterremlaps2
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
votercub2
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterremlaps-lite
weight6500 (65.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
votercmp2020-lite
weight6500 (65.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterrgkmb-unofficial
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterrgkmb
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterastronomyizfun
weight6500 (65.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterjaff8
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterstatsexpert
weight6000 (60.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterjeffbernst
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 9.624 SP to @xenetics
2018/08/27 16:18:48
delegateexenetics
delegatorsteem
vesting shares15653.427533 VESTS
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voteryuxi
weight1000 (10.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
votersimplymike
weight2000 (20.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
votercorvushilt
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterghazi48
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
body![](https://steemitimages.com/0x0/https://cdn-images-1.medium.com/max/800/1*IM14RDpJNKz2hW69iTQLCQ.jpeg) 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 permlinkutopian-io
permlinkbuild-social-media-platform-with-the-steem-blockchain-3-server-side-auth-with-steem-js-and-jwt
titleBuild social media platform with the Steem Blockchain #3 — Server Side Auth with Steem.js and JWT
Transaction InfoBlock #25438722/Trx 21acc9bdb3c4fd48b4b6b038b2a89e8a0964edda
View Raw JSON Data
{
  "block": 25438722,
  "op": [
    "comment",
    {
      "author": "xenetics",
      "body": "![](https://steemitimages.com/0x0/https://cdn-images-1.medium.com/max/800/1*IM14RDpJNKz2hW69iTQLCQ.jpeg)\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
authoralexpmorris
permlinkhowto-encrypt-and-decrypt-bitshares-memos-in-either-javascript-or-java
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
}
2018/08/27 15:54:21
authorinertia
permlinkusing-radiator-on-testnet
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-1-vue-js-storybook-js-and-steem-js
voterboyanpro
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
voterboyanpro
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkhi-i-m-lachlan-engineer-language-enthusiast-musician-minimalist-in-tokyo-japan
voterchanceb
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinksteem-development-1-first-step-into-developing-an-app-with-the-steem-blockchain
voterchanceb
weight10000 (100.00%)
Transaction InfoBlock #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
authorchanceb
bodyGreat tutorial, Thank you!!! I used this info for building my react app!
json metadata{"tags":["utopian-io"],"app":"steemit/0.1"}
parent authorxenetics
parent permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
permlinkre-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180523t233938449z
title
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
voterchanceb
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 1.251 SP to @xenetics
2018/05/17 03:48:00
delegateexenetics
delegatorsteem
vesting shares2034.813120 VESTS
Transaction InfoBlock #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
}
2018/03/30 15:03:48
authorgeniusloci
bodyHi 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 authorxenetics
parent permlinktest
permlinkre-xenetics-test-20180330t150346958z
title
Transaction InfoBlock #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
authorearthangel
bodyWow 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 authorxenetics
parent permlinkre-earthangel-learning-japanese-20180108t142936696z
permlinkre-xenetics-re-earthangel-learning-japanese-20180326t202503065z
title
Transaction InfoBlock #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
}
2018/03/26 20:23:27
authorxenetics
permlinkre-earthangel-learning-japanese-20180108t142936696z
voterearthangel
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinksteem-development-2-make-a-javascript-app-using-the-steem-blockchain
voterkmastermind
weight10000 (100.00%)
Transaction InfoBlock #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
}
dtubixupvoted (50.00%) @xenetics / test
2018/02/08 12:23:18
authorxenetics
permlinktest
voterdtubix
weight5000 (50.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
voterglobalhshvillage
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
votertokyowomanslife
weight10000 (100.00%)
Transaction InfoBlock #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
}
steemdelegated 9.826 SP to @xenetics
2018/02/04 13:24:18
delegateexenetics
delegatorsteem
vesting shares15980.668965 VESTS
Transaction InfoBlock #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 SP
2018/02/04 12:22:15
accountxenetics
reward sbd9.621 SBD
reward steem0.000 STEEM
reward vests4130.468434 VESTS
Transaction InfoBlock #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
}
2018/02/03 07:05:00
authorxenetics
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
sbd payout9.205 SBD
steem payout0.000 STEEM
vesting payout3956.559412 VESTS
Transaction InfoBlock #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 @xenetics
2018/02/03 07:05:00
authorxenetics
benefactorutopian.pay
permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
sbd payout0.000 SBD
steem payout0.000 STEEM
vesting payout2637.024344 VESTS
Transaction InfoBlock #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
}
2018/02/03 07:05:00
comment authorxenetics
comment permlinkbuild-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain
curatorxenetics
reward4.091581 VESTS
Transaction InfoBlock #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-steem
2018/02/02 13:32:42
authorxenetics
permlinkinstagram-clone-steem
sbd payout0.049 SBD
steem payout0.000 STEEM
vesting payout22.504520 VESTS
Transaction InfoBlock #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
}
2018/02/02 06:40:45
authorxenetics
permlinkre-jeffbernst-my-first-steem-js-adventure-part-3-jquery-dates-and-more-promises-almost-done-20180126t064046098z
sbd payout0.009 SBD
steem payout0.000 STEEM
vesting payout4.091789 VESTS
Transaction InfoBlock #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-overtraining
2018/02/01 22:15:33
comment authorzaiageist
comment permlinkdance-games-overtraining
curatorxenetics
reward2.045930 VESTS
Transaction InfoBlock #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-post
2018/02/01 16:20:51
authorxenetics
permlink20180125t162049464z-post
sbd payout0.151 SBD
steem payout0.000 STEEM
vesting payout63.424655 VESTS
Transaction InfoBlock #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
}
xeneticsreceived 0.196 SBD, 0.044 SP author reward for @xenetics / bitcoin
2018/01/31 15:32:45
authorxenetics
permlinkbitcoin
sbd payout0.196 SBD
steem payout0.000 STEEM
vesting payout71.612338 VESTS
Transaction InfoBlock #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
}
2018/01/31 14:50:06
authorxenetics
permlinkre-jeffbernst-designing-my-first-full-stack-javascript-project-in-sketch-20180124t145005156z
sbd payout0.011 SBD
steem payout0.000 STEEM
vesting payout6.138209 VESTS
Transaction InfoBlock #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
authorutopian-io
permlinkre-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z
voterxenetics
weight10000 (100.00%)
Transaction InfoBlock #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
authorxenetics
bodyThanks!
json metadata{"tags":["utopian-io"],"app":"steemit/0.1"}
parent authorutopian-io
parent permlinkre-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180128t185127730z
permlinkre-utopian-io-re-xenetics-build-social-media-platform-with-the-steem-blockchain-2-posting-a-comment-to-the-blockchain-20180129t024259440z
title
Transaction InfoBlock #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
}

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
App Permissions
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.
[]