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 DelegationsDeleg
+4.378SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.629SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.378SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.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
| name | copernix |
| id | 717546 |
| rank | 1,453,082 |
| reputation | 33529483 |
| created | 2018-02-05T10:08:45 |
| recovery_account | steem |
| proxy | None |
| post_count | 1 |
| comment_count | 0 |
| lifetime_vote_count | 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 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1022.782565 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7120.877241 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 1970-01-01T00:00:00 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-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
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/17 22:52:45
2026/05/17 22:52:45
| delegatee | copernix |
| delegator | steem |
| vesting shares | 7120.877241 VESTS |
| Transaction Info | Block #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
}2026/05/11 22:22:42
2026/05/11 22:22:42
| delegatee | copernix |
| delegator | steem |
| vesting shares | 4408.666836 VESTS |
| Transaction Info | Block #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
}2026/04/25 22:15:51
2026/04/25 22:15:51
| delegatee | copernix |
| delegator | steem |
| vesting shares | 7133.392997 VESTS |
| Transaction Info | Block #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
}2026/01/23 04:10:42
2026/01/23 04:10:42
| delegatee | copernix |
| delegator | steem |
| vesting shares | 4450.213655 VESTS |
| Transaction Info | Block #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
}2024/12/16 23:29:48
2024/12/16 23:29:48
| delegatee | copernix |
| delegator | steem |
| vesting shares | 4614.432852 VESTS |
| Transaction Info | Block #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
}2023/11/13 15:14:18
2023/11/13 15:14:18
| delegatee | copernix |
| delegator | steem |
| vesting shares | 4783.566384 VESTS |
| Transaction Info | Block #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
}2023/09/21 20:13:57
2023/09/21 20:13:57
| delegatee | copernix |
| delegator | steem |
| vesting shares | 7720.845170 VESTS |
| Transaction Info | Block #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
}2022/11/03 10:12:51
2022/11/03 10:12:51
| delegatee | copernix |
| delegator | steem |
| vesting shares | 7942.526608 VESTS |
| Transaction Info | Block #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
}2022/01/17 09:35:57
2022/01/17 09:35:57
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8163.059839 VESTS |
| Transaction Info | Block #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
}2021/06/13 23:34:15
2021/06/13 23:34:15
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8346.828497 VESTS |
| Transaction Info | Block #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
}2020/12/11 09:54:57
2020/12/11 09:54:57
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8534.250471 VESTS |
| Transaction Info | Block #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
}2020/12/06 03:32:09
2020/12/06 03:32:09
| delegatee | copernix |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #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
}2020/12/05 11:29:21
2020/12/05 11:29:21
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8540.617110 VESTS |
| Transaction Info | Block #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
}2020/11/02 12:57:00
2020/11/02 12:57:00
| delegatee | copernix |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #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
}2020/05/09 04:28:12
2020/05/09 04:28:12
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8743.263684 VESTS |
| Transaction Info | Block #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
}2020/05/08 07:53:27
2020/05/08 07:53:27
| delegatee | copernix |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #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
2020/02/05 11:55:18
| author | steemitboard |
| body | Congratulations @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 author | copernix |
| parent permlink | cmake-eosio |
| permlink | steemitboard-notify-copernix-20200205t115518000z |
| title | |
| Transaction Info | Block #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
}2019/12/18 16:24:30
2019/12/18 16:24:30
| delegatee | copernix |
| delegator | steem |
| vesting shares | 8821.702289 VESTS |
| Transaction Info | Block #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
2019/02/05 11:45:39
| author | steemitboard |
| body | Congratulations @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 author | copernix |
| parent permlink | cmake-eosio |
| permlink | steemitboard-notify-copernix-20190205t114539000z |
| title | |
| Transaction Info | Block #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
}2019/01/16 14:26:33
2019/01/16 14:26:33
| delegatee | copernix |
| delegator | steem |
| vesting shares | 9018.647131 VESTS |
| Transaction Info | Block #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
}copernixupvoted (100.00%) @fr3eze / eosnetworkisparalyzednowduetocpu-3msbfnk0gr2018/10/17 13:05:48
copernixupvoted (100.00%) @fr3eze / eosnetworkisparalyzednowduetocpu-3msbfnk0gr
2018/10/17 13:05:48
| author | fr3eze |
| permlink | eosnetworkisparalyzednowduetocpu-3msbfnk0gr |
| voter | copernix |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}2018/09/21 23:55:18
2018/09/21 23:55:18
| delegatee | copernix |
| delegator | steem |
| vesting shares | 29294.390119 VESTS |
| Transaction Info | Block #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
}cheetahreplied to @copernix / cheetah-re-copernixcmake-eosio2018/09/20 14:45:51
cheetahreplied to @copernix / cheetah-re-copernixcmake-eosio
2018/09/20 14:45:51
| author | cheetah |
| body | Hi! 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 author | copernix |
| parent permlink | cmake-eosio |
| permlink | cheetah-re-copernixcmake-eosio |
| title | |
| Transaction Info | Block #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-eosio2018/09/20 14:45:39
cheetahupvoted (0.08%) @copernix / cmake-eosio
2018/09/20 14:45:39
| author | copernix |
| permlink | cmake-eosio |
| voter | cheetah |
| weight | 8 (0.08%) |
| Transaction Info | Block #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-eosio2018/09/20 14:45:39
ax3upvoted (1.00%) @copernix / cmake-eosio
2018/09/20 14:45:39
| author | copernix |
| permlink | cmake-eosio |
| voter | ax3 |
| weight | 100 (1.00%) |
| Transaction Info | Block #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-eosio2018/09/20 14:45:30
copernixpublished a new post: cmake-eosio
2018/09/20 14:45:30
| author | copernix |
| 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  ## Targets and dependancies in Clion  # 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 permlink | eos |
| permlink | cmake-eosio |
| title | CMake + EOSIO |
| Transaction Info | Block #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\n\n## Targets and dependancies in Clion\n\n\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
}2018/05/16 20:11:36
2018/05/16 20:11:36
| delegatee | copernix |
| delegator | steem |
| vesting shares | 9151.416343 VESTS |
| Transaction Info | Block #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
}2018/02/05 10:08:45
2018/02/05 10:08:45
| 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} |
| Transaction Info | Block #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
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779058365
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779058365
},
"rc_account": {
"account": "copernix",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779058365
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}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.
[]