Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.036USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.629SP
└── Incoming Deleg
+4.378SP

Detailed Balance

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

Account Info

namecopernix
id717546
rank1,453,082
reputation33529483
created2018-02-05T10:08:45
recovery_accountsteem
proxyNone
post_count1
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-09-20T14:45:30
last_root_post2018-09-20T14:45:30
last_vote_time2018-10-17T13:05:48
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1022.782565 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7120.877241 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_update1970-01-01T00:00:00
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 717546,
  "name": "copernix",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5TGEfWynjjj7NgxQrco81oAak8wnq9jteEymHeFhkC7YmqV5qx",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5wGNYv6aHpjtLbjBRGcdutdeB6WQzPLdRBaJGeMCnNL7utJ2br",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8YN3s45G3HxNzk8ejYHZFhzGtZVNVLMj7pcyUnEYnw8GjBzP6n",
        1
      ]
    ]
  },
  "memo_key": "STM7aUJ8V6kHRRD3mMi8XXFFy8H4DAL2v4YFMpSBpzxQ4Huiesbd1",
  "json_metadata": "",
  "posting_json_metadata": "",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "1970-01-01T00:00:00",
  "created": "2018-02-05T10:08:45",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 1,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779058365
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779058365
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "1022.782565 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7120.877241 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2018-09-20T14:45:30",
  "last_root_post": "2018-09-20T14:45:30",
  "last_vote_time": "2018-10-17T13:05:48",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 33529483,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 1453082
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.378 SP to @copernix
2026/05/17 22:52:45
delegateecopernix
delegatorsteem
vesting shares7120.877241 VESTS
Transaction InfoBlock #106141807/Trx 3b26092959557cc9c91525915634edc4a0533e07
View Raw JSON Data
{
  "block": 106141807,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "7120.877241 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-17T22:52:45",
  "trx_id": "3b26092959557cc9c91525915634edc4a0533e07",
  "trx_in_block": 8,
  "virtual_op": 0
}
steemdelegated 2.711 SP to @copernix
2026/05/11 22:22:42
delegateecopernix
delegatorsteem
vesting shares4408.666836 VESTS
Transaction InfoBlock #105969170/Trx 88c43d14373161084297b399f0bfb8eceea1c038
View Raw JSON Data
{
  "block": 105969170,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "4408.666836 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-11T22:22:42",
  "trx_id": "88c43d14373161084297b399f0bfb8eceea1c038",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 4.386 SP to @copernix
2026/04/25 22:15:51
delegateecopernix
delegatorsteem
vesting shares7133.392997 VESTS
Transaction InfoBlock #105509497/Trx 5118eb0874f053bc82ab7ad6d9fc1da133dbc24f
View Raw JSON Data
{
  "block": 105509497,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "7133.392997 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-04-25T22:15:51",
  "trx_id": "5118eb0874f053bc82ab7ad6d9fc1da133dbc24f",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 2.736 SP to @copernix
2026/01/23 04:10:42
delegateecopernix
delegatorsteem
vesting shares4450.213655 VESTS
Transaction InfoBlock #102847473/Trx dd23a7fbc0e36260a9b8c33bcbbd816f65b63e21
View Raw JSON Data
{
  "block": 102847473,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "4450.213655 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-01-23T04:10:42",
  "trx_id": "dd23a7fbc0e36260a9b8c33bcbbd816f65b63e21",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 2.837 SP to @copernix
2024/12/16 23:29:48
delegateecopernix
delegatorsteem
vesting shares4614.432852 VESTS
Transaction InfoBlock #91293876/Trx 390cc414d3d111533dd4bf1dee728c36118a8df1
View Raw JSON Data
{
  "block": 91293876,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "4614.432852 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2024-12-16T23:29:48",
  "trx_id": "390cc414d3d111533dd4bf1dee728c36118a8df1",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 2.941 SP to @copernix
2023/11/13 15:14:18
delegateecopernix
delegatorsteem
vesting shares4783.566384 VESTS
Transaction InfoBlock #79848125/Trx 3e6e8dccb7ac2c174a32219b9cd249232692ea48
View Raw JSON Data
{
  "block": 79848125,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "4783.566384 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-11-13T15:14:18",
  "trx_id": "3e6e8dccb7ac2c174a32219b9cd249232692ea48",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 4.747 SP to @copernix
2023/09/21 20:13:57
delegateecopernix
delegatorsteem
vesting shares7720.845170 VESTS
Transaction InfoBlock #78345920/Trx 12b23a9622b7ca055b4058049e7aa0ed3be61b93
View Raw JSON Data
{
  "block": 78345920,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "7720.845170 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-09-21T20:13:57",
  "trx_id": "12b23a9622b7ca055b4058049e7aa0ed3be61b93",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 4.883 SP to @copernix
2022/11/03 10:12:51
delegateecopernix
delegatorsteem
vesting shares7942.526608 VESTS
Transaction InfoBlock #69111484/Trx b68d900befc9e0e348a394f05f769a7fd77c4024
View Raw JSON Data
{
  "block": 69111484,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "7942.526608 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-11-03T10:12:51",
  "trx_id": "b68d900befc9e0e348a394f05f769a7fd77c4024",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 5.019 SP to @copernix
2022/01/17 09:35:57
delegateecopernix
delegatorsteem
vesting shares8163.059839 VESTS
Transaction InfoBlock #60807795/Trx b1f7ab659ec5bb11026e3bf1e1307a6e93c82796
View Raw JSON Data
{
  "block": 60807795,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8163.059839 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-01-17T09:35:57",
  "trx_id": "b1f7ab659ec5bb11026e3bf1e1307a6e93c82796",
  "trx_in_block": 38,
  "virtual_op": 0
}
steemdelegated 5.132 SP to @copernix
2021/06/13 23:34:15
delegateecopernix
delegatorsteem
vesting shares8346.828497 VESTS
Transaction InfoBlock #54606246/Trx 2d7a13a998ca7ed5c6e655ba5661baf52d312bf5
View Raw JSON Data
{
  "block": 54606246,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8346.828497 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2021-06-13T23:34:15",
  "trx_id": "2d7a13a998ca7ed5c6e655ba5661baf52d312bf5",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 5.247 SP to @copernix
2020/12/11 09:54:57
delegateecopernix
delegatorsteem
vesting shares8534.250471 VESTS
Transaction InfoBlock #49353754/Trx 47e7c30a8fc8de0618bd14534f02b071ad404a54
View Raw JSON Data
{
  "block": 49353754,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8534.250471 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-11T09:54:57",
  "trx_id": "47e7c30a8fc8de0618bd14534f02b071ad404a54",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 1.176 SP to @copernix
2020/12/06 03:32:09
delegateecopernix
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #49205320/Trx 292c0082ccf0fbd5105dee6bda2da64fde5a5d6c
View Raw JSON Data
{
  "block": 49205320,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "1912.543513 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-06T03:32:09",
  "trx_id": "292c0082ccf0fbd5105dee6bda2da64fde5a5d6c",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 5.251 SP to @copernix
2020/12/05 11:29:21
delegateecopernix
delegatorsteem
vesting shares8540.617110 VESTS
Transaction InfoBlock #49186428/Trx 2362dfe245ed8f875597a40513e1b5bbb5cee57a
View Raw JSON Data
{
  "block": 49186428,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8540.617110 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-05T11:29:21",
  "trx_id": "2362dfe245ed8f875597a40513e1b5bbb5cee57a",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 1.181 SP to @copernix
2020/11/02 12:57:00
delegateecopernix
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #48254640/Trx c50a1f4da54c02b733e45b0588f6cc819515ca74
View Raw JSON Data
{
  "block": 48254640,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "1920.017158 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-11-02T12:57:00",
  "trx_id": "c50a1f4da54c02b733e45b0588f6cc819515ca74",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 5.376 SP to @copernix
2020/05/09 04:28:12
delegateecopernix
delegatorsteem
vesting shares8743.263684 VESTS
Transaction InfoBlock #43215550/Trx bf7dc521d8fa7acbf768100b4c2e74b9659bcf89
View Raw JSON Data
{
  "block": 43215550,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8743.263684 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-09T04:28:12",
  "trx_id": "bf7dc521d8fa7acbf768100b4c2e74b9659bcf89",
  "trx_in_block": 11,
  "virtual_op": 0
}
steemdelegated 1.201 SP to @copernix
2020/05/08 07:53:27
delegateecopernix
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #43191432/Trx d8206ff5758d8b7fdc0adca250e1a13759749b87
View Raw JSON Data
{
  "block": 43191432,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "1953.311140 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T07:53:27",
  "trx_id": "d8206ff5758d8b7fdc0adca250e1a13759749b87",
  "trx_in_block": 0,
  "virtual_op": 0
}
2020/02/05 11:55:18
authorsteemitboard
bodyCongratulations @copernix! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@copernix/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/@copernix) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=copernix)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png"></a></td><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator">SteemitBoard Ranking update - A better rich list comparator</a></td></tr></table> ###### [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 authorcopernix
parent permlinkcmake-eosio
permlinksteemitboard-notify-copernix-20200205t115518000z
title
Transaction InfoBlock #40552611/Trx 53a38e8a7f4d90580d9c5720380ffa4aa655bef8
View Raw JSON Data
{
  "block": 40552611,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @copernix! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@copernix/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/@copernix) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=copernix)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png\"></a></td><td><a href=\"https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-a-better-rich-list-comparator\">SteemitBoard Ranking update - A better rich list comparator</a></td></tr></table>\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": "copernix",
      "parent_permlink": "cmake-eosio",
      "permlink": "steemitboard-notify-copernix-20200205t115518000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-02-05T11:55:18",
  "trx_id": "53a38e8a7f4d90580d9c5720380ffa4aa655bef8",
  "trx_in_block": 11,
  "virtual_op": 0
}
steemdelegated 5.424 SP to @copernix
2019/12/18 16:24:30
delegateecopernix
delegatorsteem
vesting shares8821.702289 VESTS
Transaction InfoBlock #39149510/Trx 999aded27bb82c3599f28ad1575044e78bd3c162
View Raw JSON Data
{
  "block": 39149510,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "8821.702289 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-12-18T16:24:30",
  "trx_id": "999aded27bb82c3599f28ad1575044e78bd3c162",
  "trx_in_block": 13,
  "virtual_op": 0
}
2019/02/05 11:45:39
authorsteemitboard
bodyCongratulations @copernix! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@copernix/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@copernix)_</sub> > 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 authorcopernix
parent permlinkcmake-eosio
permlinksteemitboard-notify-copernix-20190205t114539000z
title
Transaction InfoBlock #30080284/Trx 3d4fa83404d2310c828fcb68cd35c69feead186a
View Raw JSON Data
{
  "block": 30080284,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @copernix! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@copernix/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@copernix)_</sub>\n\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": "copernix",
      "parent_permlink": "cmake-eosio",
      "permlink": "steemitboard-notify-copernix-20190205t114539000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-02-05T11:45:39",
  "trx_id": "3d4fa83404d2310c828fcb68cd35c69feead186a",
  "trx_in_block": 6,
  "virtual_op": 0
}
steemdelegated 5.545 SP to @copernix
2019/01/16 14:26:33
delegateecopernix
delegatorsteem
vesting shares9018.647131 VESTS
Transaction InfoBlock #29508071/Trx e8c76b1ba33b7d64692d93bce87d845dbc296410
View Raw JSON Data
{
  "block": 29508071,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "9018.647131 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-01-16T14:26:33",
  "trx_id": "e8c76b1ba33b7d64692d93bce87d845dbc296410",
  "trx_in_block": 29,
  "virtual_op": 0
}
2018/10/17 13:05:48
authorfr3eze
permlinkeosnetworkisparalyzednowduetocpu-3msbfnk0gr
votercopernix
weight10000 (100.00%)
Transaction InfoBlock #26887437/Trx 35d381ef539292dd851a3b7d927400804611f669
View Raw JSON Data
{
  "block": 26887437,
  "op": [
    "vote",
    {
      "author": "fr3eze",
      "permlink": "eosnetworkisparalyzednowduetocpu-3msbfnk0gr",
      "voter": "copernix",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-17T13:05:48",
  "trx_id": "35d381ef539292dd851a3b7d927400804611f669",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 18.011 SP to @copernix
2018/09/21 23:55:18
delegateecopernix
delegatorsteem
vesting shares29294.390119 VESTS
Transaction InfoBlock #26152349/Trx 82b3b14a001270a0338481dab3cf1a25c66d2601
View Raw JSON Data
{
  "block": 26152349,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "29294.390119 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-21T23:55:18",
  "trx_id": "82b3b14a001270a0338481dab3cf1a25c66d2601",
  "trx_in_block": 1,
  "virtual_op": 0
}
2018/09/20 14:45:51
authorcheetah
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://github.com/EOSIO/eos/blob/master/contracts/tic_tac_toe/tic_tac_toe.cpp
json metadata
parent authorcopernix
parent permlinkcmake-eosio
permlinkcheetah-re-copernixcmake-eosio
title
Transaction InfoBlock #26112605/Trx 269bbb119e05b4022ad06fbdff9d0adf9142843f
View Raw JSON Data
{
  "block": 26112605,
  "op": [
    "comment",
    {
      "author": "cheetah",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://github.com/EOSIO/eos/blob/master/contracts/tic_tac_toe/tic_tac_toe.cpp",
      "json_metadata": "",
      "parent_author": "copernix",
      "parent_permlink": "cmake-eosio",
      "permlink": "cheetah-re-copernixcmake-eosio",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-20T14:45:51",
  "trx_id": "269bbb119e05b4022ad06fbdff9d0adf9142843f",
  "trx_in_block": 41,
  "virtual_op": 0
}
cheetahupvoted (0.08%) @copernix / cmake-eosio
2018/09/20 14:45:39
authorcopernix
permlinkcmake-eosio
votercheetah
weight8 (0.08%)
Transaction InfoBlock #26112601/Trx 7458e99ed45c432144f728806702f4ee77882f24
View Raw JSON Data
{
  "block": 26112601,
  "op": [
    "vote",
    {
      "author": "copernix",
      "permlink": "cmake-eosio",
      "voter": "cheetah",
      "weight": 8
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-20T14:45:39",
  "trx_id": "7458e99ed45c432144f728806702f4ee77882f24",
  "trx_in_block": 44,
  "virtual_op": 0
}
ax3upvoted (1.00%) @copernix / cmake-eosio
2018/09/20 14:45:39
authorcopernix
permlinkcmake-eosio
voterax3
weight100 (1.00%)
Transaction InfoBlock #26112601/Trx 92e552a81185a28895ff6e4e606f650457b90c8d
View Raw JSON Data
{
  "block": 26112601,
  "op": [
    "vote",
    {
      "author": "copernix",
      "permlink": "cmake-eosio",
      "voter": "ax3",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-20T14:45:39",
  "trx_id": "92e552a81185a28895ff6e4e606f650457b90c8d",
  "trx_in_block": 40,
  "virtual_op": 0
}
copernixpublished a new post: cmake-eosio
2018/09/20 14:45:30
authorcopernix
body# Purpose This tutorial describes how to use CMake (and CLion) to build smart contracts for the eosio blockchain. This work was motivated by the absence of build tools that can be used directly from an IDE. Also it was inspired from a previous work done by [ InfiniteXLabs](https://infinitexlabs.com/setup-ide-for-eos-development/) and try to solve the following shortcomings: - build multiple contracts within the same project - do not have to copy eosio header files in your project directory - do not have to recompile eosio sdk libs within your project - provide build configuration similar to c++/CMake project (eg, add_library, target_include_directories, target_link_libraries, etc) # Prerequisites To complete this tutorial, you need to be familiar with CMake, install eosio sdk for your environment, install clang, optional but recommended CLion (or another C++ IDE). # Limitation This tutorial is a work in progress hence has been tested only on macosx, lacks some useful features (like CMake tests) and does not cover contract deployment to an eosio blockchain. # Tutorial Source The tutorial source repositories are : [eosio-cmake](https://github.com/awalga/eosio-cmake) and [eosio-cmake-tutorial](https://github.com/awalga/eosio-cmake-tutorial): # How it works ## Create a new project ### Tutorial folder structure - Create a new folder for our tutorial eosio-cmake-tutorial: - Copy `scripts/eosiosdk.cmake` `scripts/eosiosdk-util.cmake` `scripts/FindEOSIOSDKLibs.cmake` from [eosio-cmake](https://github.com/awalga/eosio-cmake) to `eosio-cmake-tutorial/cmake`. - Create `include/contracts/hello.hpp` inside eosio-cmake-tutorial - Create `include/contracts/hello.cpp`inside eosio-cmake-tutorial Your folder should look like : ``` |---- eosio-cmake-tutorial |---- CMakeLists.txt |---- include |---- contracts |----hello.hpp |---- src |---- hello.cpp |---- cmake |---- eosiosdk.cmake |---- eosiosdk-util.cmake |---- FindEOSIOSDKLibs.cmake ``` ### Editing our first contract - Edit include/contracts/hello.hpp: ``` // // MIT License. // #ifndef EOSIO_HELLO_WORLD_HELLO_HPP #define EOSIO_HELLO_WORLD_HELLO_HPP #include <contracts/hello.hpp> #include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> using namespace eosio; class hello : public eosio::contract { public: hello(account_name n); /// @abi action void hi( account_name user ); }; #endif //EOSIO_HELLO_WORLD_HELLO_HPP ``` - Edit src/hello.cpp: ``` // // MIT License. // #include "contracts/hello.hpp" using namespace eosio; hello::hello(account_name n) : contract(n) {} void hello::hi(account_name user) { print("Hello, EOS", name{user}); } EOSIO_ABI(hello, (hi)) ``` - Edit CMakeLists.txt: ``` cmake_minimum_required(VERSION 3.10) project(eosio-cmake-tutorial) ################################ ## Project ################################ set(PROJECT_VERSION_MAJOR "0") set(PROJECT_VERSION_MINOR "1") set(PROJECT_VERSION_PATCH "0") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") set(VERSION ${PROJECT_VERSION}) message("\n-- Configuring ${PROJECT_NAME} ${PROJECT_VERSION}...\n") ################################ ## Cmake dependencies ################################ include(cmake/eosiosdk.cmake) include(cmake/eosiosdk-util.cmake) include(cmake/FindEOSIOSDKLibs.cmake) ################################ ## Compiler Flags ################################ set(CMAKE_CXX_STANDARD 14) ################################ # Library Build ################################ # target hello add_eosio_wasm_library(hello CONTRACT SOURCES src/hello.cpp) target_eosio_wasm_compile_definitions(hello PUBLIC -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE) target_eosio_wasm_include_directories(hello PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>) # $<INSTALL_INTERFACE:include>) target_eosio_wasm_link_libraries(hello eosio libc++ libc musl Boost) add_eosio_wasm_abi(hello HEADERS include/contracts/hello.hpp) ################################ ## Install ################################ eosio_wasm_install(hello CONTRACT CODE DESTINATION "${CMAKE_INSTALL_FULL_CODEDIR}/hello" ABI DESTINATION "${CMAKE_INSTALL_FULL_ABIDIR}/hello") ``` ### Building our first contract ``` > cd eosio-cmake-tutorial > mkdir build && cd build > mkdir install && -DCMAKE_INSTALL_PREFIX=install .. > make contracts Scanning dependencies of target hello_link [ 16%] Building LLVM bitcode src/hello.cpp.bc [ 33%] Linking LLVM bitcode executable lib/hello.bc [ 50%] Generating textual assembly hello.s [ 66%] Generating WAST wast/hello.wast [ 83%] Generating WASM wast/hello.wast [ 83%] Built target hello_link Scanning dependencies of target hello_abi_gen [100%] Generating ABI abi/hello.abi 2018-09-20T11:17:15.814 thread-0 abi_generator.hpp:68 ricardian_contracts ] Warning, no ricardian clauses found for [100%] Built target hello_abi_gen Scanning dependencies of target hello Target hello output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin Target hello outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib Target hello output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code Target hello output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi [100%] Built target hello Scanning dependencies of target contracts [100%] Built target contracts ``` This step should output the following folders `abi``code` `bin` `lib` respectively containing `hello.abi`, `hello.wast`, `hello.wasm`, `hello.bc`. ### Installing our first contract ``` > mkdir hello_install Scanning dependencies of target hello_install Installing contracts abi /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/abi/hello Installing contracts wasm /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/code/hello Installing contracts wast /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/code/hello [100%] Built target hello_install ``` This step will install abi and code in install directory. ### Editing our second contract Our second contrat is the tic_tac_toe contract from eosio tutorial. - Create and edit include/contracts/tic_tac_toe.hpp ``` /** * @file * @copyright defined in eos/LICENSE.txt */ #ifndef EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP #define EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP #include <eosiolib/eosio.hpp> /** * @defgroup tictactoecontract Tic Tac Toe Contract * @brief Defines the PvP tic tac toe contract example * @ingroup examplecontract * * @details * For the following tic-tac-toe game: * - Each pair of player can have 2 unique game, one where player_1 become host and player_2 become challenger and vice versa * - The game data is stored in the "host" scope and use the "challenger" as the key * * (0,0) coordinate is on the top left corner of the board * @code * (0,2) * (0,0) - | o | x where - = empty cell * - | x | - x = move by host * (2,0) x | o | o o = move by challenger * @endcode * * Board is represented with number: * - 0 represents empty cell * - 1 represents cell filled by host * - 2 represents cell filled by challenger * Therefore, assuming x is host, the above board will have the following representation: [0, 2, 1, 0, 1, 0, 1, 2, 2] inside the game object * * In order to deploy this contract: * - Create an account called tic.tac.toe * - Add tic.tac.toe key to your wallet * - Set the contract on the tic.tac.toe account * * How to play the game: * - Create a game using `create` action, with you as the host and other account as the challenger. * - The first move needs to be done by the host, use the `move` action to make a move by specifying which row and column to fill. * - Then ask the challenger to make a move, after that it's back to the host turn again, repeat until the winner is determined. * - If you want to restart the game, use the `restart` action * - If you want to clear the game from the database to save up some space after the game has ended, use the `close` action * @{ */ class tic_tac_toe : public eosio::contract { public: tic_tac_toe( account_name self ):contract(self){} /** * @brief Information related to a game * @abi table games i64 */ struct game { static const uint16_t board_width = 3; static const uint16_t board_height = board_width; game() { initialize_board(); } account_name challenger; account_name host; account_name turn; // = account name of host/ challenger account_name winner = N(none); // = none/ draw/ name of host/ name of challenger std::vector<uint8_t> board; // Initialize board with empty cell void initialize_board() { board = std::vector<uint8_t>(board_width * board_height, 0); } // Reset game void reset_game() { initialize_board(); turn = host; winner = N(none); } auto primary_key() const { return challenger; } EOSLIB_SERIALIZE( game, (challenger)(host)(turn)(winner)(board)) }; /** * @brief The table definition, used to store existing games and their current state */ typedef eosio::multi_index< N(games), game> games; /// @abi action /// Create a new game void create(const account_name& challenger, const account_name& host); /// @abi action /// Restart a game /// @param by the account who wants to restart the game void restart(const account_name& challenger, const account_name& host, const account_name& by); /// @abi action /// Close an existing game, and remove it from storage void close(const account_name& challenger, const account_name& host); /// @abi action /// Make movement /// @param by the account who wants to make the move void move(const account_name& challenger, const account_name& host, const account_name& by, const uint16_t& row, const uint16_t& column); }; /// @} #endif //EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP ``` - Create and edit src/tic_tac_toe.cpp ``` /** * @file * @copyright defined in eos/LICENSE.txt */ #include <contracts/tic_tac_toe.hpp> using namespace eosio; /** * @brief Check if cell is empty * @param cell - value of the cell (should be either 0, 1, or 2) * @return true if cell is empty */ bool is_empty_cell(const uint8_t& cell) { return cell == 0; } /** * @brief Check for valid movement * @detail Movement is considered valid if it is inside the board and done on empty cell * @param row - the row of movement made by the player * @param column - the column of movement made by the player * @param board - the board on which the movement is being made * @return true if movement is valid */ bool is_valid_movement(const uint16_t& row, const uint16_t& column, const vector<uint8_t>& board) { uint32_t movement_location = row * tic_tac_toe::game::board_width + column; bool is_valid = movement_location < board.size() && is_empty_cell(board[movement_location]); return is_valid; } /** * @brief Get winner of the game * @detail Winner of the game is the first player who made three consecutive aligned movement * @param current_game - the game which we want to determine the winner of * @return winner of the game (can be either none/ draw/ account name of host/ account name of challenger) */ account_name get_winner(const tic_tac_toe::game& current_game) { auto& board = current_game.board; bool is_board_full = true; // Use bitwise AND operator to determine the consecutive values of each column, row and diagonal // Since 3 == 0b11, 2 == 0b10, 1 = 0b01, 0 = 0b00 vector<uint32_t> consecutive_column(tic_tac_toe::game::board_width, 3 ); vector<uint32_t> consecutive_row(tic_tac_toe::game::board_height, 3 ); uint32_t consecutive_diagonal_backslash = 3; uint32_t consecutive_diagonal_slash = 3; for (uint32_t i = 0; i < board.size(); i++) { is_board_full &= is_empty_cell(board[i]); uint16_t row = uint16_t(i / tic_tac_toe::game::board_width); uint16_t column = uint16_t(i % tic_tac_toe::game::board_width); // Calculate consecutive row and column value consecutive_row[column] = consecutive_row[column] & board[i]; consecutive_column[row] = consecutive_column[row] & board[i]; // Calculate consecutive diagonal \ value if (row == column) { consecutive_diagonal_backslash = consecutive_diagonal_backslash & board[i]; } // Calculate consecutive diagonal / value if ( row + column == tic_tac_toe::game::board_width - 1) { consecutive_diagonal_slash = consecutive_diagonal_slash & board[i]; } } // Inspect the value of all consecutive row, column, and diagonal and determine winner vector<uint32_t> aggregate = { consecutive_diagonal_backslash, consecutive_diagonal_slash }; aggregate.insert(aggregate.end(), consecutive_column.begin(), consecutive_column.end()); aggregate.insert(aggregate.end(), consecutive_row.begin(), consecutive_row.end()); for (auto value: aggregate) { if (value == 1) { return current_game.host; } else if (value == 2) { return current_game.challenger; } } // Draw if the board is full, otherwise the winner is not determined yet return is_board_full ? N(draw) : N(none); } /** * @brief Apply create action */ void tic_tac_toe::create(const account_name& challenger, const account_name& host) { require_auth(host); eosio_assert(challenger != host, "challenger shouldn't be the same as host"); // Check if game already exists games existing_host_games(_self, host); auto itr = existing_host_games.find( challenger ); eosio_assert(itr == existing_host_games.end(), "game already exists"); existing_host_games.emplace(host, [&]( auto& g ) { g.challenger = challenger; g.host = host; g.turn = host; }); } /** * @brief Apply restart action */ void tic_tac_toe::restart(const account_name& challenger, const account_name& host, const account_name& by) { require_auth(by); // Check if game exists games existing_host_games(_self, host); auto itr = existing_host_games.find( challenger ); eosio_assert(itr != existing_host_games.end(), "game doesn't exists"); // Check if this game belongs to the action sender eosio_assert(by == itr->host || by == itr->challenger, "this is not your game!"); // Reset game existing_host_games.modify(itr, itr->host, []( auto& g ) { g.reset_game(); }); } /** * @brief Apply close action */ void tic_tac_toe::close(const account_name& challenger, const account_name& host) { require_auth(host); // Check if game exists games existing_host_games(_self, host); auto itr = existing_host_games.find( challenger ); eosio_assert(itr != existing_host_games.end(), "game doesn't exists"); // Remove game existing_host_games.erase(itr); } /** * @brief Apply move action */ void tic_tac_toe::move(const account_name& challenger, const account_name& host, const account_name& by, const uint16_t& row, const uint16_t& column ) { require_auth(by); // Check if game exists games existing_host_games(_self, host); auto itr = existing_host_games.find( challenger ); eosio_assert(itr != existing_host_games.end(), "game doesn't exists"); // Check if this game hasn't ended yet eosio_assert(itr->winner == N(none), "the game has ended!"); // Check if this game belongs to the action sender eosio_assert(by == itr->host || by == itr->challenger, "this is not your game!"); // Check if this is the action sender's turn eosio_assert(by == itr->turn, "it's not your turn yet!"); // Check if user makes a valid movement eosio_assert(is_valid_movement(row, column, itr->board), "not a valid movement!"); // Fill the cell, 1 for host, 2 for challenger const uint8_t cell_value = itr->turn == itr->host ? 1 : 2; const auto turn = itr->turn == itr->host ? itr->challenger : itr->host; existing_host_games.modify(itr, itr->host, [&]( auto& g ) { g.board[row * tic_tac_toe::game::board_width + column] = cell_value; g.turn = turn; g.winner = get_winner(g); }); } EOSIO_ABI( tic_tac_toe, (create)(restart)(close)(move)) ``` - Modify CMakeLists.txt ``` # target tic tac toe add_eosio_wasm_library(tic_tac_toe CONTRACT SOURCES src/tic_tac_toe.cpp) target_eosio_wasm_compile_definitions(tic_tac_toe PUBLIC -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE) target_eosio_wasm_include_directories(tic_tac_toe PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>) # $<INSTALL_INTERFACE:include>) target_eosio_wasm_link_libraries(tic_tac_toe eosio libc++ libc musl Boost) add_eosio_wasm_abi(tic_tac_toe HEADERS include/contracts/tic_tac_toe.hpp) ``` ### Building both contracts ``` > cd build > rm -rf * > mkdir install && cmake -DCMAKE_INSTALL_PREFIX=install .. > make contracts Scanning dependencies of target hello_link [ 8%] Building LLVM bitcode src/hello.cpp.bc [ 16%] Linking LLVM bitcode executable lib/hello.bc [ 25%] Generating textual assembly hello.s [ 33%] Generating WAST wast/hello.wast [ 41%] Generating WASM wast/hello.wast [ 41%] Built target hello_link Scanning dependencies of target hello_abi_gen [ 50%] Generating ABI abi/hello.abi 2018-09-20T13:03:36.315 thread-0 abi_generator.hpp:68 ricardian_contracts ] Warning, no ricardian clauses found for [ 50%] Built target hello_abi_gen Scanning dependencies of target hello Target hello output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin Target hello outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib Target hello output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code Target hello output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi [ 50%] Built target hello Scanning dependencies of target tic_tac_toe_link [ 58%] Building LLVM bitcode src/tic_tac_toe.cpp.bc [ 66%] Linking LLVM bitcode executable lib/tic_tac_toe.bc [ 75%] Generating textual assembly tic_tac_toe.s [ 83%] Generating WAST wast/tic_tac_toe.wast [ 91%] Generating WASM wast/tic_tac_toe.wast [ 91%] Built target tic_tac_toe_link Scanning dependencies of target tic_tac_toe_abi_gen [100%] Generating ABI abi/tic_tac_toe.abi 2018-09-20T13:03:39.947 thread-0 abi_generator.hpp:68 ricardian_contracts ] Warning, no ricardian clauses found for [100%] Built target tic_tac_toe_abi_gen Scanning dependencies of target tic_tac_toe Target tic_tac_toe output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin Target tic_tac_toe outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib Target tic_tac_toe output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code Target tic_tac_toe output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi [100%] Built target tic_tac_toe Scanning dependencies of target contracts [100%] Built target contracts ``` ### Installing both contracts ``` > make hello_install > make tic_tac_toe_install ``` # Use from Clion Clion is a C++ IDE with built in support for CMake projects and more. Open the previous project from Clion. Clion will create build dependancies based on our CMakeLists.txt ![](https://cdn.steemitimages.com/DQmZWFvKLtiZrdVB5afXJHGyDFYx81c2t7cmUKM8ARwhqiy/image.png) ## Targets and dependancies in Clion ![](https://cdn.steemitimages.com/DQma4Th33hZeaLcAdV6LZerNHf155GCCnd1ma8psdYh2mm1/image.png) # Next step The next step will provide features to test and deploy contracts to an eosio contract.
json metadata{"tags":["eos","eosio","clion","cmake","blockchain"],"image":["https://cdn.steemitimages.com/DQmZWFvKLtiZrdVB5afXJHGyDFYx81c2t7cmUKM8ARwhqiy/image.png","https://cdn.steemitimages.com/DQma4Th33hZeaLcAdV6LZerNHf155GCCnd1ma8psdYh2mm1/image.png"],"links":["https://infinitexlabs.com/setup-ide-for-eos-development/","https://github.com/awalga/eosio-cmake","https://github.com/awalga/eosio-cmake-tutorial"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkeos
permlinkcmake-eosio
titleCMake + EOSIO
Transaction InfoBlock #26112598/Trx 6b6c3170c299493889c9d3847ada93243465e554
View Raw JSON Data
{
  "block": 26112598,
  "op": [
    "comment",
    {
      "author": "copernix",
      "body": "# Purpose\n\nThis tutorial describes how to use CMake (and CLion) to build smart contracts for the eosio blockchain. This work was motivated by the absence of build tools that can be used directly from an IDE. Also it was inspired from a previous work done by [ InfiniteXLabs](https://infinitexlabs.com/setup-ide-for-eos-development/) and try to solve the following shortcomings:\n\n- build multiple contracts within the same project\n- do not have to copy eosio header files in your project directory\n- do not have to recompile eosio sdk libs within your project\n- provide build configuration similar to c++/CMake project (eg, add_library, target_include_directories, target_link_libraries, etc)\n\n\n# Prerequisites\n\nTo complete this tutorial, you need to be familiar with CMake, install eosio sdk for your environment, install clang, optional but recommended CLion (or another C++ IDE).\n\n# Limitation\n\nThis tutorial is a work in progress hence has been tested only on macosx, lacks some useful features (like CMake tests) and does not cover contract deployment to an eosio blockchain.\n\n# Tutorial Source\n\nThe tutorial source repositories are : [eosio-cmake](https://github.com/awalga/eosio-cmake) and [eosio-cmake-tutorial](https://github.com/awalga/eosio-cmake-tutorial):\n\n\n\n# How it works\n\n## Create a new project\n\n### Tutorial folder structure\n- Create a new folder for our tutorial eosio-cmake-tutorial:\n\n- Copy `scripts/eosiosdk.cmake` `scripts/eosiosdk-util.cmake`  `scripts/FindEOSIOSDKLibs.cmake` from [eosio-cmake](https://github.com/awalga/eosio-cmake) to `eosio-cmake-tutorial/cmake`.\n\n- Create `include/contracts/hello.hpp` inside eosio-cmake-tutorial\n\n- Create `include/contracts/hello.cpp`inside eosio-cmake-tutorial\n\nYour folder should look like :\n```\n|---- eosio-cmake-tutorial\n             |---- CMakeLists.txt\n             |---- include\n                        |---- contracts\n                                   |----hello.hpp\n             |---- src\n                        |---- hello.cpp\n             |---- cmake\n                        |---- eosiosdk.cmake\n                        |---- eosiosdk-util.cmake\n                        |---- FindEOSIOSDKLibs.cmake\n```\n\n### Editing our first contract\n\n- Edit include/contracts/hello.hpp:\n\n```\n//\n// MIT License.\n//\n\n#ifndef EOSIO_HELLO_WORLD_HELLO_HPP\n#define EOSIO_HELLO_WORLD_HELLO_HPP\n\n#include <contracts/hello.hpp>\n#include <eosiolib/eosio.hpp>\n#include <eosiolib/print.hpp>\n\nusing namespace eosio;\n\nclass hello : public eosio::contract {\n public:\n  hello(account_name n);\n  /// @abi action\n  void hi( account_name user );\n};\n#endif //EOSIO_HELLO_WORLD_HELLO_HPP\n\n```\n\n- Edit src/hello.cpp:\n\n```\n//\n// MIT License.\n//\n#include \"contracts/hello.hpp\"\n\nusing namespace eosio;\n\nhello::hello(account_name n) : contract(n) {}\n\nvoid hello::hi(account_name user) {\n  print(\"Hello, EOS\", name{user});\n}\n\nEOSIO_ABI(hello, (hi))\n```\n\n- Edit CMakeLists.txt:\n\n```\ncmake_minimum_required(VERSION 3.10)\nproject(eosio-cmake-tutorial)\n\n################################\n## Project\n################################\nset(PROJECT_VERSION_MAJOR \"0\")\nset(PROJECT_VERSION_MINOR \"1\")\nset(PROJECT_VERSION_PATCH \"0\")\nset(PROJECT_VERSION \"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}\")\nset(VERSION ${PROJECT_VERSION})\n\nmessage(\"\\n-- Configuring ${PROJECT_NAME} ${PROJECT_VERSION}...\\n\")\n\n################################\n## Cmake dependencies\n################################\ninclude(cmake/eosiosdk.cmake)\ninclude(cmake/eosiosdk-util.cmake)\ninclude(cmake/FindEOSIOSDKLibs.cmake)\n\n################################\n## Compiler Flags\n################################\nset(CMAKE_CXX_STANDARD 14)\n\n################################\n# Library Build\n################################\n# target hello\nadd_eosio_wasm_library(hello CONTRACT SOURCES src/hello.cpp)\ntarget_eosio_wasm_compile_definitions(hello PUBLIC -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE)\ntarget_eosio_wasm_include_directories(hello\n        PUBLIC\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>)\n# $<INSTALL_INTERFACE:include>)\ntarget_eosio_wasm_link_libraries(hello eosio libc++ libc musl Boost)\n\nadd_eosio_wasm_abi(hello HEADERS include/contracts/hello.hpp)\n\n################################\n## Install\n################################\n\neosio_wasm_install(hello CONTRACT\n        CODE DESTINATION \"${CMAKE_INSTALL_FULL_CODEDIR}/hello\"\n        ABI DESTINATION \"${CMAKE_INSTALL_FULL_ABIDIR}/hello\")                                                                                                                                                                                                 \n```\n\n### Building our first contract\n\n\n```\n> cd eosio-cmake-tutorial\n> mkdir build && cd build\n> mkdir install && -DCMAKE_INSTALL_PREFIX=install ..\n> make contracts\n\nScanning dependencies of target hello_link\n[ 16%] Building LLVM bitcode src/hello.cpp.bc\n[ 33%] Linking LLVM bitcode executable lib/hello.bc\n[ 50%] Generating textual assembly hello.s\n[ 66%] Generating WAST wast/hello.wast\n[ 83%] Generating WASM wast/hello.wast\n[ 83%] Built target hello_link\nScanning dependencies of target hello_abi_gen\n[100%] Generating ABI abi/hello.abi\n2018-09-20T11:17:15.814 thread-0   abi_generator.hpp:68          ricardian_contracts  ] Warning, no ricardian clauses found for \n\n[100%] Built target hello_abi_gen\nScanning dependencies of target hello\nTarget hello output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin\nTarget hello outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib\nTarget hello output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code\nTarget hello output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi\n[100%] Built target hello\nScanning dependencies of target contracts\n[100%] Built target contracts\n```\n\nThis step should output the following folders `abi``code` `bin` `lib` respectively containing `hello.abi`, `hello.wast`,  `hello.wasm`, `hello.bc`.\n\n\n### Installing our first contract\n\n\n```\n> mkdir hello_install\nScanning dependencies of target hello_install\nInstalling contracts abi\n/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/abi/hello\nInstalling contracts wasm\n/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/code/hello\nInstalling contracts wast\n/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code:/Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/install/code/hello\n[100%] Built target hello_install\n```\n\nThis step will install abi and code in install directory.\n\n\n### Editing our second contract\n\n\nOur second contrat is the tic_tac_toe contract from eosio tutorial.\n\n- Create and edit include/contracts/tic_tac_toe.hpp\n\n```\n/**\n *  @file\n *  @copyright defined in eos/LICENSE.txt\n */\n#ifndef EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP\n#define EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP\n#include <eosiolib/eosio.hpp>\n\n/**\n *  @defgroup tictactoecontract Tic Tac Toe Contract\n *  @brief Defines the PvP tic tac toe contract example\n *  @ingroup examplecontract\n *\n *  @details\n *  For the following tic-tac-toe game:\n *  - Each pair of player can have 2 unique game, one where player_1 become host and player_2 become challenger and vice versa\n *  - The game data is stored in the \"host\" scope and use the \"challenger\" as the key\n *\n *  (0,0) coordinate is on the top left corner of the board\n *  @code\n *                 (0,2)\n *  (0,0) -  |  o  |  x      where - = empty cell\n *        -  |  x  |  -            x = move by host\n *  (2,0) x  |  o  |  o            o = move by challenger\n *  @endcode\n *\n *  Board is represented with number:\n *  - 0 represents empty cell\n *  - 1 represents cell filled by host\n *  - 2 represents cell filled by challenger\n *  Therefore, assuming x is host, the above board will have the following representation: [0, 2, 1, 0, 1, 0, 1, 2, 2] inside the game object\n *\n *  In order to deploy this contract:\n *  - Create an account called tic.tac.toe\n *  - Add tic.tac.toe key to your wallet\n *  - Set the contract on the tic.tac.toe account\n *\n *  How to play the game:\n *  - Create a game using `create` action, with you as the host and other account as the challenger.\n *  - The first move needs to be done by the host, use the `move` action to make a move by specifying which row and column to fill.\n *  - Then ask the challenger to make a move, after that it's back to the host turn again, repeat until the winner is determined.\n *  - If you want to restart the game, use the `restart` action\n *  - If you want to clear the game from the database to save up some space after the game has ended, use the `close` action\n *  @{\n */\nclass tic_tac_toe : public eosio::contract {\n public:\n  tic_tac_toe( account_name self ):contract(self){}\n\n  /**\n       * @brief Information related to a game\n       * @abi table games i64\n       */\n  struct game {\n    static const uint16_t board_width = 3;\n    static const uint16_t board_height = board_width;\n    game() {\n      initialize_board();\n    }\n    account_name          challenger;\n    account_name          host;\n    account_name          turn; // = account name of host/ challenger\n    account_name          winner = N(none); // = none/ draw/ name of host/ name of challenger\n    std::vector<uint8_t>  board;\n\n    // Initialize board with empty cell\n    void initialize_board() {\n      board = std::vector<uint8_t>(board_width * board_height, 0);\n    }\n\n    // Reset game\n    void reset_game() {\n      initialize_board();\n      turn = host;\n      winner = N(none);\n    }\n\n    auto primary_key() const { return challenger; }\n    EOSLIB_SERIALIZE( game, (challenger)(host)(turn)(winner)(board))\n  };\n\n  /**\n       * @brief The table definition, used to store existing games and their current state\n       */\n  typedef eosio::multi_index< N(games), game> games;\n\n  /// @abi action\n  /// Create a new game\n  void create(const account_name& challenger, const account_name& host);\n\n  /// @abi action\n  /// Restart a game\n  /// @param by the account who wants to restart the game\n  void restart(const account_name& challenger, const account_name& host, const account_name& by);\n\n  /// @abi action\n  /// Close an existing game, and remove it from storage\n  void close(const account_name& challenger, const account_name& host);\n\n  /// @abi action\n  /// Make movement\n  /// @param by the account who wants to make the move\n  void move(const account_name& challenger, const account_name& host, const account_name& by, const uint16_t& row, const uint16_t& column);\n\n};\n/// @}\n#endif //EOSIO_HELLO_WORLD_TIC_TAC_TOE_HPP\n```\n\n- Create and edit src/tic_tac_toe.cpp\n\n```\n/**\n *  @file\n *  @copyright defined in eos/LICENSE.txt\n */\n#include <contracts/tic_tac_toe.hpp>\n\nusing namespace eosio;\n\n/**\n * @brief Check if cell is empty\n * @param cell - value of the cell (should be either 0, 1, or 2)\n * @return true if cell is empty\n */\nbool is_empty_cell(const uint8_t& cell) {\n  return cell == 0;\n}\n\n/**\n * @brief Check for valid movement\n * @detail Movement is considered valid if it is inside the board and done on empty cell\n * @param row - the row of movement made by the player\n * @param column - the column of movement made by the player\n * @param board - the board on which the movement is being made\n * @return true if movement is valid\n */\nbool is_valid_movement(const uint16_t& row, const uint16_t& column, const vector<uint8_t>& board) {\n  uint32_t movement_location = row * tic_tac_toe::game::board_width + column;\n  bool is_valid = movement_location < board.size() && is_empty_cell(board[movement_location]);\n  return is_valid;\n}\n\n/**\n * @brief Get winner of the game\n * @detail Winner of the game is the first player who made three consecutive aligned movement\n * @param current_game - the game which we want to determine the winner of\n * @return winner of the game (can be either none/ draw/ account name of host/ account name of challenger)\n */\naccount_name get_winner(const tic_tac_toe::game& current_game) {\n  auto& board = current_game.board;\n\n  bool is_board_full = true;\n\n\n\n  // Use bitwise AND operator to determine the consecutive values of each column, row and diagonal\n  // Since 3 == 0b11, 2 == 0b10, 1 = 0b01, 0 = 0b00\n  vector<uint32_t> consecutive_column(tic_tac_toe::game::board_width, 3 );\n  vector<uint32_t> consecutive_row(tic_tac_toe::game::board_height, 3 );\n  uint32_t consecutive_diagonal_backslash = 3;\n  uint32_t consecutive_diagonal_slash = 3;\n  for (uint32_t i = 0; i < board.size(); i++) {\n    is_board_full &= is_empty_cell(board[i]);\n    uint16_t row = uint16_t(i / tic_tac_toe::game::board_width);\n    uint16_t column = uint16_t(i % tic_tac_toe::game::board_width);\n\n    // Calculate consecutive row and column value\n    consecutive_row[column] = consecutive_row[column] & board[i];\n    consecutive_column[row] = consecutive_column[row] & board[i];\n    // Calculate consecutive diagonal \\ value\n    if (row == column) {\n      consecutive_diagonal_backslash = consecutive_diagonal_backslash & board[i];\n    }\n    // Calculate consecutive diagonal / value\n    if ( row + column == tic_tac_toe::game::board_width - 1) {\n      consecutive_diagonal_slash = consecutive_diagonal_slash & board[i];\n    }\n  }\n\n  // Inspect the value of all consecutive row, column, and diagonal and determine winner\n  vector<uint32_t> aggregate = { consecutive_diagonal_backslash, consecutive_diagonal_slash };\n  aggregate.insert(aggregate.end(), consecutive_column.begin(), consecutive_column.end());\n  aggregate.insert(aggregate.end(), consecutive_row.begin(), consecutive_row.end());\n  for (auto value: aggregate) {\n    if (value == 1) {\n      return current_game.host;\n    } else if (value == 2) {\n      return current_game.challenger;\n    }\n  }\n  // Draw if the board is full, otherwise the winner is not determined yet\n  return is_board_full ? N(draw) : N(none);\n}\n\n/**\n * @brief Apply create action\n */\nvoid tic_tac_toe::create(const account_name& challenger, const account_name& host) {\n  require_auth(host);\n  eosio_assert(challenger != host, \"challenger shouldn't be the same as host\");\n\n  // Check if game already exists\n  games existing_host_games(_self, host);\n  auto itr = existing_host_games.find( challenger );\n  eosio_assert(itr == existing_host_games.end(), \"game already exists\");\n\n  existing_host_games.emplace(host, [&]( auto& g ) {\n    g.challenger = challenger;\n    g.host = host;\n    g.turn = host;\n  });\n}\n\n/**\n * @brief Apply restart action\n */\nvoid tic_tac_toe::restart(const account_name& challenger, const account_name& host, const account_name& by) {\n  require_auth(by);\n\n  // Check if game exists\n  games existing_host_games(_self, host);\n  auto itr = existing_host_games.find( challenger );\n  eosio_assert(itr != existing_host_games.end(), \"game doesn't exists\");\n\n  // Check if this game belongs to the action sender\n  eosio_assert(by == itr->host || by == itr->challenger, \"this is not your game!\");\n\n  // Reset game\n  existing_host_games.modify(itr, itr->host, []( auto& g ) {\n    g.reset_game();\n  });\n}\n\n/**\n * @brief Apply close action\n */\nvoid tic_tac_toe::close(const account_name& challenger, const account_name& host) {\n  require_auth(host);\n\n  // Check if game exists\n  games existing_host_games(_self, host);\n  auto itr = existing_host_games.find( challenger );\n  eosio_assert(itr != existing_host_games.end(), \"game doesn't exists\");\n\n  // Remove game\n  existing_host_games.erase(itr);\n}\n\n/**\n * @brief Apply move action\n */\nvoid tic_tac_toe::move(const account_name& challenger, const account_name& host, const account_name& by, const uint16_t& row, const uint16_t& column ) {\n  require_auth(by);\n\n  // Check if game exists\n  games existing_host_games(_self, host);\n  auto itr = existing_host_games.find( challenger );\n  eosio_assert(itr != existing_host_games.end(), \"game doesn't exists\");\n\n  // Check if this game hasn't ended yet\n  eosio_assert(itr->winner == N(none), \"the game has ended!\");\n  // Check if this game belongs to the action sender\n  eosio_assert(by == itr->host || by == itr->challenger, \"this is not your game!\");\n  // Check if this is the  action sender's turn\n  eosio_assert(by == itr->turn, \"it's not your turn yet!\");\n\n\n  // Check if user makes a valid movement\n  eosio_assert(is_valid_movement(row, column, itr->board), \"not a valid movement!\");\n\n  // Fill the cell, 1 for host, 2 for challenger\n  const uint8_t cell_value = itr->turn == itr->host ? 1 : 2;\n  const auto turn = itr->turn == itr->host ? itr->challenger : itr->host;\n  existing_host_games.modify(itr, itr->host, [&]( auto& g ) {\n    g.board[row * tic_tac_toe::game::board_width + column] = cell_value;\n    g.turn = turn;\n    g.winner = get_winner(g);\n  });\n}\n\n\nEOSIO_ABI( tic_tac_toe, (create)(restart)(close)(move))\n```\n\n- Modify CMakeLists.txt\n\n```\n\n# target tic tac toe\nadd_eosio_wasm_library(tic_tac_toe CONTRACT SOURCES src/tic_tac_toe.cpp)\ntarget_eosio_wasm_compile_definitions(tic_tac_toe PUBLIC -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE)\ntarget_eosio_wasm_include_directories(tic_tac_toe\n        PUBLIC\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>\n        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>)\n       # $<INSTALL_INTERFACE:include>)\ntarget_eosio_wasm_link_libraries(tic_tac_toe eosio libc++ libc musl Boost)\n\nadd_eosio_wasm_abi(tic_tac_toe HEADERS include/contracts/tic_tac_toe.hpp)\n\n```\n\n### Building both contracts\n\n```\n> cd build\n> rm -rf *\n> mkdir install && cmake -DCMAKE_INSTALL_PREFIX=install ..\n> make contracts\nScanning dependencies of target hello_link\n[  8%] Building LLVM bitcode src/hello.cpp.bc\n[ 16%] Linking LLVM bitcode executable lib/hello.bc\n[ 25%] Generating textual assembly hello.s\n[ 33%] Generating WAST wast/hello.wast\n[ 41%] Generating WASM wast/hello.wast\n[ 41%] Built target hello_link\nScanning dependencies of target hello_abi_gen\n[ 50%] Generating ABI abi/hello.abi\n2018-09-20T13:03:36.315 thread-0   abi_generator.hpp:68          ricardian_contracts  ] Warning, no ricardian clauses found for \n\n[ 50%] Built target hello_abi_gen\nScanning dependencies of target hello\nTarget hello output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin\nTarget hello outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib\nTarget hello output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code\nTarget hello output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi\n[ 50%] Built target hello\nScanning dependencies of target tic_tac_toe_link\n[ 58%] Building LLVM bitcode src/tic_tac_toe.cpp.bc\n[ 66%] Linking LLVM bitcode executable lib/tic_tac_toe.bc\n[ 75%] Generating textual assembly tic_tac_toe.s\n[ 83%] Generating WAST wast/tic_tac_toe.wast\n[ 91%] Generating WASM wast/tic_tac_toe.wast\n[ 91%] Built target tic_tac_toe_link\nScanning dependencies of target tic_tac_toe_abi_gen\n[100%] Generating ABI abi/tic_tac_toe.abi\n2018-09-20T13:03:39.947 thread-0   abi_generator.hpp:68          ricardian_contracts  ] Warning, no ricardian clauses found for \n\n[100%] Built target tic_tac_toe_abi_gen\nScanning dependencies of target tic_tac_toe\nTarget tic_tac_toe output wasm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/bin\nTarget tic_tac_toe outputllvm bytecode to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/lib\nTarget tic_tac_toe output wast and asm to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/code\nTarget tic_tac_toe output abi to /Users/awalga/Data/project/eosio/eosio-cmake-tutorial/build/abi\n[100%] Built target tic_tac_toe\nScanning dependencies of target contracts\n[100%] Built target contracts\n```\n\n### Installing both contracts\n\n```\n> make hello_install\n> make tic_tac_toe_install\n\n\n```\n\n# Use from Clion\n\nClion is a C++ IDE with built in support for CMake projects and more. Open the previous project from Clion. Clion will create build dependancies based on our CMakeLists.txt\n\n![](https://cdn.steemitimages.com/DQmZWFvKLtiZrdVB5afXJHGyDFYx81c2t7cmUKM8ARwhqiy/image.png)\n\n## Targets and dependancies in Clion\n\n![](https://cdn.steemitimages.com/DQma4Th33hZeaLcAdV6LZerNHf155GCCnd1ma8psdYh2mm1/image.png)\n\n# Next step\n\nThe next step will provide features to test and deploy contracts to an eosio contract.",
      "json_metadata": "{\"tags\":[\"eos\",\"eosio\",\"clion\",\"cmake\",\"blockchain\"],\"image\":[\"https://cdn.steemitimages.com/DQmZWFvKLtiZrdVB5afXJHGyDFYx81c2t7cmUKM8ARwhqiy/image.png\",\"https://cdn.steemitimages.com/DQma4Th33hZeaLcAdV6LZerNHf155GCCnd1ma8psdYh2mm1/image.png\"],\"links\":[\"https://infinitexlabs.com/setup-ide-for-eos-development/\",\"https://github.com/awalga/eosio-cmake\",\"https://github.com/awalga/eosio-cmake-tutorial\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "eos",
      "permlink": "cmake-eosio",
      "title": "CMake + EOSIO"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-20T14:45:30",
  "trx_id": "6b6c3170c299493889c9d3847ada93243465e554",
  "trx_in_block": 17,
  "virtual_op": 0
}
steemdelegated 5.627 SP to @copernix
2018/05/16 20:11:36
delegateecopernix
delegatorsteem
vesting shares9151.416343 VESTS
Transaction InfoBlock #22489733/Trx bf6431281d131188fcacc4eb17b66a615b305ca4
View Raw JSON Data
{
  "block": 22489733,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "copernix",
      "delegator": "steem",
      "vesting_shares": "9151.416343 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-16T20:11:36",
  "trx_id": "bf6431281d131188fcacc4eb17b66a615b305ca4",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemcreated a new account: @copernix
2018/02/05 10:08:45
active{"account_auths":[],"key_auths":[["STM5wGNYv6aHpjtLbjBRGcdutdeB6WQzPLdRBaJGeMCnNL7utJ2br",1]],"weight_threshold":1}
creatorsteem
delegation29700.000000 VESTS
extensions[]
fee0.500 STEEM
json metadata
memo keySTM7aUJ8V6kHRRD3mMi8XXFFy8H4DAL2v4YFMpSBpzxQ4Huiesbd1
new account namecopernix
owner{"account_auths":[],"key_auths":[["STM5TGEfWynjjj7NgxQrco81oAak8wnq9jteEymHeFhkC7YmqV5qx",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM8YN3s45G3HxNzk8ejYHZFhzGtZVNVLMj7pcyUnEYnw8GjBzP6n",1]],"weight_threshold":1}
Transaction InfoBlock #19600723/Trx 4b79a6a8bc2bf96e6878ee3f3d8755cef22abd0a
View Raw JSON Data
{
  "block": 19600723,
  "op": [
    "account_create_with_delegation",
    {
      "active": {
        "account_auths": [],
        "key_auths": [
          [
            "STM5wGNYv6aHpjtLbjBRGcdutdeB6WQzPLdRBaJGeMCnNL7utJ2br",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "creator": "steem",
      "delegation": "29700.000000 VESTS",
      "extensions": [],
      "fee": "0.500 STEEM",
      "json_metadata": "",
      "memo_key": "STM7aUJ8V6kHRRD3mMi8XXFFy8H4DAL2v4YFMpSBpzxQ4Huiesbd1",
      "new_account_name": "copernix",
      "owner": {
        "account_auths": [],
        "key_auths": [
          [
            "STM5TGEfWynjjj7NgxQrco81oAak8wnq9jteEymHeFhkC7YmqV5qx",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "posting": {
        "account_auths": [],
        "key_auths": [
          [
            "STM8YN3s45G3HxNzk8ejYHZFhzGtZVNVLMj7pcyUnEYnw8GjBzP6n",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-02-05T10:08:45",
  "trx_id": "4b79a6a8bc2bf96e6878ee3f3d8755cef22abd0a",
  "trx_in_block": 46,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
None
JSON METADATA
None
{
  "posting_json_metadata": {},
  "json_metadata": {}
}

Auth Keys

Owner
Single Signature
Public Keys
STM5TGEfWynjjj7NgxQrco81oAak8wnq9jteEymHeFhkC7YmqV5qx1/1
Active
Single Signature
Public Keys
STM5wGNYv6aHpjtLbjBRGcdutdeB6WQzPLdRBaJGeMCnNL7utJ2br1/1
Posting
Single Signature
Public Keys
STM8YN3s45G3HxNzk8ejYHZFhzGtZVNVLMj7pcyUnEYnw8GjBzP6n1/1
Memo
STM7aUJ8V6kHRRD3mMi8XXFFy8H4DAL2v4YFMpSBpzxQ4Huiesbd1
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5TGEfWynjjj7NgxQrco81oAak8wnq9jteEymHeFhkC7YmqV5qx",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM5wGNYv6aHpjtLbjBRGcdutdeB6WQzPLdRBaJGeMCnNL7utJ2br",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8YN3s45G3HxNzk8ejYHZFhzGtZVNVLMj7pcyUnEYnw8GjBzP6n",
        1
      ]
    ]
  },
  "memo": "STM7aUJ8V6kHRRD3mMi8XXFFy8H4DAL2v4YFMpSBpzxQ4Huiesbd1"
}

Witness Votes

0 / 30
No active witness votes.
[]