From 1dbb9bc19934a74aaceffe0b13e86004fb292e23 Mon Sep 17 00:00:00 2001 From: Donovan Walker Date: Thu, 18 Oct 2018 14:29:15 -0500 Subject: [PATCH] jekyll base sources --- docs/CONTRIBUTING.html | 419 + docs/Gemfile | 12 + docs/Gemfile.lock | 90 + docs/LICENSE | 21 + docs/Rakefile | 184 + docs/apidefinitions/account-by-key-api.html | 345 + docs/apidefinitions/account-history-api.html | 407 + docs/apidefinitions/block-api.html | 436 + .../apidefinitions/broadcast-ops-comment.html | 423 + docs/apidefinitions/broadcast-ops.html | 2677 +++++ docs/apidefinitions/condenser-api.html | 3998 +++++++ docs/apidefinitions/database-api.html | 1385 +++ docs/apidefinitions/debug-node-api.html | 538 + docs/apidefinitions/follow-api.html | 590 + docs/apidefinitions/index.html | 9763 +++++++++++++++++ docs/apidefinitions/jsonrpc.html | 373 + docs/apidefinitions/market-history-api.html | 521 + .../apidefinitions/network-broadcast-api.html | 390 + docs/apidefinitions/rc-api.html | 605 + docs/apidefinitions/tags-api.html | 971 ++ docs/apidefinitions/witness-api.html | 377 + docs/apple-touch-icon.png | Bin 0 -> 1058 bytes docs/community/developeradvocate.html | 334 + docs/community/index.html | 527 + docs/community/overview.html | 324 + docs/community/resources.html | 466 + docs/css/css/fa-brands.css | 13 + docs/css/css/fa-brands.min.css | 5 + docs/css/css/fa-regular.css | 14 + docs/css/css/fa-regular.min.css | 5 + docs/css/css/fa-solid.css | 15 + docs/css/css/fa-solid.min.css | 5 + docs/css/css/fontawesome-all.css | 2861 +++++ docs/css/css/fontawesome-all.min.css | 5 + docs/css/css/fontawesome.css | 2831 +++++ docs/css/css/fontawesome.min.css | 5 + docs/css/style.css | 1099 ++ docs/css/webfonts/fa-brands-400.eot | Bin 0 -> 99704 bytes docs/css/webfonts/fa-brands-400.svg | 1017 ++ docs/css/webfonts/fa-brands-400.ttf | Bin 0 -> 99468 bytes docs/css/webfonts/fa-brands-400.woff | Bin 0 -> 64392 bytes docs/css/webfonts/fa-brands-400.woff2 | Bin 0 -> 55144 bytes docs/css/webfonts/fa-regular-400.eot | Bin 0 -> 30788 bytes docs/css/webfonts/fa-regular-400.svg | 366 + docs/css/webfonts/fa-regular-400.ttf | Bin 0 -> 30560 bytes docs/css/webfonts/fa-regular-400.woff | Bin 0 -> 14672 bytes docs/css/webfonts/fa-regular-400.woff2 | Bin 0 -> 12216 bytes docs/css/webfonts/fa-solid-900.eot | Bin 0 -> 115148 bytes docs/css/webfonts/fa-solid-900.svg | 1644 +++ docs/css/webfonts/fa-solid-900.ttf | Bin 0 -> 114928 bytes docs/css/webfonts/fa-solid-900.woff | Bin 0 -> 55484 bytes docs/css/webfonts/fa-solid-900.woff2 | Bin 0 -> 44068 bytes docs/favicon.png | Bin 0 -> 15707 bytes docs/glossary/api.html | 320 + docs/glossary/chain_basics.html | 333 + docs/glossary/governance.html | 320 + docs/glossary/index.html | 651 ++ docs/glossary/market.html | 320 + docs/glossary/transactions.html | 320 + docs/images/emblem.svg | 4 + docs/images/hero.png | Bin 0 -> 17212 bytes docs/images/logo.svg | 9 + docs/images/logo_white.svg | 12 + docs/images/logotype_white.svg | 17 + docs/images/look.svg | 23 + docs/images/menu.svg | 4 + docs/images/npm-logo.svg | 8 + .../services-jussi/kitematic-example.png | Bin 0 -> 417761 bytes docs/images/steemdev.png | Bin 0 -> 7981 bytes .../jussi-multiplexer/network-diagram.png | Bin 0 -> 34148 bytes docs/index.html | 387 + docs/introduction/welcome.html | 342 + docs/js/adjust.js | 35 + docs/js/lunr.min.js | 6 + docs/js/main.js | 190 + docs/js/search.js | 102 + docs/lib/scrape/api_definitions_job.rb | 124 + docs/lib/scrape/tutorials_job/base.rb | 155 + docs/lib/scrape/tutorials_job/javascript.rb | 16 + docs/lib/scrape/tutorials_job/python.rb | 16 + docs/lib/scrape/tutorials_job/ruby.rb | 16 + docs/quickstart/choose_library.html | 322 + docs/quickstart/index.html | 596 + docs/quickstart/steemd_nodes.html | 438 + docs/quickstart/testnet.html | 433 + docs/robots.txt | 1 + docs/search/index.html | 2456 +++++ docs/services/imageHoster.html | 439 + docs/services/index.html | 1259 +++ docs/services/jussi.html | 855 ++ docs/services/sbds.html | 350 + docs/services/steemconnect.html | 352 + docs/services/steemit.html | 472 + docs/siteicon.png | Bin 0 -> 2631 bytes docs/sitemap.xml | 531 + docs/testnet/index.html | 400 + docs/testnet/tools.html | 346 + docs/touch-icon.png | Bin 0 -> 9648 bytes docs/tutorial_structure.md | 119 + .../account_reputation.html | 439 + docs/tutorials-javascript/blog_feed.html | 490 + docs/tutorials-javascript/claim_rewards.html | 441 + docs/tutorials-javascript/client_signing.html | 457 + .../convert_sbd_to_steem.html | 480 + docs/tutorials-javascript/create_account.html | 466 + docs/tutorials-javascript/delegate_power.html | 442 + .../edit_content_patching.html | 510 + docs/tutorials-javascript/follow_a_user.html | 488 + .../get_account_comments.html | 610 + .../get_account_replies.html | 602 + .../get_delegations_by_user.html | 495 + .../get_follower_and_following_list.html | 453 + .../get_post_comments.html | 483 + .../get_post_details.html | 525 + docs/tutorials-javascript/get_posts.html | 529 + .../get_state_replacement_api.html | 870 ++ .../get_voters_list_on_post.html | 440 + .../tutorials-javascript/getting_started.html | 378 + .../grant_active_permission.html | 513 + .../grant_posting_permission.html | 503 + docs/tutorials-javascript/power_down.html | 452 + docs/tutorials-javascript/power_up_steem.html | 436 + .../tutorials-javascript/reblogging_post.html | 474 + .../tutorials-javascript/search_accounts.html | 410 + docs/tutorials-javascript/search_tags.html | 413 + .../set_withdraw_route.html | 455 + docs/tutorials-javascript/steemconnect.html | 475 + .../stream_blockchain_transactions.html | 460 + .../submit_comment_reply.html | 475 + docs/tutorials-javascript/submit_post.html | 449 + .../transfer_steem_and_sbd.html | 460 + .../tutorials-javascript/vote_on_content.html | 554 + .../witness_listing_and_voting.html | 517 + docs/tutorials-python/account_reputation.html | 436 + docs/tutorials-python/claim_rewards.html | 497 + docs/tutorials-python/delegate_power.html | 475 + .../edit_content_patching.html | 482 + docs/tutorials-python/follow_a_user.html | 465 + .../get_account_comments.html | 537 + .../tutorials-python/get_account_replies.html | 427 + .../get_delegations_by_user.html | 445 + .../get_follower_and_following_list.html | 453 + docs/tutorials-python/get_post_comments.html | 520 + docs/tutorials-python/get_post_details.html | 492 + docs/tutorials-python/get_posts.html | 504 + .../get_voters_list_on_post.html | 446 + docs/tutorials-python/getting_started.html | 373 + .../grant_active_permission.html | 472 + .../grant_posting_permission.html | 466 + .../tutorials-python/password_key_change.html | 476 + docs/tutorials-python/power_down.html | 468 + docs/tutorials-python/power_up_steem.html | 480 + docs/tutorials-python/reblogging_post.html | 420 + docs/tutorials-python/search_accounts.html | 432 + docs/tutorials-python/search_tags.html | 341 + .../stream_blockchain_transactions.html | 406 + .../submit_comment_reply.html | 454 + docs/tutorials-python/submit_post.html | 449 + .../transfer_STEEM_and_SBD.html | 490 + .../tutorials-python/using_keys_securely.html | 424 + docs/tutorials-python/vote_on_content.html | 466 + .../witness_listing_and_voting.html | 481 + docs/tutorials-recipes/estimate_upvote.html | 528 + .../forum-market-bandwidth.html | 579 + docs/tutorials-recipes/jussi-multiplexer.html | 416 + .../plugin_and_api_list.html | 757 ++ .../understanding-configuration-values.html | 1039 ++ ...derstanding-dynamic-global-properties.html | 640 ++ docs/tutorials-recipes/vest-to-steem.html | 401 + ...hen-streaming-blockchain-transactions.html | 455 + docs/tutorials-ruby/blog_feed.html | 388 + .../tutorials-ruby/edit_content_patching.html | 396 + docs/tutorials-ruby/follow_another_user.html | 411 + docs/tutorials-ruby/get_account_comments.html | 445 + docs/tutorials-ruby/get_account_replies.html | 445 + docs/tutorials-ruby/get_post_comments.html | 379 + docs/tutorials-ruby/get_post_details.html | 536 + docs/tutorials-ruby/get_posts.html | 396 + .../get_voters_list_on_post.html | 364 + docs/tutorials-ruby/getting_started.html | 407 + docs/tutorials-ruby/reblogging_post.html | 631 ++ docs/tutorials-ruby/search_accounts.html | 403 + docs/tutorials-ruby/search_tags.html | 425 + .../stream_blockchain_transactions.html | 429 + docs/tutorials-ruby/submit_comment_reply.html | 389 + docs/tutorials-ruby/submit_post.html | 385 + docs/tutorials/index.html | 891 ++ docs/unused/accounts.md | 0 docs/unused/authority_and_validation.md | 0 docs/unused/blocks_and_transactions.md | 0 docs/unused/community.html | 338 + docs/unused/database_api.html | 340 + docs/unused/docker.html | 356 + docs/unused/globals.md | 0 docs/unused/keys.md | 0 docs/unused/market.md | 0 docs/unused/steemd.html | 320 + docs/unused/tags.html | 325 + docs/unused/tutorials.html | 383 + 199 files changed, 93678 insertions(+) create mode 100644 docs/CONTRIBUTING.html create mode 100644 docs/Gemfile create mode 100644 docs/Gemfile.lock create mode 100644 docs/LICENSE create mode 100644 docs/Rakefile create mode 100644 docs/apidefinitions/account-by-key-api.html create mode 100644 docs/apidefinitions/account-history-api.html create mode 100644 docs/apidefinitions/block-api.html create mode 100644 docs/apidefinitions/broadcast-ops-comment.html create mode 100644 docs/apidefinitions/broadcast-ops.html create mode 100644 docs/apidefinitions/condenser-api.html create mode 100644 docs/apidefinitions/database-api.html create mode 100644 docs/apidefinitions/debug-node-api.html create mode 100644 docs/apidefinitions/follow-api.html create mode 100644 docs/apidefinitions/index.html create mode 100644 docs/apidefinitions/jsonrpc.html create mode 100644 docs/apidefinitions/market-history-api.html create mode 100644 docs/apidefinitions/network-broadcast-api.html create mode 100644 docs/apidefinitions/rc-api.html create mode 100644 docs/apidefinitions/tags-api.html create mode 100644 docs/apidefinitions/witness-api.html create mode 100644 docs/apple-touch-icon.png create mode 100644 docs/community/developeradvocate.html create mode 100644 docs/community/index.html create mode 100644 docs/community/overview.html create mode 100644 docs/community/resources.html create mode 100644 docs/css/css/fa-brands.css create mode 100644 docs/css/css/fa-brands.min.css create mode 100644 docs/css/css/fa-regular.css create mode 100644 docs/css/css/fa-regular.min.css create mode 100644 docs/css/css/fa-solid.css create mode 100644 docs/css/css/fa-solid.min.css create mode 100644 docs/css/css/fontawesome-all.css create mode 100644 docs/css/css/fontawesome-all.min.css create mode 100644 docs/css/css/fontawesome.css create mode 100644 docs/css/css/fontawesome.min.css create mode 100644 docs/css/style.css create mode 100644 docs/css/webfonts/fa-brands-400.eot create mode 100644 docs/css/webfonts/fa-brands-400.svg create mode 100644 docs/css/webfonts/fa-brands-400.ttf create mode 100644 docs/css/webfonts/fa-brands-400.woff create mode 100644 docs/css/webfonts/fa-brands-400.woff2 create mode 100644 docs/css/webfonts/fa-regular-400.eot create mode 100644 docs/css/webfonts/fa-regular-400.svg create mode 100644 docs/css/webfonts/fa-regular-400.ttf create mode 100644 docs/css/webfonts/fa-regular-400.woff create mode 100644 docs/css/webfonts/fa-regular-400.woff2 create mode 100644 docs/css/webfonts/fa-solid-900.eot create mode 100644 docs/css/webfonts/fa-solid-900.svg create mode 100644 docs/css/webfonts/fa-solid-900.ttf create mode 100644 docs/css/webfonts/fa-solid-900.woff create mode 100644 docs/css/webfonts/fa-solid-900.woff2 create mode 100644 docs/favicon.png create mode 100644 docs/glossary/api.html create mode 100644 docs/glossary/chain_basics.html create mode 100644 docs/glossary/governance.html create mode 100644 docs/glossary/index.html create mode 100644 docs/glossary/market.html create mode 100644 docs/glossary/transactions.html create mode 100644 docs/images/emblem.svg create mode 100644 docs/images/hero.png create mode 100644 docs/images/logo.svg create mode 100644 docs/images/logo_white.svg create mode 100644 docs/images/logotype_white.svg create mode 100644 docs/images/look.svg create mode 100644 docs/images/menu.svg create mode 100644 docs/images/npm-logo.svg create mode 100644 docs/images/services-jussi/kitematic-example.png create mode 100644 docs/images/steemdev.png create mode 100644 docs/images/tutorials-recipes/jussi-multiplexer/network-diagram.png create mode 100644 docs/index.html create mode 100644 docs/introduction/welcome.html create mode 100644 docs/js/adjust.js create mode 100644 docs/js/lunr.min.js create mode 100644 docs/js/main.js create mode 100644 docs/js/search.js create mode 100644 docs/lib/scrape/api_definitions_job.rb create mode 100644 docs/lib/scrape/tutorials_job/base.rb create mode 100644 docs/lib/scrape/tutorials_job/javascript.rb create mode 100644 docs/lib/scrape/tutorials_job/python.rb create mode 100644 docs/lib/scrape/tutorials_job/ruby.rb create mode 100644 docs/quickstart/choose_library.html create mode 100644 docs/quickstart/index.html create mode 100644 docs/quickstart/steemd_nodes.html create mode 100644 docs/quickstart/testnet.html create mode 100644 docs/robots.txt create mode 100644 docs/search/index.html create mode 100644 docs/services/imageHoster.html create mode 100644 docs/services/index.html create mode 100644 docs/services/jussi.html create mode 100644 docs/services/sbds.html create mode 100644 docs/services/steemconnect.html create mode 100644 docs/services/steemit.html create mode 100644 docs/siteicon.png create mode 100644 docs/sitemap.xml create mode 100644 docs/testnet/index.html create mode 100644 docs/testnet/tools.html create mode 100644 docs/touch-icon.png create mode 100644 docs/tutorial_structure.md create mode 100644 docs/tutorials-javascript/account_reputation.html create mode 100644 docs/tutorials-javascript/blog_feed.html create mode 100644 docs/tutorials-javascript/claim_rewards.html create mode 100644 docs/tutorials-javascript/client_signing.html create mode 100644 docs/tutorials-javascript/convert_sbd_to_steem.html create mode 100644 docs/tutorials-javascript/create_account.html create mode 100644 docs/tutorials-javascript/delegate_power.html create mode 100644 docs/tutorials-javascript/edit_content_patching.html create mode 100644 docs/tutorials-javascript/follow_a_user.html create mode 100644 docs/tutorials-javascript/get_account_comments.html create mode 100644 docs/tutorials-javascript/get_account_replies.html create mode 100644 docs/tutorials-javascript/get_delegations_by_user.html create mode 100644 docs/tutorials-javascript/get_follower_and_following_list.html create mode 100644 docs/tutorials-javascript/get_post_comments.html create mode 100644 docs/tutorials-javascript/get_post_details.html create mode 100644 docs/tutorials-javascript/get_posts.html create mode 100644 docs/tutorials-javascript/get_state_replacement_api.html create mode 100644 docs/tutorials-javascript/get_voters_list_on_post.html create mode 100644 docs/tutorials-javascript/getting_started.html create mode 100644 docs/tutorials-javascript/grant_active_permission.html create mode 100644 docs/tutorials-javascript/grant_posting_permission.html create mode 100644 docs/tutorials-javascript/power_down.html create mode 100644 docs/tutorials-javascript/power_up_steem.html create mode 100644 docs/tutorials-javascript/reblogging_post.html create mode 100644 docs/tutorials-javascript/search_accounts.html create mode 100644 docs/tutorials-javascript/search_tags.html create mode 100644 docs/tutorials-javascript/set_withdraw_route.html create mode 100644 docs/tutorials-javascript/steemconnect.html create mode 100644 docs/tutorials-javascript/stream_blockchain_transactions.html create mode 100644 docs/tutorials-javascript/submit_comment_reply.html create mode 100644 docs/tutorials-javascript/submit_post.html create mode 100644 docs/tutorials-javascript/transfer_steem_and_sbd.html create mode 100644 docs/tutorials-javascript/vote_on_content.html create mode 100644 docs/tutorials-javascript/witness_listing_and_voting.html create mode 100644 docs/tutorials-python/account_reputation.html create mode 100644 docs/tutorials-python/claim_rewards.html create mode 100644 docs/tutorials-python/delegate_power.html create mode 100644 docs/tutorials-python/edit_content_patching.html create mode 100644 docs/tutorials-python/follow_a_user.html create mode 100644 docs/tutorials-python/get_account_comments.html create mode 100644 docs/tutorials-python/get_account_replies.html create mode 100644 docs/tutorials-python/get_delegations_by_user.html create mode 100644 docs/tutorials-python/get_follower_and_following_list.html create mode 100644 docs/tutorials-python/get_post_comments.html create mode 100644 docs/tutorials-python/get_post_details.html create mode 100644 docs/tutorials-python/get_posts.html create mode 100644 docs/tutorials-python/get_voters_list_on_post.html create mode 100644 docs/tutorials-python/getting_started.html create mode 100644 docs/tutorials-python/grant_active_permission.html create mode 100644 docs/tutorials-python/grant_posting_permission.html create mode 100644 docs/tutorials-python/password_key_change.html create mode 100644 docs/tutorials-python/power_down.html create mode 100644 docs/tutorials-python/power_up_steem.html create mode 100644 docs/tutorials-python/reblogging_post.html create mode 100644 docs/tutorials-python/search_accounts.html create mode 100644 docs/tutorials-python/search_tags.html create mode 100644 docs/tutorials-python/stream_blockchain_transactions.html create mode 100644 docs/tutorials-python/submit_comment_reply.html create mode 100644 docs/tutorials-python/submit_post.html create mode 100644 docs/tutorials-python/transfer_STEEM_and_SBD.html create mode 100644 docs/tutorials-python/using_keys_securely.html create mode 100644 docs/tutorials-python/vote_on_content.html create mode 100644 docs/tutorials-python/witness_listing_and_voting.html create mode 100644 docs/tutorials-recipes/estimate_upvote.html create mode 100644 docs/tutorials-recipes/forum-market-bandwidth.html create mode 100644 docs/tutorials-recipes/jussi-multiplexer.html create mode 100644 docs/tutorials-recipes/plugin_and_api_list.html create mode 100644 docs/tutorials-recipes/understanding-configuration-values.html create mode 100644 docs/tutorials-recipes/understanding-dynamic-global-properties.html create mode 100644 docs/tutorials-recipes/vest-to-steem.html create mode 100644 docs/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions.html create mode 100644 docs/tutorials-ruby/blog_feed.html create mode 100644 docs/tutorials-ruby/edit_content_patching.html create mode 100644 docs/tutorials-ruby/follow_another_user.html create mode 100644 docs/tutorials-ruby/get_account_comments.html create mode 100644 docs/tutorials-ruby/get_account_replies.html create mode 100644 docs/tutorials-ruby/get_post_comments.html create mode 100644 docs/tutorials-ruby/get_post_details.html create mode 100644 docs/tutorials-ruby/get_posts.html create mode 100644 docs/tutorials-ruby/get_voters_list_on_post.html create mode 100644 docs/tutorials-ruby/getting_started.html create mode 100644 docs/tutorials-ruby/reblogging_post.html create mode 100644 docs/tutorials-ruby/search_accounts.html create mode 100644 docs/tutorials-ruby/search_tags.html create mode 100644 docs/tutorials-ruby/stream_blockchain_transactions.html create mode 100644 docs/tutorials-ruby/submit_comment_reply.html create mode 100644 docs/tutorials-ruby/submit_post.html create mode 100644 docs/tutorials/index.html create mode 100644 docs/unused/accounts.md create mode 100644 docs/unused/authority_and_validation.md create mode 100644 docs/unused/blocks_and_transactions.md create mode 100644 docs/unused/community.html create mode 100644 docs/unused/database_api.html create mode 100644 docs/unused/docker.html create mode 100644 docs/unused/globals.md create mode 100644 docs/unused/keys.md create mode 100644 docs/unused/market.md create mode 100644 docs/unused/steemd.html create mode 100644 docs/unused/tags.html create mode 100644 docs/unused/tutorials.html diff --git a/docs/CONTRIBUTING.html b/docs/CONTRIBUTING.html new file mode 100644 index 00000000..4723ed56 --- /dev/null +++ b/docs/CONTRIBUTING.html @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + + +Contributors | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+
+

+ + Contributors + + +

+ + + Everyone is welcome to contribute code to Steemit, Inc. projects. We have a Code of Conduct; +we ask that you please follow it in all your interactions with our team and your fellow +contributors. + +Please note that this contributing guide only applies to our development presence. + +## Repositories + +There are currently two repositories that you can contribute to: + +1. Devportal [https://github.com/steemit/devportal](https://github.com/steemit/devportal) +2. Javascript Tutorials [https://github.com/steemit/devportal-tutorials-js](https://github.com/steemit/devportal-tutorials-js) + +All of the repositories have a package.json file included with them with script helpers setup. To use these you will need the following packages installed: + +1. [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/en/) +2. [prettier](https://github.com/prettier/prettier) +3. [eslint](https://eslint.org/) + +These must all be installed in your development environment + +Each of the repositories have the following scripts + +`yarn lint` - performs linting validation on the codebase +`yarn fmt` - executes prettier to format the codebase + +There is also a `precommit` script that will run both of these on committing of code to the repositoriy. + +When contributing to the **DevPortal** all code snippets must be added to the `_includes/` folder since this will be linted on commit. You can also wrap all your code in the tutorial in ``` tags which will force them to be highlighted in the portal. + +## How to contribute + +1. File an issue describing the problem you would like to solve or the feature you would like to add. It saves unnecessary work on your part, in case there's a nontechnical reason we can't accept a particular change. Please note that we can and will _automatically close all pull requests that do not refer to an issue_. +2. Learn the conventions of the project you are submitting code to, even implicit ones, and follow them. In case you have a question about a project's conventions, please ask on the issue you filed. This includes writing tests, formatting code, and documentation. +3. File a pull request against your Github issue and fill out the pull request template. Remember, you are agreeing to license your code and any intellectual property associated with your code under the same terms as the repository you are contributing to. +4. If one of our teammates asks you to make changes, please make them. Our rule is that all requests for changes in code review are resolved in favor of the reviewer. Our teammates follow this rule too! + +## Code of Conduct + +Again, please note that this Code of Conduct _only applies to our development presence_. + +### Our Pledge + +We welcome your membership in our project and community under the rules that we have set below. + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers will work to make your participation in +our project and community as fulfilling as possible. + +### Our Rules + +All members of our project and community must: + +1. Show empathy toward other project and community members +2. Use welcoming and inclusive language +3. Respect differing viewpoints and experiences +4. Gracefully accept constructive criticism + +All members of our project and community must not: + +1. Harm our project and community, or advocate harm to our project and community +2. Insult or make derogatory comments about others +3. Interact with others after they have withdrawn permission to do so + +### Our Responsibilities + +We will use any and all lawful means at our disposal to enforce our rules. This includes +but is not limited to: + +1. Rejecting contributions +2. Removing comments, commits, code, wiki edits, and issues +3. Banning abusers + +We will clarify standards of acceptable behavior and we will take appropriate +and fair corrective action in response to any instances of unacceptable behavior. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting us at github.abuse@steemit.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. We +maintain strict confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/gg + +
+ +
+ + + + + + + + diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..23d14744 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,12 @@ +source 'https://rubygems.org' + +gem 'jekyll' +gem 'neatjson' +gem 'rake' +gem 'git' +gem 'steem-ruby' + +group :jekyll_plugins do + gem 'jekyll-seo-tag' + gem 'jekyll-sitemap' +end diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 00000000..d2edd20a --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,90 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + bitcoin-ruby (0.0.18) + colorator (1.1.0) + concurrent-ruby (1.0.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7) + ffi (1.9.25) + forwardable-extended (2.6.0) + git (1.5.0) + hashie (3.6.0) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.8.4) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.5.0) + jekyll (~> 3.3) + jekyll-sitemap (1.2.0) + jekyll (~> 3.3) + jekyll-watch (2.0.0) + listen (~> 3.0) + json (2.1.0) + kramdown (1.17.0) + liquid (4.0.1) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + little-plugger (1.1.4) + logging (2.2.2) + little-plugger (~> 1.1) + multi_json (~> 1.10) + mercenary (0.3.6) + multi_json (1.13.1) + neatjson (0.8.4) + pathutil (0.16.1) + forwardable-extended (~> 2.6) + public_suffix (3.0.3) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (3.3.0) + ruby_dep (1.5.0) + safe_yaml (1.0.4) + sass (3.6.0) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + steem-ruby (0.9.3) + bitcoin-ruby (~> 0.0, >= 0.0.18) + ffi (~> 1.9, >= 1.9.23) + hashie (~> 3.5, >= 3.5.7) + json (~> 2.1, >= 2.1.0) + logging (~> 2.2, >= 2.2.0) + +PLATFORMS + ruby + +DEPENDENCIES + git + jekyll + jekyll-seo-tag + jekyll-sitemap + neatjson + rake + steem-ruby + +BUNDLED WITH + 1.16.5 diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 00000000..3a4a2fb8 --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 CloudCannon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/Rakefile b/docs/Rakefile new file mode 100644 index 00000000..969f6dda --- /dev/null +++ b/docs/Rakefile @@ -0,0 +1,184 @@ +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'scrape/api_definitions_job' +require 'scrape/tutorials_job/base' +require 'scrape/tutorials_job/javascript' +require 'scrape/tutorials_job/python' +require 'scrape/tutorials_job/ruby' + +require 'rake/testtask' +require 'net/https' +require 'json' +require 'yaml' + +namespace :scrape do + desc "Scrape steemjs docs" + task :javascript do + + end + + desc "Scrape pysteem docs" + task :python do + end + + desc "Scrape API Definitions" + task :api_defs do + url = ENV.fetch('TEST_NODE', 'https://api.steemit.com') + job = Scrape::ApiDefinitionsJob.new(url: url) + count = job.perform + + puts "Methods added or changed: #{count}" + end + + desc 'Scrape all known tutorial repositories.' + task :tutorials do + puts '=' * 80 + puts "JS-Tutorials:" + Rake::Task["scrape:tutorials:js"].invoke + puts '=' * 80 + puts "PY-Tutorials:" + Rake::Task["scrape:tutorials:py"].invoke + puts '=' * 80 + puts "RB-Tutorials:" + Rake::Task["scrape:tutorials:rb"].invoke + end + + namespace :tutorials do + desc 'Scrape JS-Tutorials' + task :js, [:num, :force] do |t, args| + job = Scrape::TutorialsJob::Javascript.new(num: args[:num], force: args[:force]) + count = job.perform + + puts "Tutorials added or changed: #{count}" + end + + desc 'Scrape PY-Tutorials' + task :py, [:num, :force] do |t, args| + job = Scrape::TutorialsJob::Python.new(num: args[:num], force: args[:force]) + count = job.perform + + puts "Tutorials added or changed: #{count}" + end + + desc 'Scrape RB-Tutorials' + task :rb, [:num, :force] do |t, args| + job = Scrape::TutorialsJob::Ruby.new(num: args[:num], force: args[:force]) + count = job.perform + + puts "Tutorials added or changed: #{count}" + end + end +end + +namespace :production do + task :prevent_dirty_builds do + if `git status --porcelain`.chomp.length > 0 + puts '*** WARNING: You currently have uncommitted changes. ***' + fail 'Build aborted, because project directory is not clean.' unless ENV['ALLOW_DIRTY'] + end + end + + task :build do + sh 'bundle exec jekyll build --destination docs' + end + + task :drop_previous_build do + sh 'git checkout master' + sh 'git rm -rf docs' + sh 'git commit -m "jekyll dropped previous site"' + end + + desc "Deploy current master to GH Pages" + task deploy: [:prevent_dirty_builds, :drop_previous_build, :build] do + sh 'git add -A' + sh 'git commit -m "jekyll base sources"' + sh 'git push origin master' + + exit(0) + end + + desc "Rollback GH Pages" + task rollback: [:prevent_dirty_builds] do + sh 'git checkout master' + sh 'git reset --hard HEAD^' + sh 'git push origin master' + + exit(0) + end +end + +namespace :test do + KNOWN_APIS = %i( + account_by_key_api account_history_api block_api condenser_api + database_api follow_api jsonrpc market_history_api network_broadcast_api + tags_api witness_api + ) + + desc "Tests the curl examples of api definitions. Known APIs: #{KNOWN_APIS.join(' ')}" + task :curl, [:apis] do |t, args| + smoke = 0 + url = ENV.fetch('TEST_NODE', 'https://api.steemit.com') + apis = [args[:apis].split(' ').map(&:to_sym)].flatten if !!args[:apis] + apis ||= KNOWN_APIS + + version = `curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_version", "params":[], "id":1}' #{url}` + version = JSON[version]['result'] + blockchain_version = version['blockchain_version'] + steem_rev = version['steem_revision'][0..5] + fc_rev = version['fc_revision'][0..5] + puts "node: #{url}; blockchain_version: #{blockchain_version}; steem_rev: #{steem_rev}; fc_rev: #{fc_rev}" + + apis.each do |api| + file_name = "_data/apidefinitions/#{api}.yml" + unless File.exist?(file_name) + puts "Does not exist: #{file_name}" + next + end + + yml = YAML.load_file(file_name) + + yml[0]['methods'].each do |method| + print "Testing #{method['api_method']} ... " + + if method['curl_examples'].nil? + puts "no curl examples." + next + end + + method['curl_examples'].each_with_index do |curl_example, index| + response = `curl -s -w \"HTTP_CODE:%{http_code}\" --data '#{curl_example}' #{url}` + response = response.split('HTTP_CODE:') + json = response[0] + code = response[1] + + case code + when '200' + data = JSON[json] + + if !!data['error'] + expected_curl_response = if !!method['expected_curl_responses'] + method['expected_curl_responses'][index] + end + + if !!expected_curl_response && data['error']['message'].include?(expected_curl_response) + print '√' + else + smoke += 1 + print "\n\t#{data['error']['message']}\n" + end + else + print '√' + end + else + smoke += 1 + 'X' + end + end + + print "\n" + end + end + + exit smoke + end +end diff --git a/docs/apidefinitions/account-by-key-api.html b/docs/apidefinitions/account-by-key-api.html new file mode 100644 index 00000000..594b0c35 --- /dev/null +++ b/docs/apidefinitions/account-by-key-api.html @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + +Account By Key Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup account information based on a key. These AppBase API methods are still under development and subject to change.

+ + +

account_by_key_api.get_key_references

+

Returns all accounts that have the key associated with their owner or active authorities.

+
Query Parameters JSON
+
{"keys": []}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_by_key_api.get_key_references", "params":{"keys":["STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH"]}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/account-history-api.html b/docs/apidefinitions/account-history-api.html new file mode 100644 index 00000000..c4850977 --- /dev/null +++ b/docs/apidefinitions/account-history-api.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + +Account History Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup account history information. These AppBase API methods are still under development and subject to change.

+ + +

account_history_api.get_account_history

+

Returns a history of all operations for a given account.

+
Query Parameters JSON
+
{
+  "account": "",
+  "start": "18446744073709551615",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"history": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_history_api.get_account_history", "params":{"account":"steemit", "start":1000, "limit":1000}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_history_api.get_account_history", "params":{"account":"steemit", "start":-1, "limit":10000}, "id":1}' https://api.steemit.com
+
+ +
+ + +

account_history_api.get_ops_in_block

+

Returns all operations contained in a block.

+
Query Parameters JSON
+
{"block_num": 0, "only_virtual": false}
+
+
Expected Response JSON
+
{"ops": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_history_api.get_ops_in_block", "params":{"block_num":1,"only_virtual":false}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_history_api.get_ops_in_block", "params":{"block_num":5443322,"only_virtual":true}, "id":1}' https://api.steemit.com
+
+ +
+ + +

account_history_api.get_transaction

+

Returns the details of a transaction based on a transaction id.

+
Query Parameters JSON
+
{"id": "0000000000000000000000000000000000000000"}
+
+
Expected Response JSON
+
{
+  "ref_block_num": 0,
+  "ref_block_prefix": 0,
+  "expiration": "1970-01-01T00:00:00",
+  "operations": [],
+  "extensions": [],
+  "signatures": [],
+  "transaction_id": "0000000000000000000000000000000000000000",
+  "block_num": 0,
+  "transaction_num": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"account_history_api.get_transaction", "params":{"id":"6fde0190a97835ea6d9e651293e90c89911f933c"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/block-api.html b/docs/apidefinitions/block-api.html new file mode 100644 index 00000000..91df18b6 --- /dev/null +++ b/docs/apidefinitions/block-api.html @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + +Block Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to query values related to the block plugin. These AppBase API methods are still under development and subject to change.

+ + +

block_api.get_block

+

Retrieve a full, signed block of the referenced block, or null if no matching block was found.

+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the very first block.
8675309Queries block number 8,675,309.
62396745Queries block number 62,396,745.
+ +
Query Parameters JSON
+
{"block_num": 0}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":8675309}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":62396745}, "id":1}' https://api.steemit.com
+
+ +
+ + +

block_api.get_block_header

+

Retrieve a block header of the referenced block, or null if no matching block was found.

+ +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the block headers for the very first block.
8675309Queries block headers for block number 8,675,309.
62396745Queries block headers for block number 62,396,745.
+ +
Query Parameters JSON
+
{"block_num": 0}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":8675309}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":62396745}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/broadcast-ops-comment.html b/docs/apidefinitions/broadcast-ops-comment.html new file mode 100644 index 00000000..443d86c5 --- /dev/null +++ b/docs/apidefinitions/broadcast-ops-comment.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + +Broadcast Ops Comment | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

This is a brief overview of the parameters allowed and values passed by the ‘comment’ operation

+ +

Additional info for API definitions is available on the dev portal

+ +

Purpose:

+ +

A broadcast operation on Steem is a way of expressing intention on the blockchain. +They have types, like comment in this instance, and they parameters (like author) depending on what their intended use is +In other words, the broadcast.comment operation creates a post or a comment on a current post, on the steem blockchain.

+ +

Rules:

+ + +

Parameters:

+ + +

Additional Parameter Definitions:

+ + +

A typical comment operation would look similar to the below:

+ +
  const post = {
+    author :"Joe",
+    title :"A post by Joe",
+    body :"Look at my awesome post",
+    parent_author :'',
+    parent_permlink :"steem",
+    permlink :"a-post-by-joe",
+    json_metadata :"{\"tags\":[\"steemit\",\"example\",\"tags\"]}",
+  };
+
+

In which case the complete broadcast operation would look like this:

+ +
  broadcast.comment(post, privatePostingKey)
+
+

With privatePostingKey being the private posting key of the author broadcasting the comment or post

+ +

Create_vs_Update:

+ +

When a comment is first broadcast, the permlink must be unique for the author. + Otherwise, it is interpreted as an update operation. Updating will either replace the entire body with the latest operation or patch the body if using diff-match-patch.

+ +

For example, if we have a paragraph that has already been broadcast:

+ +

“It’s been quite a lot of fun working with these wonderful folk at Steemit, Inc”

+ +

And we want to change it to:

+ +

“It’s been quite a lot of fun working with these wonderful people at Steemit, Inc”

+ +

We can broadcast the comment operation with the following body:

+ + +

The blockchain will know that this means we have changed the word ‘folk’ to ‘people’ within that paragraph so when fetching this content, this diff will be applied.

+ +

In addition to body, the title and json_metadata fields will also be replaced by the latest operation.

+ +

Comment_Options: LINK

+ +

Updating_Archived_Content:

+ +

Content that is older than 7 days is considered “archived” and cannot be edited unless the author indicates otherwise by broadcasting a custom_json to the witness plugin using their active authority.

+ +

As of HF18, the witness plugin has a custom operation called enable_content_editing that allows a user to signal they want to edit their content. By consensus, content is editable indefinitely, but is soft forked to be frozen after payout. This operation requires an active key and is designed to prevent vandalism if a posting key is compromised.

+ +

For ‘custom_json’: LINK

+ +

Vote: LINK

+ +

It should also be noted that a vote operation can accompany a comment in the same transaction when the author self_upvotes

+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/broadcast-ops.html b/docs/apidefinitions/broadcast-ops.html new file mode 100644 index 00000000..a8dd02e9 --- /dev/null +++ b/docs/apidefinitions/broadcast-ops.html @@ -0,0 +1,2677 @@ + + + + + + + + + + + + + + + + + + +Broadcast Ops | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

An operation on Steem is a way of expressing intention on the blockchain. +They are also known as Broadcast Operations. They have types, like vote +or comment. They pass parameters like author and permlink, depending +on what their purpose is.

+ +

Operations are grouped into transactions and passed as parameters to +methods like network_broadcast_api.broadcast_transaction, in +the operations array. Transactions must be signed in order for the +blockchain to accept them. Here is an example of a transaction that +contains one operation (shown without signatures).

+ +
{
+   "jsonrpc":"2.0",
+   "method":"network_broadcast_api.broadcast_transaction",
+   "params":{
+      "trx":{
+         "ref_block_num":1097,
+         "ref_block_prefix":2181793527,
+         "expiration":"2016-03-24T18:00:21",
+         "operations":[
+            [
+               "vote",
+               {
+                  "voter":"steemit",
+                  "author":"alice",
+                  "permlink":"a-post-by-alice",
+                  "weight":10000
+               }
+            ]
+         ],
+         "extensions":[],
+         "signatures":[]
+      }
+   },
+   "id":1
+}
+
+ +

Also see: Network Broadcast API

+ + +

+vote + + +

+

This operation is used to cast a vote on a post/comment. The primary +purpose of voting is to express Proof-of-Brain about content to the +blockchain. When a vote is cast, the content is considered in the +consensus rules involving author and curation rewards.

+ +

An upvote can be cast from the point in time that the content is created +up to 6.5 days. The remaining 12 hours are locked out of upvotes at +which time only downvotes may be cast.

+ +

A secondary aspect to voting involves reputation, which is not part of +consensus.

+ +

Reputation Rules:

+
    +
  1. Must have non-negative reputation to effect another user’s reputation.
  2. +
  3. If you are down voting another user, you must have more reputation than them to impact their reputation.
  4. +
+ +

Notes:

+ + +
Roles: posting active owner
+
Parameters: voter author permlink weight
+ +
Example Op:
+ +
[
+  "vote",
+  {
+    "voter": "steemit",
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "weight": 10000
+  }
+]
+
+ +
+ + +

+comment + + +

+

Creates a post/comment.

+ +

Notes:

+ + +
Roles: posting active owner
+
Parameters: parent_author parent_permlink author permlink title body json_metadata
+ +
Example Op:
+ +
[
+  "comment",
+  {
+    "parent_author": "",
+    "parent_permlink": "steem",
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "title": "A Post By Alice",
+    "body": "This is my post.",
+    "json_metadata": "{\"tags\":[\"steemit\",\"example\",\"tags\"]}"
+  }
+]
+
+ +
+ + +

+transfer + + +

+

Transfers asset from one account to another. The memo is plain-text, +any encryption on the memo is up to a higher level protocol.

+ +

Notes:

+ + +
Roles: active owner
+
Parameters: from to amount memo
+ +
Example Op:
+ +
[
+  "transfer",
+  {
+    "from": "steemit",
+    "to": "alice",
+    "amount": {
+      "amount": "10",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "memo": "Thanks for all the fish."
+  }
+]
+
+ +
+ + +

+transfer_to_vesting + + +

+

This operation converts STEEM into VFS (Vesting Fund Shares) at the +current exchange rate. With this operation it is possible to give +another account vesting shares so that faucets can pre-fund new accounts +with vesting shares.

+ +

Notes:

+ + +
Roles: active owner
+
Parameters: from to amount
+ +
Example Op:
+ +
[
+  "transfer_to_vesting",
+  {
+    "from": "alice",
+    "to": "",
+    "amount": {
+      "amount": "357000",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ + +

+withdraw_vesting + + +

+

At any given point in time an account can be withdrawing from their +vesting shares. A user may change the number of shares they wish to +cash out at any time between 0 and their total vesting stake.

+ +

After applying this operation, vesting_shares will be withdrawn +at a rate of vesting_shares/13 per week for 13 weeks starting +one week after this operation is included in the blockchain.

+ +

This operation is not valid if the user has no vesting shares.

+ +

Notes:

+ + +
Roles: active owner
+
Parameters: account vesting_shares
+ +
Example Op:
+ +
[
+  "withdraw_vesting",
+  {
+    "account": "steemit",
+    "vesting_shares": {
+      "amount": "200000000000",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ + +

+limit_order_create + + +

+

This operation creates a limit order and matches it against existing +open orders.

+ +
Roles: active owner
+
Parameters: owner orderid amount_to_sell min_to_receive fill_or_kill expiration
+ +
Example Op:
+ +
[
+  "limit_order_create",
+  {
+    "owner": "steemit",
+    "orderid": 10,
+    "amount_to_sell": {
+      "amount": "9950",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "min_to_receive": {
+      "amount": "3500",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "fill_or_kill": false,
+    "expiration": "2035-10-29T06:32:22"
+  }
+]
+
+ +
+ + +

+limit_order_cancel + + +

+

Cancels an order and returns the balance to owner.

+ +
Roles: active owner
+
Parameters: owner orderid
+ +
Example Op:
+ +
[
+  "limit_order_cancel",
+  {"owner": "steemit", "orderid": 10}
+]
+
+ +
+ + +

+price + + +

+ +
Roles: active owner
+
Parameters: base quote
+ +
+ + +

+feed_publish + + +

+

Feeds can only be published by the top N witnesses which are included in +every round and are used to define the exchange rate between steem and +the dollar.

+ +
Roles: active owner
+
Parameters: publisher exchange_rate
+ +
Example Op:
+ +
[
+  "feed_publish",
+  {
+    "publisher": "alice",
+    "exchange_rate": {
+      "base": {
+        "amount": "1000",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "quote": {
+        "amount": "1000000",
+        "precision": 3,
+        "nai": "@@000000021"
+      }
+    }
+  }
+]
+
+ +
+ + +

+convert + + +

+

This operation instructs the blockchain to start a conversion between +STEEM and SBD, the funds are deposited after 3.5 days.

+ +
Roles: active owner
+
Parameters: owner requestid amount
+ +
Example Op:
+ +
[
+  "convert",
+  {
+    "owner": "steemit",
+    "requestid": 1467592156,
+    "amount": {
+      "amount": "5000",
+      "precision": 3,
+      "nai": "@@000000013"
+    }
+  }
+]
+
+ +
+ + +

+account_create + + +

+ +
Roles: active owner
+
Parameters: fee creator new_account_name owner active posting memo_key json_metadata
+ +
Example Op:
+ +
[
+  "account_create",
+  {
+    "fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "creator": "steemit",
+    "new_account_name": "alice",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5b4i9gBqvh4sbgrooXPu2dbGLewNPZkXeuNeBjyiswnu2szgXx",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM7ko5nzqaYfjbD4tKWGmiy3xtT9eQFZ3Pcmq5JmygTRptWSiVQy",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5xAKxnMT2y9VoVJdF63K8xRQAohsiQy9bA33aHeyMB5vgkzaay",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM8ZSyzjPm48GmUuMSRufkVYkwYbZzbxeMysAVp7KFQwbTf98TcG",
+    "json_metadata": "{}"
+  }
+]
+
+ +
+ + +

+account_update + + +

+ +
Roles: active owner
+
Parameters: account owner active posting memo_key json_metadata
+ +
Example Op:
+ +
[
+  "account_update",
+  {
+    "account": "steemit",
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6FATHLohxTN8RWWkU9ZZwVywXo6MEDjHHui1jEBYkG2tTdvMYo",
+          1
+        ],
+        [
+          "STM76EQNV2RTA6yF9TnBvGSV71mW7eW36MM7XQp24JxdoArTfKA76",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM6FATHLohxTN8RWWkU9ZZwVywXo6MEDjHHui1jEBYkG2tTdvMYo",
+    "json_metadata": ""
+  }
+]
+
+ +
+ + +

+report_over_production + + +

+

Disabled in HF4

+ +

This operation is used to report a miner who signs two blocks +at the same time. To be valid, the violation must be reported within +STEEM_MAX_WITNESSES blocks of the head block (1 round) and the +producer must be in the ACTIVE witness set.

+ +

Users not in the ACTIVE witness set should not have to worry about their +key getting compromised and being used to produced multiple blocks so +the attacker can report it and steel their vesting steem.

+ +

The result of the operation is to transfer the full VESTING STEEM balance +of the block producer to the reporter.

+ +
Roles: active owner
+
Parameters: reporter first_block second_block
+ +
+ + +

+witness_update + + +

+

Users who wish to become a witness must pay a fee acceptable to +the current witnesses to apply for the position and allow voting +to begin.

+ +

If the owner isn’t a witness they will become a witness. Witnesses +are charged a fee equal to 1 weeks worth of witness pay which in +turn is derived from the current share supply. The fee is +only applied if the owner is not already a witness.

+ +

If the block_signing_key is null then the witness is removed from +contention. The network will pick the top 21 witnesses for +producing blocks.

+ +

Notes:

+ + +
Roles: active owner
+
Parameters: owner url block_signing_key props fee
+ +
Example Op:
+ +
[
+  "witness_update",
+  {
+    "owner": "alice",
+    "url": "witness-category/my-witness",
+    "block_signing_key": "STM8LoQjQqJHvotqBo7HjnqmUbFW9oJ2theyqonzUd9DdJ7YYHsvD",
+    "props": {
+      "account_creation_fee": {
+        "amount": "100000",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    },
+    "fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ + +

+account_witness_vote + + +

+

All accounts with a VFS (Vesting Fund Shares) can vote for or against +any witness. See: STEEM_MAX_ACCOUNT_WITNESS_VOTES

+ +

If a proxy is specified then all existing votes are removed.

+ +
Roles: active owner
+
Parameters: account witness approve
+ +
Example Op:
+ +
[
+  "account_witness_vote",
+  {
+    "account": "alice",
+    "witness": "bob",
+    "approve": true
+  }
+]
+
+ +
+ + +

+account_witness_proxy + + +

+ +
Roles: active owner
+
Parameters: account proxy
+ +
Example Op:
+ +
[
+  "account_witness_proxy",
+  {"account": "alice", "proxy": "bob"}
+]
+
+ +
+ + +

+pow + + +

+

Disabled in HF14.

+ +
Roles: active owner
+
Parameters: worker input signature work
+ +
Example Op:
+ +
[
+  "pow",
+  {
+    "worker_account": "admin",
+    "block_id": "000004433bd4602cf5f74dbb564183837df9cef8",
+    "nonce": 82,
+    "work": {
+      "worker": "STM65wH1LZ7BfSHcK69SShnqCAH5xdoSZpGkUjmzHJ5GCuxEK9V5G",
+      "input": "59b009f89477919f95914151cef06f28bf344dd6fb7670aca1c1f4323c80446b",
+      "signature": "1f3f83209097efcd01b7d6f27ce726164323d503d6fcf4d55bfb7cb3032796f6766738b36062b5850d69447fdf9c091cbc70825df5eeacc4710a0b11ffdbf0912a",
+      "work": "0b62f4837801cd857f01d6a541faeb13d6bb95f1c36c6b4b14a47df632aa6c92"
+    },
+    "props": {
+      "account_creation_fee": {
+        "amount": "100000",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    }
+  }
+]
+
+ +
+ + +

+custom + + +

+

Provides a generic way to add higher level protocols on top of witness +consensus.

+ +

There is no validation for this operation other than that required auths +are valid.

+ +
Roles: active owner
+
Parameters: required_auths id data
+ +
Example Op:
+ +
[
+  "custom",
+  {
+    "required_auths": ["bytemaster"],
+    "id": 777,
+    "data": "0a627974656d617374657207737465656d697402a3d13897d82114466ad87a74b73a53292d8331d1bd1d3082da6bfbcff19ed097029db013797711c88cccca3692407f9ff9b9ce7221aaa2d797f1692be2215d0a5f6d2a8cab6832050078bc5729201e3ea24ea9f7873e6dbdc65a6bd9899053b9acda876dc69f11a13df9ca8b26b6"
+  }
+]
+
+ +
+ + +

+delete_comment + + +

+ +
Roles: posting active owner
+
Parameters: author permlink
+ +
Example Op:
+ +
[
+  "delete_comment",
+  {
+    "author": "alice",
+    "permlink": "a-post-by-alice"
+  }
+]
+
+ +
+ + +

+custom_json + + +

+

Serves the same purpose as custom but also supports required posting +authorities. Unlike custom, this operation is designed to be human +readable/developer friendly.

+ +
follow
+ +

As of HF9, the follow plugin will track follow/unfollow/ignore events.

+ +
reblog
+ +

As of HF14, allows users to share blogs they find with those who follow +them. This change implemented entirely outside the blockchain consensus +which means that reblogging does not create a new post, it merely shares +an existing post with people who follow you.

+ +
witness
+ +

As of HF18, the witness plugin has a custom operation called +enable_content_editing that allows a user to signal they want to edit +their content. By consensus, content is editable indefinitely, but is +soft forked to be frozen after payout. This operation requires an +active key and is designed to prevent vandalism if a posting key is +compromised. #1017

+ +
Roles: posting active owner
+
Parameters: required_auths required_posting_auths id json
+ +
Example Op:
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["steemit"],
+    "id": "follow",
+    "json": "[\"follow\",{\"follower\":\"steemit\",\"following\":\"alice\",\"what\":[\"blog\"]}]"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["alice"],
+    "id": "follow",
+    "json": "[\"follow\",{\"follower\":\"alice\",\"following\":\"eve\",\"what\":[\"ignore\"]}]"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["bob"],
+    "id": "reblog",
+    "json": "{\"account\":\"bob\",\"author\":\"alice\",\"permlink\":\"a-post-by-alice\"}"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": ["alice"],
+    "required_posting_auths": [],
+    "id": "witness",
+    "json": "[\"enable_content_editing\", {\"account\": \"alice\", \"relock_time\": \"2100-01-01T12:00:00\"}]"
+  }
+]
+
+ +
+ + +

+comment_options + + +

+

Authors of posts may not want all of the benefits that come from creating a post. This +operation allows authors to update properties associated with their post.

+ +

Typically, these options will accompany a comment operation in the same transaction.

+ +

As of HF17, content can specify beneficiaries to receive a part of +their author rewards. The beneficiaries are specified in the extension +field of the comment_options_operation and is a sorted vector (by +account name) of account name, weight pairs. The beneficiaries can only +be specified once and must be specified before any votes are cast on the +comment. Most apps are already adding a comment_options in the +transaction that creates the comment, so this should not be much of a +challenge to add to existing apps.

+ +

Notes:

+ + + +
Roles: posting active owner
+
Parameters: author permlink max_accepted_payout percent_steem_dollars allow_votes allow_curation_rewards extensions
+ +
Example Op:
+ +
[
+  "comment_options",
+  {
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 5000,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": []
+  }
+]
+
+ +
[
+  "comment_options",
+  {
+    "author": "bob",
+    "permlink": "a-post-with-a-beneficiary",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 63,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": [
+      [
+        0,
+        {
+          "beneficiaries": [{"account": "charlie", "weight": 1000}]
+        }
+      ]
+    ]
+  }
+]
+
+ +
[
+  "comment_options",
+  {
+    "author": "charlie",
+    "permlink": "a-post-with-multiple-beneficiaries",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 62688,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": [
+      [
+        0,
+        {
+          "beneficiaries": [
+            {"account": "david", "weight": 500},
+            {"account": "erin", "weight": 500},
+            {"account": "faythe", "weight": 1000},
+            {"account": "frank", "weight": 500}
+          ]
+        }
+      ]
+    ]
+  }
+]
+
+ +
+ + +

+set_withdraw_vesting_route + + +

+

Allows an account to setup a vesting withdraw but with the additional +request for the funds to be transferred directly to another account’s +balance rather than the withdrawing account. In addition, those funds +can be immediately vested again, circumventing the conversion from +vests to steem and back, guaranteeing they maintain their value.

+ +

Notes:

+ + +
Roles: active owner
+
Parameters: from_account to_account percent auto_vest
+ +
Example Op:
+ +
[
+  "set_withdraw_vesting_route",
+  {
+    "from_account": "alice",
+    "to_account": "bob",
+    "percent": 10000,
+    "auto_vest": true
+  }
+]
+
+ +
+ + +

+limit_order_create2 + + +

+

This operation is identical to limit_order_create except it serializes +the price rather than calculating it from other fields.

+ +
Roles: active owner
+
Parameters: owner orderid amount_to_sell exchange_rate fill_or_kill expiration
+ +
Example Op:
+ +
[
+  "limit_order_create2",
+  {
+    "owner": "alice",
+    "orderid": 492991,
+    "amount_to_sell": {
+      "amount": "1",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "exchange_rate": {
+      "base": {
+        "amount": "1",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "quote": {
+        "amount": "10",
+        "precision": 3,
+        "nai": "@@000000021"
+      }
+    },
+    "fill_or_kill": false,
+    "expiration": "2017-05-12T23:11:13"
+  }
+]
+
+ +
+ + +

+challenge_authority + + +

+

Disabled in HF14.

+ +
Roles: posting active owner
+
Parameters: challenger challenged require_owner
+ +
+ + +

+prove_authority + + +

+ +
Roles: active owner
+
Parameters: challenged require_owner
+ +
+ + +

+request_account_recovery + + +

+

All account recovery requests come from a listed recovery account. This +is secure based on the assumption that only a trusted account should be +a recovery account. It is the responsibility of the recovery account to +verify the identity of the account holder of the account to recover by +whichever means they have agreed upon. The blockchain assumes identity +has been verified when this operation is broadcast.

+ +

This operation creates an account recovery request which the account to +recover has 24 hours to respond to before the request expires and is +invalidated.

+ +

There can only be one active recovery request per account at any one time. +Pushing this operation for an account to recover when it already has +an active request will either update the request to a new new owner authority +and extend the request expiration to 24 hours from the current head block +time or it will delete the request. To cancel a request, simply set the +weight threshold of the new owner authority to 0, making it an open authority.

+ +

Additionally, the new owner authority must be satisfiable. In other words, +the sum of the key weights must be greater than or equal to the weight +threshold.

+ +

This operation only needs to be signed by the the recovery account. +The account to recover confirms its identity to the blockchain in +the recover account operation.

+ +

Notes:

+ + + +

See: #169

+ +
Roles: active owner
+
Parameters: recovery_account account_to_recover new_owner_authority extensions
+ +
Example Op:
+ +
[
+  "request_account_recovery",
+  {
+    "recovery_account": "steem",
+    "account_to_recover": "alice",
+    "new_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6LYxj96zdypHYqgDdD6Nyh2NxerN3P1Mp3ddNm7gci63nfrSuZ",
+          1
+        ]
+      ]
+    },
+    "extensions": []
+  }
+]
+
+ +
+ + +

+recover_account + + +

+ +
Roles: owner
+
Parameters: account_to_recover new_owner_authority recent_owner_authority extensions
+ +
Example Op:
+ +
[
+  "recover_account",
+  {
+    "account_to_recover": "alice",
+    "new_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM7j3nhkhHTpXqLEvdx2yEGhQeeorTcxSV6WDL2DZGxwUxYGrHvh",
+          1
+        ]
+      ]
+    },
+    "recent_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM78Xth94gNxp8nmByFV2vNAhg9bsSdviJ6fQXUTFikySLK3uTxC",
+          1
+        ]
+      ]
+    },
+    "extensions": []
+  }
+]
+
+ +
+ + +

+change_recovery_account + + +

+

Each account lists another account as their recovery account. +The recovery account has the ability to create account_recovery_requests +for the account to recover. An account can change their recovery account +at any time with a 30 day delay. This delay is to prevent +an attacker from changing the recovery account to a malicious account +during an attack. These 30 days match the 30 days that an +owner authority is valid for recovery purposes.

+ +

On account creation the recovery account is set either to the creator of +the account (The account that pays the creation fee and is a signer on the transaction) +or to the empty string if the account was mined. An account with no recovery +has the top voted witness as a recovery account, at the time the recover +request is created. Note: This does mean the effective recovery account +of an account with no listed recovery account can change at any time as +witness vote weights. The top voted witness is explicitly the most trusted +witness according to stake.

+ +

See: #169

+ +
Roles: owner
+
Parameters: account_to_recover new_recovery_account extensions
+ +
Example Op:
+ +
[
+  "change_recovery_account",
+  {
+    "account_to_recover": "alice",
+    "new_recovery_account": "bob",
+    "extensions": []
+  }
+]
+
+ +
+ + +

+escrow_transfer + + +

+

The purpose of this operation is to enable someone to send money +contingently to another individual. The funds leave the from account +and go into a temporary balance where they are held until from +releases it to to or to refunds it to from.

+ +

In the event of a dispute the agent can divide the funds between the +to/from account. Disputes can be raised any time before or on the +dispute deadline time, after the escrow has been approved by all +parties.

+ +

This operation only creates a proposed escrow transfer. Both the agent +and to must agree to the terms of the arrangement by approving the +escrow.

+ +

The escrow agent is paid the fee on approval of all parties. It is up to +the escrow agent to determine the fee.

+ +

Escrow transactions are uniquely identified by from and escrow_id, +the escrow_id is defined by the sender.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent escrow_id sbd_amount steem_amount fee ratification_deadline escrow_expiration json_meta
+ +
Example Op:
+ +
[
+  "escrow_transfer",
+  {
+    "from": "alice",
+    "to": "bob",
+    "sbd_amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "steem_amount": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "escrow_id": 23456789,
+    "agent": "charlie",
+    "fee": {
+      "amount": "100",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "json_meta": "{}",
+    "ratification_deadline": "2017-02-26T11:22:39",
+    "escrow_expiration": "2017-02-28T11:22:39"
+  }
+]
+
+ +
+ + +

+escrow_dispute + + +

+

If either the sender or receiver of an escrow payment has an issue, they +can raise it for dispute. Once a payment is in dispute, the agent has +authority over who gets what.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who escrow_id
+ +
Example Op:
+ +
[
+  "escrow_dispute",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "alice",
+    "escrow_id": 72526562
+  }
+]
+
+ +
+ + +

+escrow_release + + +

+

This operation can be used by anyone associated with the escrow transfer +to release funds if they have permission.

+ +

The permission scheme is as follows:

+ + +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who receiver escrow_id sbd_amount steem_amount
+ +
Example Op:
+ +
[
+  "escrow_release",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "charlie",
+    "receiver": "bob",
+    "escrow_id": 72526562,
+    "sbd_amount": {
+      "amount": "5000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "steem_amount": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ + +

+pow2 + + +

+

Disabled in HF17.

+
Roles: active owner
+
Parameters: input pow_summary
+ +
Example Op:
+ +
[
+  "pow2",
+  {
+    "work": [
+      0,
+      {
+        "input": {
+          "worker_account": "alice",
+          "prev_block": "003ea604345523c344fbadab605073ea712dd76f",
+          "nonce": "1052853013628665497"
+        },
+        "pow_summary": 3817904373
+      }
+    ],
+    "props": {
+      "account_creation_fee": {
+        "amount": "1",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    }
+  }
+]
+
+ +
+ + +

+escrow_approve + + +

+

The agent and to accounts must approve an escrow transaction for it to +be valid on the blockchain. Once a party approves the escrow, they +cannot revoke their approval. Subsequent escrow approve operations, +regardless of the approval, will be rejected.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who escrow_id approve
+ +
Example Op:
+ +
[
+  "escrow_approve",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "charlie",
+    "escrow_id": 59102208,
+    "approve": true
+  }
+]
+
+ +
+ + +

+transfer_to_savings + + +

+

For time locked savings accounts. A user can place Steem and Steem +Dollars into time locked savings balances. Funds can be withdrawn from +these balances after a three day delay. The point of this addition is to +mitigate loss from hacked and compromised account. The max a user can +lose instantaneously is the sum of what the hold in liquid balances. +Assuming an account can be recovered quickly, loss in such situations +can be kept to a minimum.

+ +

See: steem_operations.hpp:868

+ +
Roles: active owner
+
Parameters: from to amount memo
+ +
Example Op:
+ +
[
+  "transfer_to_savings",
+  {
+    "from": "alice",
+    "to": "alice",
+    "amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "memo": ""
+  }
+]
+
+ +
+ + +

+transfer_from_savings + + +

+ +
Roles: active owner
+
Parameters: from request_id to amount memo
+ +
Example Op:
+ +
[
+  "transfer_from_savings",
+  {
+    "from": "alice",
+    "request_id": 101,
+    "to": "alice",
+    "amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "memo": ""
+  }
+]
+
+ +
+ + +

+cancel_transfer_from_savings + + +

+ +
Roles: active owner
+
Parameters: from request_id
+ +
Example Op:
+ +
[
+  "cancel_transfer_from_savings",
+  {"from": "alice", "request_id": 1}
+]
+
+ +
+ + +

+custom_binary + + +

+

The semmantics for this operation are the same as the custom_json +operation, but with a binary payload. The json deserialization has a +non-trivial cost associated with it. This operation will allow for +binary deserialization of plugin operations and should improve overall +performance of plugins that chose to use it.

+ +

See: steem_operations.hpp:491

+ +
Roles: posting active owner
+
Parameters: id data
+ +
+ + +

+decline_voting_rights + + +

+

An account can chose to decline their voting rights after a 30 day +delay. This includes voting on content and witnesses. The voting rights +cannot be acquired again once they have been declined. This is only to +formalize a smart contract between certain accounts and the community +that currently only exists as a social contract.

+ +

See: steem_operations.hpp:897

+ +
Roles: owner
+
Parameters: account decline
+ +
Example Op:
+ +
[
+  "decline_voting_rights",
+  {"account": "judy", "decline": true}
+]
+
+ +
+ + +

+reset_account + + +

+

This operation allows recovery_account to change account_to_reset’s +owner authority to new_owner_authority after 60 days of inactivity.

+ +

See: #169

+ +
Roles: active owner
+
Parameters: reset_account account_to_reset new_owner_authority
+ +
+ + +

+set_reset_account + + +

+

This operation allows account owner to control which account has the +power to execute the reset_account operation after 60 days.

+ +

See: #169

+ +
Roles: owner posting
+
Parameters: account current_reset_account reset_account
+ +
+ + +

+claim_reward_balance + + +

+ +
Roles: posting active owner
+
Parameters: account reward_steem reward_sbd reward_vests
+ +
Example Op:
+ +
[
+  "claim_reward_balance",
+  {
+    "account": "alice",
+    "reward_steem": {
+      "amount": "17",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "reward_sbd": {
+      "amount": "11",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "reward_vests": {
+      "amount": "185025103",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ + +

+delegate_vesting_shares + + +

+

Delegate vesting shares from one account to the other. The vesting +shares are still owned by the original account, but content voting +rights and resource credit are transferred to the receiving +account. This sets the delegation to vesting_shares, increasing it or +decreasing it as needed (i.e. a delegation of 0 removes the delegation).

+ +

When a delegation is removed the shares are placed in limbo for a week +to prevent a satoshi of VESTS from voting on the same content twice.

+ +

Also see:

+ + +
Roles: active owner
+
Parameters: delegator delegatee vesting_shares
+ +
Example Op:
+ +
[
+  "delegate_vesting_shares",
+  {
+    "delegator": "alice",
+    "delegatee": "bob",
+    "vesting_shares": {
+      "amount": "94599167138276",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ + +

+account_create_with_delegation + + +

+

Deprecated as of HF20 If an account creation service would still like to provide a delegation of Steem Power +to the accounts they create, they can still follow the account creation operation with an additional call to +delegate_vesting_shares to add a delegation of SP to the account.

+ +
+

Instead of paying the entire account creation fee with Steem, creators +can now pay a smaller fee (30x less) and delegate some Steem Power for +30 days. The exact amount is 5 * min_fee + STEEM_POWER == 150 * min_fee. +You can pay any combination of STEEM and Steem Power along that curve +(so long as the minimum fee is paid).

+
+ +
+

The witness voted STEEM fee is now the minimum required STEEM fee for +delegation. Witnesses should reduce their fee by 30x when the hardfork +goes live to preserve the same required fee for an all STEEM account +creation.

+
+ +

Also see:

+ + +
Roles: active owner
+
Parameters: fee delegation creator new_account_name owner active posting memo_key json_metadata extensions
+ +
Example Op:
+ +
[
+  "account_create_with_delegation",
+  {
+    "fee": {
+      "amount": "3000",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "delegation": {
+      "amount": "0",
+      "precision": 6,
+      "nai": "@@000000037"
+    },
+    "creator": "steemit",
+    "new_account_name": "alice",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5Tki3ecCdCCHCjhhwvQvXuKryL2s34Ma6CXsRzntSUTYVYxCQ9",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6LUoAA8gCL9tHRz7v9xcwR4ZWD3KDRHP5t1U7UAZHdfanLxyBE",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM8anmpHdfVE4AmwsDpcSXpRsydHysEbv6vGJkRQy1d1CC83zeTA",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM67RYDyEkP1Ja1jFehJ45BFGA9oHHUnRnYbxKJEtMhVQiHW3S3k",
+    "json_metadata": "{}",
+    "extensions": []
+  }
+]
+
+ +
+ + +

+fill_convert_request + + +

+

Fills when conversion requests with a conversion date before the head +block time and then converts them to/from steem/sbd at the current +median price feed history price times the premium.

+ +
Roles: active owner
+
Parameters: owner requestid amount_in amount_out
+ +
+ + +

+author_reward + + +

+ +
Roles: posting active owner
+
Parameters: author permlink sbd_payout steem_payout vesting_payout
+ +
+ + +

+curation_reward + + +

+ +
Roles: posting active owner
+
Parameters: curator reward comment_author comment_permlink
+ +
+ + +

+comment_reward + + +

+

See: #774

+ +
Roles: posting active owner
+
Parameters: author permlink payout
+ +
+ + +

+liquidity_reward + + +

+

Deprecated as of HF12, see: #178.

+ +
Roles: active owner
+
Parameters: owner payout
+ +
+ + +

+interest + + +

+ +
Roles: active owner
+
Parameters: owner interest
+ +
Example Op:
+ +
[
+  "interest",
+  {"owner": "alice", "interest": "0.001 SBD"}
+]
+
+ +
+ + +

+fill_vesting_withdraw + + +

+

See: #78

+ +
Roles: active owner
+
Parameters: from_account to_account withdrawn deposited
+ +
Example Op:
+ +
[
+  "fill_vesting_withdraw",
+  {
+    "from_account": "alice",
+    "to_account": "alice",
+    "withdrawn": "0.026475 VESTS",
+    "deposited": "0.710 STEEM"
+  }
+]
+
+ +
+ + +

+fill_order + + +

+ +
Roles: posting active owner
+
Parameters: current_owner current_orderid current_pays open_owner open_orderid open_pays
+ +
Example Op:
+ +
[
+  "fill_order",
+  {
+    "current_owner": "alice",
+    "current_orderid": 42896,
+    "current_pays": "94.999 SBD",
+    "open_owner": "bob",
+    "open_orderid": 10001,
+    "open_pays": "500.000 STEEM"
+  }
+]
+
+ +
+ + +

+shutdown_witness + + +

+

When a witness goes offline.

+ +

See: #278

+ +
Roles: posting active owner
+
Parameters: owner
+ +
Example Op:
+ +
["shutdown_witness", {"owner": "alice"}]
+
+ +
+ + +

+fill_transfer_from_savings + + +

+ +
Roles: posting active owner
+
Parameters: from to amount request_id memo
+ +
+ + +

+hardfork + + +

+ +
Roles: posting active owner
+
Parameters: hardfork_id
+ +
+ + +

+comment_payout_update + + +

+ +
Roles: posting active owner
+
Parameters: author permlink
+ +
+ + +

+return_vesting_delegation + + +

+ +
Roles: posting active owner
+
Parameters: account vesting_shares
+ +
+ + +

+comment_benefactor_reward + + +

+ +
Roles: posting active owner
+
Parameters: benefactor author permlink reward
+ +
+ + +

+producer_reward + + +

+

Witness rewards for block signing are hard to account for. Making these +rewards visible will help witnesses and prospective witnesses by +providing them with more complete and accurate information to guide +their decisions to invest in the platform.

+ +
Roles: posting active owner
+
Parameters: producer vesting_shares
+ +
Example Op:
+ +
[
+  "producer_reward",
+  {
+    "producer": "alice",
+    "vesting_shares": "14403.626449 VESTS"
+  }
+]
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/condenser-api.html b/docs/apidefinitions/condenser-api.html new file mode 100644 index 00000000..de93626c --- /dev/null +++ b/docs/apidefinitions/condenser-api.html @@ -0,0 +1,3998 @@ + + + + + + + + + + + + + + + + + + +Condenser Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

To help with this transition, we created condenser_api, which contains all of the API methods that currently exist and uses the existing argument formatting. The easiest way to get your app to work with Appbase is to change the api to condenser_api.

+ +

All calls in condenser_api will return [] as the argument, as the array argument passing is opaque and implemented in the API calls themselves. They follow the current argument formatting. Existing apps should only need to skip using login_api and send all of their calls to condenser_api without any other changes required to use Appbase.

+ +

For example, calling get_dynamic_global_properties with condenser_api vs database_api:

+ +
{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}
+
+ +
{"jsonrpc":"2.0", "method":"database_api.get_dynamic_global_properties", "id":1}
+
+ +

Because the method has no arguments, the params field can be omitted when not using condenser_api. However, it can optionally be included as the void type (e.g. "params":{}) but it is not required.

+ + +

condenser_api.broadcast_block

+

Used to broadcast a block.

+
Query Parameters JSON
+
[
+  {
+    "previous": "0000000000000000000000000000000000000000",
+    "timestamp": "1970-01-01T00:00:00",
+    "witness": "",
+    "transaction_merkle_root": "0000000000000000000000000000000000000000",
+    "extensions": [],
+    "witness_signature": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+    "transactions": []
+  }
+]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_block", "params":[{"previous":"0000000000000000000000000000000000000000","timestamp":"1970-01-01T00:00:00","witness":"","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactions":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.broadcast_transaction

+

Used to broadcast a transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["vote",{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":"100.000 STEEM","maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.broadcast_transaction_synchronous

+

Used to broadcast a transaction and waits for it to be processed synchronously.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
{
+  "id": "0000000000000000000000000000000000000000",
+  "block_num": 0,
+  "trx_num": 0,
+  "expired": false
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction_synchronous", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["vote",{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction_synchronous", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":"100.000 STEEM","maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_bandwidth

+

Disabled since 0.20.6, see: #3029

+ +

Returns the available bandwidth of an account. Parameters: account:string; type:string, e.g.: forum or market

+ + + + + + + + + + + + + + + + + + + + + +
account (string)type (string) 
"steemit""forum"Query the available forum bandwidth for the account named “steemit”.
"alice""market"Query the available market bandwidth for the account named “alice”.
+ +

See: Forum/Market Bandwidth

+ +
Query Parameters JSON
+
["steemit", "forum"]
+
+
Expected Response JSON
+
{
+  "id": 8,
+  "account": "steemit",
+  "type": "forum",
+  "average_bandwidth": 214996934,
+  "lifetime_bandwidth": "48395000000",
+  "last_bandwidth_update": "2018-02-16T03:11:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_bandwidth", "params":["steemit","forum"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_bandwidth", "params":["alice","market"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_count

+

Returns the number of accounts.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
0
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_count", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_history

+

Returns a history of all operations for a given account. Parameters: account:string; start:int. e.g.: -1 for reverse history or any positive numeric; limit:int up to 10000

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (int)limit (int) 
"steemit"10001000Queries the account named steemit starting on the latest item in history, up to 1,000 results.
"alice"-110000Queries the account named alice starting on the oldest item in history, up to 10,000 results.
+ +
Query Parameters JSON
+
["", 0, 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_history", "params":["steemit", 1000, 1000], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_history", "params":["steemit", -1, 10000], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_reputations

+

Returns a list of account reputations. Parameters: account_lower_bound:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + +
account_lower_bound (string)limit (int) 
"steemit"1Queries for accounts that start with “steemit”, only one result.
"a"10Queries for accounts that start with “a”, up to 10 results.
+ +
Query Parameters JSON
+
["", 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_reputations", "params":["steemit", 1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_reputations", "params":["a", 10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_votes

+

Returns all votes by an account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries for votes by “steemit”.
"alice"Queries for votes by “alice”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[
+  {
+    "authorperm": "",
+    "weight": "",
+    "rshares": "",
+    "percent": null,
+    "time": "2016-04-29T22:27:42"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_votes", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_votes", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_accounts

+

Returns accounts, queried by name. Parameters: account:string array

+ + + + + + + + + + + + + + + + + + +
account (string array) 
["steemit"]Queries for account named “steemit”.
["steemit", "alice"]Queries for accounts named “steemit” and “alice”.
+ +
Query Parameters JSON
+
[[""]]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "name": "",
+    "owner": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0], ["", 0]]
+    },
+    "active": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0]]
+    },
+    "posting": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0], ["", 0]]
+    },
+    "memo_key": "",
+    "json_metadata": "",
+    "proxy": "",
+    "last_owner_update": "2017-03-16T21:17:51",
+    "last_account_update": "2017-03-16T23:10:36",
+    "created": "2016-03-24T17:00:21",
+    "mined": false,
+    "recovery_account": "",
+    "last_account_recovery": "1970-01-01T00:00:00",
+    "reset_account": "null",
+    "comment_count": 0,
+    "lifetime_vote_count": 0,
+    "post_count": 0,
+    "can_vote": false,
+    "voting_power": 0,
+    "last_vote_time": "2016-12-04T23:10:57",
+    "balance": "0.000 STEEM",
+    "savings_balance": "0.0 STEEM",
+    "sbd_balance": "0.0 SBD",
+    "sbd_seconds": "",
+    "sbd_seconds_last_update": "2018-04-10T04:08:36",
+    "sbd_last_interest_payment": "2018-03-15T17:58:24",
+    "savings_sbd_balance": "0.000 SBD",
+    "savings_sbd_seconds": "",
+    "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": "0.000 VESTS",
+    "delegated_vesting_shares": "0.000000 VESTS",
+    "received_vesting_shares": "0.000000 VESTS",
+    "vesting_withdraw_rate": "0.000000 VESTS",
+    "next_vesting_withdrawal": "1969-12-31T23:59:59",
+    "withdrawn": 0,
+    "to_withdraw": 0,
+    "withdraw_routes": 0,
+    "curation_rewards": 0,
+    "posting_rewards": 0,
+    "proxied_vsf_votes": [0, 0, 0, 0],
+    "witnesses_voted_for": 0,
+    "last_post": "2016-03-30T18:30:18",
+    "last_root_post": "2016-03-30T18:30:18",
+    "vesting_balance": "0.000 STEEM",
+    "reputation": "",
+    "transfer_history": [],
+    "market_history": [],
+    "post_history": [],
+    "vote_history": [],
+    "other_history": [],
+    "witness_votes": [],
+    "tags_usage": [],
+    "guest_bloggers": []
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["steemit"]], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["steemit", "alice"]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_active_votes

+

Returns all votes for the given post. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries votes for content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries votes for content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[
+  {
+    "voter": "",
+    "weight": "",
+    "rshares": 0,
+    "percent": 0,
+    "reputation": "",
+    "time": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_votes", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_votes", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_active_witnesses

+

Returns the list of active witnesses.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_witnesses", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_block

+

Returns a block. Parameters: block_num:int

+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the very first block.
8675309Queries block number 8,675,309.
62396745Queries block number 62,396,745.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
{
+  "previous": "0000000000000000000000000000000000000000",
+  "timestamp": "2016-03-24T16:05:00",
+  "witness": "initminer",
+  "transaction_merkle_root": "0000000000000000000000000000000000000000",
+  "extensions": [],
+  "witness_signature": "204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
+  "transactions": [],
+  "block_id": "0000000109833ce528d5bbfb3f6225b39ee10086",
+  "signing_key": "STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
+  "transaction_ids": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[8675309], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[62396745], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_block_header

+

Returns a block header. Parameters: block_num:int

+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the block headers for the very first block.
8675309Queries block headers for block number 8,675,309.
62396745Queries block headers for block number 62,396,745.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
{
+  "previous": "0000000000000000000000000000000000000000",
+  "timestamp": "2016-03-24T16:05:00",
+  "witness": "initminer",
+  "transaction_merkle_root": "0000000000000000000000000000000000000000",
+  "extensions": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[8675309], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[62396745], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_blog

+

Returns the list of blog entries for an account. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
“steemit”01Queries the blog for the account named “steemit”, up to one result.
“alice”050Queries the blog for the account named “alice”, up to 50 results.
+ +
Query Parameters JSON
+
["steemit", 0, 1]
+
+
Expected Response JSON
+
[
+  {
+    "comment": {
+      "id": 0,
+      "author": "steemit",
+      "permlink": "firstpost",
+      "category": "meta",
+      "parent_author": "",
+      "parent_permlink": "meta",
+      "title": "Welcome to Steem!",
+      "body": "Steemit is a social media platform where anyone can earn STEEM points by posting. The more people who like a post, the more STEEM the poster earns. Anyone can sell their STEEM for cash or vest it to boost their voting power.",
+      "json_metadata": "",
+      "last_update": "2016-03-30T18:30:18",
+      "created": "2016-03-30T18:30:18",
+      "active": "2018-04-09T12:00:42",
+      "last_payout": "2016-08-24T19:59:42",
+      "depth": 0,
+      "children": 336,
+      "net_rshares": 0,
+      "abs_rshares": 0,
+      "vote_rshares": 0,
+      "children_abs_rshares": "26169324897669",
+      "cashout_time": "1969-12-31T23:59:59",
+      "max_cashout_time": "1969-12-31T23:59:59",
+      "total_vote_weight": 0,
+      "reward_weight": 10000,
+      "total_payout_value": {
+        "amount": "942",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "curator_payout_value": {
+        "amount": "756",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "author_rewards": 3548,
+      "net_votes": 90,
+      "root_author": "steemit",
+      "root_permlink": "firstpost",
+      "max_accepted_payout": {
+        "amount": "1000000000",
+        "pecision": 3,
+        "nai": "@@000000013"
+      },
+      "percent_steem_dollars": 10000,
+      "allow_replies": true,
+      "allow_votes": true,
+      "allow_curation_rewards": true,
+      "beneficiaries": []
+    },
+    "blog": "steemit",
+    "reblog_on": "1970-01-01T00:00:00",
+    "entry_id": 0
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog", "params":["alice",0,50], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_blog_authors

+

Returns a list of authors that have had their content reblogged on a given blog account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries for account named “steemit”.
"alice"Queries for accounts named alice”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[{"author": "", "count": 0}]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_authors", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_authors", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_blog_entries

+

Returns a list of blog entries for an account. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
“steemit”01Queries the blog entries for the account named “steemit”, up to one result.
“alice”050Queries the blog entries for the account named “alice”, up to 50 results.
+ +
Query Parameters JSON
+
["steemit", 0, 1]
+
+
Expected Response JSON
+
[
+  {
+    "author": "steemit",
+    "permlink": "firstpost",
+    "blog": "steemit",
+    "reblog_on": "1970-01-01T00:00:00",
+    "entry_id": 0
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_entries", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_entries", "params":["alice",0,50], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_chain_properties

+

Returns the chain properties.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "account_creation_fee": "0.100 STEEM",
+  "maximum_block_size": 131072,
+  "sbd_interest_rate": 1000,
+  "account_subsidy_limit": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_chain_properties", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_comment_discussions_by_payout

+

Returns a list of discussions based on payout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_comment_discussions_by_payout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_comment_discussions_by_payout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_config

+

Returns information about compile-time constants. See: Understanding Configuration Values

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_config", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_content

+

Returns the content (post or comment). Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": "0.000 STEEM",
+  "curator_payout_value": "0.000 STEEM",
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": "0.000 STEEM",
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": "0.000 STEEM",
+  "total_pending_payout_value": "0.000 STEEM",
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": "0.000 STEEM",
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_content_replies

+

Returns a list of replies. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries replies for a slug @steemit/firstpost
"alice""a-post-by-alice"Queries replies for a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": "0.000 STEEM",
+  "curator_payout_value": "0.000 STEEM",
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": "0.000 STEEM",
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": "0.000 STEEM",
+  "total_pending_payout_value": "0.000 STEEM",
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": "0.000 STEEM",
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content_replies", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content_replies", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_conversion_requests

+

Returns a list of conversion request. Parameters: id:integer

+ + + + + + + + + + + + + + +
id (int) 
1234Queries a conversion request with the id of 1234.
+ +
Query Parameters JSON
+
[0]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_conversion_requests", "params":[1234], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_current_median_history_price

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{"base": "0.000 STEEM", "quote": "0.000 STEEM"}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_current_median_history_price", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_active

+

Returns a list of discussions based on active.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_active", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_active", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_author_before_date

+

Returns a list of discussions based on author before date.

+
Query Parameters JSON
+
["", "", "1970-01-01T00:00:00", 100]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_author_before_date", "params":["steemit","firstpost","2016-04-19T22:49:43",1], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_blog

+

Returns a list of discussions by blog.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_blog", "params":[{"tag":"steemit","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_blog", "params":[{"tag":"alice","limit":10}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_cashout

+

Returns a list of discussions by cashout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_cashout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_cashout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_children

+

Returns a list of discussions by children.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_children", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_children", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_comments

+

Returns a list of discussions by comments.

+
Query Parameters JSON
+
[
+  {
+    "start_author": "",
+    "start_permlink": "",
+    "limit": 100
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_comments", "params":[{"start_author":"steemit","start_permlink":"firstpost","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_comments", "params":[{"start_author":"alice","start_permlink":"a-post-by-alice","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_created

+

Returns a list of discussions by created.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_created", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_created", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_feed

+

Returns a list of discussions by feed.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "start_author": "",
+    "start_permlink": "",
+    "limit": 100
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_feed", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_feed", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_hot

+

Returns a list of discussions by hot.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_hot", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_hot", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_promoted

+

Returns a list of discussions by promoted.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_promoted", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_promoted", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + + +

Returns a list of discussions by trending.

+ +
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+ +
[]
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_trending", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_trending", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_discussions_by_votes

+

Returns a list of discussions by votes.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_votes", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_votes", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_dynamic_global_properties

+

Returns the current dynamic global properties. See: Understanding Dynamic Global Properties

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "head_block_number": 0,
+  "head_block_id": "0000000000000000000000000000000000000000",
+  "time": "1970-01-01T00:00:00",
+  "current_witness": "",
+  "total_pow": "18446744073709551615",
+  "num_pow_witnesses": 0,
+  "virtual_supply": "0.000 STEEM",
+  "current_supply": "0.000 STEEM",
+  "confidential_supply": "0.000 STEEM",
+  "current_sbd_supply": "0.000 STEEM",
+  "confidential_sbd_supply": "0.000 STEEM",
+  "total_vesting_fund_steem": "0.000 STEEM",
+  "total_vesting_shares": "0.000 STEEM",
+  "total_reward_fund_steem": "0.000 STEEM",
+  "total_reward_shares2": "0",
+  "pending_rewarded_vesting_shares": "0.000 STEEM",
+  "pending_rewarded_vesting_steem": "0.000 STEEM",
+  "sbd_interest_rate": 0,
+  "sbd_print_rate": 10000,
+  "maximum_block_size": 0,
+  "current_aslot": 0,
+  "recent_slots_filled": "0",
+  "participation_count": 0,
+  "last_irreversible_block_num": 0,
+  "vote_power_reserve_rate": 40
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_escrow

+

Returns the escrow for a certain account by id.

+
Query Parameters JSON
+
["", 0]
+
+
Expected Response JSON
+
null
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_escrow", "params":["steemit", 1234], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_expiring_vesting_delegations

+

Returns the expiring vesting delegations for an account. Parameters: account:string, after:timestamp

+ + + + + + + + + + + + + + + + + + + + + +
account (string)after (timestamp) 
"steemit""2018-01-01T00:00:00"Queries for expiring vesting after January 1st, 2018.
"alice""2017-12-01T00:00:00"Queries for expiring vesting after December 1st, 2017.
+ +
Query Parameters JSON
+
["", "1970-01-01T00:00:00"]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "delegator": "",
+    "vesting_shares": "0.000000 VESTS",
+    "expiration": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_expiring_vesting_delegations", "params":["steemit","2018-01-01T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_expiring_vesting_delegations", "params":["alice","2017-12-01T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_feed

+

Returns a list of items in an account’s feed. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
"steemit"01Queries the account named steemit starting on the first item, up to 1 result.
"alice"110Queries the account named alice starting on the second item, up to 10 results.
+ +
Query Parameters JSON
+
["", 0, 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed", "params":["alice",1,10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_feed_entries

+

Returns a list of entries in an account’s feed. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
"steemit"01Queries the account named steemit starting on the first item, up to 1 result.
"alice"110Queries the account named alice starting on the second item, up to 10 results.
+ +
Query Parameters JSON
+
["", 0, 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_entries", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_entries", "params":["alice",1,10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_feed_history

+

Returns the history of price feed values.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_median_history": {"base": "0.000 STEEM", "quote": "0.000 STEEM"},
+  "price_history": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_history", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_follow_count

+

Returns the count of followers/following for an account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the account named steemit.
"alice"Queries the account named alice.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "account": "",
+  "follower_count": 0,
+  "following_count": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_follow_count", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_follow_count", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_followers

+

Returns the list of followers for an account. Parameters: account:string; start:string (account to start from); type:string e.g.: blog; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (string)type (string)limit (int) 
"steemit"null"blog"10Queries for follows of the account named steemit, up to 10 results.
"alice"null"ignore"100Queries for mutes of the account named alice, up to 100 results.
+ +
Query Parameters JSON
+
["", "", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_followers", "params":["steemit",null,"blog",10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_followers", "params":["alice",null,"ignore",100], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_following

+

Returns the list of accounts that are following an account. Parameters: account:string; start:string (account to start from); type:string e.g.: blog; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (string)type (string)limit (int) 
"steemit"null"blog"10Queries for follows of the account named steemit, up to 10 results.
"alice"null"ignore"100Queries for mutes of the account named alice, up to 100 results.
+ +
Query Parameters JSON
+
["", "", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_following", "params":["steemit",null,"blog",10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_following", "params":["alice",null,"ignore",100], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_hardfork_version

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
"0.0.0"
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_hardfork_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_key_references

+

Returns all accounts that have the key associated with their owner or active authorities.

+
Query Parameters JSON
+
[
+  [
+    "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH"
+  ]
+]
+
+
Expected Response JSON
+
[["steemit"]]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_key_references", "params":[["STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH"]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_market_history

+

Returns the market history for the internal SBD:STEEM market. Parameters: bucket_seconds:int; start:timestamp; end:timestamp

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bucket_seconds (int)start (timestamp)end (timestamp) 
15"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by 15 seconds.
60"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one minute.
300"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by five minutes.
3600"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one hour.
86400"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one day.
+ +
Query Parameters JSON
+
[0, "1970-01-01T00:00:00", "1970-01-01T00:00:00"]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "open": "1970-01-01T00:00:00",
+    "seconds": 0,
+    "steem": {
+      "high": 0,
+      "low": 0,
+      "open": 0,
+      "close": 0,
+      "volume": 0
+    },
+    "non_steem": {
+      "high": 0,
+      "low": 0,
+      "open": 0,
+      "close": 0,
+      "volume": 0
+    }
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[15,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[60,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[300,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[3600,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[86400,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_market_history_buckets

+

Returns the bucket seconds being tracked by the plugin.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[15, 60, 300, 3600, 86400]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history_buckets", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_next_scheduled_hardfork

+

Returns the next scheduled hardfork.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "hf_version": "0.0.0",
+  "live_time": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_next_scheduled_hardfork", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_open_orders

+

Returns the open orders for an account. account:string

+
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_open_orders", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_open_orders", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_ops_in_block

+

Returns all operations contained in a block. Parameters: block_num:int; only_virtual:boolean

+ + + + + + + + + + + + + + + + + + + + + +
block_num (int)only_virtual (boolean) 
1falseQueries the operations in block #1.
5443322trueQueries only the virtual operations in block #5,443,322.
+ +
Query Parameters JSON
+
[0, false]
+
+
Expected Response JSON
+
[
+  {
+    "trx_id": "0000000000000000000000000000000000000000",
+    "block": 0,
+    "trx_in_block": 0,
+    "op_in_trx": 0,
+    "virtual_op": 0,
+    "timestamp": "2016-10-01T06:31:24",
+    "op": [
+      "producer_reward",
+      {
+        "producer": "",
+        "vesting_shares": "0.000000 VESTS"
+      }
+    ]
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[1,false], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[5443322,true], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_order_book

+

Returns the internal market order book. Parameters: limit:int up to 500

+ + + + + + + + + + + + + + + + + + +
limit (int) 
10Queries up to 10 items in the order book.
500Queries up to 500 items in the order book.
+ +
Query Parameters JSON
+
[0]
+
+
Expected Response JSON
+
{"bids": [], "asks": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_order_book", "params":[10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_order_book", "params":[50], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_owner_history

+

Returns the owner history of an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the owner history for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_owner_history", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_post_discussions_by_payout

+

Returns a list of post discussions by payout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_post_discussions_by_payout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_post_discussions_by_payout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_potential_signatures

+

This method will return the set of all public keys that could possibly sign for a given transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_potential_signatures", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_reblogged_by

+

Returns a list of authors that have reblogged a post. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries reblogs for content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries reblogs for content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reblogged_by", "params":["steemit","firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reblogged_by", "params":["alice","a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_recent_trades

+

Returns the most recent trades for the internal SBD:STEEM market. Parameters: limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
limit (int) 
10Queries up to 10 latest trades.
500Queries up to 500 latest trades.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
[
+  {
+    "date": "1970-01-01T00:00:00",
+    "current_pays": "0.0 SBD",
+    "open_pays": "0.0 STEEM"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recent_trades", "params":[10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recent_trades", "params":[500], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_recovery_request

+

Returns the recovery request for an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the recovery requests for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
null
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recovery_request", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_replies_by_last_update

+

Returns a list of replies by last update. start_parent_author:string, start_permlink:string, limit:int up to 100

+
Query Parameters JSON
+
["", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_replies_by_last_update", "params":["steemit","firstpost",1], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_required_signatures

+

This API will take a partially signed transaction and a set of public keys that the owner has the ability to sign for and return the minimal subset of public keys that should add signatures to the transaction. Parameters: trx:object; available_keys:[string]

+ +
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  []
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_required_signatures", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]},[]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_reward_fund

+

Returns information about the current reward funds.

+
Query Parameters JSON
+
["post"]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "name": "",
+  "reward_balance": "0.000 STEEM",
+  "recent_claims": "0",
+  "last_update": "1970-01-01T00:00:00",
+  "content_constant": "0",
+  "percent_curation_rewards": 0,
+  "percent_content_rewards": 0,
+  "author_reward_curve": "quadratic",
+  "curation_reward_curve": "34723648"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reward_fund", "params":["post"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_savings_withdraw_from

+

Returns savings withdraw from an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the savings withdraw for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_savings_withdraw_from", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_savings_withdraw_to

+

Returns the savings withdraw to an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the savings withdraw for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_savings_withdraw_to", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_state

+

Returns the state of a path. Deprecated. Parameters: path:string

+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "current_route": "",
+  "props": {
+    "head_block_number": 0,
+    "head_block_id": "0000000000000000000000000000000000000000",
+    "time": "1970-01-01T00:00:00",
+    "current_witness": "",
+    "total_pow": "18446744073709551615",
+    "num_pow_witnesses": 0,
+    "virtual_supply": "0.000 STEEM",
+    "current_supply": "0.000 STEEM",
+    "confidential_supply": "0.000 STEEM",
+    "current_sbd_supply": "0.000 STEEM",
+    "confidential_sbd_supply": "0.000 STEEM",
+    "total_vesting_fund_steem": "0.000 STEEM",
+    "total_vesting_shares": "0.000 STEEM",
+    "total_reward_fund_steem": "0.000 STEEM",
+    "total_reward_shares2": "0",
+    "pending_rewarded_vesting_shares": "0.000 STEEM",
+    "pending_rewarded_vesting_steem": "0.000 STEEM",
+    "sbd_interest_rate": 0,
+    "sbd_print_rate": 10000,
+    "maximum_block_size": 0,
+    "current_aslot": 0,
+    "recent_slots_filled": "0",
+    "participation_count": 0,
+    "last_irreversible_block_num": 0,
+    "vote_power_reserve_rate": 40,
+    "average_block_size": 0,
+    "current_reserve_ratio": 1,
+    "max_virtual_bandwidth": "0"
+  },
+  "tag_idx": {"trending": []},
+  "tags": {},
+  "content": {},
+  "accounts": {},
+  "witnesses": {},
+  "discussion_idx": {},
+  "witness_schedule": {
+    "id": 0,
+    "current_virtual_time": "0",
+    "next_shuffle_block_num": 1,
+    "current_shuffled_witnesses": [],
+    "num_scheduled_witnesses": 1,
+    "top19_weight": 1,
+    "timeshare_weight": 5,
+    "miner_weight": 1,
+    "witness_pay_normalization_factor": 25,
+    "median_props": {
+      "account_creation_fee": "0.000 STEEM",
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    },
+    "majority_version": "0.0.0",
+    "max_voted_witnesses": 19,
+    "max_miner_witnesses": 1,
+    "max_runner_witnesses": 1,
+    "hardfork_required_witnesses": 17
+  },
+  "feed_price": {"base": "0.000 STEEM", "quote": "0.000 STEEM"},
+  "error": ""
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_state", "params":["/@steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_tags_used_by_author

+

Returns a list of tags used by an author. Parameters: author:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the tags used by the account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_tags_used_by_author", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_ticker

+

Returns the market ticker for the internal SBD:STEEM market.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "latest": "0.00000000000000000",
+  "lowest_ask": "0.00000000000000000",
+  "highest_bid": "0.00000000000000000",
+  "percent_change": "0.00000000000000000",
+  "steem_volume": "0.000 STEEM",
+  "sbd_volume": "0.000 STEEM"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ticker", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_trade_history

+

Returns the trade history for the internal SBD:STEEM market. Parameters: start:timestamp; end:timestamp; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
start (timestamp)end (timestamp)limit (int) 
"2018-01-01T00:00:00""2018-01-02T00:00:00"10Queries up to 10 trades between January 1st, 2018 and January 2nd, 2018.
+ +
Query Parameters JSON
+
[
+  "1970-01-01T00:00:00",
+  "1970-01-01T00:00:00",
+  1000
+]
+
+
Expected Response JSON
+
[
+  {
+    "date": "1970-01-01T00:00:00",
+    "current_pays": "0.000 SBD",
+    "open_pays": "0.000 STEEM"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trade_history", "params":["2018-01-01T00:00:00","2018-01-02T00:00:00",10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_transaction

+

Returns the details of a transaction based on a transaction id. Parameters: trx_id:string

+ + + + + + + + + + + + + + +
trx_id (string) 
"6fde0190a97835ea6d9e651293e90c89911f933c"Queries for this exact transaction id.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "ref_block_num": 0,
+  "ref_block_prefix": 0,
+  "expiration": "1970-01-01T00:00:00",
+  "operations": [],
+  "extensions": [],
+  "signatures": [],
+  "transaction_id": "0000000000000000000000000000000000000000",
+  "block_num": 0,
+  "transaction_num": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_transaction", "params":["6fde0190a97835ea6d9e651293e90c89911f933c"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_transaction_hex

+

Returns a hexdump of the serialized binary form of a transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
""
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_transaction_hex", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + + +

Returns the list of trending tags. Parameter: start_tag:string; limit:int up to 100

+ + + + + + + + + + + + + + + + + + + + + +
tag (string)limit (int) 
null100Queries the top 100 trending tags.
"steem"10Queries the tags after “steem”, up to 10 tags.
+ + +
["", 1]
+
+ +
[
+  {
+    "name": "",
+    "total_payouts": "0.000 SBD",
+    "net_votes": 0,
+    "top_posts": 0,
+    "comments": 0,
+    "trending": ""
+  }
+]
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trending_tags", "params":[null,100], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trending_tags", "params":["steem",10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_version

+

Returns the versions of blockchain, steem, and FC.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "blockchain_version": "",
+  "steem_revision": "",
+  "fc_revision": ""
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_vesting_delegations

+

Returns the vesting delegations by an account. Parameters: delegator_account:string; start_account:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
delegator_account (string)start_account (string)limit (int) 
"steemit"null10Queries up to 10 vesting delegations by “steemit”.
+ +
Query Parameters JSON
+
["", "", 1]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "delegator": "",
+    "delegatee": "",
+    "vesting_shares": "0.000000 VESTS",
+    "min_delegation_time": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_vesting_delegations", "params":["steemit",null,10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_volume

+

Returns the market volume for the past 24 hours.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "steem_volume": "0.000 STEEM",
+  "sbd_volume": "0.000 STEEM"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_volume", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_withdraw_routes

+

Returns the withdraw routes for an account. Parameters: account:string; type:string

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)type (string) 
"steemit""outgoing"Queries outgoing withdraw routes by “steemit”.
"steemit""incoming"Queries incoming withdraw routes by “steemit”.
"steemit""all"Queries all withdraw routes by “steemit”.
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "from_account": "",
+    "to_account": "",
+    "percent": 0,
+    "auto_vest": false
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","outgoing"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","incoming"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","all"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_witness_by_account

+

Returns the witness of an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries witness account of “steemit” (of null if none exists).
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "owner": "",
+  "created": "1970-01-01T00:00:00",
+  "url": "",
+  "votes": "0",
+  "virtual_last_update": "0",
+  "virtual_position": "0",
+  "virtual_scheduled_time": "0",
+  "total_missed": 0,
+  "last_aslot": 0,
+  "last_confirmed_block_num": 0,
+  "pow_worker": 0,
+  "signing_key": "",
+  "props": {
+    "account_creation_fee": "0.000 STEEM",
+    "maximum_block_size": 65536,
+    "sbd_interest_rate": 0
+  },
+  "sbd_exchange_rate": {"base": "0.000 SBD", "quote": "0.000 STEEM"},
+  "last_sbd_exchange_update": "1970-01-01T00:00:00",
+  "last_work": "",
+  "running_version": "",
+  "hardfork_version_vote": "",
+  "hardfork_time_vote": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_by_account", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_witness_count

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
0
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_count", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_witness_schedule

+

Returns the current witness schedule.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 1,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 1,
+  "top19_weight": 1,
+  "timeshare_weight": 5,
+  "miner_weight": 1,
+  "witness_pay_normalization_factor": 25,
+  "median_props": {
+    "account_creation_fee": "0.000 STEEM",
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 19,
+  "max_miner_witnesses": 1,
+  "max_runner_witnesses": 1,
+  "hardfork_required_witnesses": 17
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_schedule", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_witnesses

+

Returns current witnesses.

+
Query Parameters JSON
+
[[0]]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses", "params":[[28]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_witnesses_by_vote

+

Returns current witnesses by vote. Parameters: start_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + +
account (string)limit (int) 
null21Queries top 21 witness votes.
"a"1Queries top 10 witness votes starting with “a”.
+ +
Query Parameters JSON
+
["", 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses_by_vote", "params":[null, 21], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses_by_vote", "params":["a", 1], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.lookup_account_names

+

Looks up account names. accounts:[string]

+
Query Parameters JSON
+
[["steemit"]]
+
+
Expected Response JSON
+
[
+  {
+    "id": 28,
+    "name": "steemit",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5tfrdPG1Ycjwa9FuBUueDFFyygndBLXdVEEs2c9eRKScnFk6vM",
+          1
+        ],
+        [
+          "STM71f6yWztimJuREVyyMXNqAVbx1FzPVW6LLXNoQ35dHwKuszmHX",
+          1
+        ],
+        [
+          "STM7U3ymhUTuKME72dpdpQkdQvh722gTLjKBKtmKQPPWgtkr418Nf",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5832HKCJzs6K3rRCsZ1PidTKgjF38ZJb718Y3pCW92HEMsCGPf",
+          1
+        ],
+        [
+          "STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH",
+          1
+        ],
+        [
+          "STM7xVFaqi8RxhWKZwuLA2bKrAiQmhnrbgvw4e2ChAsKYQbPjqUq2",
+          1
+        ],
+        [
+          "STM83dmDkQcZU9X8MWcxsTztSyutE6udrb55PvYgu7RLzStaoAt67",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH",
+    "json_metadata": "",
+    "proxy": "",
+    "last_owner_update": "2017-03-16T21:17:51",
+    "last_account_update": "2017-03-16T23:10:36",
+    "created": "2016-03-24T17:00:21",
+    "mined": true,
+    "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_power": 9950,
+    "last_vote_time": "2016-12-04T23:10:57",
+    "balance": "0.006 STEEM",
+    "savings_balance": "11006644.632 STEEM",
+    "sbd_balance": "8581.890 SBD",
+    "sbd_seconds": "18846158467785",
+    "sbd_seconds_last_update": "2018-04-10T04:08:36",
+    "sbd_last_interest_payment": "2018-03-15T17:58:24",
+    "savings_sbd_balance": "0.000 SBD",
+    "savings_sbd_seconds": "0",
+    "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
+    "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
+    "savings_withdraw_requests": 0,
+    "reward_sbd_balance": "0.000 SBD",
+    "reward_steem_balance": "0.000 STEEM",
+    "reward_vesting_balance": "0.000000 VESTS",
+    "reward_vesting_steem": "0.000 STEEM",
+    "vesting_shares": "90039851836.689703 VESTS",
+    "delegated_vesting_shares": "0.000000 VESTS",
+    "received_vesting_shares": "0.000000 VESTS",
+    "vesting_withdraw_rate": "0.000000 VESTS",
+    "next_vesting_withdrawal": "1969-12-31T23:59:59",
+    "withdrawn": 0,
+    "to_withdraw": 0,
+    "withdraw_routes": 0,
+    "curation_rewards": 0,
+    "posting_rewards": 3548,
+    "proxied_vsf_votes": ["28583799126", 0, 0, 0],
+    "witnesses_voted_for": 0,
+    "last_post": "2016-03-30T18:30:18",
+    "last_root_post": "2016-03-30T18:30:18"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_account_names", "params":[["steemit"]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.lookup_accounts

+

Looks up accounts starting with name. Parameterslower_bound_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + +
lower_bound_name (string)limit (int) 
"a"10Queries up to 10 accounts that start with “a”.
+ +
Query Parameters JSON
+
["", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_accounts", "params":["a",10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.lookup_witness_accounts

+

Looks up witness accounts starting with name. Parameters: lower_bound_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + +
lower_bound_name (string)limit (int) 
"a"10Queries up to 10 witnesses that start with “a”.
+ +
Query Parameters JSON
+
["", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_witness_accounts", "params":["a",10], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.verify_account_authority

+

Not Implemented

+ +
Query Parameters JSON
+
["", [""]]
+
+
Expected Response JSON
+
false
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.verify_account_authority", "params":["steemit",["STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU"]], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.verify_authority

+

Returns true if the transaction has all of the required signatures.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
false
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.verify_authority", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ + +

condenser_api.get_account_references

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[]
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/database-api.html b/docs/apidefinitions/database-api.html new file mode 100644 index 00000000..14f0687e --- /dev/null +++ b/docs/apidefinitions/database-api.html @@ -0,0 +1,1385 @@ + + + + + + + + + + + + + + + + + + +Database Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to query information about accounts, transactions, and blockchain data. These AppBase API methods are still under development and subject to change.

+ + +

database_api.find_account_recovery_requests

+

Returns a list of account recovery requests.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.find_accounts

+

Search for accounts.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
+ + +

database_api.find_change_recovery_account_requests

+

Returns a list of requests to change the recovery account.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.find_comments

+

Search for comments.

+
Query Parameters JSON
+
{"comments": []}
+
+
Expected Response JSON
+
{"comments": []}
+
+ +
+ + +

database_api.find_decline_voting_rights_requests

+

Returns a list of requests to decline voting rights.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.find_escrows

+

Returns a list of escrows.

+
Query Parameters JSON
+
{"from": ""}
+
+
Expected Response JSON
+
{"escrows": []}
+
+ +
+ + +

database_api.find_limit_orders

+

Returns a list of limit orders.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"orders": []}
+
+ +
+ + +

database_api.find_owner_histories

+

Returns owner authority history.

+
Query Parameters JSON
+
{"owner": ""}
+
+
Expected Response JSON
+
{"owner_auths": []}
+
+ +
+ + +

database_api.find_savings_withdrawals

+

Returns the list of savings withdrawls for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"withdrawals": []}
+
+ +
+ + +

database_api.find_sbd_conversion_requests

+

Returns the list of SBD conversion requests for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.find_vesting_delegation_expirations

+

Returns the expirations for vesting delegations.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ + +

database_api.find_vesting_delegations

+

Returns the list of vesting delegations for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ + +

database_api.find_votes

+

Returns the votes for an author and permlink.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ + +

database_api.find_withdraw_vesting_routes

+

Returns the list of vesting withdraw routes for an account.

+
Query Parameters JSON
+
{"account": "", "order": "by_name"}
+
+
Expected Response JSON
+
{"routes": []}
+
+ +
+ + +

database_api.find_witnesses

+

Search for witnesses.

+
Query Parameters JSON
+
{"owners": []}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
+ + +

database_api.get_active_witnesses

+

Returns the list of active witnesses.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_active_witnesses", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_config

+

Returns information about compile-time constants. Some properties may not be present. See: Understanding Configuration Values

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_config", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_current_price_feed

+

Returns the current price feed.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "base": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "quote": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  }
+}
+
+ +
+ + +

database_api.get_dynamic_global_properties

+

Returns the current dynamic global properties. See: Understanding Dynamic Global Properties

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "head_block_number": 0,
+  "head_block_id": "0000000000000000000000000000000000000000",
+  "time": "1970-01-01T00:00:00",
+  "current_witness": "",
+  "total_pow": "18446744073709551615",
+  "num_pow_witnesses": 0,
+  "virtual_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "current_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "confidential_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "current_sbd_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "confidential_sbd_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "total_vesting_fund_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_vesting_shares": {
+    "amount": "0",
+    "precision": 6,
+    "nai": "@@000000037"
+  },
+  "total_reward_fund_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_reward_shares2": "0",
+  "pending_rewarded_vesting_shares": {
+    "amount": "0",
+    "precision": 6,
+    "nai": "@@000000037"
+  },
+  "pending_rewarded_vesting_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_interest_rate": 0,
+  "sbd_print_rate": 10000,
+  "maximum_block_size": 0,
+  "current_aslot": 0,
+  "recent_slots_filled": "0",
+  "participation_count": 0,
+  "last_irreversible_block_num": 0,
+  "vote_power_reserve_rate": 40,
+  "delegation_return_period": 604800,
+  "reverse_auction_seconds": 0,
+  "available_account_subsidies": 0,
+  "sbd_stop_percent": 0,
+  "sbd_start_percent": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_dynamic_global_properties", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_feed_history

+

Returns the history of price feed values.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_median_history": {
+    "base": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "quote": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  },
+  "price_history": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_feed_history", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_hardfork_properties

+

Returns the current properties about the blockchain’s hardforks.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "processed_hardforks": [],
+  "last_hardfork": 0,
+  "current_hardfork_version": "0.0.0",
+  "next_hardfork": "0.0.0",
+  "next_hardfork_time": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_hardfork_properties", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_order_book

+

Returns the order book.

+
Query Parameters JSON
+
{"limit": 0}
+
+
Expected Response JSON
+
{"asks": [], "bids": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_order_book", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_order_book", "params":{"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_potential_signatures

+

This method will return the set of all public keys that could possibly sign for a given transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"keys": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_potential_signatures", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_required_signatures

+

This API will take a partially signed transaction and a set of public keys that the owner has the ability to sign for and return the minimal subset of public keys that should add signatures to the transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  "available_keys": []
+}
+
+
Expected Response JSON
+
{"keys": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_required_signatures", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]},"available_keys":[]}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_reward_funds

+

Returns information about the current reward funds.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"funds": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_reward_funds", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_transaction_hex

+

Returns a hexdump of the serialized binary form of a transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"hex": ""}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_transaction_hex", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_version

+

Returns the compile time versions of blockchain, steem, FC. Also returns the boot time version of the chain id (may be different from compile time value only when looking at a testnet)

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "blockchain_version": "",
+  "steem_revision": "",
+  "fc_revision": "",
+  "chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.get_witness_schedule

+

Returns the current witness schedule.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 76479392,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 0,
+  "elected_weight": 132,
+  "timeshare_weight": 86,
+  "miner_weight": 125,
+  "witness_pay_normalization_factor": 32767,
+  "median_props": {
+    "account_creation_fee": {
+      "amount": "1",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000,
+    "account_subsidy_budget": 797,
+    "account_subsidy_decay": 347321
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 0,
+  "max_miner_witnesses": 0,
+  "max_runner_witnesses": 0,
+  "hardfork_required_witnesses": 0,
+  "account_subsidy_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "account_subsidy_witness_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "min_witness_account_subsidy_decay": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_witness_schedule", "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.list_account_recovery_requests

+

Returns a list of account recovery requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.list_accounts

+

Returns a list of accounts.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
+ + +

database_api.list_change_recovery_account_requests

+

Returns a list of recovery account change requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.list_comments

+

Returns a list of comments.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"comments": []}
+
+ +
+ + +

database_api.list_decline_voting_rights_requests

+

Returns a list of decline voting rights requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.list_escrows

+

Returns a list of escrows.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"escrows": []}
+
+ +
+ + +

database_api.list_limit_orders

+

Returns a list of limit orders.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"orders": []}
+
+ +
+ + +

database_api.list_owner_histories

+

Returns a list of owner authority histories.

+
Query Parameters JSON
+
{"start": null, "limit": 0}
+
+
Expected Response JSON
+
{"owner_auths": []}
+
+ +
+ + +

database_api.list_savings_withdrawals

+

Returns a list of savings withdrawls.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"withdrawals": []}
+
+ +
+ + +

database_api.list_sbd_conversion_requests

+

Returns a list of SBD conversion requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ + +

database_api.list_vesting_delegation_expirations

+

Returns a list of vesting delegation expirations.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ + +

database_api.list_vesting_delegations

+

Returns a list of vesting delegations.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ + +

database_api.list_votes

+

Returns a list of votes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ + +

database_api.list_withdraw_vesting_routes

+

Returns a list of vesting withdraw routes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"routes": []}
+
+ +
+ + +

database_api.list_witness_votes

+

Returns a list of witness votes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ + +

database_api.list_witnesses

+

Returns the list of witnesses.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
+ + +

database_api.verify_account_authority

+

Not Implemented

+ +
Query Parameters JSON
+
{"account": "", "signers": []}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.verify_account_authority", "params":{"account":"steemit","signers":["STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU"]}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.verify_authority

+

Returns true if the transaction has all of the required signatures.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.verify_authority", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ + +

database_api.verify_signatures

+

This is a general purpose API that checks signatures against accounts for an arbitrary sha256 hash using the existing authority structures.

+
Query Parameters JSON
+
{
+  "hash": "0000000000000000000000000000000000000000000000000000000000000000",
+  "signatures": [],
+  "required_owner": [],
+  "required_active": [],
+  "required_posting": [],
+  "required_other": []
+}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/debug-node-api.html b/docs/apidefinitions/debug-node-api.html new file mode 100644 index 00000000..96f8cca4 --- /dev/null +++ b/docs/apidefinitions/debug-node-api.html @@ -0,0 +1,538 @@ + + + + + + + + + + + + + + + + + + +Debug Node Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

This plugin allows all sorts of creative “what-if” experiments with the chain.

+ +

See: debug_node_plugin.md

+ + +

debug_node_api.debug_generate_blocks

+

Generate blocks locally.

+
Query Parameters JSON
+
{
+  "debug_key": "",
+  "count": 0,
+  "skip": 0,
+  "miss_blocks": 0,
+  "edit_if_needed": true
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ + +

debug_node_api.debug_generate_blocks_until

+

Generate blocks locally until a specified head block time. Can generate them sparsely.

+
Query Parameters JSON
+
{
+  "debug_key": "",
+  "head_block_time": "1970-01-01T00:00:00",
+  "generate_sparsely": true
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ + +

debug_node_api.debug_get_hardfork_property_object

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "processed_hardforks": [],
+  "last_hardfork": 0,
+  "current_hardfork_version": "0.0.0",
+  "next_hardfork": "0.0.0",
+  "next_hardfork_time": "1970-01-01T00:00:00"
+}
+
+ +
+ + +

debug_node_api.debug_get_json_schema

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"schema": ""}
+
+ +
+ + +

debug_node_api.debug_get_witness_schedule

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 21573344,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 192,
+  "elected_weight": 49,
+  "timeshare_weight": 73,
+  "miner_weight": 1,
+  "witness_pay_normalization_factor": 0,
+  "median_props": {
+    "account_creation_fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000,
+    "account_subsidy_budget": 797,
+    "account_subsidy_decay": 347321
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 128,
+  "max_miner_witnesses": 131,
+  "max_runner_witnesses": 191,
+  "hardfork_required_witnesses": 4,
+  "account_subsidy_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "account_subsidy_witness_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "min_witness_account_subsidy_decay": 0
+}
+
+ +
+ + +

debug_node_api.debug_has_hardfork

+ +
Query Parameters JSON
+
{"hardfork_id": 0}
+
+
Expected Response JSON
+
{"has_hardfork": false}
+
+ +
+ + +

debug_node_api.debug_pop_block

+

Pop a block from the blockchain, returning it.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{}
+
+ +
+ + +

debug_node_api.debug_push_blocks

+

Push blocks from existing database.

+
Query Parameters JSON
+
{
+  "src_filename": "",
+  "count": 0,
+  "skip_validate_invariants": false
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ + +

debug_node_api.debug_set_hardfork

+ +
Query Parameters JSON
+
{"hardfork_id": 0}
+
+
Expected Response JSON
+
{}
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/follow-api.html b/docs/apidefinitions/follow-api.html new file mode 100644 index 00000000..62102d28 --- /dev/null +++ b/docs/apidefinitions/follow-api.html @@ -0,0 +1,590 @@ + + + + + + + + + + + + + + + + + + +Follow Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup information related to reputation and account follow operations. These AppBase API methods are still under development and subject to change.

+ + +

follow_api.get_account_reputations

+

Returns a list of account reputations.

+
Query Parameters JSON
+
{"account_lower_bound": "", "limit": 1000}
+
+
Expected Response JSON
+
{"reputations": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_account_reputations", "params":{"account_lower_bound":"steemit", "limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_account_reputations", "params":{"account_lower_bound":"a", "limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_blog

+

Returns the list of blog entries for an account.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"blog": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog", "params":{"account":"alice","start_entry_id":0,"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_blog_authors

+

Returns a list of authors that have had their content reblogged on a given blog account.

+
Query Parameters JSON
+
{"blog_account": ""}
+
+
Expected Response JSON
+
{"blog_authors": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_authors", "params":{"blog_account":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_authors", "params":{"blog_account":"alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_blog_entries

+

Returns a list of blog entries for an account.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"blog": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_entries", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_entries", "params":{"account":"alice","start_entry_id":0,"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_feed

+

Returns a list of items in an account’s feed.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"feed": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed", "params":{"account":"alice","start_entry_id":1,"limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_feed_entries

+

Returns a list of entries in an account’s feed.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"feed": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed_entries", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed_entries", "params":{"account":"alice","start_entry_id":1,"limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_follow_count

+

Returns the count of followers for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{
+  "account": "",
+  "follower_count": 0,
+  "following_count": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_follow_count", "params":{"account":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_follow_count", "params":{"account":"alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_followers

+

Returns the list of followers for an account.

+
Query Parameters JSON
+
{
+  "account": "",
+  "start": "",
+  "type": "undefined",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"followers": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_followers", "params":{"account":"steemit","start":null,"type":"blog","limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_followers", "params":{"account":"alice","start":null,"type":"ignore","limit":100}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_following

+

Returns the list of accounts that are following an account.

+
Query Parameters JSON
+
{
+  "account": "",
+  "start": "",
+  "type": "undefined",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"following": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_following", "params":{"account":"steemit","start":null,"type":"blog","limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_following", "params":{"account":"alice","start":null,"type":"ignore","limit":100}, "id":1}' https://api.steemit.com
+
+ +
+ + +

follow_api.get_reblogged_by

+

Returns a list of authors that have reblogged a post.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_reblogged_by", "params":{"author":"steemit","permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_reblogged_by", "params":{"author":"alice","permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/index.html b/docs/apidefinitions/index.html new file mode 100644 index 00000000..8f22da38 --- /dev/null +++ b/docs/apidefinitions/index.html @@ -0,0 +1,9763 @@ + + + + + + + + + + + + + + + + + + +API Docs - API Definitions | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal - API Definitions

+ + + +
+
+
+
+ While the condenser_api.* calls are ready for use, all other appbase methods are currently works in progress and may change, or be unsuitable for production use. +
+
+
+ + + + + +
+

+ + Condenser Api + + +

+ + + +

To help with this transition, we created condenser_api, which contains all of the API methods that currently exist and uses the existing argument formatting. The easiest way to get your app to work with Appbase is to change the api to condenser_api.

+ +

All calls in condenser_api will return [] as the argument, as the array argument passing is opaque and implemented in the API calls themselves. They follow the current argument formatting. Existing apps should only need to skip using login_api and send all of their calls to condenser_api without any other changes required to use Appbase.

+ +

For example, calling get_dynamic_global_properties with condenser_api vs database_api:

+ +
{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}
+
+ +
{"jsonrpc":"2.0", "method":"database_api.get_dynamic_global_properties", "id":1}
+
+ +

Because the method has no arguments, the params field can be omitted when not using condenser_api. However, it can optionally be included as the void type (e.g. "params":{}) but it is not required.

+ +
    + + + +
+

condenser_api.broadcast_block

+

Used to broadcast a block.

+
Query Parameters JSON
+
[
+  {
+    "previous": "0000000000000000000000000000000000000000",
+    "timestamp": "1970-01-01T00:00:00",
+    "witness": "",
+    "transaction_merkle_root": "0000000000000000000000000000000000000000",
+    "extensions": [],
+    "witness_signature": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+    "transactions": []
+  }
+]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_block", "params":[{"previous":"0000000000000000000000000000000000000000","timestamp":"1970-01-01T00:00:00","witness":"","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactions":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.broadcast_transaction

+

Used to broadcast a transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["vote",{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":"100.000 STEEM","maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.broadcast_transaction_synchronous

+

Used to broadcast a transaction and waits for it to be processed synchronously.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
{
+  "id": "0000000000000000000000000000000000000000",
+  "block_num": 0,
+  "trx_num": 0,
+  "expired": false
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction_synchronous", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["vote",{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.broadcast_transaction_synchronous", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":"100.000 STEEM","maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
  • Disabled
  • + +
+

condenser_api.get_account_bandwidth

+

Disabled since 0.20.6, see: #3029

+ +

Returns the available bandwidth of an account. Parameters: account:string; type:string, e.g.: forum or market

+ + + + + + + + + + + + + + + + + + + + + +
account (string)type (string) 
"steemit""forum"Query the available forum bandwidth for the account named “steemit”.
"alice""market"Query the available market bandwidth for the account named “alice”.
+ +

See: Forum/Market Bandwidth

+ +
Query Parameters JSON
+
["steemit", "forum"]
+
+
Expected Response JSON
+
{
+  "id": 8,
+  "account": "steemit",
+  "type": "forum",
+  "average_bandwidth": 214996934,
+  "lifetime_bandwidth": "48395000000",
+  "last_bandwidth_update": "2018-02-16T03:11:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_bandwidth", "params":["steemit","forum"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_bandwidth", "params":["alice","market"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_account_count

+

Returns the number of accounts.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
0
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_count", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_account_history

+

Returns a history of all operations for a given account. Parameters: account:string; start:int. e.g.: -1 for reverse history or any positive numeric; limit:int up to 10000

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (int)limit (int) 
"steemit"10001000Queries the account named steemit starting on the latest item in history, up to 1,000 results.
"alice"-110000Queries the account named alice starting on the oldest item in history, up to 10,000 results.
+ +
Query Parameters JSON
+
["", 0, 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_history", "params":["steemit", 1000, 1000], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_history", "params":["steemit", -1, 10000], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF13
  • + + + +
+

condenser_api.get_account_reputations

+

Returns a list of account reputations. Parameters: account_lower_bound:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + +
account_lower_bound (string)limit (int) 
"steemit"1Queries for accounts that start with “steemit”, only one result.
"a"10Queries for accounts that start with “a”, up to 10 results.
+ +
Query Parameters JSON
+
["", 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_reputations", "params":["steemit", 1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_reputations", "params":["a", 10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_account_votes

+

Returns all votes by an account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries for votes by “steemit”.
"alice"Queries for votes by “alice”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[
+  {
+    "authorperm": "",
+    "weight": "",
+    "rshares": "",
+    "percent": null,
+    "time": "2016-04-29T22:27:42"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_votes", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_account_votes", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_accounts

+

Returns accounts, queried by name. Parameters: account:string array

+ + + + + + + + + + + + + + + + + + +
account (string array) 
["steemit"]Queries for account named “steemit”.
["steemit", "alice"]Queries for accounts named “steemit” and “alice”.
+ +
Query Parameters JSON
+
[[""]]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "name": "",
+    "owner": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0], ["", 0]]
+    },
+    "active": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0]]
+    },
+    "posting": {
+      "weight_threshold": 0,
+      "account_auths": [],
+      "key_auths": [["", 0], ["", 0], ["", 0]]
+    },
+    "memo_key": "",
+    "json_metadata": "",
+    "proxy": "",
+    "last_owner_update": "2017-03-16T21:17:51",
+    "last_account_update": "2017-03-16T23:10:36",
+    "created": "2016-03-24T17:00:21",
+    "mined": false,
+    "recovery_account": "",
+    "last_account_recovery": "1970-01-01T00:00:00",
+    "reset_account": "null",
+    "comment_count": 0,
+    "lifetime_vote_count": 0,
+    "post_count": 0,
+    "can_vote": false,
+    "voting_power": 0,
+    "last_vote_time": "2016-12-04T23:10:57",
+    "balance": "0.000 STEEM",
+    "savings_balance": "0.0 STEEM",
+    "sbd_balance": "0.0 SBD",
+    "sbd_seconds": "",
+    "sbd_seconds_last_update": "2018-04-10T04:08:36",
+    "sbd_last_interest_payment": "2018-03-15T17:58:24",
+    "savings_sbd_balance": "0.000 SBD",
+    "savings_sbd_seconds": "",
+    "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": "0.000 VESTS",
+    "delegated_vesting_shares": "0.000000 VESTS",
+    "received_vesting_shares": "0.000000 VESTS",
+    "vesting_withdraw_rate": "0.000000 VESTS",
+    "next_vesting_withdrawal": "1969-12-31T23:59:59",
+    "withdrawn": 0,
+    "to_withdraw": 0,
+    "withdraw_routes": 0,
+    "curation_rewards": 0,
+    "posting_rewards": 0,
+    "proxied_vsf_votes": [0, 0, 0, 0],
+    "witnesses_voted_for": 0,
+    "last_post": "2016-03-30T18:30:18",
+    "last_root_post": "2016-03-30T18:30:18",
+    "vesting_balance": "0.000 STEEM",
+    "reputation": "",
+    "transfer_history": [],
+    "market_history": [],
+    "post_history": [],
+    "vote_history": [],
+    "other_history": [],
+    "witness_votes": [],
+    "tags_usage": [],
+    "guest_bloggers": []
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["steemit"]], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["steemit", "alice"]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_active_votes

+

Returns all votes for the given post. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries votes for content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries votes for content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[
+  {
+    "voter": "",
+    "weight": "",
+    "rshares": 0,
+    "percent": 0,
+    "reputation": "",
+    "time": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_votes", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_votes", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_active_witnesses

+

Returns the list of active witnesses.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_active_witnesses", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_block

+

Returns a block. Parameters: block_num:int

+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the very first block.
8675309Queries block number 8,675,309.
62396745Queries block number 62,396,745.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
{
+  "previous": "0000000000000000000000000000000000000000",
+  "timestamp": "2016-03-24T16:05:00",
+  "witness": "initminer",
+  "transaction_merkle_root": "0000000000000000000000000000000000000000",
+  "extensions": [],
+  "witness_signature": "204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
+  "transactions": [],
+  "block_id": "0000000109833ce528d5bbfb3f6225b39ee10086",
+  "signing_key": "STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
+  "transaction_ids": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[8675309], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[62396745], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_block_header

+

Returns a block header. Parameters: block_num:int

+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the block headers for the very first block.
8675309Queries block headers for block number 8,675,309.
62396745Queries block headers for block number 62,396,745.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
{
+  "previous": "0000000000000000000000000000000000000000",
+  "timestamp": "2016-03-24T16:05:00",
+  "witness": "initminer",
+  "transaction_merkle_root": "0000000000000000000000000000000000000000",
+  "extensions": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[8675309], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block_header", "params":[62396745], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_blog

+

Returns the list of blog entries for an account. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
“steemit”01Queries the blog for the account named “steemit”, up to one result.
“alice”050Queries the blog for the account named “alice”, up to 50 results.
+ +
Query Parameters JSON
+
["steemit", 0, 1]
+
+
Expected Response JSON
+
[
+  {
+    "comment": {
+      "id": 0,
+      "author": "steemit",
+      "permlink": "firstpost",
+      "category": "meta",
+      "parent_author": "",
+      "parent_permlink": "meta",
+      "title": "Welcome to Steem!",
+      "body": "Steemit is a social media platform where anyone can earn STEEM points by posting. The more people who like a post, the more STEEM the poster earns. Anyone can sell their STEEM for cash or vest it to boost their voting power.",
+      "json_metadata": "",
+      "last_update": "2016-03-30T18:30:18",
+      "created": "2016-03-30T18:30:18",
+      "active": "2018-04-09T12:00:42",
+      "last_payout": "2016-08-24T19:59:42",
+      "depth": 0,
+      "children": 336,
+      "net_rshares": 0,
+      "abs_rshares": 0,
+      "vote_rshares": 0,
+      "children_abs_rshares": "26169324897669",
+      "cashout_time": "1969-12-31T23:59:59",
+      "max_cashout_time": "1969-12-31T23:59:59",
+      "total_vote_weight": 0,
+      "reward_weight": 10000,
+      "total_payout_value": {
+        "amount": "942",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "curator_payout_value": {
+        "amount": "756",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "author_rewards": 3548,
+      "net_votes": 90,
+      "root_author": "steemit",
+      "root_permlink": "firstpost",
+      "max_accepted_payout": {
+        "amount": "1000000000",
+        "pecision": 3,
+        "nai": "@@000000013"
+      },
+      "percent_steem_dollars": 10000,
+      "allow_replies": true,
+      "allow_votes": true,
+      "allow_curation_rewards": true,
+      "beneficiaries": []
+    },
+    "blog": "steemit",
+    "reblog_on": "1970-01-01T00:00:00",
+    "entry_id": 0
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog", "params":["alice",0,50], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_blog_authors

+

Returns a list of authors that have had their content reblogged on a given blog account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries for account named “steemit”.
"alice"Queries for accounts named alice”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[{"author": "", "count": 0}]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_authors", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_authors", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_blog_entries

+

Returns a list of blog entries for an account. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
“steemit”01Queries the blog entries for the account named “steemit”, up to one result.
“alice”050Queries the blog entries for the account named “alice”, up to 50 results.
+ +
Query Parameters JSON
+
["steemit", 0, 1]
+
+
Expected Response JSON
+
[
+  {
+    "author": "steemit",
+    "permlink": "firstpost",
+    "blog": "steemit",
+    "reblog_on": "1970-01-01T00:00:00",
+    "entry_id": 0
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_entries", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_blog_entries", "params":["alice",0,50], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_chain_properties

+

Returns the chain properties.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "account_creation_fee": "0.100 STEEM",
+  "maximum_block_size": 131072,
+  "sbd_interest_rate": 1000,
+  "account_subsidy_limit": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_chain_properties", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

condenser_api.get_comment_discussions_by_payout

+

Returns a list of discussions based on payout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_comment_discussions_by_payout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_comment_discussions_by_payout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_config

+

Returns information about compile-time constants. See: Understanding Configuration Values

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_config", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_content

+

Returns the content (post or comment). Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": "0.000 STEEM",
+  "curator_payout_value": "0.000 STEEM",
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": "0.000 STEEM",
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": "0.000 STEEM",
+  "total_pending_payout_value": "0.000 STEEM",
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": "0.000 STEEM",
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_content_replies

+

Returns a list of replies. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries replies for a slug @steemit/firstpost
"alice""a-post-by-alice"Queries replies for a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": "0.000 STEEM",
+  "curator_payout_value": "0.000 STEEM",
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": "0.000 STEEM",
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": "0.000 STEEM",
+  "total_pending_payout_value": "0.000 STEEM",
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": "0.000 STEEM",
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content_replies", "params":["steemit", "firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_content_replies", "params":["alice", "a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_conversion_requests

+

Returns a list of conversion request. Parameters: id:integer

+ + + + + + + + + + + + + + +
id (int) 
1234Queries a conversion request with the id of 1234.
+ +
Query Parameters JSON
+
[0]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_conversion_requests", "params":[1234], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_current_median_history_price

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{"base": "0.000 STEEM", "quote": "0.000 STEEM"}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_current_median_history_price", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_active

+

Returns a list of discussions based on active.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_active", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_active", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_author_before_date

+

Returns a list of discussions based on author before date.

+
Query Parameters JSON
+
["", "", "1970-01-01T00:00:00", 100]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_author_before_date", "params":["steemit","firstpost","2016-04-19T22:49:43",1], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_blog

+

Returns a list of discussions by blog.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_blog", "params":[{"tag":"steemit","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_blog", "params":[{"tag":"alice","limit":10}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_cashout

+

Returns a list of discussions by cashout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_cashout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_cashout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_children

+

Returns a list of discussions by children.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_children", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_children", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_comments

+

Returns a list of discussions by comments.

+
Query Parameters JSON
+
[
+  {
+    "start_author": "",
+    "start_permlink": "",
+    "limit": 100
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_comments", "params":[{"start_author":"steemit","start_permlink":"firstpost","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_comments", "params":[{"start_author":"alice","start_permlink":"a-post-by-alice","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_created

+

Returns a list of discussions by created.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_created", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_created", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_discussions_by_feed

+

Returns a list of discussions by feed.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "start_author": "",
+    "start_permlink": "",
+    "limit": 100
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_feed", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_feed", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_hot

+

Returns a list of discussions by hot.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_hot", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_hot", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF13
  • + + + +
+

condenser_api.get_discussions_by_promoted

+

Returns a list of discussions by promoted.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_promoted", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_promoted", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+ +

Returns a list of discussions by trending.

+ +
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+ +
[]
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_trending", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_trending", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_discussions_by_votes

+

Returns a list of discussions by votes.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_votes", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_discussions_by_votes", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_dynamic_global_properties

+

Returns the current dynamic global properties. See: Understanding Dynamic Global Properties

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "head_block_number": 0,
+  "head_block_id": "0000000000000000000000000000000000000000",
+  "time": "1970-01-01T00:00:00",
+  "current_witness": "",
+  "total_pow": "18446744073709551615",
+  "num_pow_witnesses": 0,
+  "virtual_supply": "0.000 STEEM",
+  "current_supply": "0.000 STEEM",
+  "confidential_supply": "0.000 STEEM",
+  "current_sbd_supply": "0.000 STEEM",
+  "confidential_sbd_supply": "0.000 STEEM",
+  "total_vesting_fund_steem": "0.000 STEEM",
+  "total_vesting_shares": "0.000 STEEM",
+  "total_reward_fund_steem": "0.000 STEEM",
+  "total_reward_shares2": "0",
+  "pending_rewarded_vesting_shares": "0.000 STEEM",
+  "pending_rewarded_vesting_steem": "0.000 STEEM",
+  "sbd_interest_rate": 0,
+  "sbd_print_rate": 10000,
+  "maximum_block_size": 0,
+  "current_aslot": 0,
+  "recent_slots_filled": "0",
+  "participation_count": 0,
+  "last_irreversible_block_num": 0,
+  "vote_power_reserve_rate": 40
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_escrow

+

Returns the escrow for a certain account by id.

+
Query Parameters JSON
+
["", 0]
+
+
Expected Response JSON
+
null
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_escrow", "params":["steemit", 1234], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

condenser_api.get_expiring_vesting_delegations

+

Returns the expiring vesting delegations for an account. Parameters: account:string, after:timestamp

+ + + + + + + + + + + + + + + + + + + + + +
account (string)after (timestamp) 
"steemit""2018-01-01T00:00:00"Queries for expiring vesting after January 1st, 2018.
"alice""2017-12-01T00:00:00"Queries for expiring vesting after December 1st, 2017.
+ +
Query Parameters JSON
+
["", "1970-01-01T00:00:00"]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "delegator": "",
+    "vesting_shares": "0.000000 VESTS",
+    "expiration": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_expiring_vesting_delegations", "params":["steemit","2018-01-01T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_expiring_vesting_delegations", "params":["alice","2017-12-01T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_feed

+

Returns a list of items in an account’s feed. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
"steemit"01Queries the account named steemit starting on the first item, up to 1 result.
"alice"110Queries the account named alice starting on the second item, up to 10 results.
+ +
Query Parameters JSON
+
["", 0, 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed", "params":["alice",1,10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_feed_entries

+

Returns a list of entries in an account’s feed. Parameters: account:string; start_entry_id:int; limit:int up to 500

+ + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start_entry_id (int)limit (int) 
"steemit"01Queries the account named steemit starting on the first item, up to 1 result.
"alice"110Queries the account named alice starting on the second item, up to 10 results.
+ +
Query Parameters JSON
+
["", 0, 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_entries", "params":["steemit",0,1], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_entries", "params":["alice",1,10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_feed_history

+

Returns the history of price feed values.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_median_history": {"base": "0.000 STEEM", "quote": "0.000 STEEM"},
+  "price_history": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_feed_history", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

condenser_api.get_follow_count

+

Returns the count of followers/following for an account. Parameters: account:string

+ + + + + + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the account named steemit.
"alice"Queries the account named alice.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "account": "",
+  "follower_count": 0,
+  "following_count": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_follow_count", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_follow_count", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

condenser_api.get_followers

+

Returns the list of followers for an account. Parameters: account:string; start:string (account to start from); type:string e.g.: blog; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (string)type (string)limit (int) 
"steemit"null"blog"10Queries for follows of the account named steemit, up to 10 results.
"alice"null"ignore"100Queries for mutes of the account named alice, up to 100 results.
+ +
Query Parameters JSON
+
["", "", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_followers", "params":["steemit",null,"blog",10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_followers", "params":["alice",null,"ignore",100], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

condenser_api.get_following

+

Returns the list of accounts that are following an account. Parameters: account:string; start:string (account to start from); type:string e.g.: blog; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)start (string)type (string)limit (int) 
"steemit"null"blog"10Queries for follows of the account named steemit, up to 10 results.
"alice"null"ignore"100Queries for mutes of the account named alice, up to 100 results.
+ +
Query Parameters JSON
+
["", "", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_following", "params":["steemit",null,"blog",10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_following", "params":["alice",null,"ignore",100], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_hardfork_version

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
"0.0.0"
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_hardfork_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF16
  • + + + +
+

condenser_api.get_key_references

+

Returns all accounts that have the key associated with their owner or active authorities.

+
Query Parameters JSON
+
[
+  [
+    "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH"
+  ]
+]
+
+
Expected Response JSON
+
[["steemit"]]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_key_references", "params":[["STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH"]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_market_history

+

Returns the market history for the internal SBD:STEEM market. Parameters: bucket_seconds:int; start:timestamp; end:timestamp

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bucket_seconds (int)start (timestamp)end (timestamp) 
15"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by 15 seconds.
60"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one minute.
300"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by five minutes.
3600"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one hour.
86400"2018-01-01T00:00:00""2018-01-02T00:00:00"Queries for market history between January 1st, 2018 and January 2nd, 2018, segmented by one day.
+ +
Query Parameters JSON
+
[0, "1970-01-01T00:00:00", "1970-01-01T00:00:00"]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "open": "1970-01-01T00:00:00",
+    "seconds": 0,
+    "steem": {
+      "high": 0,
+      "low": 0,
+      "open": 0,
+      "close": 0,
+      "volume": 0
+    },
+    "non_steem": {
+      "high": 0,
+      "low": 0,
+      "open": 0,
+      "close": 0,
+      "volume": 0
+    }
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[15,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[60,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[300,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[3600,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history", "params":[86400,"2018-01-01T00:00:00","2018-01-02T00:00:00"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_market_history_buckets

+

Returns the bucket seconds being tracked by the plugin.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[15, 60, 300, 3600, 86400]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_market_history_buckets", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_next_scheduled_hardfork

+

Returns the next scheduled hardfork.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "hf_version": "0.0.0",
+  "live_time": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_next_scheduled_hardfork", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_open_orders

+

Returns the open orders for an account. account:string

+
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_open_orders", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_open_orders", "params":["alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_ops_in_block

+

Returns all operations contained in a block. Parameters: block_num:int; only_virtual:boolean

+ + + + + + + + + + + + + + + + + + + + + +
block_num (int)only_virtual (boolean) 
1falseQueries the operations in block #1.
5443322trueQueries only the virtual operations in block #5,443,322.
+ +
Query Parameters JSON
+
[0, false]
+
+
Expected Response JSON
+
[
+  {
+    "trx_id": "0000000000000000000000000000000000000000",
+    "block": 0,
+    "trx_in_block": 0,
+    "op_in_trx": 0,
+    "virtual_op": 0,
+    "timestamp": "2016-10-01T06:31:24",
+    "op": [
+      "producer_reward",
+      {
+        "producer": "",
+        "vesting_shares": "0.000000 VESTS"
+      }
+    ]
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[1,false], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ops_in_block", "params":[5443322,true], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_order_book

+

Returns the internal market order book. Parameters: limit:int up to 500

+ + + + + + + + + + + + + + + + + + +
limit (int) 
10Queries up to 10 items in the order book.
500Queries up to 500 items in the order book.
+ +
Query Parameters JSON
+
[0]
+
+
Expected Response JSON
+
{"bids": [], "asks": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_order_book", "params":[10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_order_book", "params":[50], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_owner_history

+

Returns the owner history of an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the owner history for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_owner_history", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

condenser_api.get_post_discussions_by_payout

+

Returns a list of post discussions by payout.

+
Query Parameters JSON
+
[
+  {
+    "tag": "",
+    "limit": 0,
+    "filter_tags": [],
+    "select_authors": [],
+    "select_tags": [],
+    "truncate_body": 0
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_post_discussions_by_payout", "params":[{"tag":"steem","limit":1}], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_post_discussions_by_payout", "params":[{"tag":"photography","limit":10,"truncate_body":0}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_potential_signatures

+

This method will return the set of all public keys that could possibly sign for a given transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_potential_signatures", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_reblogged_by

+

Returns a list of authors that have reblogged a post. Parameters: author:string; permlink:string

+ + + + + + + + + + + + + + + + + + + + + +
author (string)permlink (string) 
"steemit""firstpost"Queries reblogs for content with a slug @steemit/firstpost
"alice""a-post-by-alice"Queries reblogs for content with a slug @alice/a-post-by-alice
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reblogged_by", "params":["steemit","firstpost"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reblogged_by", "params":["alice","a-post-by-alice"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_recent_trades

+

Returns the most recent trades for the internal SBD:STEEM market. Parameters: limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
limit (int) 
10Queries up to 10 latest trades.
500Queries up to 500 latest trades.
+ +
Query Parameters JSON
+
[1]
+
+
Expected Response JSON
+
[
+  {
+    "date": "1970-01-01T00:00:00",
+    "current_pays": "0.0 SBD",
+    "open_pays": "0.0 STEEM"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recent_trades", "params":[10], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recent_trades", "params":[500], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF11
  • + + + +
+

condenser_api.get_recovery_request

+

Returns the recovery request for an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the recovery requests for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
null
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_recovery_request", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_replies_by_last_update

+

Returns a list of replies by last update. start_parent_author:string, start_permlink:string, limit:int up to 100

+
Query Parameters JSON
+
["", "", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_replies_by_last_update", "params":["steemit","firstpost",1], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_required_signatures

+

This API will take a partially signed transaction and a set of public keys that the owner has the ability to sign for and return the minimal subset of public keys that should add signatures to the transaction. Parameters: trx:object; available_keys:[string]

+ +
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  []
+]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_required_signatures", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]},[]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

condenser_api.get_reward_fund

+

Returns information about the current reward funds.

+
Query Parameters JSON
+
["post"]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "name": "",
+  "reward_balance": "0.000 STEEM",
+  "recent_claims": "0",
+  "last_update": "1970-01-01T00:00:00",
+  "content_constant": "0",
+  "percent_curation_rewards": 0,
+  "percent_content_rewards": 0,
+  "author_reward_curve": "quadratic",
+  "curation_reward_curve": "34723648"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_reward_fund", "params":["post"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_savings_withdraw_from

+

Returns savings withdraw from an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the savings withdraw for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_savings_withdraw_from", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

condenser_api.get_savings_withdraw_to

+

Returns the savings withdraw to an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the savings withdraw for account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_savings_withdraw_to", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + +
  • Deprecated
  • + + +
+

condenser_api.get_state

+

Returns the state of a path. Deprecated. Parameters: path:string

+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "current_route": "",
+  "props": {
+    "head_block_number": 0,
+    "head_block_id": "0000000000000000000000000000000000000000",
+    "time": "1970-01-01T00:00:00",
+    "current_witness": "",
+    "total_pow": "18446744073709551615",
+    "num_pow_witnesses": 0,
+    "virtual_supply": "0.000 STEEM",
+    "current_supply": "0.000 STEEM",
+    "confidential_supply": "0.000 STEEM",
+    "current_sbd_supply": "0.000 STEEM",
+    "confidential_sbd_supply": "0.000 STEEM",
+    "total_vesting_fund_steem": "0.000 STEEM",
+    "total_vesting_shares": "0.000 STEEM",
+    "total_reward_fund_steem": "0.000 STEEM",
+    "total_reward_shares2": "0",
+    "pending_rewarded_vesting_shares": "0.000 STEEM",
+    "pending_rewarded_vesting_steem": "0.000 STEEM",
+    "sbd_interest_rate": 0,
+    "sbd_print_rate": 10000,
+    "maximum_block_size": 0,
+    "current_aslot": 0,
+    "recent_slots_filled": "0",
+    "participation_count": 0,
+    "last_irreversible_block_num": 0,
+    "vote_power_reserve_rate": 40,
+    "average_block_size": 0,
+    "current_reserve_ratio": 1,
+    "max_virtual_bandwidth": "0"
+  },
+  "tag_idx": {"trending": []},
+  "tags": {},
+  "content": {},
+  "accounts": {},
+  "witnesses": {},
+  "discussion_idx": {},
+  "witness_schedule": {
+    "id": 0,
+    "current_virtual_time": "0",
+    "next_shuffle_block_num": 1,
+    "current_shuffled_witnesses": [],
+    "num_scheduled_witnesses": 1,
+    "top19_weight": 1,
+    "timeshare_weight": 5,
+    "miner_weight": 1,
+    "witness_pay_normalization_factor": 25,
+    "median_props": {
+      "account_creation_fee": "0.000 STEEM",
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    },
+    "majority_version": "0.0.0",
+    "max_voted_witnesses": 19,
+    "max_miner_witnesses": 1,
+    "max_runner_witnesses": 1,
+    "hardfork_required_witnesses": 17
+  },
+  "feed_price": {"base": "0.000 STEEM", "quote": "0.000 STEEM"},
+  "error": ""
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_state", "params":["/@steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_tags_used_by_author

+

Returns a list of tags used by an author. Parameters: author:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries the tags used by the account named “steemit”.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_tags_used_by_author", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_ticker

+

Returns the market ticker for the internal SBD:STEEM market.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "latest": "0.00000000000000000",
+  "lowest_ask": "0.00000000000000000",
+  "highest_bid": "0.00000000000000000",
+  "percent_change": "0.00000000000000000",
+  "steem_volume": "0.000 STEEM",
+  "sbd_volume": "0.000 STEEM"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_ticker", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_trade_history

+

Returns the trade history for the internal SBD:STEEM market. Parameters: start:timestamp; end:timestamp; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
start (timestamp)end (timestamp)limit (int) 
"2018-01-01T00:00:00""2018-01-02T00:00:00"10Queries up to 10 trades between January 1st, 2018 and January 2nd, 2018.
+ +
Query Parameters JSON
+
[
+  "1970-01-01T00:00:00",
+  "1970-01-01T00:00:00",
+  1000
+]
+
+
Expected Response JSON
+
[
+  {
+    "date": "1970-01-01T00:00:00",
+    "current_pays": "0.000 SBD",
+    "open_pays": "0.000 STEEM"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trade_history", "params":["2018-01-01T00:00:00","2018-01-02T00:00:00",10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_transaction

+

Returns the details of a transaction based on a transaction id. Parameters: trx_id:string

+ + + + + + + + + + + + + + +
trx_id (string) 
"6fde0190a97835ea6d9e651293e90c89911f933c"Queries for this exact transaction id.
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "ref_block_num": 0,
+  "ref_block_prefix": 0,
+  "expiration": "1970-01-01T00:00:00",
+  "operations": [],
+  "extensions": [],
+  "signatures": [],
+  "transaction_id": "0000000000000000000000000000000000000000",
+  "block_num": 0,
+  "transaction_num": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_transaction", "params":["6fde0190a97835ea6d9e651293e90c89911f933c"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_transaction_hex

+

Returns a hexdump of the serialized binary form of a transaction.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
""
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_transaction_hex", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+ +

Returns the list of trending tags. Parameter: start_tag:string; limit:int up to 100

+ + + + + + + + + + + + + + + + + + + + + +
tag (string)limit (int) 
null100Queries the top 100 trending tags.
"steem"10Queries the tags after “steem”, up to 10 tags.
+ + +
["", 1]
+
+ +
[
+  {
+    "name": "",
+    "total_payouts": "0.000 SBD",
+    "net_votes": 0,
+    "top_posts": 0,
+    "comments": 0,
+    "trending": ""
+  }
+]
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trending_tags", "params":[null,100], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_trending_tags", "params":["steem",10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_version

+

Returns the versions of blockchain, steem, and FC.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "blockchain_version": "",
+  "steem_revision": "",
+  "fc_revision": ""
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

condenser_api.get_vesting_delegations

+

Returns the vesting delegations by an account. Parameters: delegator_account:string; start_account:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + +
delegator_account (string)start_account (string)limit (int) 
"steemit"null10Queries up to 10 vesting delegations by “steemit”.
+ +
Query Parameters JSON
+
["", "", 1]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "delegator": "",
+    "delegatee": "",
+    "vesting_shares": "0.000000 VESTS",
+    "min_delegation_time": "1970-01-01T00:00:00"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_vesting_delegations", "params":["steemit",null,10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_volume

+

Returns the market volume for the past 24 hours.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "steem_volume": "0.000 STEEM",
+  "sbd_volume": "0.000 STEEM"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_volume", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_withdraw_routes

+

Returns the withdraw routes for an account. Parameters: account:string; type:string

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
account (string)type (string) 
"steemit""outgoing"Queries outgoing withdraw routes by “steemit”.
"steemit""incoming"Queries incoming withdraw routes by “steemit”.
"steemit""all"Queries all withdraw routes by “steemit”.
+ +
Query Parameters JSON
+
["", ""]
+
+
Expected Response JSON
+
[
+  {
+    "id": 0,
+    "from_account": "",
+    "to_account": "",
+    "percent": 0,
+    "auto_vest": false
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","outgoing"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","incoming"], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_withdraw_routes", "params":["steemit","all"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_witness_by_account

+

Returns the witness of an account. Parameters: account:string

+ + + + + + + + + + + + + + +
account (string) 
"steemit"Queries witness account of “steemit” (of null if none exists).
+ +
Query Parameters JSON
+
[""]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "owner": "",
+  "created": "1970-01-01T00:00:00",
+  "url": "",
+  "votes": "0",
+  "virtual_last_update": "0",
+  "virtual_position": "0",
+  "virtual_scheduled_time": "0",
+  "total_missed": 0,
+  "last_aslot": 0,
+  "last_confirmed_block_num": 0,
+  "pow_worker": 0,
+  "signing_key": "",
+  "props": {
+    "account_creation_fee": "0.000 STEEM",
+    "maximum_block_size": 65536,
+    "sbd_interest_rate": 0
+  },
+  "sbd_exchange_rate": {"base": "0.000 SBD", "quote": "0.000 STEEM"},
+  "last_sbd_exchange_update": "1970-01-01T00:00:00",
+  "last_work": "",
+  "running_version": "",
+  "hardfork_version_vote": "",
+  "hardfork_time_vote": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_by_account", "params":["steemit"], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_witness_count

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
0
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_count", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_witness_schedule

+

Returns the current witness schedule.

+
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 1,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 1,
+  "top19_weight": 1,
+  "timeshare_weight": 5,
+  "miner_weight": 1,
+  "witness_pay_normalization_factor": 25,
+  "median_props": {
+    "account_creation_fee": "0.000 STEEM",
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 19,
+  "max_miner_witnesses": 1,
+  "max_runner_witnesses": 1,
+  "hardfork_required_witnesses": 17
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witness_schedule", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_witnesses

+

Returns current witnesses.

+
Query Parameters JSON
+
[[0]]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses", "params":[[28]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_witnesses_by_vote

+

Returns current witnesses by vote. Parameters: start_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + + + + + + +
account (string)limit (int) 
null21Queries top 21 witness votes.
"a"1Queries top 10 witness votes starting with “a”.
+ +
Query Parameters JSON
+
["", 1000]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses_by_vote", "params":[null, 21], "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_witnesses_by_vote", "params":["a", 1], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.lookup_account_names

+

Looks up account names. accounts:[string]

+
Query Parameters JSON
+
[["steemit"]]
+
+
Expected Response JSON
+
[
+  {
+    "id": 28,
+    "name": "steemit",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5tfrdPG1Ycjwa9FuBUueDFFyygndBLXdVEEs2c9eRKScnFk6vM",
+          1
+        ],
+        [
+          "STM71f6yWztimJuREVyyMXNqAVbx1FzPVW6LLXNoQ35dHwKuszmHX",
+          1
+        ],
+        [
+          "STM7U3ymhUTuKME72dpdpQkdQvh722gTLjKBKtmKQPPWgtkr418Nf",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5832HKCJzs6K3rRCsZ1PidTKgjF38ZJb718Y3pCW92HEMsCGPf",
+          1
+        ],
+        [
+          "STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH",
+          1
+        ],
+        [
+          "STM7xVFaqi8RxhWKZwuLA2bKrAiQmhnrbgvw4e2ChAsKYQbPjqUq2",
+          1
+        ],
+        [
+          "STM83dmDkQcZU9X8MWcxsTztSyutE6udrb55PvYgu7RLzStaoAt67",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM5jZtLoV8YbxCxr4imnbWn61zMB24wwonpnVhfXRmv7j6fk3dTH",
+    "json_metadata": "",
+    "proxy": "",
+    "last_owner_update": "2017-03-16T21:17:51",
+    "last_account_update": "2017-03-16T23:10:36",
+    "created": "2016-03-24T17:00:21",
+    "mined": true,
+    "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_power": 9950,
+    "last_vote_time": "2016-12-04T23:10:57",
+    "balance": "0.006 STEEM",
+    "savings_balance": "11006644.632 STEEM",
+    "sbd_balance": "8581.890 SBD",
+    "sbd_seconds": "18846158467785",
+    "sbd_seconds_last_update": "2018-04-10T04:08:36",
+    "sbd_last_interest_payment": "2018-03-15T17:58:24",
+    "savings_sbd_balance": "0.000 SBD",
+    "savings_sbd_seconds": "0",
+    "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
+    "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
+    "savings_withdraw_requests": 0,
+    "reward_sbd_balance": "0.000 SBD",
+    "reward_steem_balance": "0.000 STEEM",
+    "reward_vesting_balance": "0.000000 VESTS",
+    "reward_vesting_steem": "0.000 STEEM",
+    "vesting_shares": "90039851836.689703 VESTS",
+    "delegated_vesting_shares": "0.000000 VESTS",
+    "received_vesting_shares": "0.000000 VESTS",
+    "vesting_withdraw_rate": "0.000000 VESTS",
+    "next_vesting_withdrawal": "1969-12-31T23:59:59",
+    "withdrawn": 0,
+    "to_withdraw": 0,
+    "withdraw_routes": 0,
+    "curation_rewards": 0,
+    "posting_rewards": 3548,
+    "proxied_vsf_votes": ["28583799126", 0, 0, 0],
+    "witnesses_voted_for": 0,
+    "last_post": "2016-03-30T18:30:18",
+    "last_root_post": "2016-03-30T18:30:18"
+  }
+]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_account_names", "params":[["steemit"]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.lookup_accounts

+

Looks up accounts starting with name. Parameterslower_bound_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + +
lower_bound_name (string)limit (int) 
"a"10Queries up to 10 accounts that start with “a”.
+ +
Query Parameters JSON
+
["", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_accounts", "params":["a",10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.lookup_witness_accounts

+

Looks up witness accounts starting with name. Parameters: lower_bound_name:string; limit:int up to 1000

+ + + + + + + + + + + + + + + + +
lower_bound_name (string)limit (int) 
"a"10Queries up to 10 witnesses that start with “a”.
+ +
Query Parameters JSON
+
["", 1]
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.lookup_witness_accounts", "params":["a",10], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
  • Disabled
  • + +
+

condenser_api.verify_account_authority

+

Not Implemented

+ +
Query Parameters JSON
+
["", [""]]
+
+
Expected Response JSON
+
false
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.verify_account_authority", "params":["steemit",["STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU"]], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.verify_authority

+

Returns true if the transaction has all of the required signatures.

+
Query Parameters JSON
+
[
+  {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+]
+
+
Expected Response JSON
+
false
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.verify_authority", "params":[{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[["pow",{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}]],"extensions":[],"signatures":[]}], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

condenser_api.get_account_references

+ +
Query Parameters JSON
+
[]
+
+
Expected Response JSON
+
[]
+
+ +
+ + +
+ +
+

+ + Broadcast Ops Comment + + +

+ + + +

This is a brief overview of the parameters allowed and values passed by the ‘comment’ operation

+ +

Additional info for API definitions is available on the dev portal

+ +

Purpose:

+ +

A broadcast operation on Steem is a way of expressing intention on the blockchain. +They have types, like comment in this instance, and they parameters (like author) depending on what their intended use is +In other words, the broadcast.comment operation creates a post or a comment on a current post, on the steem blockchain.

+ +

Rules:

+
    +
  • The “title” must not be longer than 256 bytes
  • +
  • The “title” must be UTF-8
  • +
  • The “body” must be larger than 0 bytes
  • +
  • The “body” much also be UTF-8
  • +
+ +

Parameters:

+
    +
  • parent_author - the author that comment is being submitted to, when posting a new blog this is an empty string
  • +
  • parent_permlink - specific post that comment is being submitted to, when posting a new blog this is an empty string
  • +
  • author - author of the post/comment being submitted (account name)
  • +
  • permlink - unique string identifier for the post, linked to the author of the post
  • +
  • title - human readable title of the post being submitted, this is often blank when commenting
  • +
  • body - body of the post/comment being submitted, or diff-match-patch when updating
  • +
  • json_metadata - JSON object string
  • +
+ +

Additional Parameter Definitions:

+
    +
  • permlink: + Two authors may have the same permlink as it’s unique to the author only. For example, there could be two authors, alice and bob, and both could have a permlink of firstpost
  • +
  • json_metadata: +There is no blockchain enforced validation on json_metadata, but the community has adopted a particular structure.
  • +
  • It should contain a JSON object with the following keys: +
      +
    • tags - An array of up to 5 strings. Although the blockchain will accept more than 5, the tags plugin only looks at the first five
    • +
    • app - A user agent style application identifier. Typically app_name.version, e.g. steemit/0.1
    • +
    • format - The format of the body, e.g. markdown
    • +
    • In addition to the above keys, application developrs are free to add any other keys they want to help manage the content they broadcast.
    • +
    +
  • +
+ +

A typical comment operation would look similar to the below:

+ +
  const post = {
+    author :"Joe",
+    title :"A post by Joe",
+    body :"Look at my awesome post",
+    parent_author :'',
+    parent_permlink :"steem",
+    permlink :"a-post-by-joe",
+    json_metadata :"{\"tags\":[\"steemit\",\"example\",\"tags\"]}",
+  };
+
+

In which case the complete broadcast operation would look like this:

+ +
  broadcast.comment(post, privatePostingKey)
+
+

With privatePostingKey being the private posting key of the author broadcasting the comment or post

+ +

Create_vs_Update:

+ +

When a comment is first broadcast, the permlink must be unique for the author. + Otherwise, it is interpreted as an update operation. Updating will either replace the entire body with the latest operation or patch the body if using diff-match-patch.

+ +

For example, if we have a paragraph that has already been broadcast:

+ +

“It’s been quite a lot of fun working with these wonderful folk at Steemit, Inc”

+ +

And we want to change it to:

+ +

“It’s been quite a lot of fun working with these wonderful people at Steemit, Inc”

+ +

We can broadcast the comment operation with the following body:

+
    +
  • ”@@ -406,12 +406,14 @@”
  • +
  • ful
  • +
  • -folk
  • +
  • +people
  • +
  • at
  • +
+ +

The blockchain will know that this means we have changed the word ‘folk’ to ‘people’ within that paragraph so when fetching this content, this diff will be applied.

+ +

In addition to body, the title and json_metadata fields will also be replaced by the latest operation.

+ +

Comment_Options: LINK

+ +

Updating_Archived_Content:

+ +

Content that is older than 7 days is considered “archived” and cannot be edited unless the author indicates otherwise by broadcasting a custom_json to the witness plugin using their active authority.

+ +

As of HF18, the witness plugin has a custom operation called enable_content_editing that allows a user to signal they want to edit their content. By consensus, content is editable indefinitely, but is soft forked to be frozen after payout. This operation requires an active key and is designed to prevent vandalism if a posting key is compromised.

+ +

For ‘custom_json’: LINK

+ +

Vote: LINK

+ +

It should also be noted that a vote operation can accompany a comment in the same transaction when the author self_upvotes

+ + +
+ + + + + +
+

+ + Database Api + + +

+ + + +

Used to query information about accounts, transactions, and blockchain data. These AppBase API methods are still under development and subject to change.

+ +
    + +
  • Since: HF11
  • + + + +
+

database_api.find_account_recovery_requests

+

Returns a list of account recovery requests.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + + + +
+

database_api.find_accounts

+

Search for accounts.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
+ +
    + +
  • Since: HF11
  • + + + +
+

database_api.find_change_recovery_account_requests

+

Returns a list of requests to change the recovery account.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + + + +
+

database_api.find_comments

+

Search for comments.

+
Query Parameters JSON
+
{"comments": []}
+
+
Expected Response JSON
+
{"comments": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.find_decline_voting_rights_requests

+

Returns a list of requests to decline voting rights.

+
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.find_escrows

+

Returns a list of escrows.

+
Query Parameters JSON
+
{"from": ""}
+
+
Expected Response JSON
+
{"escrows": []}
+
+ +
+ +
    + + + +
+

database_api.find_limit_orders

+

Returns a list of limit orders.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"orders": []}
+
+ +
+ +
    + + + +
+

database_api.find_owner_histories

+

Returns owner authority history.

+
Query Parameters JSON
+
{"owner": ""}
+
+
Expected Response JSON
+
{"owner_auths": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.find_savings_withdrawals

+

Returns the list of savings withdrawls for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"withdrawals": []}
+
+ +
+ +
    + + + +
+

database_api.find_sbd_conversion_requests

+

Returns the list of SBD conversion requests for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

database_api.find_vesting_delegation_expirations

+

Returns the expirations for vesting delegations.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

database_api.find_vesting_delegations

+

Returns the list of vesting delegations for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ +
    + + + +
+

database_api.find_votes

+

Returns the votes for an author and permlink.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ +
    + + + +
+

database_api.find_withdraw_vesting_routes

+

Returns the list of vesting withdraw routes for an account.

+
Query Parameters JSON
+
{"account": "", "order": "by_name"}
+
+
Expected Response JSON
+
{"routes": []}
+
+ +
+ +
    + + + +
+

database_api.find_witnesses

+

Search for witnesses.

+
Query Parameters JSON
+
{"owners": []}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
+ +
    + + + +
+

database_api.get_active_witnesses

+

Returns the list of active witnesses.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_active_witnesses", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_config

+

Returns information about compile-time constants. Some properties may not be present. See: Understanding Configuration Values

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_config", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_current_price_feed

+

Returns the current price feed.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "base": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "quote": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  }
+}
+
+ +
+ +
    + + + +
+

database_api.get_dynamic_global_properties

+

Returns the current dynamic global properties. See: Understanding Dynamic Global Properties

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "head_block_number": 0,
+  "head_block_id": "0000000000000000000000000000000000000000",
+  "time": "1970-01-01T00:00:00",
+  "current_witness": "",
+  "total_pow": "18446744073709551615",
+  "num_pow_witnesses": 0,
+  "virtual_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "current_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "confidential_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "current_sbd_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "confidential_sbd_supply": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "total_vesting_fund_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_vesting_shares": {
+    "amount": "0",
+    "precision": 6,
+    "nai": "@@000000037"
+  },
+  "total_reward_fund_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_reward_shares2": "0",
+  "pending_rewarded_vesting_shares": {
+    "amount": "0",
+    "precision": 6,
+    "nai": "@@000000037"
+  },
+  "pending_rewarded_vesting_steem": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_interest_rate": 0,
+  "sbd_print_rate": 10000,
+  "maximum_block_size": 0,
+  "current_aslot": 0,
+  "recent_slots_filled": "0",
+  "participation_count": 0,
+  "last_irreversible_block_num": 0,
+  "vote_power_reserve_rate": 40,
+  "delegation_return_period": 604800,
+  "reverse_auction_seconds": 0,
+  "available_account_subsidies": 0,
+  "sbd_stop_percent": 0,
+  "sbd_start_percent": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_dynamic_global_properties", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_feed_history

+

Returns the history of price feed values.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_median_history": {
+    "base": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "quote": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  },
+  "price_history": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_feed_history", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_hardfork_properties

+

Returns the current properties about the blockchain’s hardforks.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "processed_hardforks": [],
+  "last_hardfork": 0,
+  "current_hardfork_version": "0.0.0",
+  "next_hardfork": "0.0.0",
+  "next_hardfork_time": "1970-01-01T00:00:00"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_hardfork_properties", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_order_book

+

Returns the order book.

+
Query Parameters JSON
+
{"limit": 0}
+
+
Expected Response JSON
+
{"asks": [], "bids": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_order_book", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_order_book", "params":{"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_potential_signatures

+

This method will return the set of all public keys that could possibly sign for a given transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"keys": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_potential_signatures", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_required_signatures

+

This API will take a partially signed transaction and a set of public keys that the owner has the ability to sign for and return the minimal subset of public keys that should add signatures to the transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  "available_keys": []
+}
+
+
Expected Response JSON
+
{"keys": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_required_signatures", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]},"available_keys":[]}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

database_api.get_reward_funds

+

Returns information about the current reward funds.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"funds": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_reward_funds", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_transaction_hex

+

Returns a hexdump of the serialized binary form of a transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"hex": ""}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_transaction_hex", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF20
  • + + + +
+

database_api.get_version

+

Returns the compile time versions of blockchain, steem, FC. Also returns the boot time version of the chain id (may be different from compile time value only when looking at a testnet)

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "blockchain_version": "",
+  "steem_revision": "",
+  "fc_revision": "",
+  "chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_version", "params":[], "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.get_witness_schedule

+

Returns the current witness schedule.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 76479392,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 0,
+  "elected_weight": 132,
+  "timeshare_weight": 86,
+  "miner_weight": 125,
+  "witness_pay_normalization_factor": 32767,
+  "median_props": {
+    "account_creation_fee": {
+      "amount": "1",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000,
+    "account_subsidy_budget": 797,
+    "account_subsidy_decay": 347321
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 0,
+  "max_miner_witnesses": 0,
+  "max_runner_witnesses": 0,
+  "hardfork_required_witnesses": 0,
+  "account_subsidy_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "account_subsidy_witness_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "min_witness_account_subsidy_decay": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.get_witness_schedule", "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF11
  • + + + +
+

database_api.list_account_recovery_requests

+

Returns a list of account recovery requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + + + +
+

database_api.list_accounts

+

Returns a list of accounts.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
+ +
    + +
  • Since: HF11
  • + + + +
+

database_api.list_change_recovery_account_requests

+

Returns a list of recovery account change requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + + + +
+

database_api.list_comments

+

Returns a list of comments.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"comments": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.list_decline_voting_rights_requests

+

Returns a list of decline voting rights requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.list_escrows

+

Returns a list of escrows.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"escrows": []}
+
+ +
+ +
    + + + +
+

database_api.list_limit_orders

+

Returns a list of limit orders.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"orders": []}
+
+ +
+ +
    + + + +
+

database_api.list_owner_histories

+

Returns a list of owner authority histories.

+
Query Parameters JSON
+
{"start": null, "limit": 0}
+
+
Expected Response JSON
+
{"owner_auths": []}
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

database_api.list_savings_withdrawals

+

Returns a list of savings withdrawls.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"withdrawals": []}
+
+ +
+ +
    + + + +
+

database_api.list_sbd_conversion_requests

+

Returns a list of SBD conversion requests.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"requests": []}
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

database_api.list_vesting_delegation_expirations

+

Returns a list of vesting delegation expirations.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

database_api.list_vesting_delegations

+

Returns a list of vesting delegations.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"delegations": []}
+
+ +
+ +
    + + + +
+

database_api.list_votes

+

Returns a list of votes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ +
    + + + +
+

database_api.list_withdraw_vesting_routes

+

Returns a list of vesting withdraw routes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"routes": []}
+
+ +
+ +
    + + + +
+

database_api.list_witness_votes

+

Returns a list of witness votes.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
+ +
    + + + +
+

database_api.list_witnesses

+

Returns the list of witnesses.

+
Query Parameters JSON
+
{"start": null, "limit": 0, "order": "by_name"}
+
+
Expected Response JSON
+
{"witnesses": []}
+
+ +
+ +
    + + + +
  • Disabled
  • + +
+

database_api.verify_account_authority

+

Not Implemented

+ +
Query Parameters JSON
+
{"account": "", "signers": []}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.verify_account_authority", "params":{"account":"steemit","signers":["STM7Q2rLBqzPzFeteQZewv9Lu3NLE69fZoLeL6YK59t7UmssCBNTU"]}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.verify_authority

+

Returns true if the transaction has all of the required signatures.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  }
+}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"database_api.verify_authority", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

database_api.verify_signatures

+

This is a general purpose API that checks signatures against accounts for an arbitrary sha256 hash using the existing authority structures.

+
Query Parameters JSON
+
{
+  "hash": "0000000000000000000000000000000000000000000000000000000000000000",
+  "signatures": [],
+  "required_owner": [],
+  "required_active": [],
+  "required_posting": [],
+  "required_other": []
+}
+
+
Expected Response JSON
+
{"valid": false}
+
+ +
+ + +
+ +
+

+ + Follow Api + + +

+ + + +

Used to lookup information related to reputation and account follow operations. These AppBase API methods are still under development and subject to change.

+ +
    + +
  • Since: HF13
  • + + + +
+

follow_api.get_account_reputations

+

Returns a list of account reputations.

+
Query Parameters JSON
+
{"account_lower_bound": "", "limit": 1000}
+
+
Expected Response JSON
+
{"reputations": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_account_reputations", "params":{"account_lower_bound":"steemit", "limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_account_reputations", "params":{"account_lower_bound":"a", "limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

follow_api.get_blog

+

Returns the list of blog entries for an account.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"blog": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog", "params":{"account":"alice","start_entry_id":0,"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

follow_api.get_blog_authors

+

Returns a list of authors that have had their content reblogged on a given blog account.

+
Query Parameters JSON
+
{"blog_account": ""}
+
+
Expected Response JSON
+
{"blog_authors": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_authors", "params":{"blog_account":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_authors", "params":{"blog_account":"alice"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

follow_api.get_blog_entries

+

Returns a list of blog entries for an account.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"blog": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_entries", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_blog_entries", "params":{"account":"alice","start_entry_id":0,"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

follow_api.get_feed

+

Returns a list of items in an account’s feed.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"feed": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed", "params":{"account":"alice","start_entry_id":1,"limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

follow_api.get_feed_entries

+

Returns a list of entries in an account’s feed.

+
Query Parameters JSON
+
{"account": "", "start_entry_id": 0, "limit": 500}
+
+
Expected Response JSON
+
{"feed": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed_entries", "params":{"account":"steemit","start_entry_id":0,"limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_feed_entries", "params":{"account":"alice","start_entry_id":1,"limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

follow_api.get_follow_count

+

Returns the count of followers for an account.

+
Query Parameters JSON
+
{"account": ""}
+
+
Expected Response JSON
+
{
+  "account": "",
+  "follower_count": 0,
+  "following_count": 0
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_follow_count", "params":{"account":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_follow_count", "params":{"account":"alice"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

follow_api.get_followers

+

Returns the list of followers for an account.

+
Query Parameters JSON
+
{
+  "account": "",
+  "start": "",
+  "type": "undefined",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"followers": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_followers", "params":{"account":"steemit","start":null,"type":"blog","limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_followers", "params":{"account":"alice","start":null,"type":"ignore","limit":100}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF9
  • + + + +
+

follow_api.get_following

+

Returns the list of accounts that are following an account.

+
Query Parameters JSON
+
{
+  "account": "",
+  "start": "",
+  "type": "undefined",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"following": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_following", "params":{"account":"steemit","start":null,"type":"blog","limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_following", "params":{"account":"alice","start":null,"type":"ignore","limit":100}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

follow_api.get_reblogged_by

+

Returns a list of authors that have reblogged a post.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"accounts": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_reblogged_by", "params":{"author":"steemit","permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"follow_api.get_reblogged_by", "params":{"author":"alice","permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Jsonrpc + + +

+ + + +

Used to lookup information about the JSON RPC API. These AppBase API methods are still under development and subject to change.

+ +
    + + + +
+

jsonrpc.get_methods

+

Returns a list of methods supported by the JSON RPC API.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_methods", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

jsonrpc.get_signature

+

Returns the signature information for a JSON RPC method including the arguments and expected response JSON.

+
Query Parameters JSON
+
{"method": ""}
+
+
Expected Response JSON
+
{"args": null, "ret": null}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"jsonrpc.get_methods"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"jsonrpc.get_signature"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"condenser_api.get_dynamic_global_properties"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"database_api.get_dynamic_global_properties"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Market History Api + + +

+ + + +

Used to lookup market history information. These AppBase API methods are still under development and subject to change.

+ +
    + + + +
+

market_history_api.get_market_history

+

Returns the market history for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{
+  "bucket_seconds": 0,
+  "start": "1970-01-01T00:00:00",
+  "end": "1970-01-01T00:00:00"
+}
+
+
Expected Response JSON
+
{"buckets": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":15,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":60,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":300,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":3600,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":86400,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_market_history_buckets

+

Returns the bucket seconds being tracked by the plugin.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"bucket_sizes": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history_buckets", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_order_book

+

Returns the internal market order book.

+
Query Parameters JSON
+
{"limit": 500}
+
+
Expected Response JSON
+
{"bids": [], "asks": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_order_book", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_order_book", "params":{"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_recent_trades

+

Returns the most recent trades for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{"limit": 1000}
+
+
Expected Response JSON
+
{"trades": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_recent_trades", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_recent_trades", "params":{"limit":500}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_ticker

+

Returns the market ticker for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "latest": "0.00000000000000000",
+  "lowest_ask": "0.00000000000000000",
+  "highest_bid": "0.00000000000000000",
+  "percent_change": "0.00000000000000000",
+  "steem_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_ticker", "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_trade_history

+

Returns the trade history for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{
+  "start": "1970-01-01T00:00:00",
+  "end": "1970-01-01T00:00:00",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"trades": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_trade_history", "params":{"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

market_history_api.get_volume

+

Returns the market volume for the past 24 hours.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "steem_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_volume", "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Network Broadcast Api + + +

+ + + +

Used to broadcast transactions and blocks. These AppBase API methods are +still under development and subject to change.

+ +

Also see: Blockchain Ops

+ +
    + + + +
+

network_broadcast_api.broadcast_block

+

Used to broadcast a block.

+
Query Parameters JSON
+
{
+  "block": {
+    "previous": "0000000000000000000000000000000000000000",
+    "timestamp": "1970-01-01T00:00:00",
+    "witness": "",
+    "transaction_merkle_root": "0000000000000000000000000000000000000000",
+    "extensions": [],
+    "witness_signature": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+    "transactions": []
+  }
+}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_block", "params":{"block":{"previous":"0000000000000000000000000000000000000000","timestamp":"1970-01-01T00:00:00","witness":"","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactions":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

network_broadcast_api.broadcast_transaction

+

Used to broadcast a transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  "max_block_age": -1
+}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_transaction", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"vote_operation","value":{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}}],"extensions":[],"signatures":[]},"max_block_age":50}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_transaction", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]},"max_block_age":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Rc Api + + +

+ + + +

Allows querying of various Resource Credit metrics. See: RC Bandwidth System, 0.20.2 Release Notes, Developer Guide: Resource Credit System

+ +
    + +
  • Since: HF20
  • + + + +
+

rc_api.find_rc_accounts

+

Returns the available resource credits of accounts. Parameters: accounts:string array

+ + + + + + + + + + + + + + + + + + +
accounts (string) 
"steemit"Query the available resource credits for the account named “steemit”.
"alice"Query the available resource credits for the accounts named “alice” and “bob”.
+ +
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{
+  "rc_accounts": [
+    {
+      "account": "",
+      "rc_manabar": {"current_mana": "0", "last_update_time": 0},
+      "max_rc_creation_adjustment": {
+        "amount": "0",
+        "precision": 6,
+        "nai": "@@000000037"
+      },
+      "max_rc": "0"
+    }
+  ]
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.find_rc_accounts", "params":{"accounts":["steemit"]}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.find_rc_accounts", "params":{"accounts":["alice","bob"]}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF20
  • + + + +
+

rc_api.get_resource_params

+

Work in progress. See: #2980

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "resource_names": [
+    "resource_history_bytes",
+    "resource_new_accounts",
+    "resource_market_bytes",
+    "resource_state_bytes",
+    "resource_execution_time"
+  ],
+  "resource_params": {
+    "resource_history_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 347222,
+        "pool_eq": "216404314004",
+        "max_pool_size": "432808628007",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": 1690658703,
+        "shift": 49
+      }
+    },
+    "resource_new_accounts": {
+      "resource_dynamics_params": {
+        "resource_unit": 10000,
+        "budget_per_time_unit": 797,
+        "pool_eq": 157691079,
+        "max_pool_size": 157691079,
+        "decay_params": {
+          "decay_per_time_unit": 347321,
+          "decay_per_time_unit_denom_shift": 36
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "16484671763857882971",
+        "coeff_b": 1231961,
+        "shift": 51
+      }
+    },
+    "resource_market_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 10,
+        "budget_per_time_unit": 578704,
+        "pool_eq": "16030041350",
+        "max_pool_size": "32060082699",
+        "decay_params": {
+          "decay_per_time_unit": 2540365427,
+          "decay_per_time_unit_denom_shift": 46
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "9231393461629499392",
+        "coeff_b": 125234698,
+        "shift": 53
+      }
+    },
+    "resource_state_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 231481481,
+        "pool_eq": "144269542669147",
+        "max_pool_size": "288539085338293",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": "1127105802103",
+        "shift": 49
+      }
+    },
+    "resource_execution_time": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 82191781,
+        "pool_eq": "51225569123068",
+        "max_pool_size": "102451138246135",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": "400199758774",
+        "shift": 49
+      }
+    }
+  },
+  "size_info": {
+    "resource_state_bytes": {
+      "authority_base_size": 40000,
+      "authority_account_member_size": 180000,
+      "authority_key_member_size": 350000,
+      "account_object_base_size": 4800000,
+      "account_authority_object_base_size": 400000,
+      "account_recovery_request_object_base_size": 320000,
+      "comment_object_base_size": 2010000,
+      "comment_object_permlink_char_size": 10000,
+      "comment_object_parent_permlink_char_size": 20000,
+      "comment_object_beneficiaries_member_size": 180000,
+      "comment_vote_object_base_size": 470000,
+      "convert_request_object_base_size": 480000,
+      "decline_voting_rights_request_object_base_size": 280000,
+      "escrow_object_base_size": 1190000,
+      "limit_order_object_base_size": 147440,
+      "savings_withdraw_object_byte_size": 14656,
+      "transaction_object_base_size": 6090,
+      "transaction_object_byte_size": 174,
+      "vesting_delegation_object_base_size": 600000,
+      "vesting_delegation_expiration_object_base_size": 440000,
+      "withdraw_vesting_route_object_base_size": 430000,
+      "witness_object_base_size": 2660000,
+      "witness_object_url_char_size": 10000,
+      "witness_vote_object_base_size": 400000,
+      "STATE_BYTES_SCALE": 10000
+    },
+    "resource_execution_time": {
+      "account_create_operation_exec_time": 57700,
+      "account_create_with_delegation_operation_exec_time": 57700,
+      "account_update_operation_exec_time": 14000,
+      "account_witness_proxy_operation_exec_time": 117000,
+      "account_witness_vote_operation_exec_time": 23000,
+      "cancel_transfer_from_savings_operation_exec_time": 11500,
+      "change_recovery_account_operation_exec_time": 12000,
+      "claim_account_operation_exec_time": 10000,
+      "claim_reward_balance_operation_exec_time": 50300,
+      "comment_operation_exec_time": 114100,
+      "comment_options_operation_exec_time": 13200,
+      "convert_operation_exec_time": 15700,
+      "create_claimed_account_operation_exec_time": 57700,
+      "custom_operation_exec_time": 228000,
+      "custom_json_operation_exec_time": 228000,
+      "custom_binary_operation_exec_time": 228000,
+      "decline_voting_rights_operation_exec_time": 5300,
+      "delegate_vesting_shares_operation_exec_time": 19900,
+      "delete_comment_operation_exec_time": 51100,
+      "escrow_approve_operation_exec_time": 9900,
+      "escrow_dispute_operation_exec_time": 11500,
+      "escrow_release_operation_exec_time": 17200,
+      "escrow_transfer_operation_exec_time": 19100,
+      "feed_publish_operation_exec_time": 6200,
+      "limit_order_cancel_operation_exec_time": 9600,
+      "limit_order_create_operation_exec_time": 31700,
+      "limit_order_create2_operation_exec_time": 31700,
+      "request_account_recovery_operation_exec_time": 54400,
+      "set_withdraw_vesting_route_operation_exec_time": 17900,
+      "transfer_from_savings_operation_exec_time": 17500,
+      "transfer_operation_exec_time": 9600,
+      "transfer_to_savings_operation_exec_time": 6400,
+      "transfer_to_vesting_operation_exec_time": 44400,
+      "vote_operation_exec_time": 26500,
+      "withdraw_vesting_operation_exec_time": 10400,
+      "witness_set_properties_operation_exec_time": 9500,
+      "witness_update_operation_exec_time": 9500
+    }
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.get_resource_params", "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF20
  • + + + +
+

rc_api.get_resource_pool

+

Work in progress. See: #2563, PR#2678

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "resource_pool": {
+    "resource_history_bytes": {"pool": "200825644923"},
+    "resource_new_accounts": {"pool": 37393465},
+    "resource_market_bytes": {"pool": "15915722826"},
+    "resource_state_bytes": {"pool": "132151641791507"},
+    "resource_execution_time": {"pool": "47739958648192"}
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.get_resource_pool", "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Tags Api + + +

+ + + +

Used to lookup information about tags, posts, and discussions. These AppBase API methods are still under development and subject to change.

+ +
    + + + +
+

tags_api.get_active_votes

+

Returns all votes for the given post.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_active_votes", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_active_votes", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

tags_api.get_comment_discussions_by_payout

+

Returns a list of discussions based on payout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_comment_discussions_by_payout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_comment_discussions_by_payout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_content_replies

+

Returns a list of replies.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_content_replies", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_content_replies", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussion

+

Returns the discussion given an author and permlink.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "curator_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_pending_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussion", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussion", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_active

+

Returns a list of discussions based on active.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_active", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_active", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_author_before_date

+

Returns a list of discussions based on author before date.

+
Query Parameters JSON
+
{
+  "author": "",
+  "start_permlink": "",
+  "before_date": "1970-01-01T00:00:00",
+  "limit": 100
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_author_before_date", "params":{"author":"steemit","start_permlink":"firstpost","before_date":"2016-04-19T22:49:43","limit":1}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_blog

+

Returns a list of discussions by blog.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_blog", "params":{"tag":"steemit","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_blog", "params":{"tag":"alice","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_cashout

+

Returns a list of discussions by cashout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_cashout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_cashout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_children

+

Returns a list of discussions by children.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_children", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_children", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_comments

+

Returns a list of discussions by comments.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_comments", "params":{"start_author":"steemit","start_permlink":"firstpost","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_comments", "params":{"start_author":"alice","start_permlink":"a-post-by-alice","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_created

+

Returns a list of discussions by created.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_created", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_created", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF14
  • + + + +
+

tags_api.get_discussions_by_feed

+

Returns a list of discussions by feed.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_feed", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_feed", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_hot

+

Returns a list of discussions by hot.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_hot", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_hot", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF13
  • + + + +
+

tags_api.get_discussions_by_promoted

+

Returns a list of discussions by promoted.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_promoted", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_promoted", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+ +

Returns a list of discussions by trending.

+ +
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+ +
{"discussions": []}
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_trending", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_trending", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_discussions_by_votes

+

Returns a list of discussions by votes.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_votes", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_votes", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
+

tags_api.get_post_discussions_by_payout

+

Returns a list of post discussions by payout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_post_discussions_by_payout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_post_discussions_by_payout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_replies_by_last_update

+

Returns a list of replies by last update.

+
Query Parameters JSON
+
{
+  "start_parent_author": "",
+  "start_permlink": "",
+  "limit": 100
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_replies_by_last_update", "params":{"start_parent_author":"steemit","start_permlink":"firstpost","limit":1}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

tags_api.get_tags_used_by_author

+

Returns a list of tags used by an author.

+
Query Parameters JSON
+
{"author": ""}
+
+
Expected Response JSON
+
{"tags": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_tags_used_by_author", "params":{"author":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+ +

Returns the list of trending tags.

+ +
{"start_tag": "", "limit": 100}
+
+ +
{"tags": []}
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_trending_tags", "params":{"start_tag":null,"limit":100}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_trending_tags", "params":{"start_tag":"steem","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Witness Api + + +

+ + + +

API removed in 0.20.6, see: #3029

+ +
    + + + +
  • Disabled
  • + +
+

witness_api.get_account_bandwidth

+

Disabled since 0.20.6, see: #3029

+ +

Returns the available bandwidth of an account. See: Forum/Market Bandwidth

+ +
Query Parameters JSON
+
{"account": "", "type": "post"}
+
+
Expected Response JSON
+
{}
+
+ +
+ +
    + + + +
  • Disabled
  • + +
+

witness_api.get_reserve_ratio

+

Disabled since 0.20.6, see: #3029

+ +

Returns the current reserve ratio.

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "average_block_size": 0,
+  "current_reserve_ratio": 1,
+  "max_virtual_bandwidth": "0"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"witness_api.get_account_bandwidth", "params":{"account":"steemit","type":"forum"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"witness_api.get_account_bandwidth", "params":{"account":"alice","type":"market"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Block Api + + +

+ + + +

Used to query values related to the block plugin. These AppBase API methods are still under development and subject to change.

+ +
    + + + +
+

block_api.get_block

+

Retrieve a full, signed block of the referenced block, or null if no matching block was found.

+ +

Parameters:

+ +
    +
  • block_num:int
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the very first block.
8675309Queries block number 8,675,309.
62396745Queries block number 62,396,745.
+ +
Query Parameters JSON
+
{"block_num": 0}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":8675309}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block", "params":{"block_num":62396745}, "id":1}' https://api.steemit.com
+
+ +
+ +
    + + + +
+

block_api.get_block_header

+

Retrieve a block header of the referenced block, or null if no matching block was found.

+ +

Parameters:

+ +
    +
  • block_num:int - Height of the block whose header should be returned
  • +
+ + + + + + + + + + + + + + + + + + + + + + +
block_num (int) 
1Queries the block headers for the very first block.
8675309Queries block headers for block number 8,675,309.
62396745Queries block headers for block number 62,396,745.
+ +
Query Parameters JSON
+
{"block_num": 0}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":8675309}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"block_api.get_block_header", "params":{"block_num":62396745}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ +
+

+ + Debug Node Api + + +

+ + + +

This plugin allows all sorts of creative “what-if” experiments with the chain.

+ +

See: debug_node_plugin.md

+ +
    + + + +
+

debug_node_api.debug_generate_blocks

+

Generate blocks locally.

+
Query Parameters JSON
+
{
+  "debug_key": "",
+  "count": 0,
+  "skip": 0,
+  "miss_blocks": 0,
+  "edit_if_needed": true
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_generate_blocks_until

+

Generate blocks locally until a specified head block time. Can generate them sparsely.

+
Query Parameters JSON
+
{
+  "debug_key": "",
+  "head_block_time": "1970-01-01T00:00:00",
+  "generate_sparsely": true
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_get_hardfork_property_object

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "processed_hardforks": [],
+  "last_hardfork": 0,
+  "current_hardfork_version": "0.0.0",
+  "next_hardfork": "0.0.0",
+  "next_hardfork_time": "1970-01-01T00:00:00"
+}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_get_json_schema

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"schema": ""}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_get_witness_schedule

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "current_virtual_time": "0",
+  "next_shuffle_block_num": 21573344,
+  "current_shuffled_witnesses": [],
+  "num_scheduled_witnesses": 192,
+  "elected_weight": 49,
+  "timeshare_weight": 73,
+  "miner_weight": 1,
+  "witness_pay_normalization_factor": 0,
+  "median_props": {
+    "account_creation_fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "maximum_block_size": 131072,
+    "sbd_interest_rate": 1000,
+    "account_subsidy_budget": 797,
+    "account_subsidy_decay": 347321
+  },
+  "majority_version": "0.0.0",
+  "max_voted_witnesses": 128,
+  "max_miner_witnesses": 131,
+  "max_runner_witnesses": 191,
+  "hardfork_required_witnesses": 4,
+  "account_subsidy_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "account_subsidy_witness_rd": {
+    "resource_unit": 0,
+    "budget_per_time_unit": 0,
+    "pool_eq": 0,
+    "max_pool_size": 0,
+    "decay_params": {
+      "decay_per_time_unit": 0,
+      "decay_per_time_unit_denom_shift": 0
+    },
+    "min_decay": 0
+  },
+  "min_witness_account_subsidy_decay": 0
+}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_has_hardfork

+ +
Query Parameters JSON
+
{"hardfork_id": 0}
+
+
Expected Response JSON
+
{"has_hardfork": false}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_pop_block

+

Pop a block from the blockchain, returning it.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_push_blocks

+

Push blocks from existing database.

+
Query Parameters JSON
+
{
+  "src_filename": "",
+  "count": 0,
+  "skip_validate_invariants": false
+}
+
+
Expected Response JSON
+
{"blocks": 0}
+
+ +
+ +
    + + + +
+

debug_node_api.debug_set_hardfork

+ +
Query Parameters JSON
+
{"hardfork_id": 0}
+
+
Expected Response JSON
+
{}
+
+ +
+ + +
+ +
+

+ + Broadcast Ops + + +

+ + + +

An operation on Steem is a way of expressing intention on the blockchain. +They are also known as Broadcast Operations. They have types, like vote +or comment. They pass parameters like author and permlink, depending +on what their purpose is.

+ +

Operations are grouped into transactions and passed as parameters to +methods like network_broadcast_api.broadcast_transaction, in +the operations array. Transactions must be signed in order for the +blockchain to accept them. Here is an example of a transaction that +contains one operation (shown without signatures).

+ +
{
+   "jsonrpc":"2.0",
+   "method":"network_broadcast_api.broadcast_transaction",
+   "params":{
+      "trx":{
+         "ref_block_num":1097,
+         "ref_block_prefix":2181793527,
+         "expiration":"2016-03-24T18:00:21",
+         "operations":[
+            [
+               "vote",
+               {
+                  "voter":"steemit",
+                  "author":"alice",
+                  "permlink":"a-post-by-alice",
+                  "weight":10000
+               }
+            ]
+         ],
+         "extensions":[],
+         "signatures":[]
+      }
+   },
+   "id":1
+}
+
+ +

Also see: Network Broadcast API

+ +
    + + + + +
+

+vote + + +

+

This operation is used to cast a vote on a post/comment. The primary +purpose of voting is to express Proof-of-Brain about content to the +blockchain. When a vote is cast, the content is considered in the +consensus rules involving author and curation rewards.

+ +

An upvote can be cast from the point in time that the content is created +up to 6.5 days. The remaining 12 hours are locked out of upvotes at +which time only downvotes may be cast.

+ +

A secondary aspect to voting involves reputation, which is not part of +consensus.

+ +

Reputation Rules:

+
    +
  1. Must have non-negative reputation to effect another user’s reputation.
  2. +
  3. If you are down voting another user, you must have more reputation than them to impact their reputation.
  4. +
+ +

Notes:

+
    +
  • voter: must be a valid account name
  • +
  • author: must be a valid account name
  • +
  • permlink: must be content created by author
  • +
  • weight: absolute value must not be more than 10000 (100.00 %).
  • +
+ +
Roles: posting active owner
+
Parameters: voter author permlink weight
+ +
Example Op:
+ +
[
+  "vote",
+  {
+    "voter": "steemit",
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "weight": 10000
+  }
+]
+
+ +
+ +
    + + + + +
+

+comment + + +

+

Creates a post/comment.

+ +

Notes:

+
    +
  • title: must not be larger than 256 bytes
  • +
  • title: must be UTF-8
  • +
  • body: must be larger than 0 bytes
  • +
  • body: must be UTF-8
  • +
+ +
Roles: posting active owner
+
Parameters: parent_author parent_permlink author permlink title body json_metadata
+ +
Example Op:
+ +
[
+  "comment",
+  {
+    "parent_author": "",
+    "parent_permlink": "steem",
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "title": "A Post By Alice",
+    "body": "This is my post.",
+    "json_metadata": "{\"tags\":[\"steemit\",\"example\",\"tags\"]}"
+  }
+]
+
+ +
+ +
    + + + + +
+

+transfer + + +

+

Transfers asset from one account to another. The memo is plain-text, +any encryption on the memo is up to a higher level protocol.

+ +

Notes:

+
    +
  • Transferring of Steem Power (VESTS) is not allowed.
  • +
  • Cannot transfer a negative amount (aka: stealing).
  • +
  • Memo must be less than 2048 bytes.
  • +
  • Memo must be UTF-8.
  • +
+ +
Roles: active owner
+
Parameters: from to amount memo
+ +
Example Op:
+ +
[
+  "transfer",
+  {
+    "from": "steemit",
+    "to": "alice",
+    "amount": {
+      "amount": "10",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "memo": "Thanks for all the fish."
+  }
+]
+
+ +
+ +
    + + + + +
+

+transfer_to_vesting + + +

+

This operation converts STEEM into VFS (Vesting Fund Shares) at the +current exchange rate. With this operation it is possible to give +another account vesting shares so that faucets can pre-fund new accounts +with vesting shares.

+ +

Notes:

+
    +
  • Amount must be in STEEM.
  • +
  • Must transfer a nonzero amount.
  • +
+ +
Roles: active owner
+
Parameters: from to amount
+ +
Example Op:
+ +
[
+  "transfer_to_vesting",
+  {
+    "from": "alice",
+    "to": "",
+    "amount": {
+      "amount": "357000",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+withdraw_vesting + + +

+

At any given point in time an account can be withdrawing from their +vesting shares. A user may change the number of shares they wish to +cash out at any time between 0 and their total vesting stake.

+ +

After applying this operation, vesting_shares will be withdrawn +at a rate of vesting_shares/13 per week for 13 weeks starting +one week after this operation is included in the blockchain.

+ +

This operation is not valid if the user has no vesting shares.

+ +

Notes:

+
    +
  • Amount must be VESTS.
  • +
+ +
Roles: active owner
+
Parameters: account vesting_shares
+ +
Example Op:
+ +
[
+  "withdraw_vesting",
+  {
+    "account": "steemit",
+    "vesting_shares": {
+      "amount": "200000000000",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+limit_order_create + + +

+

This operation creates a limit order and matches it against existing +open orders.

+ +
Roles: active owner
+
Parameters: owner orderid amount_to_sell min_to_receive fill_or_kill expiration
+ +
Example Op:
+ +
[
+  "limit_order_create",
+  {
+    "owner": "steemit",
+    "orderid": 10,
+    "amount_to_sell": {
+      "amount": "9950",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "min_to_receive": {
+      "amount": "3500",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "fill_or_kill": false,
+    "expiration": "2035-10-29T06:32:22"
+  }
+]
+
+ +
+ +
    + + + + +
+

+limit_order_cancel + + +

+

Cancels an order and returns the balance to owner.

+ +
Roles: active owner
+
Parameters: owner orderid
+ +
Example Op:
+ +
[
+  "limit_order_cancel",
+  {"owner": "steemit", "orderid": 10}
+]
+
+ +
+ +
    + + + + +
+

+price + + +

+ +
Roles: active owner
+
Parameters: base quote
+ +
+ +
    + + + + +
+

+feed_publish + + +

+

Feeds can only be published by the top N witnesses which are included in +every round and are used to define the exchange rate between steem and +the dollar.

+ +
Roles: active owner
+
Parameters: publisher exchange_rate
+ +
Example Op:
+ +
[
+  "feed_publish",
+  {
+    "publisher": "alice",
+    "exchange_rate": {
+      "base": {
+        "amount": "1000",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "quote": {
+        "amount": "1000000",
+        "precision": 3,
+        "nai": "@@000000021"
+      }
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+convert + + +

+

This operation instructs the blockchain to start a conversion between +STEEM and SBD, the funds are deposited after 3.5 days.

+ +
Roles: active owner
+
Parameters: owner requestid amount
+ +
Example Op:
+ +
[
+  "convert",
+  {
+    "owner": "steemit",
+    "requestid": 1467592156,
+    "amount": {
+      "amount": "5000",
+      "precision": 3,
+      "nai": "@@000000013"
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+account_create + + +

+ +
Roles: active owner
+
Parameters: fee creator new_account_name owner active posting memo_key json_metadata
+ +
Example Op:
+ +
[
+  "account_create",
+  {
+    "fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "creator": "steemit",
+    "new_account_name": "alice",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5b4i9gBqvh4sbgrooXPu2dbGLewNPZkXeuNeBjyiswnu2szgXx",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM7ko5nzqaYfjbD4tKWGmiy3xtT9eQFZ3Pcmq5JmygTRptWSiVQy",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5xAKxnMT2y9VoVJdF63K8xRQAohsiQy9bA33aHeyMB5vgkzaay",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM8ZSyzjPm48GmUuMSRufkVYkwYbZzbxeMysAVp7KFQwbTf98TcG",
+    "json_metadata": "{}"
+  }
+]
+
+ +
+ +
    + + + + +
+

+account_update + + +

+ +
Roles: active owner
+
Parameters: account owner active posting memo_key json_metadata
+ +
Example Op:
+ +
[
+  "account_update",
+  {
+    "account": "steemit",
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6FATHLohxTN8RWWkU9ZZwVywXo6MEDjHHui1jEBYkG2tTdvMYo",
+          1
+        ],
+        [
+          "STM76EQNV2RTA6yF9TnBvGSV71mW7eW36MM7XQp24JxdoArTfKA76",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM6FATHLohxTN8RWWkU9ZZwVywXo6MEDjHHui1jEBYkG2tTdvMYo",
+    "json_metadata": ""
+  }
+]
+
+ +
+ +
    + + + + +
  • Disabled
  • + +
+

+report_over_production + + +

+

Disabled in HF4

+ +

This operation is used to report a miner who signs two blocks +at the same time. To be valid, the violation must be reported within +STEEM_MAX_WITNESSES blocks of the head block (1 round) and the +producer must be in the ACTIVE witness set.

+ +

Users not in the ACTIVE witness set should not have to worry about their +key getting compromised and being used to produced multiple blocks so +the attacker can report it and steel their vesting steem.

+ +

The result of the operation is to transfer the full VESTING STEEM balance +of the block producer to the reporter.

+ +
Roles: active owner
+
Parameters: reporter first_block second_block
+ +
+ +
    + + + + +
+

+witness_update + + +

+

Users who wish to become a witness must pay a fee acceptable to +the current witnesses to apply for the position and allow voting +to begin.

+ +

If the owner isn’t a witness they will become a witness. Witnesses +are charged a fee equal to 1 weeks worth of witness pay which in +turn is derived from the current share supply. The fee is +only applied if the owner is not already a witness.

+ +

If the block_signing_key is null then the witness is removed from +contention. The network will pick the top 21 witnesses for +producing blocks.

+ +

Notes:

+
    +
  • The fee paid to register a new witness, should be 10x current +block production pay.
  • +
  • url cannot be more than 2048 bytes.
  • +
  • url must be UTF-8.
  • +
  • fee cannot be negative.
  • +
+ +
Roles: active owner
+
Parameters: owner url block_signing_key props fee
+ +
Example Op:
+ +
[
+  "witness_update",
+  {
+    "owner": "alice",
+    "url": "witness-category/my-witness",
+    "block_signing_key": "STM8LoQjQqJHvotqBo7HjnqmUbFW9oJ2theyqonzUd9DdJ7YYHsvD",
+    "props": {
+      "account_creation_fee": {
+        "amount": "100000",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    },
+    "fee": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+account_witness_vote + + +

+

All accounts with a VFS (Vesting Fund Shares) can vote for or against +any witness. See: STEEM_MAX_ACCOUNT_WITNESS_VOTES

+ +

If a proxy is specified then all existing votes are removed.

+ +
Roles: active owner
+
Parameters: account witness approve
+ +
Example Op:
+ +
[
+  "account_witness_vote",
+  {
+    "account": "alice",
+    "witness": "bob",
+    "approve": true
+  }
+]
+
+ +
+ +
    + + + + +
+

+account_witness_proxy + + +

+ +
Roles: active owner
+
Parameters: account proxy
+ +
Example Op:
+ +
[
+  "account_witness_proxy",
+  {"account": "alice", "proxy": "bob"}
+]
+
+ +
+ +
    + + + + +
  • Disabled
  • + +
+

+pow + + +

+

Disabled in HF14.

+ +
Roles: active owner
+
Parameters: worker input signature work
+ +
Example Op:
+ +
[
+  "pow",
+  {
+    "worker_account": "admin",
+    "block_id": "000004433bd4602cf5f74dbb564183837df9cef8",
+    "nonce": 82,
+    "work": {
+      "worker": "STM65wH1LZ7BfSHcK69SShnqCAH5xdoSZpGkUjmzHJ5GCuxEK9V5G",
+      "input": "59b009f89477919f95914151cef06f28bf344dd6fb7670aca1c1f4323c80446b",
+      "signature": "1f3f83209097efcd01b7d6f27ce726164323d503d6fcf4d55bfb7cb3032796f6766738b36062b5850d69447fdf9c091cbc70825df5eeacc4710a0b11ffdbf0912a",
+      "work": "0b62f4837801cd857f01d6a541faeb13d6bb95f1c36c6b4b14a47df632aa6c92"
+    },
+    "props": {
+      "account_creation_fee": {
+        "amount": "100000",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    }
+  }
+]
+
+ +
+ +
    + + + + +
+

+custom + + +

+

Provides a generic way to add higher level protocols on top of witness +consensus.

+ +

There is no validation for this operation other than that required auths +are valid.

+ +
Roles: active owner
+
Parameters: required_auths id data
+ +
Example Op:
+ +
[
+  "custom",
+  {
+    "required_auths": ["bytemaster"],
+    "id": 777,
+    "data": "0a627974656d617374657207737465656d697402a3d13897d82114466ad87a74b73a53292d8331d1bd1d3082da6bfbcff19ed097029db013797711c88cccca3692407f9ff9b9ce7221aaa2d797f1692be2215d0a5f6d2a8cab6832050078bc5729201e3ea24ea9f7873e6dbdc65a6bd9899053b9acda876dc69f11a13df9ca8b26b6"
+  }
+]
+
+ +
+ +
    + + + + +
+

+delete_comment + + +

+ +
Roles: posting active owner
+
Parameters: author permlink
+ +
Example Op:
+ +
[
+  "delete_comment",
+  {
+    "author": "alice",
+    "permlink": "a-post-by-alice"
+  }
+]
+
+ +
+ +
    + + + + +
+

+custom_json + + +

+

Serves the same purpose as custom but also supports required posting +authorities. Unlike custom, this operation is designed to be human +readable/developer friendly.

+ +
follow
+ +

As of HF9, the follow plugin will track follow/unfollow/ignore events.

+ +
reblog
+ +

As of HF14, allows users to share blogs they find with those who follow +them. This change implemented entirely outside the blockchain consensus +which means that reblogging does not create a new post, it merely shares +an existing post with people who follow you.

+ +
witness
+ +

As of HF18, the witness plugin has a custom operation called +enable_content_editing that allows a user to signal they want to edit +their content. By consensus, content is editable indefinitely, but is +soft forked to be frozen after payout. This operation requires an +active key and is designed to prevent vandalism if a posting key is +compromised. #1017

+ +
Roles: posting active owner
+
Parameters: required_auths required_posting_auths id json
+ +
Example Op:
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["steemit"],
+    "id": "follow",
+    "json": "[\"follow\",{\"follower\":\"steemit\",\"following\":\"alice\",\"what\":[\"blog\"]}]"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["alice"],
+    "id": "follow",
+    "json": "[\"follow\",{\"follower\":\"alice\",\"following\":\"eve\",\"what\":[\"ignore\"]}]"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": [],
+    "required_posting_auths": ["bob"],
+    "id": "reblog",
+    "json": "{\"account\":\"bob\",\"author\":\"alice\",\"permlink\":\"a-post-by-alice\"}"
+  }
+]
+
+ +
[
+  "custom_json",
+  {
+    "required_auths": ["alice"],
+    "required_posting_auths": [],
+    "id": "witness",
+    "json": "[\"enable_content_editing\", {\"account\": \"alice\", \"relock_time\": \"2100-01-01T12:00:00\"}]"
+  }
+]
+
+ +
+ +
    + + + + +
+

+comment_options + + +

+

Authors of posts may not want all of the benefits that come from creating a post. This +operation allows authors to update properties associated with their post.

+ +

Typically, these options will accompany a comment operation in the same transaction.

+ +

As of HF17, content can specify beneficiaries to receive a part of +their author rewards. The beneficiaries are specified in the extension +field of the comment_options_operation and is a sorted vector (by +account name) of account name, weight pairs. The beneficiaries can only +be specified once and must be specified before any votes are cast on the +comment. Most apps are already adding a comment_options in the +transaction that creates the comment, so this should not be much of a +challenge to add to existing apps.

+ +

Notes:

+ +
    +
  • The max_accepted_payout may be decreased, but never increased.
  • +
  • The percent_steem_dollars may be decreased, but never increased.
  • +
  • Part of comment_option validation process, to be called when +allowed_vote_assets object has been added as comment option extension are: +
      +
    • When votable assets are greater than maximum votable assets: “Too much votable assets specified”
    • +
    • When the symbol is not allowed in the list for votable assets: “STEEM can not be explicitly specified as one of allowed_vote_assets”
    • +
    +
  • +
  • max_accepted_payout: SBD value of the maximum payout this post will receive
  • +
  • percent_steem_dollars: the percent of Steem Dollars to key, unkept amounts will be received as Steem Power
  • +
  • allow_votes: allows/disallows a post to receive votes;
  • +
  • allow_curation_rewards: allows/disllows voters to recieve curation rewards. Rewards return to reward fund.
  • +
  • beneficiaries +
      +
    • Must have at least one (empty beneficiaries not allowed).
    • +
    • Cannot have more than 127 (witness currently only allow up to 8).
    • +
    • Cannot allocate more than 100% of rewards to one account.
    • +
    • Cannot allocate more than 100% of rewards to a comment.
    • +
    • Must be specified in sorted order (account ascending; no duplicates).
    • +
    +
  • +
+ +
Roles: posting active owner
+
Parameters: author permlink max_accepted_payout percent_steem_dollars allow_votes allow_curation_rewards extensions
+ +
Example Op:
+ +
[
+  "comment_options",
+  {
+    "author": "alice",
+    "permlink": "a-post-by-alice",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 5000,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": []
+  }
+]
+
+ +
[
+  "comment_options",
+  {
+    "author": "bob",
+    "permlink": "a-post-with-a-beneficiary",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 63,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": [
+      [
+        0,
+        {
+          "beneficiaries": [{"account": "charlie", "weight": 1000}]
+        }
+      ]
+    ]
+  }
+]
+
+ +
[
+  "comment_options",
+  {
+    "author": "charlie",
+    "permlink": "a-post-with-multiple-beneficiaries",
+    "max_accepted_payout": {
+      "amount": "1000000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "percent_steem_dollars": 62688,
+    "allow_votes": true,
+    "allow_curation_rewards": true,
+    "extensions": [
+      [
+        0,
+        {
+          "beneficiaries": [
+            {"account": "david", "weight": 500},
+            {"account": "erin", "weight": 500},
+            {"account": "faythe", "weight": 1000},
+            {"account": "frank", "weight": 500}
+          ]
+        }
+      ]
+    ]
+  }
+]
+
+ +
+ +
    + + + + +
+

+set_withdraw_vesting_route + + +

+

Allows an account to setup a vesting withdraw but with the additional +request for the funds to be transferred directly to another account’s +balance rather than the withdrawing account. In addition, those funds +can be immediately vested again, circumventing the conversion from +vests to steem and back, guaranteeing they maintain their value.

+ +

Notes:

+
    +
  • Percent must be valid steem percent.
  • +
+ +
Roles: active owner
+
Parameters: from_account to_account percent auto_vest
+ +
Example Op:
+ +
[
+  "set_withdraw_vesting_route",
+  {
+    "from_account": "alice",
+    "to_account": "bob",
+    "percent": 10000,
+    "auto_vest": true
+  }
+]
+
+ +
+ +
    + + + + +
+

+limit_order_create2 + + +

+

This operation is identical to limit_order_create except it serializes +the price rather than calculating it from other fields.

+ +
Roles: active owner
+
Parameters: owner orderid amount_to_sell exchange_rate fill_or_kill expiration
+ +
Example Op:
+ +
[
+  "limit_order_create2",
+  {
+    "owner": "alice",
+    "orderid": 492991,
+    "amount_to_sell": {
+      "amount": "1",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "exchange_rate": {
+      "base": {
+        "amount": "1",
+        "precision": 3,
+        "nai": "@@000000013"
+      },
+      "quote": {
+        "amount": "10",
+        "precision": 3,
+        "nai": "@@000000021"
+      }
+    },
+    "fill_or_kill": false,
+    "expiration": "2017-05-12T23:11:13"
+  }
+]
+
+ +
+ +
    + + + + +
  • Disabled
  • + +
+

+challenge_authority + + +

+

Disabled in HF14.

+ +
Roles: posting active owner
+
Parameters: challenger challenged require_owner
+ +
+ +
    + + + + +
+

+prove_authority + + +

+ +
Roles: active owner
+
Parameters: challenged require_owner
+ +
+ +
    + +
  • Since: HF11
  • + + + + +
+

+request_account_recovery + + +

+

All account recovery requests come from a listed recovery account. This +is secure based on the assumption that only a trusted account should be +a recovery account. It is the responsibility of the recovery account to +verify the identity of the account holder of the account to recover by +whichever means they have agreed upon. The blockchain assumes identity +has been verified when this operation is broadcast.

+ +

This operation creates an account recovery request which the account to +recover has 24 hours to respond to before the request expires and is +invalidated.

+ +

There can only be one active recovery request per account at any one time. +Pushing this operation for an account to recover when it already has +an active request will either update the request to a new new owner authority +and extend the request expiration to 24 hours from the current head block +time or it will delete the request. To cancel a request, simply set the +weight threshold of the new owner authority to 0, making it an open authority.

+ +

Additionally, the new owner authority must be satisfiable. In other words, +the sum of the key weights must be greater than or equal to the weight +threshold.

+ +

This operation only needs to be signed by the the recovery account. +The account to recover confirms its identity to the blockchain in +the recover account operation.

+ +

Notes:

+ +
    +
  • recovery_account: The recovery account is listed as the recovery account +on the account to recover.
  • +
  • account_to_recover: The account to recover. This is likely due to a +compromised owner authority.
  • +
  • new_owner_authority: The new owner authority the account to recover +wishes to have. This is secret known by the account to recover and +will be confirmed in a recover_account.
  • +
+ +

See: #169

+ +
Roles: active owner
+
Parameters: recovery_account account_to_recover new_owner_authority extensions
+ +
Example Op:
+ +
[
+  "request_account_recovery",
+  {
+    "recovery_account": "steem",
+    "account_to_recover": "alice",
+    "new_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6LYxj96zdypHYqgDdD6Nyh2NxerN3P1Mp3ddNm7gci63nfrSuZ",
+          1
+        ]
+      ]
+    },
+    "extensions": []
+  }
+]
+
+ +
+ +
    + +
  • Since: HF11
  • + + + + +
+

+recover_account + + +

+ +
Roles: owner
+
Parameters: account_to_recover new_owner_authority recent_owner_authority extensions
+ +
Example Op:
+ +
[
+  "recover_account",
+  {
+    "account_to_recover": "alice",
+    "new_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM7j3nhkhHTpXqLEvdx2yEGhQeeorTcxSV6WDL2DZGxwUxYGrHvh",
+          1
+        ]
+      ]
+    },
+    "recent_owner_authority": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM78Xth94gNxp8nmByFV2vNAhg9bsSdviJ6fQXUTFikySLK3uTxC",
+          1
+        ]
+      ]
+    },
+    "extensions": []
+  }
+]
+
+ +
+ +
    + +
  • Since: HF11
  • + + + + +
+

+change_recovery_account + + +

+

Each account lists another account as their recovery account. +The recovery account has the ability to create account_recovery_requests +for the account to recover. An account can change their recovery account +at any time with a 30 day delay. This delay is to prevent +an attacker from changing the recovery account to a malicious account +during an attack. These 30 days match the 30 days that an +owner authority is valid for recovery purposes.

+ +

On account creation the recovery account is set either to the creator of +the account (The account that pays the creation fee and is a signer on the transaction) +or to the empty string if the account was mined. An account with no recovery +has the top voted witness as a recovery account, at the time the recover +request is created. Note: This does mean the effective recovery account +of an account with no listed recovery account can change at any time as +witness vote weights. The top voted witness is explicitly the most trusted +witness according to stake.

+ +

See: #169

+ +
Roles: owner
+
Parameters: account_to_recover new_recovery_account extensions
+ +
Example Op:
+ +
[
+  "change_recovery_account",
+  {
+    "account_to_recover": "alice",
+    "new_recovery_account": "bob",
+    "extensions": []
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+escrow_transfer + + +

+

The purpose of this operation is to enable someone to send money +contingently to another individual. The funds leave the from account +and go into a temporary balance where they are held until from +releases it to to or to refunds it to from.

+ +

In the event of a dispute the agent can divide the funds between the +to/from account. Disputes can be raised any time before or on the +dispute deadline time, after the escrow has been approved by all +parties.

+ +

This operation only creates a proposed escrow transfer. Both the agent +and to must agree to the terms of the arrangement by approving the +escrow.

+ +

The escrow agent is paid the fee on approval of all parties. It is up to +the escrow agent to determine the fee.

+ +

Escrow transactions are uniquely identified by from and escrow_id, +the escrow_id is defined by the sender.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent escrow_id sbd_amount steem_amount fee ratification_deadline escrow_expiration json_meta
+ +
Example Op:
+ +
[
+  "escrow_transfer",
+  {
+    "from": "alice",
+    "to": "bob",
+    "sbd_amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "steem_amount": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "escrow_id": 23456789,
+    "agent": "charlie",
+    "fee": {
+      "amount": "100",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "json_meta": "{}",
+    "ratification_deadline": "2017-02-26T11:22:39",
+    "escrow_expiration": "2017-02-28T11:22:39"
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+escrow_dispute + + +

+

If either the sender or receiver of an escrow payment has an issue, they +can raise it for dispute. Once a payment is in dispute, the agent has +authority over who gets what.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who escrow_id
+ +
Example Op:
+ +
[
+  "escrow_dispute",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "alice",
+    "escrow_id": 72526562
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+escrow_release + + +

+

This operation can be used by anyone associated with the escrow transfer +to release funds if they have permission.

+ +

The permission scheme is as follows:

+
    +
  • If there is no dispute and escrow has not expired, either party can +release funds to the other.
  • +
  • If escrow expires and there is no dispute, either party can release +funds to either party.
  • +
  • If there is a dispute regardless of expiration, the agent can +release funds to either party following whichever agreement was in place between the parties.
  • +
+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who receiver escrow_id sbd_amount steem_amount
+ +
Example Op:
+ +
[
+  "escrow_release",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "charlie",
+    "receiver": "bob",
+    "escrow_id": 72526562,
+    "sbd_amount": {
+      "amount": "5000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "steem_amount": {
+      "amount": "0",
+      "precision": 3,
+      "nai": "@@000000021"
+    }
+  }
+]
+
+ +
+ +
    + + + + +
  • Disabled
  • + +
+

+pow2 + + +

+

Disabled in HF17.

+
Roles: active owner
+
Parameters: input pow_summary
+ +
Example Op:
+ +
[
+  "pow2",
+  {
+    "work": [
+      0,
+      {
+        "input": {
+          "worker_account": "alice",
+          "prev_block": "003ea604345523c344fbadab605073ea712dd76f",
+          "nonce": "1052853013628665497"
+        },
+        "pow_summary": 3817904373
+      }
+    ],
+    "props": {
+      "account_creation_fee": {
+        "amount": "1",
+        "precision": 3,
+        "nai": "@@000000021"
+      },
+      "maximum_block_size": 131072,
+      "sbd_interest_rate": 1000
+    }
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+escrow_approve + + +

+

The agent and to accounts must approve an escrow transaction for it to +be valid on the blockchain. Once a party approves the escrow, they +cannot revoke their approval. Subsequent escrow approve operations, +regardless of the approval, will be rejected.

+ +

See: steem_operations.hpp:229

+ +
Roles: active owner
+
Parameters: from to agent who escrow_id approve
+ +
Example Op:
+ +
[
+  "escrow_approve",
+  {
+    "from": "alice",
+    "to": "bob",
+    "agent": "charlie",
+    "who": "charlie",
+    "escrow_id": 59102208,
+    "approve": true
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+transfer_to_savings + + +

+

For time locked savings accounts. A user can place Steem and Steem +Dollars into time locked savings balances. Funds can be withdrawn from +these balances after a three day delay. The point of this addition is to +mitigate loss from hacked and compromised account. The max a user can +lose instantaneously is the sum of what the hold in liquid balances. +Assuming an account can be recovered quickly, loss in such situations +can be kept to a minimum.

+ +

See: steem_operations.hpp:868

+ +
Roles: active owner
+
Parameters: from to amount memo
+ +
Example Op:
+ +
[
+  "transfer_to_savings",
+  {
+    "from": "alice",
+    "to": "alice",
+    "amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "memo": ""
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+transfer_from_savings + + +

+ +
Roles: active owner
+
Parameters: from request_id to amount memo
+ +
Example Op:
+ +
[
+  "transfer_from_savings",
+  {
+    "from": "alice",
+    "request_id": 101,
+    "to": "alice",
+    "amount": {
+      "amount": "1000",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "memo": ""
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+cancel_transfer_from_savings + + +

+ +
Roles: active owner
+
Parameters: from request_id
+ +
Example Op:
+ +
[
+  "cancel_transfer_from_savings",
+  {"from": "alice", "request_id": 1}
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+custom_binary + + +

+

The semmantics for this operation are the same as the custom_json +operation, but with a binary payload. The json deserialization has a +non-trivial cost associated with it. This operation will allow for +binary deserialization of plugin operations and should improve overall +performance of plugins that chose to use it.

+ +

See: steem_operations.hpp:491

+ +
Roles: posting active owner
+
Parameters: id data
+ +
+ +
    + +
  • Since: HF14
  • + + + + +
+

+decline_voting_rights + + +

+

An account can chose to decline their voting rights after a 30 day +delay. This includes voting on content and witnesses. The voting rights +cannot be acquired again once they have been declined. This is only to +formalize a smart contract between certain accounts and the community +that currently only exists as a social contract.

+ +

See: steem_operations.hpp:897

+ +
Roles: owner
+
Parameters: account decline
+ +
Example Op:
+ +
[
+  "decline_voting_rights",
+  {"account": "judy", "decline": true}
+]
+
+ +
+ +
    + +
  • Since: HF11
  • + + + + +
  • Disabled
  • + +
+

+reset_account + + +

+

This operation allows recovery_account to change account_to_reset’s +owner authority to new_owner_authority after 60 days of inactivity.

+ +

See: #169

+ +
Roles: active owner
+
Parameters: reset_account account_to_reset new_owner_authority
+ +
+ +
    + +
  • Since: HF11
  • + + + + +
  • Disabled
  • + +
+

+set_reset_account + + +

+

This operation allows account owner to control which account has the +power to execute the reset_account operation after 60 days.

+ +

See: #169

+ +
Roles: owner posting
+
Parameters: account current_reset_account reset_account
+ +
+ +
    + + + + +
+

+claim_reward_balance + + +

+ +
Roles: posting active owner
+
Parameters: account reward_steem reward_sbd reward_vests
+ +
Example Op:
+ +
[
+  "claim_reward_balance",
+  {
+    "account": "alice",
+    "reward_steem": {
+      "amount": "17",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "reward_sbd": {
+      "amount": "11",
+      "precision": 3,
+      "nai": "@@000000013"
+    },
+    "reward_vests": {
+      "amount": "185025103",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ +
    + +
  • Since: HF17
  • + + + + +
+

+delegate_vesting_shares + + +

+

Delegate vesting shares from one account to the other. The vesting +shares are still owned by the original account, but content voting +rights and resource credit are transferred to the receiving +account. This sets the delegation to vesting_shares, increasing it or +decreasing it as needed (i.e. a delegation of 0 removes the delegation).

+ +

When a delegation is removed the shares are placed in limbo for a week +to prevent a satoshi of VESTS from voting on the same content twice.

+ +

Also see:

+ + +
Roles: active owner
+
Parameters: delegator delegatee vesting_shares
+ +
Example Op:
+ +
[
+  "delegate_vesting_shares",
+  {
+    "delegator": "alice",
+    "delegatee": "bob",
+    "vesting_shares": {
+      "amount": "94599167138276",
+      "precision": 6,
+      "nai": "@@000000037"
+    }
+  }
+]
+
+ +
+ +
    + +
  • Since: HF17
  • + + + +
  • Deprecated
  • + + +
+

+account_create_with_delegation + + +

+

Deprecated as of HF20 If an account creation service would still like to provide a delegation of Steem Power +to the accounts they create, they can still follow the account creation operation with an additional call to +delegate_vesting_shares to add a delegation of SP to the account.

+ +
+

Instead of paying the entire account creation fee with Steem, creators +can now pay a smaller fee (30x less) and delegate some Steem Power for +30 days. The exact amount is 5 * min_fee + STEEM_POWER == 150 * min_fee. +You can pay any combination of STEEM and Steem Power along that curve +(so long as the minimum fee is paid).

+
+ +
+

The witness voted STEEM fee is now the minimum required STEEM fee for +delegation. Witnesses should reduce their fee by 30x when the hardfork +goes live to preserve the same required fee for an all STEEM account +creation.

+
+ +

Also see:

+ + +
Roles: active owner
+
Parameters: fee delegation creator new_account_name owner active posting memo_key json_metadata extensions
+ +
Example Op:
+ +
[
+  "account_create_with_delegation",
+  {
+    "fee": {
+      "amount": "3000",
+      "precision": 3,
+      "nai": "@@000000021"
+    },
+    "delegation": {
+      "amount": "0",
+      "precision": 6,
+      "nai": "@@000000037"
+    },
+    "creator": "steemit",
+    "new_account_name": "alice",
+    "owner": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM5Tki3ecCdCCHCjhhwvQvXuKryL2s34Ma6CXsRzntSUTYVYxCQ9",
+          1
+        ]
+      ]
+    },
+    "active": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM6LUoAA8gCL9tHRz7v9xcwR4ZWD3KDRHP5t1U7UAZHdfanLxyBE",
+          1
+        ]
+      ]
+    },
+    "posting": {
+      "weight_threshold": 1,
+      "account_auths": [],
+      "key_auths": [
+        [
+          "STM8anmpHdfVE4AmwsDpcSXpRsydHysEbv6vGJkRQy1d1CC83zeTA",
+          1
+        ]
+      ]
+    },
+    "memo_key": "STM67RYDyEkP1Ja1jFehJ45BFGA9oHHUnRnYbxKJEtMhVQiHW3S3k",
+    "json_metadata": "{}",
+    "extensions": []
+  }
+]
+
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+fill_convert_request + + +

+

Fills when conversion requests with a conversion date before the head +block time and then converts them to/from steem/sbd at the current +median price feed history price times the premium.

+ +
Roles: active owner
+
Parameters: owner requestid amount_in amount_out
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+author_reward + + +

+ +
Roles: posting active owner
+
Parameters: author permlink sbd_payout steem_payout vesting_payout
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+curation_reward + + +

+ +
Roles: posting active owner
+
Parameters: curator reward comment_author comment_permlink
+ +
+ +
    + +
  • Since: HF17
  • + + +
  • Virtual Operation
  • + + + +
+

+comment_reward + + +

+

See: #774

+ +
Roles: posting active owner
+
Parameters: author permlink payout
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
  • Disabled
  • + +
+

+liquidity_reward + + +

+

Deprecated as of HF12, see: #178.

+ +
Roles: active owner
+
Parameters: owner payout
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+interest + + +

+ +
Roles: active owner
+
Parameters: owner interest
+ +
Example Op:
+ +
[
+  "interest",
+  {"owner": "alice", "interest": "0.001 SBD"}
+]
+
+ +
+ +
    + +
  • Since: HF6
  • + + +
  • Virtual Operation
  • + + + +
+

+fill_vesting_withdraw + + +

+

See: #78

+ +
Roles: active owner
+
Parameters: from_account to_account withdrawn deposited
+ +
Example Op:
+ +
[
+  "fill_vesting_withdraw",
+  {
+    "from_account": "alice",
+    "to_account": "alice",
+    "withdrawn": "0.026475 VESTS",
+    "deposited": "0.710 STEEM"
+  }
+]
+
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+fill_order + + +

+ +
Roles: posting active owner
+
Parameters: current_owner current_orderid current_pays open_owner open_orderid open_pays
+ +
Example Op:
+ +
[
+  "fill_order",
+  {
+    "current_owner": "alice",
+    "current_orderid": 42896,
+    "current_pays": "94.999 SBD",
+    "open_owner": "bob",
+    "open_orderid": 10001,
+    "open_pays": "500.000 STEEM"
+  }
+]
+
+ +
+ +
    + +
  • Since: HF14
  • + + +
  • Virtual Operation
  • + + + +
+

+shutdown_witness + + +

+

When a witness goes offline.

+ +

See: #278

+ +
Roles: posting active owner
+
Parameters: owner
+ +
Example Op:
+ +
["shutdown_witness", {"owner": "alice"}]
+
+ +
+ +
    + +
  • Since: HF14
  • + + +
  • Virtual Operation
  • + + + +
+

+fill_transfer_from_savings + + +

+ +
Roles: posting active owner
+
Parameters: from to amount request_id memo
+ +
+ +
    + +
  • Since: HF9
  • + + +
  • Virtual Operation
  • + + + +
+

+hardfork + + +

+ +
Roles: posting active owner
+
Parameters: hardfork_id
+ +
+ +
    + + +
  • Virtual Operation
  • + + + +
+

+comment_payout_update + + +

+ +
Roles: posting active owner
+
Parameters: author permlink
+ +
+ +
    + +
  • Since: HF17
  • + + +
  • Virtual Operation
  • + + + +
+

+return_vesting_delegation + + +

+ +
Roles: posting active owner
+
Parameters: account vesting_shares
+ +
+ +
    + +
  • Since: HF17
  • + + +
  • Virtual Operation
  • + + + +
+

+comment_benefactor_reward + + +

+ +
Roles: posting active owner
+
Parameters: benefactor author permlink reward
+ +
+ +
    + +
  • Since: HF17
  • + + +
  • Virtual Operation
  • + + + +
+

+producer_reward + + +

+

Witness rewards for block signing are hard to account for. Making these +rewards visible will help witnesses and prospective witnesses by +providing them with more complete and accurate information to guide +their decisions to invest in the platform.

+ +
Roles: posting active owner
+
Parameters: producer vesting_shares
+ +
Example Op:
+ +
[
+  "producer_reward",
+  {
+    "producer": "alice",
+    "vesting_shares": "14403.626449 VESTS"
+  }
+]
+
+ +
+ + +
+ + + +
+ + + + + + + + diff --git a/docs/apidefinitions/jsonrpc.html b/docs/apidefinitions/jsonrpc.html new file mode 100644 index 00000000..4f58ff7e --- /dev/null +++ b/docs/apidefinitions/jsonrpc.html @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + +Jsonrpc | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup information about the JSON RPC API. These AppBase API methods are still under development and subject to change.

+ + +

jsonrpc.get_methods

+

Returns a list of methods supported by the JSON RPC API.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
[]
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_methods", "id":1}' https://api.steemit.com
+
+ +
+ + +

jsonrpc.get_signature

+

Returns the signature information for a JSON RPC method including the arguments and expected response JSON.

+
Query Parameters JSON
+
{"method": ""}
+
+
Expected Response JSON
+
{"args": null, "ret": null}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"jsonrpc.get_methods"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"jsonrpc.get_signature"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"condenser_api.get_dynamic_global_properties"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"jsonrpc.get_signature", "params":{"method":"database_api.get_dynamic_global_properties"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/market-history-api.html b/docs/apidefinitions/market-history-api.html new file mode 100644 index 00000000..0946881c --- /dev/null +++ b/docs/apidefinitions/market-history-api.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + +Market History Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup market history information. These AppBase API methods are still under development and subject to change.

+ + +

market_history_api.get_market_history

+

Returns the market history for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{
+  "bucket_seconds": 0,
+  "start": "1970-01-01T00:00:00",
+  "end": "1970-01-01T00:00:00"
+}
+
+
Expected Response JSON
+
{"buckets": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":15,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":60,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":300,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":3600,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history", "params":{"bucket_seconds":86400,"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_market_history_buckets

+

Returns the bucket seconds being tracked by the plugin.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{"bucket_sizes": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_market_history_buckets", "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_order_book

+

Returns the internal market order book.

+
Query Parameters JSON
+
{"limit": 500}
+
+
Expected Response JSON
+
{"bids": [], "asks": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_order_book", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_order_book", "params":{"limit":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_recent_trades

+

Returns the most recent trades for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{"limit": 1000}
+
+
Expected Response JSON
+
{"trades": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_recent_trades", "params":{"limit":10}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_recent_trades", "params":{"limit":500}, "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_ticker

+

Returns the market ticker for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "latest": "0.00000000000000000",
+  "lowest_ask": "0.00000000000000000",
+  "highest_bid": "0.00000000000000000",
+  "percent_change": "0.00000000000000000",
+  "steem_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_ticker", "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_trade_history

+

Returns the trade history for the internal SBD:STEEM market.

+
Query Parameters JSON
+
{
+  "start": "1970-01-01T00:00:00",
+  "end": "1970-01-01T00:00:00",
+  "limit": 1000
+}
+
+
Expected Response JSON
+
{"trades": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_trade_history", "params":{"start":"2018-01-01T00:00:00","end":"2018-01-02T00:00:00","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +

market_history_api.get_volume

+

Returns the market volume for the past 24 hours.

+
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "steem_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "sbd_volume": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"market_history_api.get_volume", "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/network-broadcast-api.html b/docs/apidefinitions/network-broadcast-api.html new file mode 100644 index 00000000..ecadea77 --- /dev/null +++ b/docs/apidefinitions/network-broadcast-api.html @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + +Network Broadcast Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to broadcast transactions and blocks. These AppBase API methods are +still under development and subject to change.

+ +

Also see: Blockchain Ops

+ + +

network_broadcast_api.broadcast_block

+

Used to broadcast a block.

+
Query Parameters JSON
+
{
+  "block": {
+    "previous": "0000000000000000000000000000000000000000",
+    "timestamp": "1970-01-01T00:00:00",
+    "witness": "",
+    "transaction_merkle_root": "0000000000000000000000000000000000000000",
+    "extensions": [],
+    "witness_signature": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+    "transactions": []
+  }
+}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_block", "params":{"block":{"previous":"0000000000000000000000000000000000000000","timestamp":"1970-01-01T00:00:00","witness":"","transaction_merkle_root":"0000000000000000000000000000000000000000","extensions":[],"witness_signature":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactions":[]}}, "id":1}' https://api.steemit.com
+
+ +
+ + +

network_broadcast_api.broadcast_transaction

+

Used to broadcast a transaction.

+
Query Parameters JSON
+
{
+  "trx": {
+    "ref_block_num": 0,
+    "ref_block_prefix": 0,
+    "expiration": "1970-01-01T00:00:00",
+    "operations": [],
+    "extensions": [],
+    "signatures": []
+  },
+  "max_block_age": -1
+}
+
+
Expected Response JSON
+
{}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_transaction", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"vote_operation","value":{"voter":"steemit","author":"alice","permlink":"a-post-by-alice","weight":10000}}],"extensions":[],"signatures":[]},"max_block_age":50}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"network_broadcast_api.broadcast_transaction", "params":{"trx":{"ref_block_num":1097,"ref_block_prefix":2181793527,"expiration":"2016-03-24T18:00:21","operations":[{"type":"pow_operation","value":{"worker_account":"cloop3","block_id":"00000449f7860b82b4fbe2f317c670e9f01d6d9a","nonce":3899,"work":{"worker":"STM7P5TDnA87Pj9T4mf6YHrhzjC1KbPZpNxLWCcVcHxNYXakpoT4F","input":"ae8e7c677119d22385f8c48026fee7aad7bba693bf788d7f27047f40b47738c0","signature":"1f38fe9a3f9989f84bd94aa5bbc88beaf09b67f825aa4450cf5105d111149ba6db560b582c7dbb026c7fc9c2eb5051815a72b17f6896ed59d3851d9a0f9883ca7a","work":"000e7b209d58f2e64b36e9bf12b999c6c7af168cc3fc41eb7f8a4bf796c174c3"},"props":{"account_creation_fee":{"amount":"100000","precision":3,"nai":"@@000000021"},"maximum_block_size":131072,"sbd_interest_rate":1000}}}],"extensions":[],"signatures":[]},"max_block_age":50}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/rc-api.html b/docs/apidefinitions/rc-api.html new file mode 100644 index 00000000..68b4ec6a --- /dev/null +++ b/docs/apidefinitions/rc-api.html @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + +Rc Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Allows querying of various Resource Credit metrics. See: RC Bandwidth System, 0.20.2 Release Notes, Developer Guide: Resource Credit System

+ + +

rc_api.find_rc_accounts

+

Returns the available resource credits of accounts. Parameters: accounts:string array

+ + + + + + + + + + + + + + + + + + +
accounts (string) 
"steemit"Query the available resource credits for the account named “steemit”.
"alice"Query the available resource credits for the accounts named “alice” and “bob”.
+ +
Query Parameters JSON
+
{"accounts": []}
+
+
Expected Response JSON
+
{
+  "rc_accounts": [
+    {
+      "account": "",
+      "rc_manabar": {"current_mana": "0", "last_update_time": 0},
+      "max_rc_creation_adjustment": {
+        "amount": "0",
+        "precision": 6,
+        "nai": "@@000000037"
+      },
+      "max_rc": "0"
+    }
+  ]
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.find_rc_accounts", "params":{"accounts":["steemit"]}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.find_rc_accounts", "params":{"accounts":["alice","bob"]}, "id":1}' https://api.steemit.com
+
+ +
+ + +

rc_api.get_resource_params

+

Work in progress. See: #2980

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "resource_names": [
+    "resource_history_bytes",
+    "resource_new_accounts",
+    "resource_market_bytes",
+    "resource_state_bytes",
+    "resource_execution_time"
+  ],
+  "resource_params": {
+    "resource_history_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 347222,
+        "pool_eq": "216404314004",
+        "max_pool_size": "432808628007",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": 1690658703,
+        "shift": 49
+      }
+    },
+    "resource_new_accounts": {
+      "resource_dynamics_params": {
+        "resource_unit": 10000,
+        "budget_per_time_unit": 797,
+        "pool_eq": 157691079,
+        "max_pool_size": 157691079,
+        "decay_params": {
+          "decay_per_time_unit": 347321,
+          "decay_per_time_unit_denom_shift": 36
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "16484671763857882971",
+        "coeff_b": 1231961,
+        "shift": 51
+      }
+    },
+    "resource_market_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 10,
+        "budget_per_time_unit": 578704,
+        "pool_eq": "16030041350",
+        "max_pool_size": "32060082699",
+        "decay_params": {
+          "decay_per_time_unit": 2540365427,
+          "decay_per_time_unit_denom_shift": 46
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "9231393461629499392",
+        "coeff_b": 125234698,
+        "shift": 53
+      }
+    },
+    "resource_state_bytes": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 231481481,
+        "pool_eq": "144269542669147",
+        "max_pool_size": "288539085338293",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": "1127105802103",
+        "shift": 49
+      }
+    },
+    "resource_execution_time": {
+      "resource_dynamics_params": {
+        "resource_unit": 1,
+        "budget_per_time_unit": 82191781,
+        "pool_eq": "51225569123068",
+        "max_pool_size": "102451138246135",
+        "decay_params": {
+          "decay_per_time_unit": 3613026481,
+          "decay_per_time_unit_denom_shift": 51
+        },
+        "min_decay": 0
+      },
+      "price_curve_params": {
+        "coeff_a": "12981647055416481792",
+        "coeff_b": "400199758774",
+        "shift": 49
+      }
+    }
+  },
+  "size_info": {
+    "resource_state_bytes": {
+      "authority_base_size": 40000,
+      "authority_account_member_size": 180000,
+      "authority_key_member_size": 350000,
+      "account_object_base_size": 4800000,
+      "account_authority_object_base_size": 400000,
+      "account_recovery_request_object_base_size": 320000,
+      "comment_object_base_size": 2010000,
+      "comment_object_permlink_char_size": 10000,
+      "comment_object_parent_permlink_char_size": 20000,
+      "comment_object_beneficiaries_member_size": 180000,
+      "comment_vote_object_base_size": 470000,
+      "convert_request_object_base_size": 480000,
+      "decline_voting_rights_request_object_base_size": 280000,
+      "escrow_object_base_size": 1190000,
+      "limit_order_object_base_size": 147440,
+      "savings_withdraw_object_byte_size": 14656,
+      "transaction_object_base_size": 6090,
+      "transaction_object_byte_size": 174,
+      "vesting_delegation_object_base_size": 600000,
+      "vesting_delegation_expiration_object_base_size": 440000,
+      "withdraw_vesting_route_object_base_size": 430000,
+      "witness_object_base_size": 2660000,
+      "witness_object_url_char_size": 10000,
+      "witness_vote_object_base_size": 400000,
+      "STATE_BYTES_SCALE": 10000
+    },
+    "resource_execution_time": {
+      "account_create_operation_exec_time": 57700,
+      "account_create_with_delegation_operation_exec_time": 57700,
+      "account_update_operation_exec_time": 14000,
+      "account_witness_proxy_operation_exec_time": 117000,
+      "account_witness_vote_operation_exec_time": 23000,
+      "cancel_transfer_from_savings_operation_exec_time": 11500,
+      "change_recovery_account_operation_exec_time": 12000,
+      "claim_account_operation_exec_time": 10000,
+      "claim_reward_balance_operation_exec_time": 50300,
+      "comment_operation_exec_time": 114100,
+      "comment_options_operation_exec_time": 13200,
+      "convert_operation_exec_time": 15700,
+      "create_claimed_account_operation_exec_time": 57700,
+      "custom_operation_exec_time": 228000,
+      "custom_json_operation_exec_time": 228000,
+      "custom_binary_operation_exec_time": 228000,
+      "decline_voting_rights_operation_exec_time": 5300,
+      "delegate_vesting_shares_operation_exec_time": 19900,
+      "delete_comment_operation_exec_time": 51100,
+      "escrow_approve_operation_exec_time": 9900,
+      "escrow_dispute_operation_exec_time": 11500,
+      "escrow_release_operation_exec_time": 17200,
+      "escrow_transfer_operation_exec_time": 19100,
+      "feed_publish_operation_exec_time": 6200,
+      "limit_order_cancel_operation_exec_time": 9600,
+      "limit_order_create_operation_exec_time": 31700,
+      "limit_order_create2_operation_exec_time": 31700,
+      "request_account_recovery_operation_exec_time": 54400,
+      "set_withdraw_vesting_route_operation_exec_time": 17900,
+      "transfer_from_savings_operation_exec_time": 17500,
+      "transfer_operation_exec_time": 9600,
+      "transfer_to_savings_operation_exec_time": 6400,
+      "transfer_to_vesting_operation_exec_time": 44400,
+      "vote_operation_exec_time": 26500,
+      "withdraw_vesting_operation_exec_time": 10400,
+      "witness_set_properties_operation_exec_time": 9500,
+      "witness_update_operation_exec_time": 9500
+    }
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.get_resource_params", "id":1}' https://api.steemit.com
+
+ +
+ + +

rc_api.get_resource_pool

+

Work in progress. See: #2563, PR#2678

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "resource_pool": {
+    "resource_history_bytes": {"pool": "200825644923"},
+    "resource_new_accounts": {"pool": 37393465},
+    "resource_market_bytes": {"pool": "15915722826"},
+    "resource_state_bytes": {"pool": "132151641791507"},
+    "resource_execution_time": {"pool": "47739958648192"}
+  }
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"rc_api.get_resource_pool", "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/tags-api.html b/docs/apidefinitions/tags-api.html new file mode 100644 index 00000000..5662f463 --- /dev/null +++ b/docs/apidefinitions/tags-api.html @@ -0,0 +1,971 @@ + + + + + + + + + + + + + + + + + + +Tags Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

Used to lookup information about tags, posts, and discussions. These AppBase API methods are still under development and subject to change.

+ + +

tags_api.get_active_votes

+

Returns all votes for the given post.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"votes": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_active_votes", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_active_votes", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_comment_discussions_by_payout

+

Returns a list of discussions based on payout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_comment_discussions_by_payout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_comment_discussions_by_payout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_content_replies

+

Returns a list of replies.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_content_replies", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_content_replies", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussion

+

Returns the discussion given an author and permlink.

+
Query Parameters JSON
+
{"author": "", "permlink": ""}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "author": "",
+  "permlink": "",
+  "category": "",
+  "parent_author": "",
+  "parent_permlink": "",
+  "title": "",
+  "body": "",
+  "json_metadata": "",
+  "last_update": "1970-01-01T00:00:00",
+  "created": "1970-01-01T00:00:00",
+  "active": "1970-01-01T00:00:00",
+  "last_payout": "1970-01-01T00:00:00",
+  "depth": 0,
+  "children": 0,
+  "net_rshares": 0,
+  "abs_rshares": 0,
+  "vote_rshares": 0,
+  "children_abs_rshares": 0,
+  "cashout_time": "1970-01-01T00:00:00",
+  "max_cashout_time": "1970-01-01T00:00:00",
+  "total_vote_weight": 0,
+  "reward_weight": 0,
+  "total_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "curator_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "author_rewards": 0,
+  "net_votes": 0,
+  "root_author": "",
+  "root_permlink": "",
+  "max_accepted_payout": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "percent_steem_dollars": 0,
+  "allow_replies": false,
+  "allow_votes": false,
+  "allow_curation_rewards": false,
+  "beneficiaries": [],
+  "url": "",
+  "root_title": "",
+  "pending_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "total_pending_payout_value": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000021"
+  },
+  "active_votes": [],
+  "replies": [],
+  "author_reputation": 0,
+  "promoted": {
+    "amount": "0",
+    "precision": 3,
+    "nai": "@@000000013"
+  },
+  "body_length": 0,
+  "reblogged_by": []
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussion", "params":{"author":"steemit", "permlink":"firstpost"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussion", "params":{"author":"alice", "permlink":"a-post-by-alice"}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_active

+

Returns a list of discussions based on active.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_active", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_active", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_author_before_date

+

Returns a list of discussions based on author before date.

+
Query Parameters JSON
+
{
+  "author": "",
+  "start_permlink": "",
+  "before_date": "1970-01-01T00:00:00",
+  "limit": 100
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_author_before_date", "params":{"author":"steemit","start_permlink":"firstpost","before_date":"2016-04-19T22:49:43","limit":1}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_blog

+

Returns a list of discussions by blog.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_blog", "params":{"tag":"steemit","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_blog", "params":{"tag":"alice","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_cashout

+

Returns a list of discussions by cashout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_cashout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_cashout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_children

+

Returns a list of discussions by children.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_children", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_children", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_comments

+

Returns a list of discussions by comments.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_comments", "params":{"start_author":"steemit","start_permlink":"firstpost","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_comments", "params":{"start_author":"alice","start_permlink":"a-post-by-alice","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_created

+

Returns a list of discussions by created.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_created", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_created", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_feed

+

Returns a list of discussions by feed.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_feed", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_feed", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_hot

+

Returns a list of discussions by hot.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_hot", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_hot", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_promoted

+

Returns a list of discussions by promoted.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_promoted", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_promoted", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + + +

Returns a list of discussions by trending.

+ +
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+ +
{"discussions": []}
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_trending", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_trending", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_discussions_by_votes

+

Returns a list of discussions by votes.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_votes", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_discussions_by_votes", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_post_discussions_by_payout

+

Returns a list of post discussions by payout.

+
Query Parameters JSON
+
{
+  "tag": "",
+  "limit": 0,
+  "filter_tags": [],
+  "select_authors": [],
+  "select_tags": [],
+  "truncate_body": 0
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_post_discussions_by_payout", "params":{"tag":"steem","limit":1}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_post_discussions_by_payout", "params":{"tag":"photography","limit":10,"truncate_body":0}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_replies_by_last_update

+

Returns a list of replies by last update.

+
Query Parameters JSON
+
{
+  "start_parent_author": "",
+  "start_permlink": "",
+  "limit": 100
+}
+
+
Expected Response JSON
+
{"discussions": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_replies_by_last_update", "params":{"start_parent_author":"steemit","start_permlink":"firstpost","limit":1}, "id":1}' https://api.steemit.com
+
+ +
+ + +

tags_api.get_tags_used_by_author

+

Returns a list of tags used by an author.

+
Query Parameters JSON
+
{"author": ""}
+
+
Expected Response JSON
+
{"tags": []}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_tags_used_by_author", "params":{"author":"steemit"}, "id":1}' https://api.steemit.com
+
+ +
+ + + +

Returns the list of trending tags.

+ +
{"start_tag": "", "limit": 100}
+
+ +
{"tags": []}
+
+ + + +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_trending_tags", "params":{"start_tag":null,"limit":100}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"tags_api.get_trending_tags", "params":{"start_tag":"steem","limit":10}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apidefinitions/witness-api.html b/docs/apidefinitions/witness-api.html new file mode 100644 index 00000000..d48afe85 --- /dev/null +++ b/docs/apidefinitions/witness-api.html @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + +Witness Api | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ +

API removed in 0.20.6, see: #3029

+ + +

witness_api.get_account_bandwidth

+

Disabled since 0.20.6, see: #3029

+ +

Returns the available bandwidth of an account. See: Forum/Market Bandwidth

+ +
Query Parameters JSON
+
{"account": "", "type": "post"}
+
+
Expected Response JSON
+
{}
+
+ +
+ + +

witness_api.get_reserve_ratio

+

Disabled since 0.20.6, see: #3029

+ +

Returns the current reserve ratio.

+ +
Query Parameters JSON
+
{}
+
+
Expected Response JSON
+
{
+  "id": 0,
+  "average_block_size": 0,
+  "current_reserve_ratio": 1,
+  "max_virtual_bandwidth": "0"
+}
+
+ +
Example curl
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"witness_api.get_account_bandwidth", "params":{"account":"steemit","type":"forum"}, "id":1}' https://api.steemit.com
+
+ +
curl -s --data '{"jsonrpc":"2.0", "method":"witness_api.get_account_bandwidth", "params":{"account":"alice","type":"market"}, "id":1}' https://api.steemit.com
+
+ +
+ + +
+ + + + + + + + diff --git a/docs/apple-touch-icon.png b/docs/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..815caab2f2a8384f68ab7ece2bcd16217aabe47c GIT binary patch literal 1058 zcmeAS@N?(olHy`uVBq!ia0y~yVAuk}9Lx+13|zwB7#J8Bj01c^Tp1V`l;ssjLLcnp zqZk+%1WSVaf*BGF{(mUAAh1ATLqos;hX)hZd^x|1fq}W#)5S5Q;?~>Sx0B{5h_pWJ zZI*F4_`Uwtvwfb?pPREiV!x}!&p7+c;MhEy%1@IYPvbnRzyC~n9plzBJXeg215TfD z&^2ZzmlL%)j`xhiTJ!acD?-z{9o8DE8!wnPvoR`-Eo-Laiqy0P*Jhs;Hoh%>fbe9WT&mO zv-q_m>)ETRv#y^`Tla0I*l}0m@Xt&)8zfiEZ460Z%i1<)`}O53)0(d?{cU$La{m#1 zHD5Mn-ZMGI)85S1d@%X&t2@OD%wNyl`#ivU!$a2j8q%-aX356$dTp26d#mHfwbkMI z3AL=uExSVYZJ7Mf(tfsGLN)s-o^^&hk00D{v|2yq{Apczamn|gXZ4nSn1As3qeH6? z-@L$L({A))_TN=j59Sx#dQfx8L22)TlZ!8^@72Ilmu&vJMO1@OWFhs(E|l zw~EalBX0=)VqoVK=-5^dz5pj{JKR)@Xo50mkvb6O=Iahy2;{0 z?b;&2`Ri6l|6mH8CcLL!=QLlQ!jj!fZ_bKidcQn-b@HZv7Y~F_{3UzOXZA9lIPIWR z=6u!@LHqxPH7I=eWpLK~LRzHth0naDtp5#+E;_u{|0>qdmpg6kq`LN3ix=k1`mE#q zWl^L>WaEz#Odh=uj+WR_~adA=7G7A6JUX)fHlqOf4=y)##< zjKhmJyPbVM`Iq|3s=Ly1`)jr~-u%l^e8SA+bi*M(!3LA?n!4@MLDBx7C%&C_q^|jG z_-{SNhqlx;rOAVRs{^MiP7aBA4q9i7$dKr*5?0yiz!Jhmzm!z3!WC|6937 zT7chExBb6y#o2FtC#!GPE#LlF$Mn{0_3KfwKRy0>Y*F{0XHz--57U{ + + + + + + + + + + + + + + + + + +Sharing & Help | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+

Developer Advocate

+ +

The members of the Steemit Inc. development team are currently the main contributors to the Steem blockchain software. They oversee the open source Steem GitHub repository, and maintain many of the open source libraries that developers use.

+ +

Steemit’s Developer Advocate is here to make the process of developing for the Steem platform as smooth as possible. If you have any comments, concerns, or suggestions about how to improve the experience of developing applications with the Steem blockchain - please reach out.

+ +

The D.A. receives a lot of emails, but will respond as quickly as possible.

+ +
+ +

SteemDevs Chat - https://discord.gg/B29Bbng

+ +

SteemDevs chat is a public Discord chat community where members of the Steem development community go to discuss Steem development, and other related topics. +It is a great place to go to ask questions, meet other developers that are working on Steem projects, share tips and code snippets, and discuss the items you are working on.

+ + +
+ + + + + + + + diff --git a/docs/community/index.html b/docs/community/index.html new file mode 100644 index 00000000..c229b5bd --- /dev/null +++ b/docs/community/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + +Community | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal - Community

+ + + +
+ + + + +
+

+ + Overview + + +

+ + +

The steem community is thriving with developer activity and projects to support +our great blockchain steem.

+ +

While we don’t officially endorse the following projects, below are growing community developer +projects which could be beneficial for your steem project.

+ +
+ +
+

+ + Resources + + +

+ + +

Libraries, tools

+ +

Radiator - https://github.com/inertia186/radiator

+ +

Radiator is a Ruby API client to interact with the steem blockchain.

+ +
+ +

SteemJS - https://github.com/svk31/steemjs-lib

+ +

Pure JavaScript Steem crypto library for node.js and browsers. Can be used to construct, sign and broadcast transactions in JavaScript.

+ +
+ +

Beem - https://github.com/holgern/beem

+ +

A python library to interact with the STEEM blockchain. It includes the CLI tool beempy.

+ +
+ +

Piston-cli - https://github.com/xeroc/piston-cli

+ +

This python library is unmaintained! Swiss army knife for interacting with the STEEM blockchain.

+ +
+ +

ChainSync - https://github.com/aaroncox/chainsync

+ +

A simple library to stream blocks and operations for digesting into other mediums.

+ +
+ +

SteemIAPI - http://steem.esteem.ws/

+ +

Interactive Steem API swagger, open-source script allows you to interact with blockchain.

+ +
+ +

PHP Steem - https://github.com/lukestokes/php-steem-tools

+ +

Various tools and scripts written in PHP for exploring the STEEM blockchain.

+ +
+ +

SteemJ - https://github.com/marvin-we/steem-java-api-wrapper

+ +

An API Wrapper for Steem written in Java

+ +
+ +

GoSteem - https://github.com/go-steem/rpc

+ +

Golang RPC client library for Steem

+ +
+ +

SteemClientRS - https://github.com/cyberpunk-ventures/steem-client-rs

+ +

Client library for Steem blockchain built with Rust

+ +

Services and databases

+ +

SteemSQL - http://www.steemsql.com/

+ +

A private Microsoft SQL server database with Steem blockchain data, subscription based, allows you to do flexible queries and analyze blockchain data.

+ +
+ +

Steem Data - https://github.com/SteemData

+ +

SteemData is discontinued but open-source python project, it parses the STEEM blockchain for you, and provide the data as a fast and convenient MongoDB service. SteemData helps developers and researchers build better STEEM applications.

+ +
+ +

SteemData-Ruby - https://github.com/steem-third-party/steem_data

+ +

Wrapper for accessing steemdata.com in a ruby application. It uses MongoID and ActiveModel to leverage all of the tools provided by those libraries.

+ +
+ +

eSync - https://github.com/eSteemApp/esync

+ +

eSync extracts Steem blockchain data and saves into Mongodb, written in Nodejs.

+ +
+ +

Glasnost - https://github.com/cyberpunk-ventures/glasnost

+ +

Glasnost is an GraphQL app server for Steem blockchain built with Elixir, Phoenix and Mnesia.

+ +
+ +

SteemConnect

+ +

Most people who will be implementing OAuth2 will want to find and utilize a library in the language of their choice. These libraries, while not necessarily built by Steemit, should support the SteemConnect API.

+ +
+ +

SteemConnect SDK - https://github.com/steemit/steemconnect-sdk

+ +

An official javascript library for utilizing SteemConnect.

+ +
+ +

steem-connect-firebase-function - https://jakipatryk.github.io/steemconnect-firebase-functions/

+ +

A TypeScript library that can help you build applications with SteemConnect and Firebase.

+ +
+ +

Sc2 SDK PHP - https://github.com/hernandev/sc2-sdk-php

+ +

Easily integrate STEEM blockchain into your PHP applications, though SteemConnect.

+ +
+ +

Social Auth SteemConnect - https://pypi.python.org/pypi/social-auth-steemconnect/0.0.2

+ +

Pluggable authentication backend for python-social-auth, that allows authentication via SteemConnect (v2).

+ +
+ +

steemconnect-python-client - https://github.com/emre/steemconnect-python-client

+ +

steemconnect-python-client is a simple yet powerful library to interact with the Steemconnect.

+ +
+ +

omniauth-steemconnect - https://rubygems.org/gems/omniauth-steemconnect/versions/0.1.0

+ +

Ruby Omniauth2 Strategy for SteemConnect.

+ +
+ +

SwiftyConnect - https://github.com/caspernikus/SwiftyConnect

+ +

SteemConnect Library for iOS / Swift.

+ +
+ +

SteemConnect4j - https://github.com/hapramp/steemconnect4j

+ +

Steemconnect SDK for Java.

+ +
+ +

Many more projects and tools can be found here https://steemprojects.com and https://steemtools.com

+ +
+ +
+

+ + Sharing & Help + + +

+ + +

Developer Advocate

+ +

The members of the Steemit Inc. development team are currently the main contributors to the Steem blockchain software. They oversee the open source Steem GitHub repository, and maintain many of the open source libraries that developers use.

+ +

Steemit’s Developer Advocate is here to make the process of developing for the Steem platform as smooth as possible. If you have any comments, concerns, or suggestions about how to improve the experience of developing applications with the Steem blockchain - please reach out.

+ +

The D.A. receives a lot of emails, but will respond as quickly as possible.

+ +
+ +

SteemDevs Chat - https://discord.gg/B29Bbng

+ +

SteemDevs chat is a public Discord chat community where members of the Steem development community go to discuss Steem development, and other related topics. +It is a great place to go to ask questions, meet other developers that are working on Steem projects, share tips and code snippets, and discuss the items you are working on.

+ + +
+ + + +
+ + + + + + + + diff --git a/docs/community/overview.html b/docs/community/overview.html new file mode 100644 index 00000000..0f17183a --- /dev/null +++ b/docs/community/overview.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + +Overview | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+

The steem community is thriving with developer activity and projects to support +our great blockchain steem.

+ +

While we don’t officially endorse the following projects, below are growing community developer +projects which could be beneficial for your steem project.

+ +
+ + + + + + + + diff --git a/docs/community/resources.html b/docs/community/resources.html new file mode 100644 index 00000000..40000655 --- /dev/null +++ b/docs/community/resources.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + +Resources | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+

Libraries, tools

+ +

Radiator - https://github.com/inertia186/radiator

+ +

Radiator is a Ruby API client to interact with the steem blockchain.

+ +
+ +

SteemJS - https://github.com/svk31/steemjs-lib

+ +

Pure JavaScript Steem crypto library for node.js and browsers. Can be used to construct, sign and broadcast transactions in JavaScript.

+ +
+ +

Beem - https://github.com/holgern/beem

+ +

A python library to interact with the STEEM blockchain. It includes the CLI tool beempy.

+ +
+ +

Piston-cli - https://github.com/xeroc/piston-cli

+ +

This python library is unmaintained! Swiss army knife for interacting with the STEEM blockchain.

+ +
+ +

ChainSync - https://github.com/aaroncox/chainsync

+ +

A simple library to stream blocks and operations for digesting into other mediums.

+ +
+ +

SteemIAPI - http://steem.esteem.ws/

+ +

Interactive Steem API swagger, open-source script allows you to interact with blockchain.

+ +
+ +

PHP Steem - https://github.com/lukestokes/php-steem-tools

+ +

Various tools and scripts written in PHP for exploring the STEEM blockchain.

+ +
+ +

SteemJ - https://github.com/marvin-we/steem-java-api-wrapper

+ +

An API Wrapper for Steem written in Java

+ +
+ +

GoSteem - https://github.com/go-steem/rpc

+ +

Golang RPC client library for Steem

+ +
+ +

SteemClientRS - https://github.com/cyberpunk-ventures/steem-client-rs

+ +

Client library for Steem blockchain built with Rust

+ +

Services and databases

+ +

SteemSQL - http://www.steemsql.com/

+ +

A private Microsoft SQL server database with Steem blockchain data, subscription based, allows you to do flexible queries and analyze blockchain data.

+ +
+ +

Steem Data - https://github.com/SteemData

+ +

SteemData is discontinued but open-source python project, it parses the STEEM blockchain for you, and provide the data as a fast and convenient MongoDB service. SteemData helps developers and researchers build better STEEM applications.

+ +
+ +

SteemData-Ruby - https://github.com/steem-third-party/steem_data

+ +

Wrapper for accessing steemdata.com in a ruby application. It uses MongoID and ActiveModel to leverage all of the tools provided by those libraries.

+ +
+ +

eSync - https://github.com/eSteemApp/esync

+ +

eSync extracts Steem blockchain data and saves into Mongodb, written in Nodejs.

+ +
+ +

Glasnost - https://github.com/cyberpunk-ventures/glasnost

+ +

Glasnost is an GraphQL app server for Steem blockchain built with Elixir, Phoenix and Mnesia.

+ +
+ +

SteemConnect

+ +

Most people who will be implementing OAuth2 will want to find and utilize a library in the language of their choice. These libraries, while not necessarily built by Steemit, should support the SteemConnect API.

+ +
+ +

SteemConnect SDK - https://github.com/steemit/steemconnect-sdk

+ +

An official javascript library for utilizing SteemConnect.

+ +
+ +

steem-connect-firebase-function - https://jakipatryk.github.io/steemconnect-firebase-functions/

+ +

A TypeScript library that can help you build applications with SteemConnect and Firebase.

+ +
+ +

Sc2 SDK PHP - https://github.com/hernandev/sc2-sdk-php

+ +

Easily integrate STEEM blockchain into your PHP applications, though SteemConnect.

+ +
+ +

Social Auth SteemConnect - https://pypi.python.org/pypi/social-auth-steemconnect/0.0.2

+ +

Pluggable authentication backend for python-social-auth, that allows authentication via SteemConnect (v2).

+ +
+ +

steemconnect-python-client - https://github.com/emre/steemconnect-python-client

+ +

steemconnect-python-client is a simple yet powerful library to interact with the Steemconnect.

+ +
+ +

omniauth-steemconnect - https://rubygems.org/gems/omniauth-steemconnect/versions/0.1.0

+ +

Ruby Omniauth2 Strategy for SteemConnect.

+ +
+ +

SwiftyConnect - https://github.com/caspernikus/SwiftyConnect

+ +

SteemConnect Library for iOS / Swift.

+ +
+ +

SteemConnect4j - https://github.com/hapramp/steemconnect4j

+ +

Steemconnect SDK for Java.

+ +
+ +

Many more projects and tools can be found here https://steemprojects.com and https://steemtools.com

+ +
+ + + + + + + + diff --git a/docs/css/css/fa-brands.css b/docs/css/css/fa-brands.css new file mode 100644 index 00000000..7a11355a --- /dev/null +++ b/docs/css/css/fa-brands.css @@ -0,0 +1,13 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: normal; + src: url("../webfonts/fa-brands-400.eot"); + src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; } diff --git a/docs/css/css/fa-brands.min.css b/docs/css/css/fa-brands.min.css new file mode 100644 index 00000000..15cc6827 --- /dev/null +++ b/docs/css/css/fa-brands.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands} \ No newline at end of file diff --git a/docs/css/css/fa-regular.css b/docs/css/css/fa-regular.css new file mode 100644 index 00000000..845ac418 --- /dev/null +++ b/docs/css/css/fa-regular.css @@ -0,0 +1,14 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + src: url("../webfonts/fa-regular-400.eot"); + src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } diff --git a/docs/css/css/fa-regular.min.css b/docs/css/css/fa-regular.min.css new file mode 100644 index 00000000..b0bc616a --- /dev/null +++ b/docs/css/css/fa-regular.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400} \ No newline at end of file diff --git a/docs/css/css/fa-solid.css b/docs/css/css/fa-solid.css new file mode 100644 index 00000000..c0072d54 --- /dev/null +++ b/docs/css/css/fa-solid.css @@ -0,0 +1,15 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + src: url("../webfonts/fa-solid-900.eot"); + src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/docs/css/css/fa-solid.min.css b/docs/css/css/fa-solid.min.css new file mode 100644 index 00000000..e861a9da --- /dev/null +++ b/docs/css/css/fa-solid.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900} \ No newline at end of file diff --git a/docs/css/css/fontawesome-all.css b/docs/css/css/fontawesome-all.css new file mode 100644 index 00000000..ec052ff5 --- /dev/null +++ b/docs/css/css/fontawesome-all.css @@ -0,0 +1,2861 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: normal; + src: url("../webfonts/fa-brands-400.eot"); + src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + src: url("../webfonts/fa-regular-400.eot"); + src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + src: url("../webfonts/fa-solid-900.eot"); + src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/docs/css/css/fontawesome-all.min.css b/docs/css/css/fontawesome-all.min.css new file mode 100644 index 00000000..0c0e4e00 --- /dev/null +++ b/docs/css/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/docs/css/css/fontawesome.css b/docs/css/css/fontawesome.css new file mode 100644 index 00000000..d58b1b24 --- /dev/null +++ b/docs/css/css/fontawesome.css @@ -0,0 +1,2831 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-male:before { + content: "\f183"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nintendo-switch:before { + content: "\f418"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-random:before { + content: "\f074"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-road:before { + content: "\f018"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-train:before { + content: "\f238"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } diff --git a/docs/css/css/fontawesome.min.css b/docs/css/css/fontawesome.min.css new file mode 100644 index 00000000..0db07bdb --- /dev/null +++ b/docs/css/css/fontawesome.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.10 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frown:before{content:"\f119"}.fa-futbol:before{content:"\f1e3"}.fa-gamepad:before{content:"\f11b"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-strava:before{content:"\f428"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-circle:before{content:"\f2bd"}.fa-user-md:before{content:"\f0f0"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/docs/css/style.css b/docs/css/style.css new file mode 100644 index 00000000..0417d01f --- /dev/null +++ b/docs/css/style.css @@ -0,0 +1,1099 @@ +html, body { + padding: 0; + margin: 0; } + +body, .main { + box-sizing: border-box; + min-height: 100vh; } + +html { + font-size: 62.5%; + color: #474a54; + background: #232323; + height: 100vh; } + +@media (max-width: 700px) { + .sidebar, header > form { + display: none; } + + .sidebar h6 { + font-size: 1.4em; } + + .sidebar a { + padding: 10px 0; } + + body .main { + margin: 45px 0 0 0; } } +body { + font-size: 1.6rem; + line-height: 1.6; + font-weight: 400; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; + background: #fcfcfc; } + body.nav-open { + overflow: hidden; } + body.nav-open .sidebar, + body.nav-open header > form { + display: block; } + body.nav-open header { + bottom: 0; } + +table { + border: 1px solid #E1E1E1; + margin: 0 0 20px 0; + border-collapse: collapse; } + +th, td { + border: 1px solid #ccc; + padding: 10px; + font-size: .9em; + text-align: left; } + +th { + background: #f7f7f7; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + font-weight: 300; } + +h1 { + font-size: 4.0rem; + line-height: 1.2; + letter-spacing: 0rem; } + +h2 { + font-size: 3.6rem; + line-height: 1.25; + letter-spacing: 0rem; } + +h3 { + font-size: 3.0rem; + line-height: 1.3; + letter-spacing: 0rem; + font-weight: 900; } + +h4 { + font-size: 2.4rem; + line-height: 1.35; + letter-spacing: 0rem; + margin: 0 0 5px 0; } + +h5 { + font-size: 1.8rem; + line-height: 1.5; + letter-spacing: 0rem; + margin-bottom: 4px; + font-weight: bold; + font-weight: 500; } + +p { + margin-top: 0; } + +h3 a { + text-decoration: none; + color: #474a54; } + +h3 a:hover { + text-decoration: none; + color: #474a54; } + +a { + color: #4BA2F2; + text-decoration: none; + transition: 0.3s all ease-in-out; } + +a:hover, a:focus { + color: #1A5099; + text-decoration: underline; } + +pre { + white-space: pre-wrap; + font-size: 1em; + margin: 22px 0; + word-wrap: break-word; } + +dl { + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + padding: 0 0 20px 0; + margin: 0 0 20px 0; } + +dl dt { + width: 30%; + float: left; + font-weight: bold; + position: relative; + top: 20px; } + +dl dd { + margin-left: 30%; + padding-left: 15px; + margin-top: 20px; } + +dl dd + dd { + margin-top: 0; } + +dl dd:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; } + +.sidebar h6 { + text-transform: uppercase; + line-height: 1em; + font-size: 1.5rem; + letter-spacing: 1px; + font-weight: 900; + color: #474a54; } + +.sidebar { + padding: 20px 20px 0 20px; + white-space: nowrap; + overflow-y: auto; } + .sidebar section { + padding: 10px 0; } + .sidebar ul { + padding: 0 0 0 10px; + margin: 0; + list-style: none; } + .sidebar h6 { + padding: 0; + margin: 0 0 5px 0; } + .sidebar a { + color: #364149; + text-decoration: none; + font-size: .90em; + display: block; + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + padding: 2px 0; + transition: 0.3s color ease-in-out; } + .sidebar a.active { + color: #2196F3; + text-decoration: none; } + .sidebar a:hover, .sidebar a:focus { + color: #2196F3; } + +.endpoint { + font-size: 10px; + padding: 0 2px; + position: relative; } + +h3 .endpoint { + padding: 4px 6px; + font-size: 19px; } + +.endpoint.put { + color: #7E57C2; } + .endpoint.put:after { + content: "PUT"; } + +.endpoint.delete { + color: #FF7043; } + .endpoint.delete:after { + content: "DELETE"; } + +.endpoint.get { + color: #66BB6A; } + .endpoint.get:after { + content: "GET"; } + +.endpoint.post { + color: #42A5F5; } + .endpoint.post:after { + content: "POST"; } + +.main { + margin: 0 0 0 210px; + border-left: 1px solid #eee; } + .main h6 { + font-size: 1.01em; + padding: 0 0 6px 0; + margin: 0; } + .main .description { + color: #aaa; + margin-top: -11px; } + .main .overview { + color: #aaa; + background: #fefefe; } + @media (max-width: 700px) { + .main { + margin: 0; } } + +hr { + border: 0; + border-top: 1px solid #ddd; + margin: 20px 0; } + +.error, .warning, .info, .success { + border-left: 5px solid #FD0; + padding: 10px 15px; + margin-left: -20px; + margin-right: -15px; + background-color: #FAFAFA; + border-radius: 2px; } + +.info { + border-color: #56ADEC; } + +.error { + border-color: #F20; } + +.success { + border-color: #6c0; } + +.doc-content { + width: 100%; + border: 0; + -moz-border-image: -moz-linear-gradient(left, #eee 0%, #eee 50%, #333333 50%); + -webkit-border-image: -webkit-linear-gradient(left, #eee 0%, #eee 50%, #333333 50%); + border-image-slice: 1; + padding: 30px 0; + background: -webkit-linear-gradient(left, #ffffff 0%, #ffffff 50%, #27313E 50%); + /* Chrome10+,Safari5.1+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#232323',GradientType=1 ); + /* IE6-9 */ } + +.doc-content:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; } + +.doc-content:last-child { + border: 0; } + +.left-docs { + width: 50%; + float: left; + padding: 0 50px; + -webkit-box-sizing: border-box; + /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; + /* Firefox, other Gecko */ + box-sizing: border-box; + /* Opera/IE 8+ */ } + .left-docs pre { + border: 0px; + box-shadow: 0 0 0 1px #eee; + border-radius: 3px; + padding: 10px; } + +.right-code { + width: 50%; + float: left; + padding: 0 50px; + -webkit-box-sizing: border-box; + /* Safari/Chrome, other WebKit */ + -moz-box-sizing: border-box; + /* Firefox, other Gecko */ + box-sizing: border-box; + /* Opera/IE 8+ */ } + .right-code code { + color: whitesmoke; } + .right-code pre { + background: white; + background: #3E4956; + padding: 10px; + border-radius: 5px; } + .right-code .code-viewer .languages li a:hover { + border-color: #555; } + .right-code p { + color: white; } + +.code-viewer .languages { + padding: 0; + margin: 0 0 5px 0; + list-style: none; + font-size: .9em; } + .code-viewer .languages li { + display: inline-block; } + .code-viewer .languages li a { + display: block; + padding: 5px 10px; + z-index: 100; + border: 1px solid transparent; } + .code-viewer .languages li a:hover { + border-color: #eee; + border-radius: 5px; } + .code-viewer .languages li a.active:hover { + border-color: transparent; } +.code-viewer a { + text-decoration: none; + color: #aaa; } + .code-viewer a:hover { + color: #222; } +.code-viewer pre { + margin: 0 0 20px 0; } + +.code-viewer a.active, .code-viewer a.active:hover, .right-code .code-viewer a.active:hover { + color: #4BA2EE; } + +.right-code .code-viewer a:hover { + color: #fff; } + +@media (max-width: 700px) { + .main { + border-left: none; } } +@media (max-width: 1000px) { + .right-code { + float: none; + width: 100%; + background: white; + background: #232323; + padding: 30px 30px 10px; } + + .left-docs { + float: none; + width: 100%; + padding: 0 24px; } + + .doc-content { + background: #fff; + padding-bottom: 0; + border-image: none; + -moz-border-image: none; + -webkit-border-image: none; + border-color: #eee; } } +header { + max-height: 100vh; + position: fixed; + top: 0; + left: 0; + right: 0; + overflow-x: hidden; + z-index: 1; + background-color: #f5f5f5; + border-top: 4px solid #2196F3; } + header h1 { + height: 107px; + box-sizing: border-box; + background-color: #3E4956; + margin: 0; + font-size: 1.7rem; + line-height: 0.8; + letter-spacing: 0; + font-weight: 600; + text-indent: 0; + display: -webkit-flex; + display: flex; + -webkit-flex-direction: row; + flex-direction: row; + -webkit-align-items: center; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); } + header h1 img { + height: 36px; + margin: 0 18px; } + header .open-nav { + background-image: url(/images/menu.svg); + background-color: transparent; + background-repeat: no-repeat; + background-size: 50%; + background-position: center; + padding-right: 0px; + border: 0; + border-radius: 2px; + cursor: pointer; + height: 60px; + width: 60px; } + header .open-nav:focus { + outline: none; + background-color: rgba(0, 0, 0, 0.05); } + header .open-nav:hover { + background-color: rgba(0, 0, 0, 0.1); } + @media (min-width: 700px) { + header { + background-color: transparent; + width: 210px; + right: auto; + bottom: auto; } + header .open-nav { + display: none; } + header h1 { + box-shadow: inset -10px 0 10px -10px rgba(0, 0, 0, 0.1); } } + +#search-input { + -webkit-appearance: none; + display: block; + margin: 0; + padding: 10px 20px; + width: 100%; + box-sizing: border-box; + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.075); + font-size: 1.5rem; + font-weight: 600; + line-height: 1.8; } + #search-input:focus { + outline: none; + border-left: 5px solid #4BA2F2; + padding-left: 15px; } + +.search-page { + max-width: 800px; + margin: 0 0 0 50px; + padding: 50px 20px 0 20px; } + +#search-results { + margin: 0; + padding: 0; } + #search-results li { + list-style: none; + margin: 0; + padding: 0; } + #search-results li h4 { + font-size: 2rem; } + #search-results li p { + line-height: 1.5; } + +.copyright { + text-align: center; + font-size: .6em; + margin: 30px 0 0 0; } + +.logo-link { + color: #ffffff; + font-weight: 600; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + pointer-events: none; + cursor: default; } + +.glossary dt { + top: 0px; } + +blockquote { + background: #EEEEEE; + padding: 5px; } + +code .hll { + background-color: #ffffcc; } + +code .c { + color: #aaaaaa; + font-style: italic; } + +/* Comment */ +code .err { + color: #F00000; + background-color: #F0A0A0; } + +/* Error */ +code .k { + color: #0000aa; } + +/* Keyword */ +code .cm { + color: #aaaaaa; + font-style: italic; } + +/* Comment.Multiline */ +code .cp { + color: #4c8317; } + +/* Comment.Preproc */ +code .c1 { + color: #aaaaaa; + font-style: italic; } + +/* Comment.Single */ +code .cs { + color: #0000aa; + font-style: italic; } + +/* Comment.Special */ +code .gd { + color: #aa0000; } + +/* Generic.Deleted */ +code .ge { + font-style: italic; } + +/* Generic.Emph */ +code .gr { + color: #aa0000; } + +/* Generic.Error */ +code .gh { + color: #000080; + font-weight: bold; } + +/* Generic.Heading */ +code .gi { + color: #00aa00; } + +/* Generic.Inserted */ +code .go { + color: #888888; } + +/* Generic.Output */ +code .gp { + color: #555555; } + +/* Generic.Prompt */ +code .gs { + font-weight: bold; } + +/* Generic.Strong */ +code .gu { + color: #800080; + font-weight: bold; } + +/* Generic.Subheading */ +code .gt { + color: #aa0000; } + +/* Generic.Traceback */ +code .kc { + color: #0000aa; } + +/* Keyword.Constant */ +code .kd { + color: #0000aa; } + +/* Keyword.Declaration */ +code .kn { + color: #0000aa; } + +/* Keyword.Namespace */ +code .kp { + color: #0000aa; } + +/* Keyword.Pseudo */ +code .kr { + color: #0000aa; } + +/* Keyword.Reserved */ +code .kt { + color: #00aaaa; } + +/* Keyword.Type */ +code .m { + color: #009999; } + +/* Literal.Number */ +code .s { + color: #aa5500; } + +/* Literal.String */ +code .na { + color: #1e90ff; } + +/* Name.Attribute */ +code .nb { + color: #00aaaa; } + +/* Name.Builtin */ +code .nc { + color: #00aa00; + text-decoration: underline; } + +/* Name.Class */ +code .no { + color: #aa0000; } + +/* Name.Constant */ +code .nd { + color: #888888; } + +/* Name.Decorator */ +code .ni { + color: #800000; + font-weight: bold; } + +/* Name.Entity */ +code .nf { + color: #00aa00; } + +/* Name.Function */ +code .nn { + color: #00aaaa; + text-decoration: underline; } + +/* Name.Namespace */ +code .nt { + color: #1e90ff; + font-weight: bold; } + +/* Name.Tag */ +code .nv { + color: #aa0000; } + +/* Name.Variable */ +code .ow { + color: #0000aa; } + +/* Operator.Word */ +code .w { + color: #bbbbbb; } + +/* Text.Whitespace */ +code .mf { + color: #009999; } + +/* Literal.Number.Float */ +code .mh { + color: #009999; } + +/* Literal.Number.Hex */ +code .mi { + color: #009999; } + +/* Literal.Number.Integer */ +code .mo { + color: #009999; } + +/* Literal.Number.Oct */ +code .sb { + color: #aa5500; } + +/* Literal.String.Backtick */ +code .sc { + color: #aa5500; } + +/* Literal.String.Char */ +code .sd { + color: #aa5500; } + +/* Literal.String.Doc */ +code .s2 { + color: #aa5500; } + +/* Literal.String.Double */ +code .se { + color: #aa5500; } + +/* Literal.String.Escape */ +code .sh { + color: #aa5500; } + +/* Literal.String.Heredoc */ +code .si { + color: #aa5500; } + +/* Literal.String.Interpol */ +code .sx { + color: #aa5500; } + +/* Literal.String.Other */ +code .sr { + color: #009999; } + +/* Literal.String.Regex */ +code .s1 { + color: #aa5500; } + +/* Literal.String.Single */ +code .ss { + color: #0000aa; } + +/* Literal.String.Symbol */ +code .bp { + color: #00aaaa; } + +/* Name.Builtin.Pseudo */ +code .vc { + color: #aa0000; } + +/* Name.Variable.Class */ +code .vg { + color: #aa0000; } + +/* Name.Variable.Global */ +code .vi { + color: #aa0000; } + +/* Name.Variable.Instance */ +code .il { + color: #009999; } + +/* Literal.Number.Integer.Long */ +.right-code code .hll { + background-color: #49483e; } + +.right-code code .c { + color: #75715e; } + +/* Comment */ +.right-code code .err { + color: #960050; + background-color: #1e0010; } + +/* Error */ +.right-code code .k { + color: #66d9ef; } + +/* Keyword */ +.right-code code .l { + color: #ae81ff; } + +/* Literal */ +.right-code code .n { + color: #f8f8f2; } + +/* Name */ +.right-code code .o { + color: #f92672; } + +/* Operator */ +.right-code code .p { + color: #f8f8f2; } + +/* Punctuation */ +.right-code code .cm { + color: #75715e; } + +/* Comment.Multiline */ +.right-code code .cp { + color: #75715e; } + +/* Comment.Preproc */ +.right-code code .c1 { + color: #75715e; } + +/* Comment.Single */ +.right-code code .cs { + color: #75715e; } + +/* Comment.Special */ +.right-code code .ge { + font-style: italic; } + +/* Generic.Emph */ +.right-code code .gs { + font-weight: bold; } + +/* Generic.Strong */ +.right-code code .kc { + color: #66d9ef; } + +/* Keyword.Constant */ +.right-code code .kd { + color: #66d9ef; } + +/* Keyword.Declaration */ +.right-code code .kn { + color: #f92672; } + +/* Keyword.Namespace */ +.right-code code .kp { + color: #66d9ef; } + +/* Keyword.Pseudo */ +.right-code code .kr { + color: #66d9ef; } + +/* Keyword.Reserved */ +.right-code code .kt { + color: #66d9ef; } + +/* Keyword.Type */ +.right-code code .ld { + color: #e6db74; } + +/* Literal.Date */ +.right-code code .m { + color: #ae81ff; } + +/* Literal.Number */ +.right-code code .s { + color: #e6db74; } + +/* Literal.String */ +.right-code code .na { + color: #a6e22e; } + +/* Name.Attribute */ +.right-code code .nb { + color: #f8f8f2; } + +/* Name.Builtin */ +.right-code code .nc { + color: #a6e22e; } + +/* Name.Class */ +.right-code code .no { + color: #66d9ef; } + +/* Name.Constant */ +.right-code code .nd { + color: #a6e22e; } + +/* Name.Decorator */ +.right-code code .ni { + color: #f8f8f2; } + +/* Name.Entity */ +.right-code code .ne { + color: #a6e22e; } + +/* Name.Exception */ +.right-code code .nf { + color: #a6e22e; } + +/* Name.Function */ +.right-code code .nl { + color: #f8f8f2; } + +/* Name.Label */ +.right-code code .nn { + color: #f8f8f2; } + +/* Name.Namespace */ +.right-code code .nx { + color: #a6e22e; } + +/* Name.Other */ +.right-code code .py { + color: #f8f8f2; } + +/* Name.Property */ +.right-code code .nt { + color: #f92672; } + +/* Name.Tag */ +.right-code code .nv { + color: #f8f8f2; } + +/* Name.Variable */ +.right-code code .ow { + color: #f92672; } + +/* Operator.Word */ +.right-code code .w { + color: #f8f8f2; } + +/* Text.Whitespace */ +.right-code code .mf { + color: #ae81ff; } + +/* Literal.Number.Float */ +.right-code code .mh { + color: #ae81ff; } + +/* Literal.Number.Hex */ +.right-code code .mi { + color: #ae81ff; } + +/* Literal.Number.Integer */ +.right-code code .mo { + color: #ae81ff; } + +/* Literal.Number.Oct */ +.right-code code .sb { + color: #e6db74; } + +/* Literal.String.Backtick */ +.right-code code .sc { + color: #e6db74; } + +/* Literal.String.Char */ +.right-code code .sd { + color: #e6db74; } + +/* Literal.String.Doc */ +.right-code code .s2 { + color: #e6db74; } + +/* Literal.String.Double */ +.right-code code .se { + color: #ae81ff; } + +/* Literal.String.Escape */ +.right-code code .sh { + color: #e6db74; } + +/* Literal.String.Heredoc */ +.right-code code .si { + color: #e6db74; } + +/* Literal.String.Interpol */ +.right-code code .sx { + color: #e6db74; } + +/* Literal.String.Other */ +.right-code code .sr { + color: #e6db74; } + +/* Literal.String.Regex */ +.right-code code .s1 { + color: #e6db74; } + +/* Literal.String.Single */ +.right-code code .ss { + color: #e6db74; } + +/* Literal.String.Symbol */ +.right-code code .bp { + color: #f8f8f2; } + +/* Name.Builtin.Pseudo */ +.right-code code .vc { + color: #f8f8f2; } + +/* Name.Variable.Class */ +.right-code code .vg { + color: #f8f8f2; } + +/* Name.Variable.Global */ +.right-code code .vi { + color: #f8f8f2; } + +/* Name.Variable.Instance */ +.right-code code .il { + color: #ae81ff; } + +/* Literal.Number.Integer.Long */ +/* Generic Heading & Diff Header */ +.right-code code .gu { + color: #75715e; } + +/* Generic.Subheading & Diff Unified/Comment? */ +.right-code code .gd { + color: #f92672; } + +/* Generic.Deleted & Diff Deleted */ +.right-code code .gi { + color: #a6e22e; } + +/* Generic.Inserted & Diff Inserted */ +.highlight { + padding: 5px; + background: #23323E; } + +pre { + color: white; } + +.row { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; } + +.right-code { + margin-top: 110px; } + +.left-docs { + border-top: 1px solid #eeeeee; } + .left-docs h3:first-child { + padding-top: 40px; } + +.left-docs img { + max-width: 100%; } + +section.doc-content.introductionwelcome > .left-docs { + border-top: none !important; } + +.main:focus, .doc-content:focus { + outline: none; } + +/*.hero { + text-align: left; + padding: 0 50px; + height: 110px; + border-bottom: 1px solid #eee; + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + &__img { + + } + &__h1 { + margin-bottom: 0; + } +}*/ +header h1 { + height: 60px; } + +.hero { + padding: 50px 24px 40px; + border-bottom: 1px solid #eee; } + .hero__img { + display: block; + max-width: 100%; } + .hero__h1 { + font-size: 2em; } + +@media (min-width: 700px) { + .hero { + padding: 0px 50px; + height: 63px; + display: flex; + align-items: center; } + .hero__img { + display: none; } + .hero__h1 { + margin-bottom: 0; } } +@media (min-width: 1000px) { + .hero { + text-align: left; + padding: 0 50px; + height: 111px; + position: relative; + justify-content: space-between; } + .hero__img { + display: block; + max-width: 100%; } + + header h1 { + height: 107px; } } +.footer { + background-color: #3E4956; + border-top: 1px solid #eeeeee; + display: flex; + justify-content: center; + padding: 10px; } + .footer a:hover, + .footer a:visited { + color: #4BA2F2; } + +.main-nav-section .title { + cursor: pointer; + width: 100%; + text-align: left; + border: none; + outline: none; + transition: 0.4s; } +.main-nav-section.show-content .content { + display: block; } +.main-nav-section .content { + display: none; + overflow: hidden; } + +.active, .accordion:hover { + /*background-color: #ccc;*/ } + +.top-of-tutorial-repo-link { + text-transform: lowercase; } + .top-of-tutorial-repo-link .first-word { + text-transform: capitalize; } + +.warn.deprecated { + background: #FD0; + font-weight: bold; + font-size: small; + display: inline-block; + margin-left: 5px; + padding: 5px; + position: relative; + top: -3px; } + +.danger { + background: #dc3545; + color: #fff; + font-weight: bold; + padding: 5px; } + +.danger.removed { + font-size: small; + display: inline-block; + margin-left: 5px; + position: relative; + top: -3px; } diff --git a/docs/css/webfonts/fa-brands-400.eot b/docs/css/webfonts/fa-brands-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..9d49a59a67978299f3b162e805bdeaf7f9c8a627 GIT binary patch literal 99704 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 z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/css/webfonts/fa-brands-400.ttf b/docs/css/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..374f8ee9146f6d40e34e273cb62f5bc25578cbec GIT binary patch literal 99468 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

-AWKuAeVY)1yA}aK6uB5cF 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

8C6_LeDu)~3N7pbo0z!9&=f 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

5lP*p5w;Z%RBlutA$; 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

)Wzgc&FQvT%Ca}KS2K5uEQilo`9DVHspT5c&t zO7JLKZeMw`WcHOv?F=O+fmP{}pB5SEgdEcqJi2&B@5}ek=l*xjzRNb&+hv1rLr^pBK3^^JkDdXU^pO3u~^-|9dcLH}CbI z{H$s>{C>wJ^rsanEQ(tCR`y{)8@J7FS`s#<%i&SRp590ZAN!&?N zN7r39u`TP*qi0HSowJX${uMhvxxbkI`OajsiI$3# zd;CtsH|DBc)|RtAO_8?P!1>zn@zM^(Hwv!tM~Y^jG))!eNplnpjdtI2>%f=A3MR3S zG~3o&b8T|?^h9Igk)O*}pV*}JdW+VFjY*jrw;V3N3V(IW$M~y;w=wJCnC;$MG?MJH zisL37n|CU^t&78g?bEr>vvLHSryTIPS{m2w;#FFV=Pb8(eUXuR^DZ(i^5d9IJ^rv>>$w7DHSwC4Ni36@)(|I?+#<^ly%p74CE)zHuGT6kjD%2}e`h8=o`S1k*;W9iSbP|As2!!oGh zozRh+jwQUS-?10%%s1HOw8}xYaeTt#ht=^**7jFK#`2S(+jO3z?F+H;_L~~lqwx7st@UcFBmwo9ksdsPh{64_< zL+AC+=9C$|;nR+LdL*-4l2Y>i)SEqJt)u^Z-!hq)Bg%YwO2KTYi>r5d?N2t1Km7S1 zhmQu|)D0#l8xCGwTXM@>W}fdgwx67Z`>bl$Og~}tg@sG0t+`gqlOwM?B4CorzV>#` zi7G;zMiD=zOp*{w@hY4f^ouv+)FO?*8CNQOPKX`6CLYIC9H?IL>U3`OiEWpP7$r0Q zuekaC{ok&JlAcW(UC}l^E-Ka{N15g*2F>XR=a&~gn%sU=^5w(iNeASsXNYrM%I-h( z=;HNHhiaX=HUzH};LKjlw11o0i$fQcn+l$+IKX|pzw6P($A`QtJpcSiteJdRe!9r{H@uc70fjs3SO%k&oL8gVo;ue#InO8t~+y;)glZ2Ru_QrBZ+-wMt77i6qg z%Ki345cifmwxb3s+gSrHFfs4*O>$q#R9UsP`ftnL@3Z|jzInMU)^-1$g}bjF*=nl1 z!g+i4w9v?hyoXn-HqJi%eEo#|%JZB4EjZU}c<#Y5JH} zZ=ZYrA%w-bXPr!>Y+t(1>o&E&e1$t*I<%slYJC?ht8!5g71eYpJv#A>g_Fh~l=WTfenqUhmOal{Q^3_3FL1M{mo&4qLS1($k`KvMadlD;Ts*(kkY&>r~FV zXcc42`>_3(>B~R*=hR=n*WLI0gSOQAi2sW|9nE>4zw1en`R}dq)z9Cqy}dg;%m1BC zY{jp8GjpC@685*h`_?aa$N7ozs_{?KCU&1bzHvp*M3v~2#`ivf-=`HH*kiZQyC*!6 zRrI9nrXwe$zioe)tmpUO>!*@S@!}%?4*%KX(4yb0cm6-0{ukD%|1}*2-wC$dt_YA4 zd8na3MV z?iS5s8dDqsk8EI*5&w8IoyD}!=FHjWI?L}wCv2H@dBePwxpRGw^)2>4xhwSZt-i~d znxU(8{wtn(a(r(_X+f4jj(vN|Qz!3T78lv)IhY#ya@TFVp(pm>pl-)mwDctJgS8e$ zSEnClymetGdsQRP$F<)UU(aNpyS+oTb=##39$#~J1Lgco-b*DHqE@cI60f6U`l`0_ z@4p>Yi}r2W8}vVod&`4K?{CQNUw36s(CgKEWm{e=lyRQVocdtNbCc)RSAR@A^Jsp2 z{K~80|8iIQI_wU%T96>U&HdK?+cVTFqW)Ti>Gzc{zay0KXLs;v`7?FX4jY|1c2Oh! zSabThZIveXmgY1aJ9{tjPwf5Xr?zYC-tQ<~e?>Di{bcUls~>NEbW^NoE_rjbJ@NiM z_g7ihO7H4qL@bM}jpr2kQMUU~64a0A%tbXpcxF<&8S;ceK=-vIc z$rXLK-|p(t49`9$9j&eVW3%>Lu0MvgvW6!o$}=q4dE^*_wP)WaLz#uGO@Hpp5Vnr`wF`Z96)@ylc=7S5b*iGwhc(!%;u{g~O?DJ3lxbDCE`L9J9&gN%qZdQc4 z^-o>?pKWK=d>#FVz3LNBthsypvd!k2N!DK+7cCJ}{O&EvDm9O1mB7S_vzQzICnn|2 z(P-c)XMI%3bX8O6z~hA3T?@1qIvTu)b!bZnndY#Wy>O0X-cqwI+@D3S23D-RR>rk3 zv8zc_F`0A^Ha$qw{wfJ?JGg)Dt4tATq}e#%2xE49$a@(O~~?e%bKZ< zcT9DJ%mgoAVv#+zTu7t1b=9K>E0<)f?wES|_JWdICt7u)*Yzdd{O~Kp#hHC(Tu4`r z(xeso5;dY<0z69>FYr9f^wc%(>VylDy8owf91#BrC~j4#iBFO#o5 zDZlskqi^4iE`PV@b9TJ)+P&-dzDb>2)9Nnqo#nalkE;)l%#`;HcAMF+-m~s`-NXOe zbxqHk_08G&`QeT1*3UCVdnf;#`OWwFd$~UDI`ubO&raC#df)HEOS#RzzH;60Ugzki zpvye-a!S(jqI^#6OPnn-S?x+^|2vK6O;cX^)!b3vVZ9?fk;g-we+%Q~$%Y$xjjr)K z)}Fsq(Ei3=jFofJ_8SxUF1q#{R4D9l40-X>?_y?8=9-0PKE=O$!una{U~Qd)Sa<72 z&H#=-Q&U#o%?&%e;KBp_3D&yzYv#ZIAX(z;ck*McxvA))DLKFI{fx^O3}I;1Vw?Lu z#zQFj>X*FCcbt(XPFFow9o-?aJH*K8Xx=n#M~U0>^S=Jhyrxg{WZ-v50| z6MiIamu+1i)~`{x`h$LSRP|5We8UA%XA>U%c>2AhEXIIcXs5uQ(7mFLPerr7a7A6e zwy>?ED~Cm*VX1%e<#m(t4{VoJh)>8kJ>#V1wpLl8<}BlL$0Fzak5@2|Ot*gVw=>si zpWf6>S7*oi^gd|5`+QxKrfYL|_BH++@_U~;>({=x{q_2v9ow(er@eD^(^bB>9F#a699nJ3@y_lfSA_$}+btNj(rzkB-1Z?6t}AAYwlOl0DVHtQME zsSdn%T%PP=o+W?wrs|~Hy`t>x7X+P+OAa6Vxvs+Irn$nMMghK6=kw36&)&wiS>@VG z{R1|B3AKM0$bB!IYZo+s_WJMDUCT7}SDig~HOZHI<+oSA{>0QeUKi8Y^7rWL#}4W(FFV$5*csG*lzT&I z!1mZ@smk>`tNIg2#WJ>`LCAb^7Y7qOZ+6>T)*y&-}8d*!+iT%^4l#9tF0$ zw@UV$Rc4CqiP`hwi*oqv-S#*4uT=lA^_J}awdKL{#j{LLotL#P*ARW)e`t!0?yAN; zHS6rFw^g|di>I9ny+2RZYl-BI-rzptb+O60U+Xef`@SW5o8RoP z@z;}EbYwkV&?EYv8Z}#DT36t54g93frMR{EpN^O<7TEMZ6Q|RcKPwuAf z#eZh8-|Bs6;kL|TnNO!v^@hCLlS{p-z1%le&JWM^yb)-0RH$ZQ&_~CHwHnehP9C~2 z$1$d6mtl^_$ttVqR^FjJ>?%SzD|IY6-5fcaL<8GqswIXm&Es^cu#iy6 ze%cx@TuuAsBGIa zPy0a32}YNdbCL>#y1k@&Z!hks`M2Ul^z`YfjHh0H_E7ltUcTsO!ykzkIp^>G4qvxw zP9)33A0OOVJ2~EGc{F~KJNY;L@x22Ehpm@Z3WOZJl>n|*xplT_KK^QA}+3Syt3v@Me~k|)YbOsvqUdmJmPWP zPk(Fqt)+){u3Odls$k{zYu3A0tlCude(m#XbHg@T#!v43*g5+|_2zG{esyJO?mc=> zY>v@m**N|`x2OG1uaa5b`1fn&yyP0w@so)FrF`)05rb>Q*0pt}&GF()qr)wM;qhhy>n>PC&zKt> zm$7|U(b~BkC-yD3D*2?+r)py5w$MiStcCIR6M0K2LqrcVRW>HgT9>(R_r+P+->0;_ z)ZCPMlIzdUFacptUG7O%c~-N}&P=)+=I~IpZK;XXk>Ur13&R^cjq5!*y3a`?^sU#-}$Hg1^2m!uvb35r+@rxnonNa%j+_K!=|JdR6hHqRJlts z-ag~~;v1pw9`4)z=u-5|7nj%7N=v;B{G`i^=O>b*S<3{>^ygcg3BzOW!Y2 zmZ&@NDfjmFj#ZIi36bX4&(G1gmff0co_l>t#8>^Vaxs!N2KDpTAI(aApZ#^}+{C?h zcOqAYx1KA@{;pnj`}R%K+Qe+z%cZr6#mbkz)m4@yi~Z|LHBj1Y6q&x-xV7f%^U%|u zbh~|PUY}*%8x{ZJ`l+n^Jq*j{C|M*B8FNdE6oBS#pZsnyDZ68Sm?=&F~XG zcIegxqrHh1j}?!8YkJxg{@69jtaRRr&rKVc%oc1AVxPpLb+(+xYftdRr*3!lsC+68 z2}stz=JIdJ34WH3Vb?TYPohHrdFUl{)v7PUUO3C-k3c z-@0=Ci^&0HT34=5&`!#cx%8`#J^8wtrtGr3$$k&icW-q!yZ)|X&+gwRZmAYkY~Oub z)qnoo-=A*XdVJ*e?bvALqnrB=+xPvRcfW-#xPkA=@naXhy6enV>Jk)YV; zU%9W4`T9fW?)NrJqnBU1yl|OgaE7ki(G4l-_v<^>>x4ZzlXtauNm#c>c!>YIc{5@o z6!y-v5}fkYEMI81y`J7$?zX_lRTXAmZ!OF)TQ~is`htFK1u^gHc(dMPlUwG*RDX@+ zV40inXW?CsyhUy+L!(7lQcDXZRzw^B4f`opr#*M;nLbJJ$GgPs5A}=1&EAo4G5C7_ z+KQ*~Yh>&Ae%9SxQ&wgC`t7s5o++{a*WEa;XB!>;dUB4yJK?v!9X~GR)>*bUs@m`V zUZu^j_o=DD-QOs$cVa_?R0;UBX{==M^bLHjcmmA{yWwDIa#ce54$LOgh}^a z-BOxT7Nr+{GJS!q;XBPoO`>A$37=AuFPu#JG;{xt#n$&f9D9C$;+?vWOhOrPJ3q1S zJ)Xbo<=xkZ3o>~YDW&b~^?&z!$;Dgi3r{vm+|SLMZhh3YeYa@N|J^&PcRnwizEeE; z&8-6avfgD9+2(RR$5#5VFIc$5h;0ey>BlCY)Q|JB?{uGS=KfesBdy|@MMC=F%Cjfz z1>DSdH4n$1S?Aj|{pSApwLTN-uhjqj&iN!U@!?s8I{D4_N`8L2`gN&&L`{0#5p}(I zJC|uDsqYsn*&Yk4f2?nt{l5R~y{F9oTiPrC{eH54i}K^9-%OVSR?kY*334tw;aT^d zL*n%FEt`U-#wGljnHl^#P;&C4RxvdhDx1To=?OA#KzGih)?opA>KYDjp2D#3+XHx5OaoMXS;MjDu z|4@HFhyCHtsyr{%n*te^cKw}FUlYLLxoIlT1(>ZV%ogG(Dyn?@Zaf=+~O}Ki&UrP1qgdlr6e)-pr5#(~OTQ%=BPRtMPN1^X$`~^`gtB z`>kAld~wBu*&IF_&sB!aa&}WWvOjE>hC^ko^U9#ZI^K_5Wwy0=?i7-o=gIr{XVG$w zplwlaPApT-?t2<4vv$epRP!torR_S`eVkXWNLk|{zI62@1C^HP!Jj9*o31{6(vhO0 zGgoHj#mtVKzxHT=%F!zGR{sYqU*l{GYW_}`>9xt=k>t9kp)ZQpJH4(}{eJk4^^WB` z=0CPORy(=F!iy&~vAto-(!y`C`$dF9Ui^rxkDl?&_}ruPzi$Ov9xT7O`R}WiHo=&` z3%*UgJ0X=tR(D07v*m2PH~F1`RwrIQF;1=6_@zzrh9SqD0}7uXT;5nJ^JS9ZGCOe< zZ-tb$pQeja#TtGY8?`OyNQqleYR$K5ItAGwim#-R+erjCG6#233eOOoDO)s9M z=F2&n8SUeqKK;rYDVx9I*rgL2cGaHNR8RQK-lyHQPFP~y+$p)c?{Dq7IB8+tnpK~k z?K-o5olspt)x$rv&&9#UM_%pCxmVO>di}EOeQ|*)2Vd#=#T7mL^XSYI)%3pP zkiAOUi=O$2x14OM>zqE-{qF?1M@uDll-_9Qlsnk6J=ax4#C0=o=kvc^OBLN_zszb= z@#@RD`0VrE4mm>+mGJxh5C4g6j&AF@t{VR5+uzPLYn5dtPQ9(wbA0XQ{pP0@&yEq( zJoPAGhHh8vu2^QvwTx)u3$JGlD8#3N|YyIsA<&OLJX+c_TOI*L} zE~X+ACtIN@$4$JG)%H6*;gnmJ{A`cZ1nu^7_ly5sc=X8d^R(0A`f>Y?TJ8F=?Nf(M z?bla}yL*qWuM<@Z=l9Lo71Ms_=!+fcC(~y*-EP`s(fcj^ME~KbiR~W)T5?*{ox=ZQ z$OOuC9>04*x@=j)lnu5!0*}`e@7O9Sma;Np-4^EgpQg>$OWi7Yzhsr&48~)I`}Vr% z3L9(KE`Q(g%7@YL1hc!L$nsCJW(V1mk9T@!79Zzdk$LiPSaM*Q*|Tdox8jXfFBS5P z+J1hbqjdpGRPMHU1zxGHJg+9@Y0dLlsj@O}&)xKmldG@Wu~wZEUoc-rIY^ZAruC*k zoo>b{hoYZZWzSo8Cgg?Rt&^VNS;85yH|H<-_A&9mhlGeVio5i!R5ZT5ZqzpUdd*L* z&)tqQyM20D)a|)JXI@`@=9XXP7P{-~@Auxjx`bHDXEX*Dt$6v;ZFl2_8%JlKn(C*h zlrn9OowUxGGkZ71oaWo=`RT*Nts4V(yuM+p`t^<1Z;xee3*BaIWe>lWcKc{hc3$m{ z1fg{~np`HL>$6z)1?iZrv@{RSTF$>|N8@=TxtW#k{N6FX`@Q3OL(793-~IU?@EGgo zo|xb@bNUO0MITr~g&uQ6-uqp!$84df)H{CNJfE9(n-vFd#OxQMy+3WhPnd>C`o?e?(dw*p>&zD~3)mlJq$Tdq3fOsY_MaVw`ZJiE)uxzVYP z0(w7}J(Z9;VRSYqC-A6X*yV!KXtyf~o)dDycVAoGRIx9?w4{uUAla7w@{eAtr04;KXxx=AY}>ymtrR(JxAk`{!+* z@O%G1`)OybzukL1-OH|$W0~#03lr;9FT{kI`9+vA8|%;3JD+^>jnmC3e_p5W$$mJE zTl=Qj6kmqa#{z|4D>kaVvDm1g_58=4oPSgHOtWdV>o3z-KKa|M{#$%Sd*Wn@5_!32 z@iWJqJ|2CXa zH)U}eZTmS*JYvzhe3p>!kCv3)cZziN$UgdBsxGQG9Im+^4C-|YLZ8+i6b#CFUGZ3>Gzlw%ijTQI=L zUglOv1Z%W+?x{@{$}6U+o$1)b!**en#_BfTxDWpFhSNTD=-+H}IvP5!qku&;z2a=p zLk=xd(}^EePg)~!u6CP~d@9#1-4`6YT_=Wm)=XKo>68Dv3aNuf^X@G55V~!8@$3RW zh5VgoBz@+eyks;nV5;DW&*#_a{rhx%|Gw`>UTi$>w%=i0%$^E|FD`Rt~h-`_5|HY0PMo#d}2Q(sM*ZRU8fJnH1lq^Gh^ zZ#sBRJD%fp%jpHzmP!r70~!%;&bznnJs+-pupp#}%_U^P!iKDehm?Z?mvBw~TYrpy z!F~5{ha>Z5Tc6xA|EYv?MP!$N>}HSbut~o=ihpm+zU1XM;ozl?1D}!$WQ4mbC)pjF zc4G3ZRcr2UGuX4G=$!qk?M|+fpP$cZV3V)D$NyrUc%<0RmH%e${5SLGPvhG4x;<}p zJ^ybQac0G{`|ZVNjXWDuZm<1mym#~C-jD?<9BKY%c+Q?^*?+X=TgdZ*<;@d3v{vdJ zeR^wEqV(_j%Mlx6uC;#H_gvuZ$@KMH$29l6uIS`V`d-=g=z5|CulAYsO@X~@{@+rs zK4CoV@B6-8tkRb4SDysd{;A5|EXwh0Q%L^SZBdEog{~h`bU)lOz23yerY83+yMbxZ z>?j59RcqWkItuPHcK$j#^UF4iS=Of4Bi@TX_nVyjGHmtb31Yqn)nA51MP;$iUuaeI z(xQ05?kJZ_CG6H^}2WG3n-0GflZ>_m{KUSH{a{S;o{eB@SmKudRHZICpZAu$AP`#$!K! zo^3bF?wzi`HaG5`m%a6j#m8$m?yC7+R9zk+9V2n&K-S;=uXkO$VX;nYPx-y|b8l9@ zfA{9_y_+|;Uhl7c|3kD|_BNO2tPsPAJfWcPHa_;vD1SP0u64QGzVpTBY@h$u zFgwQ~c{RlGb?Z9E*CMA66twcRuQCaaiV+RASyWMC5I>{xMak#jO8$42yVieqn`J2W zbEDZE-OF)0hu&%Sy78>v*rS!5IV+W=^I@B1hGUwx|5*#8vNM;yvN%sJ{By1JlHIC} zoi{vx{J$*`)NuUb_s}QF8nJIYUT2*+w$GR)OQC;OvBdH4&*c*RR6HtVkG>g&1^jawQ8)~088pZc_i^Rm#H9m`ZXByTR-6nSb= z(Vm2vTq>ux={jxly*pjy;OehgC#Ib3TQ>c4*&d||?=5~s;?N>^^( zG;deFM=YP4&)L5-v@J6qN4G8eyqJ4c#F>qr@eg=!{wg~3WRg_IQ>FZ>7o4>YbJDcl zJzld=Bm0Fnm(;A9?5|&CPdh)9SCcVkWfIU}d-d>n@v%os?(8&IOlHXt36EkeR@q=G z%2)E0^Q8m#;cuI@b`|&B{BpGK<-)hO^KPGCyzTzB*>B|!KQ}kezvuFOd3>ei-@oBp z;rA-OzEab>wEp7$PW=|fTmRxNoO<_VVp8-%%f35KlDA~pn;e+AnvcJ`!g?-K$e~l? zsJ=V5#?uo!-*203pP1e8C34;U`c>cEKi_zA>1*SkLrS4frdk{?STpyGO0Lg|xjI*- zU6wgp6c!X*%9C_z1cI{_iO(9BP8oC@8BU+ zP|>S#iGBYke=hk2AN}l_CvgUx5bjZXt(Kv7Z*TB^2~LrnhCAOb^xgk0e&VNu12f@3Cwzl&`9=Z)v97slu(JjhPh=Dp=7vLVdObB~nV`8(fT zt!CNYx!K28+~eSBlAc{scDKzq++4Wos6^o^(p3!u8snl69tC4uYa9_uK6CN=!EE z;`_hHTvN4Ye!{w*Ku=A+*i(1xMcZoE<=^eyUDlt!ZU5^Rxf%75Gp-wUIp`E9U8y^? zpi6e~VIjjb_f4j8`GvO)?%ovCmix6<{Tci5;)QJU4b1O}?$z-Ic#mpof0y}Y)rF>3e5NuTyy@ml=We{Q*HtwN|lpP%bjiJOZ= zGp z%MR-n&0KotQK3Zg_337x4%G>p3@m0mE+5R>Ysy|P=d|83CWb<$mB#%I+7}l$M>fv>cE_)1SLX56Q&ZX>e&6q4 zICBT{qV^Xe5j}j_ub7-K>d2oLxsZ4-pft3IMg764pPRHUcO(h>%voF=udUy4LhEVC z$34KY+kj@V)yYN)0S!by$n4gpJ#ZLh_hen3!3F~TERfD%lhvhSjpF{pBlc0#iTv! zYmuf9lVkaV*hNzk*XgX;b2stNi@&8ZtG3KrE?E|nz%KP>s`BlH`&KdS{`*)bK6S?K zo*DIzW=!SF$bQ&8??aY7ck)%@l&sv$P;uR0w*FRz_-+R1U!&J-T zvy8W{qKQ}WojqriKmO6`x%HXr|HSl)OzY$S=1SdN-SOt}_YFxkPw(b$Ui9g1bk~i1 z=0%IQ#`U~y{K@P1qVTO+)cex=_pB|>6`z{1U%fl-Md`&~YtzH7?$}=S??A51pZAXc z%Rb%`>Sz)apLLld@zud)58O`tonF|h61;B5!3EExTWwDsy3`=1;&p$=F@x)3<q+4FX~U(0FssQEAB9HvU2c)9mW&=x=0*N%3g z)#_~qDK1}BE_-~x{fq6?36o#HyuM$^I~}z`r~T%n*GuOXy*qh2e`?kF+qm7ocOb6V^M;VP)t$EuAwOoB-o7c)c$g!F zDLlqw#x-lfRBgwzohPh4*I34Ucl{-y{;+|`$4DgoTcy(R>l2@O9oKODw}MZ$<)|Xx zrZAsVYTjFA&s~X2{U$nLMuNraV;n_$oGym=POY>uKTyP3nAG&lUs>LBPu6lBPv>T% z+*j&8ldtbr=JJ}wXqsIAUag8ptw4)UQ_Fg`*rVf_!7fvBIPNhW-FPRbY0~}$XB!k8 zu14?CytvGn)D`kqf7bBXrtziU zKQpWErrtiuEoypon*z4;+WMQ`+%nZ=)Aq*~pP&C$w|tX^fg!2x zx$(}Af6U?~cg&PI&#d;5&TK5D<(Zy0l|^N;(XoPP`5e|qlhYy6-2+pTbOp`v}sJ=e;OPj?G{{P}Iq zW5efp^5z6+bR;@rn&Ek=-v9O zq42Vuz_C47Z!~qkK36MId`9%%gzwXyFN>M~(pIwnyao5w>R-+C&n9O`ecpch{pGB^ zvc-A7zWglsYq_ubWa$cKyL_hUx4KpDU;4M}<$}aw-;f^FKj99BhYs$pe))CXf3Xr> z(=*=7KQDY`@$L2(q1s*fiAVo^^08$Ld0mu#Bls7q_jNmQ1`v3_=)<^y@fOoQrVq?H zEK67|SQoL$uzlkY;4tEt$0@=2gKG)bH|{9z72Fqiqh^X&gP*g33llykIm%yL}g z_`}J`X^PVsXD$~dmpSfb9`igdd3^KS;FacG;Jw59jQ1y>AfFq)6~3?hg8X*)y9J~K zdj#JI$qKm?sulVoY*E;)aE0)o@LLfv5$7Teq7Mi2fD(CoU&$THK!as`xGO zpAwo9k0d@w5=iPxx{&lKSt0pEN=hnU+Pt(Y>2Vni8J{x4GS_9^%hJfXk{g$MEiW#g zCtoMOBmYxDOOa5~rs7v6aV7go*-9%)Uz7!uttq=#u2;UO{6~dF#gxjtss+_r)rV?0 zYMN>VYG>71)D_jeskf^?(ZJBKsmZ2kOS3}rlor00o|Z$c-`XtNvf4hh7qvg@$m#gf z+1F*#b))-1k4?{(o@c#My|emQ`cnGN^grnTHNj@Wi-}efCrrFGNocazWS7ZxlW$EG zni@7uU|Pnsb<=K5H=Euv{n!kF83r>h%`BPuVRqi^E3^O1X_?D3k7ZuSyh-yO&DWd1 zY=O;!sD%s*s}^xB>RN2Gc+KKdOM;fXS!%YlW9f@!P0P+LXIrkeJYads@}3nkEAmzx zTgd||H^61lm*hWZ7Mx>X@^LuB+QP&0|6mOpgZ4M3Muv(xYbSYo9ZnEwJ%4}tjV|W+ z7Y;l8x-^z7o#2_Sd*hr;$%V>W|6Vrl`SE%CQQnT#1^n+0vhH9g)V;T5dXlT_!4{SK zmf!D8=3#okkRK2sUtO~{^5KlDvx;vVY%P#`zC%RM;68_V;6aBSEygW}Qez&+?Pzkg zDQwnyv&rh{<_(8L<64VvgsVQZnf1zJ$AKE{m?NE40(uJ<%C(+;v0D5g*Q%Xa>U}y} zr&;wn|DAYp>9&uH0&iV@T=`(8e)^Z$iSe^bq}-oaebrGnEML8MwQ{b_YIl7o}s4R=2s@lAl3rp3mshy2FD}G<{n4(pO;K8N~hlHdwUr(5S|0m1z^=3Ra z^ZIYR-)MbIhSB;NfAyFA*|lM9e_yUrJZ-%q|JSzLcjWi&J*^d0TDfPrrQ@ILcR$)5 zZ7Sw1)2+E?m%hpF)*jbl_X9p2VVfnboxjQYghg}CTJiB^{VD4?kCv5xl%3TIF28fb zSWBK*2%Qbz_4b&GvGwUQFYexKOijC&tadZ(w%6@x?vtdS&6o)X>z}+kmv(>mo+F|0 z8y?Oq#OaK2KHfRHp6@`T z1qb_M0hzAD1r~h=CR%X0KbDZ`eq3PVcc9aPQ~j|Bi-qX&L~Fm}d~c5Ey*VanA)Nj& zXHIi*q1?IStUCn6A11{#c^69R9T(jp6#g(Pra8M%cAfg^yd$~=-gmgRAImL>zQecu zxNL#@9nSJ&u?69Gc*~F59uQP=;%Q_QS~4NxxPWAlNPxyhb}2S7Q8$U?Ce3e;=Is!F z*Zcdyz8&)K`q>{eRtU)Tv_Du_AtBf2{$OH-h+OaS2OBG7>skI_Wrftd zzVrt(E5zpYK7X*YLT+Ba_=DC8!ML9350+L)#`T3im|7tk*L(fJ)(Y9Ue)9*t6~gy= zwm(=~A$_l}{K4D`@q4}BAMCA=zt_+Ip!tV@T~Ggm#XltM`urbE{vl%5d;Y=ZA2N3R z`VYE)2<_`x|6uhGseOI<4`%-m+t>U4!R{Y&`}*Y{wEqyS>zV&x`47puzW4{ze~8xg z-hZ(DhiqNH{e%7=!vA{qKUn`m`d?rDgZV$i|MmWVus^4>(Qw-tsWm5Uo^2M(-pu!U zlicggqT5bgyCJr1>f6KHHrC#(%c(D8u$~}$gfFdqgY(VAHw9%Z){|t9_N5))kbJZ7 zO+^`#^~AYH{L+?hXqbD-FZuS(mpSaWPnK=G`-Z1X&ANN;*>j1{H+{bG^9@s(;_i;v zGkS^BH=Vxm^bJ>;>h7-Cv+EMCZ+d;>>l?PR$3ey4zrB5$GSz*efm_>5j+7-`Vh>NP zXpDVk*jS;m<>5^(d7c!touX! zjhlBKPYqov#%w8g>$&ntZo`jrwq(uh_tjSMR+=|md!a|AVCR81D|d+fliB7xb9F(i z%QO?|u!{i^^S5}MT;y1Ei_ch&ms#6&`8B77Tcblfl}ZGD6|a>}o4Ud4rU}Pw>0d<| zi??pL)OAi^=8Ow-b>0U1@>;eYUncK*&{ywEwu+jqy103~qQL2vVFwtJrI6}5U~l_$LDyw^O-vlG^PJv5W^JZwEt<4(4gSlpCJp^Jo5S9SRw+1xtI zd-k`itFCc;C$y^einw+!5m_ptJw=t(Qb$aA;>t_P89P5MniMmCt*(-ci`Mzj#Hfje z*39#6wgp=Srsld`G+HUoE;36Y@93Q+fudbyI!2P7p^}$Q`S>PJ{jt&DaL{T#S+|8- zV{W_YOkU#8pIIrk!sElC^|nss>rB&yKM%Z{QNLL#Te3~>e)`G_ zQ3>;dw((p&(p~EM@AD(g#o|PxMt?Jm?z1Zt~ox}BtLkxc=0wLyvA#~Tu3BDtEx0PGw%-5Z)U5M z1!}RAj!JlpQ%Bu@CaWP9aO zwmudgg9&eW9d5svoqPHAo(oC=6O~=kAH>8*?=`w`DAmD-f0gb1gBOm>b-A&iL~-L= z6;7py`H5>Hoi^t?*4+@iRaqPx0|W;VIYaCV5&JW?sAG zEfT4=t24;(X-ZDhlD!MRdw6RwYkXP!OO*XokN-|Wgd4z0a#1b^di^)aua|AjV>9YAe#m>&q^tYi z1fg>~x>RoA1P@2)AMTEnnP}GGw+}1c(Ch>M9@@` zMx7|`yUMMbR(LL&WwPnzfnS#XF<&b!=T8u=(@T2fby-PswatmWGcTzu)MZRuy=m@g zkJYXxv&gWkuNtZx0BAh`NK&q~Q9`!*{@nDeSn z?>36pI}>?#ky6#xAkm^tzDHZ7F5UG}Y%i+2{_m_JH zmsNSB37u&Ny~%bs#=ER&gXg>#GcsbvN;{^ zURj4eKW1EWU~7&K8_yq;1{w|`$a6L&)G56!SC&6 zt<0X8g;nL3gRX~6@m?x*+2Y|uzv8o9OXXfwoC?fSjN-nrd{VKpmw}j3$lIzbQ`*)n zIC9?TYH9jq7p>k)e}6IT^=Og&loPu~+s`6wR)1CTjV+gh-sW6bvT(NO)x~dvK4wqc zk>Oi=D*VyJik(J@tBsavam}kzKG)e&BV~KX=7zc?_g0JIwpq%a(%;;S?*HhwXI`A9 zEB!?Epxfc6fsWc!Bh1hKs*BkEH zN@ZW(up;G6Zp$RUyI)`UaqtJuS$@d*>&oL_U-9Q2&0qiVY;x$!bI}zX{0|py`F8L8 zlC#IfwmjadyT`zXsfAfpM8b=+_}TVP6>Z`CvqcWqws23rF4^V1Sv<{ibN!cxNr4Z( z6gW5VKA*ESOJT-_#Tyg~92p)c$-EF0NN!WJITBR&=l;HX@7GUXd3yIstH=5FIl)fdx|WEGXZcuL}`bl@WoM@J>mB_fW2jq3CCYJJ(R$6 zLt>}t7q=9zNCmNoMl;Q_1^R4h|FzThf86)~*x&QH^`@69o;a;J^3(Uog-DmbQVIt= z{@uTRY2W$m_wTlrb1I#-eJd1U6tI|aw#CBRQbpBjduIRKa3dwpcssigOIyn-oyObi zf=*6acyQ87+i4*I$(x^Kt;t5y!iY4viDogmoMMAWTMF@ z554UC-1_fXt97 z{y)uq{E#W8@s{*1L&t-OMyghUih)I4lh$%d>ihQ_?XVT}usCKVH}Bv6Ta#3CqcoC} zgWq2`ep-9>O+Ty2_cnHvg)eu$$hf}YwA_ZsZ?~4du=H3`GS$w#t%IW~&8g0Q_SNZc zx>c;3=ea&uHK}~=nKl1+bK0|dYEQlNPVcZBzl=c|v)}`^ZDTLNM^92uT$<;cpHG@B?L^v{y)q@4GE@3k&FKBK$&*#Bwn&UaKSw6tc2(P?ljp9nQtCf5$(VS~GWLR^>#Mmpzl2PadAr_Sy5L)$$KY++QBdo4uyT ztDJu}5nRn@gJ<5V;PffG-|N~pQ6bmSS4VO0 zYtOiM=1XTprkm_ObN#H3gJg~gd)I->ku{x-TVdT2s92Q-fF(<>oGx`;?vNr#+gU{YPtGzBxC zXGFE6TskLrSU5Ak<+$9;ltp*jEHfr5-0VI%%k{6pnhTL4JJ?=7^o;4a@g_*0;nz{a zwM$F(?XU`DZe?;@x`%sj(kg#Dwu>P_XKTw%H-t&8JnS9Q*=f5(BM4#6PO)vV$KvcV)?6{HHL?|bW_@#0-z?!D+nybhGA=h+J6VL8 zzhuq4^C`A(zIy#%_TzcouCQqpZAKAX>&ooDJ^yX8<;_L}YI z+-B!)x~lhEw%|mfdkcrCo;5Up zL#9)mGr+*W)8pg`&B_nU9{THhXl#D9>g`pbr!Qaan55K{m*WkOoX8Qxe za&*{ET)iaboAn}TopoGQ_S9+tmJ632F(hOv{Oc=RViqHBY&nVZoka$FIoq2?YyP&w zv0W)`yLoOMj^$H+5Z8XZApd~!4)a8zJJAM$?~HHoPL^mpDAL?)uryK7N0Or{lksNa zE~TxByA-D;?oytbP~}uRBhDkI;U%wk;xC8v8Fd1z3BR1JW;A-R&2aRnn(=UgL>fzw zSX#;pgY?A=zZ2Y?ZD$yAFg$j!myn+%md51MJhMxrab}xH`%J$0gtP;pGiG||G(}Fq+XDz?mi-(tMNWd*ZeO zu`||QU`UHTbDPmYYDV(}sb>O0@(Fy(g^X$b3wYK<#$p_>&cs|s>k@7)4T0riQm=jZCxAMFVOAqizOKm(jtO-3x%M9LV z;ZMogj&V7&H>{OSFvzKvV7bls@K9Mx@rJn%baK)qIBv6Yw!P(&yO9?la@)4%I&*>G zHg%omx3Y4tnFSi&vKum%iRiS*_Wn4~*Vq%mUUl%-1Lijt89dgEUWw|53~zW|U@tRT z)G(LHKXJK}#2b?zd}VeihxHoP+;BDEDl<%Kh;5pYFx{#6Mz4WbnQ%|z-L8s*dCnml zZVR$(uojTmU@d5|VfO>ZH*zmHc8hm5-EH4-_+9(S4eSfp*Vwz234P%DCi11-ws%89 z{?Yw+*?ijfGOtZ|e@N&?^#`eMc7IrYb1Xb;=hm~qf9JCkff=j&^8z|pwphEc-C|zE z^p^8t!?&gv4%N;&3u+bgF6^7Y@Rt2!s3ETghiRi96`Na9Y6|%Tl_ad!b&5rb&xlv)hHK7npW&-Es(bj(!pKf+d#S zcH!%V<|WKL4S7uyFPwegu>F9=i?9!l+YeT}D4W4>m(h5Eb)s5{_?f16Z8tC28u0HD z7jyW2FzE$j1g9;B_JZ~V(=P^V8h<6)e&JZtEZ5q5LEr`tZ>#SGgBx7D2lQTW-r%?8 zWM8oSp}-d&nYMYY$`?Kx=8Fs5aCNZwl9h0sQSe3YjJ>lPf?upXkf*%Cx_Yb^ZnEx>R z<=F3Nf7t$leusl-C*$9)BaL;=j~w?ab1tx-pmJfp2iFUG71cc+9$^&|C+2)uq;T`0 zt83AL?!G5Y;>;&`_0=ZH$LTB)*mJ`pu%d9nqz{jjmOfNAPsnlarjWzl zQrlFSpB(h&i+#AX;cf?mbxAdHWJm*&%QC_=Dd4BF)noA2I4DpNUR$ z2(E}+XuT)LKq{_m2ERW0B!M_T6~jF-9!eEEC+d9ohv!C~S1x#vBe|6Q6eDQ9M)$j-LD&Hr=6*cM7} zomXer`CB=j!dF%m#!@htk6wLe1AdZhv)YXT^*rUO1PM0e`wyjAY)MZSd}&I z;|vC~cg_LRT%Z4z^18Qd)j@ud2>xR{3)gqW)Yb{KJ`rox_mA{j8Tj+;mYOxHKlm0O z4*w`{Wa&Yr1yem4^gL(ZQCcw7zW?h|`)O8 z81=It`IF=0$x-}~Qf^25ujiG1+O)rMVTOxiSNYM#^BM~tpD>YHa{JP~lEl?X{sp0Z z9@<|XuISltH&dWGRm4f_SlYECJsAy49nYSMikLm~qOY)c+4gDIKB=*uvfn;s!UE}! z(mP9!c8AS&&^|dKZDm-1*Sj>HEs41a%k(t5Ju;>nwpq-uYz#|%xGjp=On8mcsmZ1J zSAM&tuX=1%%eb^?Cx?cJ)HUH~_DPetwQp+j=rUikK3;jSgH!7Cn%nDoo&<%bWh=Qo z-myZu(zU}TjsJjSX4wVv8P@IBw($tI<=&P&s?@-+Ovw3j4}-R=lETFWlU!81*te|A zirM0R_0F@6I+IS!UHf}`{7==ITb~8h8!dxZt4v=Y$baFOuwzephbx;vCv)Hfwo|T` zkGt>~x`wQ^Jt4hWZ>M1W-zTPT9xVBP`nbnDhspD|-s)^$*Uyv}l>{LsitGu#e;l|w)ZaDj% z?)p*Ir17+>gymRGx5iQqra7O2CVuQ}yc?9ZM~dClt8?MwTY;x7jck^&^>>E3#;;kf zJh@N9bie-WS?Bj`xwPBfY@@=AZ*uQ+E=vAmc`$Fb6|+~~jF#_<&3PsqbLeQk%BA{s z_dAuh$y^(+=C;L^?a8>aX0BnJ%32NW$L67v&m^6R&RoB0b=PId5O;pHYU$Lg9+{Ur ztQ}YKe(TeZ;Vre4e7~^pJ>>C0 zMDjWJp-GQBVz*_~ThH;^tz+e1_R_eIg|TpNNs`vzpms za~JVU4fW-9k9J|OZ?eqyo&Cl-eEl5#WS32?TW0;XII!2#a^<&-w|wi?T$>q~YoqzT z;L(Q1s^04iliE&bFA=?I7xny8fVPXdfb>(Q*IGrFUP%25%~{*{;qb;Y!jI1_IDNq- za2t2f(fKL{!g+$Gg3a~U>`mmKyij?!;sf*kCDV^pXCKsh#$}&+J7@8lRh$cs83Y|Z zHc7o>Sy$Q{!T&xxyNnbXo?p~^)tWOQ_zA1^+bgNz!M?7R2WLwhpE&zTuFS^Axmjx} z?rpl8(U7-wbDvF#vi0_m32RmgSvGYRMeqI}P`_!F){)IG=j~Cf2w%E=>ox7ifB58j zh40j5Uzsr}vwu-jmz1ITvY3K1-CxaYYUI|$c&@tZ_Aan(1-Dek0j7e$$14OcWNc@4 zKPMT}x>EDf({=o(r2RfrDE$)M7XH+hwNq1U9?yPByPDaHE!t14Um>HyYVhF1ew$gh z-s(Tv+iZPOUsJ#;Ws-)+xsyt54|j)GJ)WuhXy)<7w_Z12I8e8BcVFhb(^aXZswJQJ z<@f)HS!-`A^@8W!oLVEj@836F3zg?#5q$V1u|;Eg@MX@ZqfbOm8Z;lC9I%=F?ZUTn zJv-vX^tPyno&A#c@z|>G52s()+ave=z`?c+drelj?fz)+(!II(q5Y|SA7<>>U~=xe znZ8MONU3&;-+sa12P>R5|NM}8w9}*f_4$N=gS`qmT3YpNf-}7|tCCVDEPn2&pI|TF zxcrL4>xEOUd@bqJ^D#G3PF`1WxhP7!cHX3aA`ewhKFqj#)coqA#78}C;);xC@;oNH z6i->P_6zs?+>^d3XSV(ADgE|x;kn`f!R1S~eS6|_ds2zgmp|&O?Ml9zB;Q_t&2_@_ z+Rc+C-rV0HH|Jc{b;X%q&$l->6&EoNG^XGk?U+2PkEN`Pc`v~d02Tal-3rfvQb7GAc~ zQg~C?yBBJPSJwDw`n4U(SQ}RMj5}fJyq~EJSNkVRbXKT->DXkT087 z%x#}YUF70nKYHNDf&z^V7B$z>zUWLl&Gq}*`PSUSNw1IdU#|Gpu4oX-dbVZi#QT4= zGLz?9&R{Yzi9hgfLRb7+s|O}?{Wfjf6&O9G`Q!69tBb1N6zMpe&;6{T`*Puuxb=%) zML)dsnWRCF%9-M#OIh^DdTwjFD~os!aevg)j>&c~Pg-*B&ZuxH;A z+xY0@tiTmdBQGsg*t44AiGHmtX=E!nU&5e#^YOGmW)&HgPgZ4E~HP^hQ_YX15F%6v&nZJB@kn5kR zsona)8#nK2T*_nrEiCuRG5hFyGOopWY1_II8h+ewG-iIk@zwguy3N)PE9z!n|8YK9 zxi|5J^-o!A?dxJJ*UU`+#GRM<#&^Pc(b-Qnrf;(68t=NTpt~SG|I3@s{D^KwH@ixW zvOO0C%U_&vc>L^kndP636It@tjcrdwHCh%v_|al}$-=^Fd&!rcdOKO2603GMsqh@X zN!R;&Pgu^A{C6a4g37az_Hd0FW%G=c-Sr52t~NI!J4N_Ip4j%S>{l`}Rg-mQMv zru@R&@=DbLk=Iv*T$VU=bO{I=ortwlzhlMAv~JP_L)l}y(--fVb)qH9sqh@{2EnVX ze!9A?Z8Ev(PnO!qPMRgK{oo|88D7(#^)6_g!^gp4q*}_vbjxS=E=jh=_b#91R&uwv z%;XZ-{IzS_lCXP^4@(v)cqRr#AKBd5*>Fe7p+)-BUENo!=S^IHDL`4FT0nloV=XC{ z+O~sLD@-I(42>906tv&&c+3~KStiTs+x_ev@-Dl#soT2o=$?ph@6IZ}A5nL6|AN0q zqEn6c`11<{OY{&?Kb|-KhrYKmG%FBZ@>7vTFvyl%lj%8 z&Xwhy{a}ZE-LCJIl}~$l|64ARoBaIu>FHPYy?Z5CntHE1q-J%|o1pZg#cBV%XV-8A z*JM>ba=cY#Hg(I{x7#Ys{+_Kq{a^D}PP=6MpL4u6v){grj!i1!;6H!G>-&@Q-&%r? zov~M|>xusQ`sc+jK4k^#9zHvF^4Qe%o6qlf;}_jmIL&&M;yrVj{Pi|Udj-n1)q@J& zF&4cMnDD)Q&%J#0yNR0*u(&X@yxAgbQfi)={&mGdt4#g;K>jzzr#D-d@Ef;Z34B_0 zYdKq%N6Q7feV5E)j*H$sQ<-%3!PBWpK9l2}VV^X<0Fw;f)6 zy#Lh2iP4*naipwSnYZRWhc;K>)m}yp#xD&f9)`PK{a@~q5E{+5e6c-+!d_+5Bn!Gt^A?}}$n?$s{w;QX<= zVsTo;>s`KD>{o492^uwdWZjvcI^pPYpZ^tE7HVRr9*JFM_A1;no9|5C>W9VqI_Az< zSe4?*+bGlfw<|c;z*pt7+uQ^x*2XE!leo{Gi0m}2wYE4M^-n{Ycio(suJ;ap6x_D4 zpPeUVX~k)S+zI>4KU_R<%_zweQ`_YzKg{`VIw7{rnE=dHcfpT-}=y z_Fo%LvDXVk*Oz>n-gR=pzi{{G=C7u+?mC>aFd^DBw3}~1BZL3GrA)VO*q+vwJ}%}} zYWgiO&phf>_!71+v%iS!-E&>Ag2n2XeDLHbj_vVl7$cvrOP+qnTtP&3^=pgF25~Pg z0ZHW((@$;-+P&@#Pw1b8PpnfV?(3);vh3;H@mkGF&+*0KJ6|WHaC0u~Qdie_Za-Pm zAvnV1?mNF%XXc*sdYOCmm}kbZ`D-Hd?rc1@egAe%i|ezO?AG^o5G$O%-PLQM^e%f2 zzVkV+>z$X)6bL#RTsC#OXOpBKk7sWfuU6uT+f&@GIZvFy9N7JlvB4-+<6>BtUaI%H zrrx%^r~JIJzQ#FDGi?<&tz_#|3aXjPqrKup()oEuJJ+etK3R5JRLkM)C4ruqS$F2M ztIgtK{=(wUs_J~f#kbR_h;#d7gQZfBc&^7CeL111;Ty-(4-3?+gQh2*$?TOXTDo|$ z1lvK|yv1#2T~q=%Tcy8cKCyYT{j|;c9glzRD0<+=9)9@YIZw@u<6FA4fa2SY-Ykl(I$rtFEaaM0m^t@FfJ6q!n zzHDMh+07`nInIJ}_V>=YhaS1;e@ikbSsJzF_Y~e)Q-m#)Uv@<9dUVjtHt3a$qUAm# z)s)A-{``65aYQhkckR*V9?4IXnRYX=CEck%^^JXUkwDbj1r6)^K8vty{hjW#GI_cC z($mq-RSALHeM4lY?wzM|c!Gbi^|G|MyUW}r=Wu?Dx~giqao-AC^HxKR&?%i0-g4-t z&pB@8&0W;0|EO+J?Ai#?iRaDaKZQ+qS}rNd{qN+e6ZJdncl=I{S+eLUXI>!RPM5Oo zZnZ$!AaORyr->ROtclA~Oq&{ZO*7H;e#zLbRn(SiD*Pel|84&xX4loL7Rs5<$o0AU z>6XVO2lYqnw{Q9uE#P);7P+fzch;-#u~f0;9LY5LX=1(JT#H8|eBaF~0#GP?4H(NZ?k zI>~A8?UG}wP1;OPzP-pj(T{zVm+ESpQ_;WfyY~DM^A%Kmv8^+-=IF^HnY4h5c`J&z zynY=y*mzK+r!u`!N5&GcCQU>sV6!lpLMfx}7d1zTK;E zBbm#)ut&-K%%OyQ9^LZZ+4>DDm+rgXbLLQCh;XnR&xKoI^=}sT2d)&)OU_!Jep6xY zbDPG(4JlQxA6aQl`gHP=jOLvec@LJgmu>apz1Q>p@0TBMn&su+-p>8&+F5=1mvnmY zx&Oz?%<5ZLZ+bpIEdIJ&|BYp0@5+Od^8e1PiE1&fW)i0?9HajQ$r z<=D8Avl5KLs_c=*cm6jWS+$@dphL~s;_c4^ExOYtYDF>XuDIXW<#O?U*RkmRlGmng z-Qc&a-rXqo|J2s(?8W8rcQ4a5ebFS`@Mww(w(ELp~t!oRu3=CDNf zkIRb|a`aw1qi?WKv6PkR8f!(`mP2~pm(@e3FZ?s_nEk&?Oss5^6cs*QJ)E8Kk%4Dd zQ!tmrrel$no~5U2j(X`&SaYXhmjIW6PtJ)=lC05}x+CTktaezcvbtp&%PFfU-iOSS z)Q_xoN|Eyvo~o)E)0r?OSN?rk+1`_^<5lwI(??cZuAY*kp7*$oO#F zqcSJ?*+(a<9rPBu_b}2%HPgPqxB0u@QuceV@18p`BSq`io2hf|FT8zVsd9>7=LOyD zBu;y;8LqusL|@;UH}~u1VD@A2XIYmAd0&w;T)6g-tHA5YO>v5*_pfxHG!>BEoU$^? zqvm?qDwAIK(|3J8RI624d^1vBW}W1qkug2JT6tH>#VmiPf}hDfrA7j(ho7I&`10{u zqPyafmYZtJR!N`x)3);X{27+nHnZnOuV|fc=gZYzoq>-SsT~V_NH=A?u%axlYai_+2{N9uhi!szn@$> zq;x7H;{TQ}AHq`CZ8`RH_wrwd>yIm*JlDN*`Ooy*PkSFszxj%LcFIo^r>!vu{wQ@U zYo6}>sXFk}p`EJDTaW$wm>liB@@v}CT8=qex88j#KIz}FxJ!K1xn9g!yt_9Zskv8S z6YqcHl=1m{Hxl)y-gvsVGcB>~%I3p49fwS>xIZ$^{9aP(eksYu{N1I67j$&i9sM{r z^-EHe*7<|`!o5ya#vaViu6Pv5QgXUQRi6{&a4hUKG=o z(0$!!))sF3f5pTjw%%mk5{>L^<;EH1_jK%*7;T*A_o3t!tB~ReM$gc)jSuDdn3!w~ z4!6v@{a|AG?~m^y9&TRmaqjT$oy$Yi)|~vjBIAiS-(#D(X6 zPWAuK`9vvSDL<-5Q9a0CXo_dpHjgQ_+g_<%c>U?q*{yma%LEUuFb?56qGZ@B_Mml* zw$tf|u)mj7517a8{BtTgZe@^|R9D9&|3jM}o%FPeGRcbGdDQobcA47VhC@^4R2dxn z_3BpV(Zlsu{%alUN_aF$a^_9ReLna3{}gWBeIn(vYw?um*n%}X>Jy8v9~aW-d9{l9 z@9s&v_>88wgil;D-QC0R+RO%z_g5C`u6(V&B=f~t$zEqJk*tzO)Bh;=F*xY*S+8++ zV{P9Y@mlfu2~BQ^*>c>)7MopXuzvE~)qMQ5M$zi-%=r(iQdSr%mUJ-0PGtDhvPp8q zr)j#YvJ~!>HYatym6bcxyzY=j$=4dkEy^A;7rYo_zFp}nF*_-F^uOemq61aYcX&3j zJ*dgyuzPmIPowqxvS5A%VYW$+=2=eN+4$ddvroegSDw0w##SefU7r3nH#4W-c-HsD zlf_u0U-M4-b?JuSt62H!Z>I!`e@I?p`=9;iV|TM<@&1>Q!cH+Ij?DY&3uG5gbU7BG z)6-tKRIC2#Hv8uhbrYxUTVvZV^zg~C>%NbTJ04tK^27Jhtr?H*Y23IOWo1-up~n08 z*-hm~YeSvpZJ#Q4S2UH)ZS@QtiTyf%!rm+^+7lBKXEI%P@vDXQag(cGzP+elH1Su8 zqP**!t+fyL*sfm^P{9=U|HI0k&9h{yw@U1Ym)WOVw(^8l%C4R#8CoZeTcboiJ`~J6 zclwH8PTeDa7xtruYu+@>)%@~tQe@8jTbnEMc1&G#CF{m%o*zm3fEr~*V&UD>7@QiYn9s;SEH>SvrL|(3iubKFIr|IFuT}w zal?@{-klR`esYKHh>Lo3<*0gEV1l0K8rMxuvlb>zAFeNH)tE z*EsL7a9xtiTp2x6Ud5!lq*r!X>yPb=OISQ_E;+wo5m&7ELE9YFg%c+=oJg8&+_U)! zXTJU$ljwDcT%u8DcQ53+ZRVZ*bOy(v2By^oe!4EE^{VFke$^z@JQEYFn9p}sf1k{* zaDS0^FTJY%?moAt{#8+G{ok86{@wB1xMjaYY{|=3$dnYjf*9o|yaKWHnop=)xbb{p@dSl$`qXDEsS%gWP4e%hTq^+I;@-FdR+3}^XDLkS5^}50ep{_YAbyN-4iyrjznyX@=&T-1u;LeA23HKevmo&}q zyff2w%ATNUKH9sUefPIsn{_F-Kv4GVuh^tV{3q%{t-n1zuJ}`Kj@q?PPR(l;KG6Ph z?fi|$Y%d-iPmFKL+`Hw-;&m1+xpRUAu4M@IyG5zkY*ViMw%+sX>2iLpv!Yzb*2!P6 zueoniaVF^a)xgv@Pu_V(T{dgRZr;4uTfG;;Hm<*U>W=q~ zH@W+Y-nFe{eW?|*LS+)eter)I(x+5&s<{t$ef8bExKnoZ&B({Gem4TvG74=hwck-} zq^YFv@Nitz*M*f@mpv^%m&c{3IGFINGb~YhCZZ)JdqSnFSI0GMs?tSK_KaKC8$1%f z9{ur@d0A@S<}+806h}j2F81*e3mNy<#T6}f$#2`v`bs&#@_e0K6f+oaPjtf^OsePSD!ywe`m@sjZOE~ zZ~yK5!CL)%^*mRf#~1upmfXIlW}II9TOpl;V}-fHYXRvp`&Ql1HD!&>hIPuPJv6%d zFV=Ki+1Vz<`9es8QLnv4nk&Jp(PICztm5eSCpPQebbbEH-|@lx`(fv8X-OI~Hn(r_ z1Zyw-KkKj;2dk2(z=_yWOY@RwWs~5?q7waHeM_HrTWr+Ww)u)r*1r`E!R5yS_J-!y z7S23ntSOpe{p;eJ!sxvJK5g#z4CaM2F_l|X&8t}UWlGw+GlwfqnBD(yp=0ug)a7Q! z!?dnFYgneR$!T)Wd-ae7e1U4`Dl{1c7WkQ5lvP!5nDq27i*BIA7q?|UZwhT{2x-Y` zQNx{?A=-+b;-x^gy=WZNzd!Ue>*&l`u3Hz!-CUOQi#FT zFYLGdrARjKBZ6=J#%E{oq0Zc@z2Fui_SZV znL6BNO)WjQRZO2zLa$3`i*CK3!!F}OdyOByMuCg2UAJa@qBYT|;V75Ooh-3`BHF#i zQ#hgzK91{%_510*{q5HQ8;9wq z)Pi5`+SN0oCR%pR+sAKro=H2i!0qT++3q5(`yby52nb#1Gkq3zs^*kyw4FMOxulD| z^~8|K^M~eb71S!3{FYU#e3DbK=Em=ql8Ffp(ZL_rCOqT`uwQ&)mJS(j?h z+Rc9QMO^XQ>YvWMuYQ`F&+}ZnOG|b)`_J1ija9e({TNjK^=Oh?{G?^~{v>Bce>||y zTy@($Bf-{Hy~WINHF392Es0(@`TWjf_vgh%>HmqVOwN0F;qIkRew+M5)Tf7fY!lZ> zE3$X%tnO?+!u)RE0wRrrm#cbocd_ zAD85R`h54o>*Fhz8_#w8;ro6a|MyEz`}6JI@UIThzasnX-u8T>zfZINua4*R+hpvl zxlAVXcgXG+mdhEwsVQtabxPC7%Te{?#tAAaH$oNsc>En(x15-_np5xQ?r(37OLngQ z7Lz~mu3h2vS^BB&&FM?iHXOdPx|?52^G@QW147#$h2AUSdT+P1e@Rub^pXQ{tqF^} z+W01gP2H>-BJoK5gzaGtBVDoP*}Ls(GrAh2+?tYlTCheNJCC5u(&SFs$VZ{SJ zXNqqeeb&0HlOb|R)$WW*3K9mpwqSc_)$5X&}sCWzgC7VwYfNcF6=&#;?b5V(I6r&FrROm$GC7;0KRrp@%JW@pMZ>lbkyN&gkKXXwNE$EpOP#wj zVnc!GmUmtL+onECYuu6-Q1#YOcO%ayCXTze0)AeMJNc3^)?Zvgh4;$-3rvR}DLU(7 z-ww-BIsdTX?R$0ejF`wJ@|MXHR2svkc{uLd8p8f$TesNqz*ruKX)o^BP0N3|AbLq% ztK8|Va}IMlyFN<%G}KXRPMNHh(IUM0?%J+HwS6lEXB~YhUEk8v^t`R|YmWP)p4q(Y zTJoIT(rFn}9<{LRmxXO>(f5dUH&Tt}`+I;ZpvF2VMqM%JyYQ^5*IlF6%zDns(k_sB zF`q}jcM4 zs3tBeaJIXOb?Tm5x0*Myc4=D7{rJ20;Pw51lS?yQ?_aOJ8Mr%dlHB|}o_ChjUB93G zd(*goyN!i-*<`cJ651j;>FsSyRsXzJi=SoTDKShE{yHc9g5>G2Tbi2BuX*~b_@1cw z+2nsLe5Tsn$5o%Y8aJ}##mZ_<(;VaHU9sk9UpWzN^Y;bm-LglI*I3`io4ClNp=_4 z$L#$4b=}c?MI&X-daDil4YxMTP@VM5WrEhF)~>X3MP3Offh->0P-w&zd4-vC~U`{eLn^Z>jVw zi+={ok4_NZzI2hzwW)le=ibzx+<45RRXlyo{(}$qUwm@$nD5H7dQUffQJh|TY;C)~ zyZMDfZNVNwQHQ*~rCRQ3ntbL@gu%`BqjNqR9W2%2ILol+P^YQ(oIKYX4prVs4bzq% zn=vQ6x$?pn=NTWZ)&8mZ>%9NZZ+Ekafsw0g_G&h#^p&44|G!v%{N=CfJ{>AloZ<%4bowXwCs+scd+??AtcgkMupO6v#nAZidCRbqS^VGxvCNYjRSsGzz3BV$>sV}>YS?ql2XeDCwUik% z%KdMfE^2z&=Hno)%zv_>If!BPol}#RM4q0ac45-yV8I}fWI5B-b=yN77OPFVu+!Wi z?})+jQ#UT^#W^}zc`~lZjANUjYIDCQbosWX{ZcoxzIweE4edB87*_fBVMy429p`ti z<`$jpd}DQc?$Mb)GoOS{*y8ddKvV2>hw1c|a<2)~o;;Ddm$~F;?{W9CG=_tI`LnO~ zKeP1uC1~;d&M)KLceu}0&*4)l-1m1UD}U_N<|oqv|4nG>GXA&b$-H8NSL&Z)ULQ{> zy8T)zU~hu6QO`%G;#~9UsWSx9gZ|_&FE-phLvNnz0h8qpjWT)je0Rt)yqYVL`Y|?7 z_H*r}ccBJdiy!H(`*D1~!0NetrM5Fx9J;kbgW8g0#kmo6t7zPk8eSM`E6p^s~&tG_Hg z`^sv|IkUD$XZ7{?g^y}FB$s{uwza&j;`#ZlU)=ci>%86e!>4HK%L%9Q)_*(waJ|9T z!#vdn6FxZo{{7(4qw^Z)Zf8II`0!@yN%rGn`!xL*MB$F8->_3MoJ4NU7d zKM|_p`5_mz)oW#oTIBS0oxP% zLW>xE_B#jVE!VSZ*sAdB#hlI4mWpn^^6}l*#-AtiesX0W$v*A&U2NTk9pQFg4n%#+ zTDEvbpY)OSAEq_$7rQpo>gT01Y}+@Vx8n(qOSb(y<>hMGw!PaE*c$wL&dRT^uT)+8 z*TVhO{~6n2{)88_ZYp6Gx!Eg{5umcJ{j7^R~r_5sM;u-}h<@NOo2C zI(w;Tv5USdRKCvjqwp!~{RK?!?;B-AqzvtgnLNZlmnXe&5;&{A@j;^ejIN(^KQ$Qb zT-JQ*!oz3JHhGEg zxBEi|vrNmD;@34b0=HI`nX#7WELWRxi0}Ar*~;@j9H+_i)qlO2xqjWYwx&?E5|2L) zOE-#4(fr|g?RIOXiR=rlRL&P!JDJxMe44aW`Es)FY}GUR59}+fUE>Y(pE$H>q}{eD znzG2>qDOsmv9a5BnU)D1uQ{fyKDN={{oyp;(EC!)MOKBaV^KDrTy@yN!BDPq=IW?R zefn1)-Z6Z|<+DV@=t2MocSSTKtH8{aDwh=&B&!?LNKOs7=~Z@9N%EFTFmKZ0qgR^# z8~C15dA1<^zy)SSzgwzey%Ivz@vAo*?Xt93vh13Z)9%|-F7>7SP)k+oLSIF8-f{8RsL?-b3qQ+`NAa&7+{l?3eI!4&O7^XRL`eLF zPd>p8(|`9{m$2UQ=vY{~Tz`wz+;w-`UL3w_Wq;3Z>-W=94}RT^lD9OKEZcbf^O0qL zf4$i9Fi@&!SFqC0;xiRoJSE2`9G@JLt3B1sW0Q~MDWSO<+r|4A{}8r#YIIgi+sjr> zdx3#xs$+v|TqJIX*aI)KW`?QRqwa^EP7q9EA-ORzf;fNPf!b9-}L&@60erB4;j%%rfy(7sPyE^ zVH528O^I0(qJN8anv$xg#iAFig+&Jz+hd1s2Hcv1qRE=8_#$UJi z-=Ejcw+mMu61uRu{Mxr&GrDs13XcT8dvki~>TT=%GxGS$t$&@r#d$dF&hqyMgKu*& z`EOcY_~nvj#ooI)R;eem*Ju5kd353_o24H-3zgSyTYiaUBM*cjP`}NhD|dP=@ZkAk$zJsqQ-tr3yQ z$(Z=-tSnpH&Y&{ZBE7dW)XUFwm(RHO>xk~L#U86-12#x8o0>ZIvfo}Pvs^~mKwy8Q z#_wI+Ohq>i$ka?av3`t8Z{r7z#*ZF16Q&rEN7qMObx3y{Nm8=h|+rQ1&Ewo{+ z;_W*->!qUw)S0;UXntA!>BtTV^MySRm9FqN&N{zU`PG8`3;YhK)w|ao)`(eh;bLA; z#!fe_l(qZ^)&vT^`*Cm1y#5!R&Jpq=`Gx!QyPmJsbaw4_ByW2ec9J9+!m^G^8xqW%AA`-?J_r>Y!O-|*k``<`L&>&GIuTUAl4hfluD z+P^5&&!*#O+dX-?kk)e+lGl{hzW8hL|KXE3g{RXKUriLbA{L;SxABjziB-kNJr=ue z-T(fFYv;Cai-P0sOkWp!XGhPyX`$YmByXBNNSEQ>XDe9HXwH-EC%Li1=j`IStJ`Y# zl`XbTEZx5C-KV>+Af{gYjtdYHf-G+ z^SEMFoS^m9&D#%|%l98DKc|;^eMW?IV$7sSvrUDCf1OndqQ5RfTpG2vhIQ(V^f~TDU%CXhZuHVlo4+-!TZZ5J(R^3NTE;V>Gyh0DpK~Ef z!$;&JM>JE|61mqck-9$9ew919={!(f>~w64=0VRi(=tyZ5ki=`1SEk@9!V!Uf*-ml!5)@S-1K3=U$1seBNXGJ${jSQ~!H2{&+C0{La~A z_ZN6}1LAM5eEb&T!gWBp$W(rjxM5>FQ^H1+QBk zTh^Ve9la<1t)9-Am&$_skAGhlp`*~@%(eBh*V{FJPRTC`60uYKd~Ef*w_CUGdK`4- z+@7!ETN9SX+%n^;%QRfgVpEuXWwPSbmtNOiJG?*cZn)xGi@o+AozIuV?^#b1pS2`> z1LqTwQzyDbwyZa}``Kcfn=h1lou0b+^NG@V zJzv|xk3N6h`ETJOr^p35Kjb4#8zD8w%1*WsGvy(yD=IGtF3J2)twvt-y5x#^~C;(_NI zvs6=z1o@Z5PuV_e$(&RJiIxOI8`hJb&qclMkqJ!T&|(!S=rcTC&aD34D_CUT9m%@& zQeJ`*3w}+zbpPf}jqL{yu9=*Ej`>A_XvlYOu8vsV)My>puxfV6?Z?X-oxgBq zxc;4T!>{j<>$BZ7?m6MV_V3Sv32W~C72gE%Wwir08w(TYD{M*||9q%?_bE@3(h-D$srE66EBs_DxFOf5p;;=G|K^+)_wX zZML5^X%WlfNS5q_LY!PCm%AqXZM?bDRP;vuWRvXM+EHnijJ$IrTso7OqGf65TCAYQ*gifo1)Bz^Ky~8BJAA9BSX{HC!Jxl#|!|KNM$cyk}SaKAB??YpZ7IZ#w5|vpRS8o-&O#*Cv4@ z^+xSed_w4?Byx_ID)sOD*mj;ZtBMt~2yOgf5=E4px^^KvE zmPuzeBu(ACZplQAYi>`3{Eo6jX4`#FiCI>7U|T}^rL{MMgAykgb!Rx83<;Mze(v?% z=b{VVK9`q|n{#k)jM~05iOzg)IjL7-8z+Bad$!r`@$8%5Ugo^Jx8ybV{3R!}xSt-h z{2Xf}cx>9aZ86E-x_3^5pE2svKciLkuiGkmN$c`c1yTK6GW(AKsZ~Pl>(NDxI92R&(`)u>M_c31Q>%MHBKQB6k#;8hWd* z{-5@1u42n1*f%!BEza6~C)#w9 zB>#;Qr=In^TeLag>gTN$-~V%D88E9U-P+&$=D4Sc@4{VY&Wn2dk+}3%CBTP`&7$t+ ziu~%x%o$tDH!V>7%$(ae(e3h&cl?*+7iVcyX!_n*aydSwdH&SZ(~}kEoJ_ZwBfaX; zhch`Bce~vdWGvt}>)b9c8ok-uy^JBPO1S^#{RB^;pYmCAlWjOFm{;p0Oh5EsPn6y( z&vV6VdQKnMq8oFnW$#@Dv+}Q#xKo};Dy`P8e*SiG(ghh!?dQkl{dhdP&@Z$^#Cu-& zVUGjO%KFB)VxtCkQJBWH_;2fuocXAI;p?6cLT}@nj{LQqw?O6RDT9E6lq3BTuI{BzTWZ6!6Vn;&f2uE%w9t;vlQhbQS&sce<-E-G29d-L3}xI+`d z@0N5oRx0d_XxNr)oqg`ln?KDHL<`KHZDseJ8^vlaD_~`tKkuW3)$B9JmE1Z)%2z&^ zw)$eh(wA#0CDX12YxxK9MeSAaPDmuj@wHpxkFDBzTC<8}qS~w4%xd>vYgBiM zZB7f2@8OTU8L(>7j;&^wdAlFGy!cw)*ctrLaiitZqB{pnrltK3tP{9AXWg0|YqJHG zW^CQ}^|fN)M;*m;vyW`yN~%7x?bqY~(pGAoj+RloW!~))l%A8tyEY-=C*ukpgKWn| z6Q2vMY|Y!aE~{A)!W>@(*4}YWeg5-Z+G8S%Itk~ zKz{d)!`nnpD8%hpbanZvDKE6E%g-II`+jO&{@KAb7@ z%mw4?)BL{gbN}S;SCTC-mwm$pxAO-5+d`ggb?WXq@uIeS@zWi5k0ib;O*+5zP4D5O zdOZ&>M#y}*y7s)v(oJ{r1^*}Tyw3HU7&AX3cFT^-KlJ;LSglzcaCXlg#V7oiKd1Qq zyZU*TV9WZ=d+(NiI+<;Kc7OZ##Jc}dGuCfAw$DBN|DJEr5pO@;|Ndw3w_Bll`)Y(f zxE*Sid0Qw^yMOmlss9Z=d%J!1-6`+kyu7&TZH3yiJGKrMcbcEK znmOmJs&V2IxwE0mmWksXZ^ME%-qg^E>UX0U*5pZsyT^DwihrZvzuV>23l+^)9($V! z@9yS?AGZ43^Egd#-m(AN8in_y>7D-mJjCl2=WkSfI`{$H1 z3ytSEW$N>}&V8~hIPW8=A=KM()SobTlR`Q?YOzRbLT zH^T2fj-2v5VM%(n^EB;H-nK~Hj+%`zYgTzVK3mm)nrXJ4{eQb0{zuJGe;#peURCMG z_lWx-Uvbn0>z-e?pS%m1@cI9KgM995Q7ilIbpQN5`*TT-{hc*GE|%!1EVEzCe_7(l z#${GXzeO`VKb|x)((2>)_Vz8_E9!ZFM%~q|T7k2ix}LvCb3V6}Y1s;u?c0wUnLM%4 z`*6OAMA<-oeC`Z$s1mnckY*_oQ$m2Te*p! z+V82=8~Nsc+h^eHwJF+BboGNjB3j`=T|SQa?MZfX#fvpMXEBv#eBW=d`o|~f#{VLB z-oGr3ig9@EwBE<*>~*Dt9k)W)?bzA6;Y8`=vd5kWI7Mbv|59CeXX)ux%bIH2v`!tG zWpX|K-rAmmua^o1PriMSU1zF)?j!5Q>1O#i>wXs=VD4k)^3C{C@J?i^+LY-2-RCUd z`B}+5-S{}`cqW6>?Bkb%7RPxVG(4ZImUCjs%b*_d`?n2T`ycOJ*UItDx}t|q>yKN? zoYU{!J9dWmYOrgX$0V>kx6M2C@zt-T-SzkTQf$s`4|keTZmT$BzRNkkcZPeDcSgw+ zth#%q;^bRn>(WTI&D(;$p8w}DE3H<~t5K5w#UmRNivo`x(MFfb#}*GZ^B;QfVEM6G z3lnv{jwtSbIqmw{FQHivp38inr}^jcyFT^n@9Q>}AD2ArwpUhfZtiQpWqw;qCZ90j znh(BH-N7&35+#*w2I*E?!%DPGw`Z)^t-Y>4luNQ@f^VcD-?Y(DPAf z*WF#rPE_#Rdd6w8`%saHeUGJsk4o^VyLLSR-- zkB!0SISX8Ox2#EX{}Uzi^!t?+>SxrnL>Ql(xpKWbb={R$KH*{JTV#{o{}DZzv^Ox$ zH1gl{>jypeoPS;`_+*9lI-z5&^KR-E^01zm5L9>6Yx-rkko8&ZE8X~#jrlKlG+a;- zSaq$yQXy*skEYD#+BexzCEY94o6IM^@M&V&^E^xS@?6Ka9$bGt>1OM@O#a>wr<7QRzL0~IE;(N9%??Sx%#_b``dBl4`=&)Z~x9& z_0j%rQJQAm(qFC9=0DMQm?j{&i95giznR>wk8h@hE~t6){!RR;8@6e#uO^kuG}=(%(%22WCt@*Yft<)<3gtI5;=+?^&)*=R0;`zL zY`G))cW;TR)O#VfzqRl4OMWL*Jp1_Ywz}cjr=RW|3Q27&?W?prC6aT^oae%p#L#VT z&!4#`eRPSQ(JECH$KNbpm#T%jO_w+wR4Dvka6yIMD}81eZ5Eb51-@AmFKk?I#~ERI zW!HpUEhUa;V#n`yOtpOQXU}=zR8`YY7x#X3vi#ZSZ+=bPDCi3C6ZI>tAnqj4%5@_0c zO`Y8q{v> z|KRF#Mn?OpNZ5p=Mb>q?zfWpOy!zC4o{R5+nMIlYT4v=SX_dtH*`Xe{jlM3p{rucP z-Q8||a)Q_Q9{=6&by@k%+{a#P0zZ1PsrZ;H<;{MfVx6?peIZNMu^Uq9m$f^km8Z&E z=iK2F(!Q;huvTe%`Jw&GEJSzwl5L9Iey98G{Uy#J`!>#bYWC&S=Ip8W*DzjwzHox3 z^5f5kPKyW}kG4Ltj9v6e%gmeY5#s8GAKh+mY392;(}rK;U5M=VuH)19xktaaDQ@!o zQF4BNzd%evN6n?J&h{?_iga!!bFShEb>d8)Hz6%&f%2PM(x1B5p4oiDc~Xt>Lp$cf zPK@Wc9hU}H_^V#{dTs48Xlm&)ApZTznNP7hYSZnsh+ zX0O>c`+pfd^XsR5c)k8q;nPnF=FO99&KrJs6S*U6x@&Av&1cnLkNl%+=EpofVYlm< z*T;$7pWoOtGvryS!k+5fqmQSFnP zyWf6%yv{Tw>&Cl|OnI3Q>&PjA=1gz0S=A1Nsz2fn%U$}j+4ShXlL2kYR)^)K@0C|C z7hiEf+<#-{sV$aCu63VO`VVQHJd-1Fig)(Q2h*IFZlAy$b9nNLSAE-#M00y@_G?m} z_UO%esgo<)qHY9vEYl2|Gc$HmeE9VjN+)(kSCqZEm-MdCCrbE2dC0a`DvDSsa0iYzeV+rZI$VXFI9EfmUMnf+u0tr{*TU^&%3AI&ffX?rCLd=e8%-D zjCQd(YqwZ#6!7kIaG82p|8vO4waVqI>YUu;W_TtT!p}@*X&EbWS?GAk=4W~cYICwvZop$T;;lY7VV2NKAxO<)9jR$Y1MVF<{Ieqrt++DF;tMlLcoi*0=@wNYa`ycnV$Mavy#;=^b=h6?2 zw^M%V*}XV%HSNaj&u5*2pOky~uihP_yD5HNby-!d(S?`7XJ+SOT z6rQUG?AT|w2J^ zvfVr1u+JCXeW`fSke68cJF1QOXN*Kwxa+d2)W^@g?GAL*P5rc~>BsSgQ{EHhd>H1< z)9YsZb(C?1`G)V$O>I}UZ~hQ!e(n6x#ow>z|M~YyYI)gSLubPqI+Np;znshQ?EgdG zh=ZKxU*r``kh{J3(~P@2!e1^9KV()jz3A%Bwde2UO}~BB|A3?Lub;xVPld#UnYh^* zMy+PLXT0BThwz0(e`E7Y1Fsl%$u2&q5SJ(?`00Jk&z(iQA(4Jxl6E9kzhC5kxxTif z*MezL`)>RE>Ux2I?2|{DPH)+J&gd`K{>={0BLkP2h%{s$bbqojnLS>#%DCoM{?$cn z_pEoXjX52iwA#}4ib4Bv^|OkW3;a#lzJ6>xT;(j?eDWY?azf56iIBtB9(F2b=Tw|B z63qW{{ociOzH{t9ZLItBm%DfSliQD<+u4|uyuERBVgJ#sq2hh@DSK^Yfr!#u0NzbBlkMvyVERFTORmUt)30 z=ChTLdfR6{ik7j?lfDpW@9PG5gCft&@=L zS$0Y5lX^sI&gRFiQzhbsd<84K?SLPLmzbS}bd`0Tq{bdfv z_CN5SK6!fo(@Sa2>%y+EvPwL7d~(yb7LTuiyKHZKT)}lB%KB5->5H)+E`RF%JOBQ# z|H38t)`fBZKh(7Zf8~}sHf4VM`-fMG9~EZ&pS_;tkKpNgkDRS9w)}hP_WPnnpQWHl zN`KR_CbdUaXKF)TR9D{pCj0;KjXz0Ii~PSBoO|K#_b6u8!rzLYHHr`WKXcMIxN!f2 zcKBYs+|W-tGD}@ds~CBImml_&cCzLW65(JyHCL;p()wwUUQ*#KFZ2CJ-oMGb!n|1j z$OP?X<+Rf6&v$yyyno&BYkji&`fuWfN8@K!I4yLKJuW%zpAFORVvf=)PIEQ03zGzI zTQIY2{2bD(aX{zSA&cG9yiWwnO%VN~@+4pVpx0S#g?fXt+Ar45+2~+ixa<9a_WONV zbqxHOP8XN^1!}jSkL!IjZPtkk?b8^Suc#L|Asqgb_5NR*-Sy`dg`dk1Gg+<2x-QXa zYj~Wz-n!Pl^H)UVB0h`prbhn#@yY4TdFK=QnKc#-N%J=l{lW{MH+>kHX70xTSc{`S$e6dJc!hH0}=HJ=^vKv+~@|?V(Beu<0Xv5RU*%oj5JQuupVJI8T)~u_(VYTIY zKgW}oZ|&Q0r=<30p-JU$!==YtKQ+idzP#<%-m05**NqnXT(-Pls8H$Nv6D+We8#?K z_dhSYo98>xT~Kw~f|)r1k|*}U3kZKs(nq(of{$- z64$Iv%DufU#q;2w2RGK{_nvOPWtbUp<@c?R=OR0OYp=Rroz*w(yZmC0<*%nUbe%HY zxk<;G#mlZN=vb_=>G9 z-F@8kG}ejjST5r9{?qv%KSRpneoB9w^`5EI(_-e_tCq<&%@`> z32Zk!`Pk=f_fA3K+ug6T-cPz7=NwbJRiNZl;WWqCyU&#hBt$iwmNb-J|CN3Bo79}O zvrf3KsqF|(S(4ziaIJ&DTjN`^#AeQjUd!D-TTSFr-wao=QJxFQ8y zx^$X8@9!5r>3Zfy`^qDHhx#p?3>3|ldY(U@wkKXvM@L(_C?gHI-IU$W6E{`Bu7 zVV?0%G`S}}vNH$@`t)qZ%vSrlZyU>0rq0nY-CDWKG9vrdqD#kI)*jv}{VeR}oL)NP`7gxC%3{n`3C*-Oagxr zdL}gmd${^qReaCd!r~;iBA;d3(@i09`rm#tb9QaIEI;38!KwY${k&Yy4jhQQ9A%TB zzgFUXLt+Z=x91&h7eDkj^eFtDRd`!I;hF*0$)21GNSGO&&<)7=PTko13o^o~xzd`l) z)HxgKcQ&2jsLB1R#+9(YNO0j%z3_cg&pq|nf1d5`bgjAVcKN3(=jcmT5U?_M0|FI|FL)zSD>*~J=*{f(DsXbz}<-w%(;?+@) z-sCAJNqY8ted?upZk2u1@9F&?-mPL!ib%~VeZN+{(lzEVpW9)BXqm!evpH%*VjpVO z?+`NiZ`1e9^~hq=pt~(TpTw-Xk8wYj`8!SG-96X4l~Y8{E#CN|+OAf){(0y66FZM? zC`&z2qZ@N(YW%}o;YBZ>lqmJi3F}_)(#0~+ZOK#iz?oavq=F-6>71y0X@0ubzFGa= z|M-xN)d`#b>N8Jn&5QHptUme1U1kyEy*m%qeA@QvG?SCwx)0}h3*Ya_Sm~b@7%8*= zrosMn)~w@y?Bh;(^&XapJft+z|7`a;nswW1 zp~lmw*LTh)ya|=JjDDy6c+=j03$FdTzJIZ~-4fN^H>1<|FGscgwB`DncfYmYQ9oGe ziH85pI<2*Bf4a|XjB`8Ue)yWlnHXdJ4I5A7a!s7}NVxsim5H0#)vlerDP||Kd;ixi zzb`KyZoKEa!j`}0nD5)2mac}YSNfj+Eqvu`>3gQA*Dw zx__6s?6v-W)%pFBAHkgeCs=y>o;q-saSm&7{grL^IkSRIK0RN;e%{XSUUX zb30Y#rtq1=O7m-uBy>IJSh!6v=k{EMlMw}$P44&Rr598gvMm;rULEQ7Rm5<{{a_Et zWd_AZEq9&Y{&={1dD|Z8 zvHf!u*l|;l;?(%lQ@4xX!7{@%}uPl%+WGkZh}UC*0l}C(6>zonHx6HB(~&2-v*ChZ%l*bo{v&@QZ)9k_PC3Irr~ml; z-t|8Z`LU~2wQf)q{XXs5zV-jyWK}92m+?Ck$n0EWT+4Xl&rg;ql8+CFT*zjby2ZqI zQ+m_wDON54GFF;gfnWZ8U-tW>Am6(qt=-`PFIeX&KRCgqe?7oz`5DfVrE@nF$7)3v zR$M)|@PgkAMv<>a`r@}9y1zwmIq%yap1JSOE&DxXc|f}K_mD@Y_wq^ot~_J>|IY7r z$y0B1{);@H<>9j1?ZeeHhxiPUnMbvkA3d|#Zb{RG*uCGACHtnW60Kh7eUDKzVDGhc z>1?boELLyL<}9d+WniBw@J9OVgB{OQm;Yb0epbI;!93w_)o&APUx}R0Ji0Y)UhAiZ z87nTNnKybi7uj1HE@}39qM16=Q8Bo4o@J@5@+7tG51-Fjm9Jo`v0>>JJ>5LX-BZ#FQ2W z&9hN+oWw-)P97=iTRve!T`%mY^fp9FbnTAu3Y z?J8jNJLJ(9@M4Cc%b^U7Wt@vldO~7^o(d%Ktnn|qsIkmXeLC;7Ntdri7&R_-4Sf1v zyV6qm%4}yLCX*F;pZG%B4Fh%0?>*}s=&j5-XO&`L>w*>q1KnSDW#?T^*(bStVbPJz zmt(yH3UqhLUA(4%!7hL*i^`Y>;+T+OMop+}1%96L(HA(ZU@sED%hnh^{{`T^o>dl`0 zA7<}abnf@Ad!~k+v!C2OHFZIH{ehK-i~XMMv{2XmI<3vk$2iPu>-to=BqQmh>5~q8 z&i*g5X!qA>uQI6)Pb%CH8H4`hwqbyMDK< zxWT#8FH?B3VxP8(ZOH}aFZ17RkXRFa{hiwK&F5!v9#GwHmpx1WcJH5Zn-g(`{Z+%No_o!`{C_fXY1>^UUxQDdOv-#&+bI&s}&)q`o3i}^MrpY%ahyoXZdm& zKhO8~es24iGyQ05<+*R0KD=4m*>N+(JKyN8Nm(uzOQ*2Cf5G2}XMaC>!hiPeFmy5(_RQY`Wj_rYy4d*+dpgDnxE?=e%{PpU+kJQX;*xi%Y32c z?-!~H+@FWo%wk)(LdV7|m&r7aEn`ameT}lxV~ZcTOTK#HAiy(kN=Un@xv{$OBL|mT z2Qye_KdM;IbZ2qp%&_Uzx6?ba;I&EdClu zSsb|c^G(Y$!FM@%`&qwKG%Y;8kGmx)^}ym+U-P56?*uh| zYrL+XyXSFO^1?0GEGAjJYJS9}cz%y>X3y4#>jhNZ0&ZPb=jDF8X7XW=#nuna{HNum zc)m7sd+&AlMAoYG$W2Q(aBk^yt@9LTke0BX6n$^|ub`+~v$IZbGSAHXFthO}o?qVIC+~-N|`@De!14#EqU9{WK>++v1m#8waI@tGubbxuhsNBHN&#J+~v%+m?yXD zwo7lx{U(#JY@uAwSx*WN@0e$Cv(ENGUvPb(ZmO#wLzsN`Zr5Z}MGv>E z2m`xo4B~vte2x6IU#o`sE;{w>pUmf?P7$7Mk6gB0c~{h3eLyZk&EE4t=ko8nN=|JK z-Eniq%=cGk**v?F!oB(6ne`e@3_Npgc|TgBc)85@f8&}ZH?!~WZA%d3nc2>}>`B8p zo3H$zoaX)P;%CZS_OYV$;9Ijvysn+OtHaK0v%6(mqS>@Sr)Tw=pwPlVy{2tv#IOK3qh9~)Ngwd5Q+4%ay9TN>_Pb%J8YUjleYyGp({L$(+`7*l&M4mpmuF;fg zf4L$-aB9f*wVTTXewj{fd6?2;{D0|{lqoL4n%fQ?KDl}S@7jgj=DVvVoSejwyihhlrta;@NpCvy&!;Z0c_+ebdQP?P zmh!TWvrpFEkqFe^@p9_xldDC+)_Q^P2`g!Tt{V(AN%uj?!46CO}AbZ*e%#R z(W&LgTaQk~i;*TuQ_rYHOqBDJv3af0c`Etiir+KV@kl=9Yu$IlXT7ddq0^};n~YR< zDVgr(P)#*%YA|gGJW*iozq#^+s}SQ}<5oWr-}x5i%X+FN7Hz%ar+#&D#jhxd)EQC| zQ*^jiMm|X~@~#WmtnAwV^;3SEd zL~7p_2_@chTaDI<`=0!;deZWf_5ZHl56G~a?ax@}|8l>vOQX`U_lzHZ7&TQ*_Yqks zFBiM(P0gb0_LjEy*Vpp+vmbbO-MRf=+nPktce-xf>;|XqKkQ~Iz26&jVfL2US4`fn zDBs?A{p{thADCk*PHz@i=9{>Os-gF{krJO z%&6Ely^61^M7BQswC42H9DAt+)>RtL>~Hd4+)ec{5lEeO{%*_RBND+fA%9Y483+<3Ew`aDVE!tn%ZFByc>leoxhil8iv=*l7{!cTQ z<``MH_(s#D2h(2OEj7`qjC1un?R_q0-UU4oncH!vHf=ULb=|is_=u&b_T?G175w|Q z$Dc^H&omb*o5r)PF?RZrIF1cdFKOoptY?1qQM5+xwAoaa>4Fa9Bw%{cRc&`}0&W%s~SnyE{Z7!u49oOL+ZCin?8IS4c)ZT1QH z^R!Flr+??A+9nO(InQ1{T>EQ6$$ozwuZ{6ah38UBEmyXRN}RZ|xTQn=5B3etnqbE4@9Swq}uUaic}7ltsDL+@g+D(<$@JJUK$n-#KP^Mx%mv-j;B8 z$(6C2r#yHi*>2H3Q>#be>@fu%KE8=*4ikK=HWnydWn`JntQ^C^E+PIXNnp~md0!I$ zWc}{C?3yWj=j#8NJbbdnwx`~u#io^pS0!=CxU1z)DlIyaE8!Ku7vNF$_2@R!G_CbV zej3^uPKjjOtf;5c?!2MU<-#Pd$BR?~RAWx2ZjfA(9yX(8L*PHF4(4hx*C$LIt~)r= zU#fj_``+@|L89-&gM;h6EKTGa)wj%veDssA!*aHq``yPk=a+J97IM5XL9A2Nd+Te} zM?Q}d5BYpJ8~BW4{SEt>yRxre=(v^oMebvQ;GX!jrimFcPX8KpBAnD@G=A;!5aU-j zzVXq?s?{z-Gx>AM*NW9^8iVKWzU=#4TYE|SbFwIrkUPxkMk?% zPn+?0;^Dlh#WVIywQ(xB5R*E2KJSq?L0h6@f}_{2@X_IlyeDJ8DQc;{so>AE^Sf8` z_zO%B?3%YA$29D%wCzd*Z-ZxRTbR$d^;b3~y!!m2P|o$9)#oPtn#-(T-bIKShOy*a zxf5_$=ZL|Sdl8#e4?R7Hj&`h##2rlh57be~I?FLs=JHHk*e& zmS@>F#a2>%*XF94TWKeX!fmGaTlswGSgR7m5Y<c zbM5@G$lH$KKt={jYNG~|7nKZ8$TUbb#;CHxsNVu4hXu>I^JJ# z&qq>+x3n!ZNBCkwSV^U+rcZ^XmSc7^f8PFex9T4lcxSH8^tM?U-)(-~J$sY0ZI`!M zMa~Hg9h*&BVqRSzm-_CScqEQt_WlQYaw-Wms+A|bE3eIDfAoFDl$me6g<9I0r)sa# z`&rX#d^$yJ`I$RhB9HE^*~dR~->wHu2M#b@5DF;>zB6Sx`z7sJDVw_gvCZ#d7d>Eb z&$)k&$jJyV-X1xbwq`DCjR}g!BOKS7usu6$VCJ;T$0gbGnrB$s)+qPs4JDDsym;D} zKWm0&x!vF4zeoQe_kV}r%qA`ciL0p#jaZ+G>v7Fh==*)dRgC%PGmhfGn-ed}HZA?O zC8ga~*-TmUsL)j7%?ET?6_;vkUvXt#pzZ3iSLU;uqQ02a{%LUB%Ad4S=E%Os8&`hT zWMj@P^^ywdoql?$!fplY{a=-0rc8b>H#v^&)TSaSAw6!6d2&W!Y+_kTPo@7%3V5(v zz-`@{W%b#~FC>g_rb=b~6OqpB;k>y)dg|Y>%P(u@P5LqAwp_e+ip6!Jx2vS16{0t)K}y-O;qXY={)@Uu=1HwwMo;jrmWF^)&GU}@B2x5+fPmS{W<;a z-FPNwATtIcZmpU%JB zVB*Y4I}AIgG8sLadz$}ejnac7>9yY?>$(Eho%(L3v#UPX_(}EZo}xOg4e7gLmR5e@ za4sy{o_t@qyY!iVyltj^;?Manj;FmB-Qj9?~ututr#Wyh(0wV#~l zhDhEB=;G7$+;Jf`>Ig4aOW1$z1t0IQE0>5}+P`fwbLk!(^TWbUi+WWxd!^;`pX~cJ zZQq}Gq2>OECVi4li%*)1<~{R&i={HQ)tho%C0Tyj*>%2?n{%;xX_&^ho3%mfK6YsAzTv`_a^$`G z#iDo_CFe=|uS7=_f1LF{PbY0j{<_wMZPVwrTARJ~{%vz|Mq z$Lb1q+f#vqFDHKeGoQ&~K|@7g`|hWOEB{$*dtZ)NAERjCkU9TJ|GdT!tJ3^j10|iB z^*?W)TebbOk&cvPT+8N;a_euepDqXq|M2GFu612$^A#oE9?bl4YLb8b&&M;gul(YO zocG!0YR~yc*0FhOSpzl8?<~GEf90gR^LMDPE-ScpaqAaX6V_VB*mE-$)-d#)Z}{Pu z8TB(MnX8UtyX2hrSJu9Wd(Yw9@FdLdl_Kwao1KfpWemKR*RNjQcYEuh2Wq928v?@q zJj<6k>8coLp&cdud*9W-+6^Mr&hgwWqq%2UeW}oZSP2pX=@3e0TM0|Fd5L4xe5ZcC=(?=jHXU zN~<>3O_!_DoVVJSuljG;mam`urMAZ(nzXfb+ns9>fs0gJL(;c%&+cC25}1>n_vs^3 zch_m%vUf*5bRPI@^tSOq0&(bC@%Z08=VynN|=w|RM~+j(&npe*Wa1ut+S+@%zgjcc zqis=}N?`o6hM9TX`#;{hxNar4ribPO8=qFo;|@2zUOcJrewXE$JL!Dp>Q*r|p}RAi zEDg_?H9p^%+I&H%D*f!)4YL=XtG-k&^ZM${WhVJ+zvz@b`u}Uy+*Kj5x`rY%d}Ntk zWi%?p9TzI{{?q$;)#bhSW7gJuv@^B6!SHnc)ESpQIlo_|Kl$bM?VFj8^}GTK1Hn=Bn=nJAFG3iNv4XDZl^u-LKOn zI~U8G)%fi8)W7$?Tztu^M*>R6YThm0(6qLC`_muGY7%3&Ug)uMTa&)aDu(Myy0}dF z8y&98Ve^G97G~@`WRZ9DjNjgeot(D?j;ys8G%x<$wXDMSZ{F5wpHn$;|34efn>#IG z#q!vKMQ)br`g^aQU(eUUy5vXS6+U*^mj!(%_1^T^)!KQP2`~t9&Nk=S`^({6&&=QV z=j=UyvwgRL`@<<6X&KlZT|g)G@|Rs5O6oeIU@lg?R-8GoB@ zqj}RMY5ojDR-SDV&8wQHnf^SoBt!Z1wzhW$?>yf4N=b8mEcM=Z{Nz;j<_B?$o|JUe zZZ1uHw7);R@Mm0WH! zjoUxHc)IZB{g|!)3+h?_n;Qi_?cE)~y1P8dP=s}B*5A4<<}YekS^X2<-_;AgJE5ya zXJvMTeAJUHCa1ujZN=Lgq!+c-%jWJq9^E7N>YJpD(Urb0NB`VP^lIGVF0PT-IOBER zp@QD7*{2qtnW}i}jO$Cs#arE0__JXG)~QAL9$R{|Xsby-D+2 zanb1G{nzSgFPQRN9S?k3TXR15Xu%1Ghy2>{ds)-gF7+^XeOsn8keOgh_SB+r@*P$(f3x3*&+gn(D=+xVLZ9{ov?>uJKcCN}^ zx0tA>rW@<{RLc5z*K8GCYEshF#`^Yk`HN?B&6u4_PCol6vffYI;lhjFOe_9IK{adE z)X#3WmiJE9KHISKp?mDAo93-n&FfEHUGDiO*_^NONBzZJQmId>M1+GT%Y<{k-R00U zi|25nck(JvjrPNfYl4%^n6_8G_k6PN(1YLetHO%JW2%1btSJ4l>QmFr`tMiy|Hf{$ z`G3i2d$O^8tRC09$3{=TZu{r!*gwTJal`FH-WQ9WRaKib*Z(lNX!do=zJ@F_w~%o6 zEo@u1he|x&_cu7&@#m@!SD$W+oL}{N{khDRnhM)`R-;39Ujk|txXr4(lA6*jeV;Y3 z%C5qoM&;aw_PKYT&w3&y5i{qRp#JCEPuohg4WqkMj86SIs8DNo_xbzI8Qh=mZFqcE z!Fx;2yUtk`a}MWMTbCDpw0>A8o_n$Dz{C%moE2WOE_N?XdwHoRebb^@1%>xN4ezt?J!qdBoOB*>Tds zlur9smvTjG>ed%+^O^druHNzJ)uj&}Ke`aJ*RDLqq53%IR_*1LWmZ;Cb7qJ>To88U zWb65>1wZF}n4`h&dGy{K_dNC5q(4rV%=kL~ca$xZkhIk_n9@_b*j+#C$xFu?>s_Yj z+>O7it8>cn)ivmCoz~hi#g`}Jy~{#5mv-CklO3Gb|9|=}S+MHn>Zr^_&lzuSr2F2j zaXstvDd*?>ggZjwD>qE?2~pmfI9F9cW4DL;vUBUWGBfAfs!GVLy_xwX>e9J{DXN#6 zCtPw8W1n5|>ARP2hic067h$eqb7pLu@QHibzugW~Za#AK343)>(QV$F6Psnr&I3}-mr=Erl`$cp3<}Z_Mx}CRW7cYw%b+wRItE}KU;&Rb%`4H-M=NU z{ZpdwzrR9Fb)iQ~rFWXWD&!UD`sB7<oWtBmBQO*O*@u? z8sROO8#!=l%csI?jy0CB6j(~T9dQPlc<~K}p=nI3zwZq^=XwAA_lSQ+ z$|7>Pvp*l)^l;vL(^oHI`Lh|5Bt>|X!uD9x-V|C~c&;;SkM8-484q_@Me>&TOh0WGbnWS7w@sTiZ{Cz) zQqcCgNufl#d-ACUduNty^EP$xdTO4$q?%629pV7Qc6#op$u0^u~7+zj%Bl8Wc_PtLz9`rwzSJ&WjyK-(^^3%`0Cn}fZ*m@b%FYP!~6`~QhEb<_NfMN!*39RHp~05#Os@Y|)W%9ro^>F8Rm>@WkKUE6`qwNI zSAgBPse`X!2%Dnq*?c4IxMdhL*7ti@!t^F#Wrt+s?XU@?q$D^l?f7-H* zFW{j;bWOc_wTp(vI@vWD@oFwXt@qPbT&)*z`*BRpZF=(6CvQ`%3R~thuNRrZqGY=y zA}ifB%{0LNMB@zqUo%Z)BlfOmTzvba?MvG`9$wsTf7*XPyH|bgc=G%5H~c;2EZe4Z zJoy&#Mshdf0XCUwO}3M-ajl%nwtHWflgsGTNW{u zTCA!s6t-{n9WUDTr3L1{x3PYTYh3f@ku+W#kRkLYOGJEK3cC-BI#D8yS}Du zZp_D=t2Wp3rUY8b&tLKFp8b=5bJm$AFUkBOC$reo(ZTVjLAs@BZiU?ZZ>oWHj~7hZ z+!JJGVcWQ<^k2!9r@Z;UxdRMk?R%l{{ z`R=5aT`^aJr|eelUa;}yl15R(!e`q`S^CU+J8Zcu8Xii|N{=kojN((zNt|7pm9)sf zO}uDpj$_Q7Gm!~T{C=*`ke>PaP|?ph3-lEK%?*hOi?h>Lbd)YUH9fvgr17QdIxTf` z)jJxWL^l@|3qQ*<;Qqc%uleoXmt7r>_Pkw>b>|8kb)Dl}X2e=lpX;?dEl=g*ddq8^ z9&)9cZ|5!fnd1NH56h|Ad$s@cS67Ettu_!lDf~Dgr*f?ztHPnwqTMa!VHaJKIeoPb zRGwJ<$XWKYdQRKA3e98bJJZ!ITIF}7YTP^?eeruvleB6{?e1sk7uPjEHa@oJ%R4(O z*V(h@oE0s;S(Lxk?ah*17v9h0R9I86J<27*(;&3t^_5F9GaG6byw^SaAg5rZ-?8@pBZQW?)qh3<@!Hbk62h|UfbF+(@t(H zSK4u|{P$=0+V)&i?$ONqr?n{3(EXgu?cA{0?D+;yO%0wd?yujU;qlGt+pn;fi+C3` zx?Z~W@9x?8=3?6%=pd|HH##nuh`QZm22-B<2$QdRc$Nx9hcgT}?;+Lhs;@?{--P=IuVLbx2yN z?o7(^mzT~tsM`D%ZrD^>)NtbJ^hld&JSRjZh)5*ulzqz>GwYVo!gWU99v@j~yOeX~ zw1!6l-COe}F0(%oY^=D)#>Qylv$A(>tD8!BUmaY-tUA$Rvh;)!)=7e!%JSd;7kuP-bzNuEwMZwXu3%lxsnyr~e?&-GFFdzsSz+^S z>k~T8O_!$FSR3-alfSp|MMJujnzXvvu^)dU8~3>{^bOvl$Yvog?>SFfRn|qVKiR2j{3>4#e`mdVp?;_FnX8z2I&r*|G!(Y$Xq;16csH!HW z{p>r&JpcOM zqA}egF(9EZd*34eq8^gH&+3c6myzyJivbJ2`eJZAvW1fe*!9=`mU8<^8|f5`;dJ3scjy-)x6 zxAus){+VTqYn00^EH}i?TUX9nV#<*%Ddx8JLOZ*Ou)dVur^wqu#>nl5nHDUn-~8ZU*Mf|^(3i4XeumH1Q8j3OKSlgd(d)pY?Z%A^){PmGQ`vzF;R|IMaVTF!6YK9?+>cQnE1k5ud{5ntI$ zRT?>AOM_hRos;@HfA*hi^;-_#>(840yXlrq$i>3-Hh*H%ZXDY!Q4@ERb@hz{pO*^g z#w$8$Z!6wVkZT~g@UZTU%Ma|-4Q=H-f97~q{K=B$S~G5ZZyJV{J(KRWMU zyhU#)$Lcrnm)dHdyR^R5ka-w>V#1GQ`z@L#|C~@A`d@eb^?n^|X)8|isdvJ1Zm$m8 zef5*Eg5tu9)m)R7?T!C>eAc`!U#S@}yJr??#pZrDe0u21S~sOGra9&F*jH$+jrxAK za?1%h2JSWYcE7zKl$&xr=Jjd~vQ`@Rg&)pZaX5xoOv5VPXTiI^#|I2=UccS7 zEcoum=G|iJev5KuU0!#dZ_OR=q;2<0k4K#eG|7{qppz zQx;d=r7jhE?mWr+gw5vJsXOOQYAHGB%O1OW`RSP^H!VL-ex@s;>80r)R2J|gX8YI6 zOG7Oti7DyjZSdc#JY7Uj`eZJHK(3F+Mg7e?BA>JFaCx+D+naj--Sgiaxn3lqFs=Uj zQiE14jf-rR&EcQV`*^i2>QQYEx$@9M2jvF7g^}Y;l`XaN6>)Ix7 zQAv?!=g-FV8abP|3f`){wlnD#%kF(i-=co}Kl-cNwlUp#{+H*wZi;sPE}pfA^=rzn zxXF>d8~OfC+uXmWi+76B(+E6Gq#ntaO{=GFi#q-b|96i}wzM^5bH8UK z+Pvwa`i*2-BbL}Jz79C-7{Pt^| z{NuZpWn~ASHf|IV+3I+MD|C^}qAhWz;7U#8SvVO+wLVpGMOuhb)=526FuC9$!5Xa5RXw zpmN(BruHozOFS4=_p-iYis$fZT6fZ(I;Nr zn|S(wVvf+6$hxb1n->XiJFpr|IP~?(uj&BHxoi*m7IuUSZI4;hadYNWbER&Px2ErY zsjd7LCB9PpplYg6v`y;vMVDC%m2}n5Dkzn+<$5|b=7}HCW<79dcLSfKwEu~B9sl&B z_FHe}RPmg<{on?99oE%zSX46=Ma`mv%hQ)6`bWkrUXoP% z_ZU}yrp(MsN8C=n(omh^$js5_cQk9`N{v2-D3buUl_xcBFPTzUz@?_E)!DW1)1p%| z?q*&O+7r;{$+uC!U)U!6)VD8iWS6!@W{p9iF$DWVJAKx*u zN}KFibp7M|!$$uu7FaSZOMCIWCQN0z*nH6+r+<9oo+&iPZ$rzzr_<~fZEbjw7_X>Z z#9y-^Bg*7e>vW-|KOC z)#Ar@9?fz%RS~Mkc5TYj}rqEL#2XQ;J*ii_W9F zg=OtFt@k%zoh^3GfBEu9T#R=jww63S`6{SXsN^g2vo@ElvIaTF_4JZNH$3>5Pq(!A@V?}H$(DPq$-`nki)LYq*TdvYCl0lh9xGMKll~t) zdTa0B*YnCJR%~1o8fJZbxs(fcZB*=~6)S79s@jTo$u>zcO}Br&VM08ars8T^497Wa~UtU42!-x=ij=3!Z+D(XFFTwZDtKJ6YsWH)T|2MN z{(H>FLsQsY;%?ISH5QMv1@;O_yq4bmT_F8Y{vsClyiG6POIUQPxz~Q+)p$7b?pa}> zMbcb>#+RSn|8q~$%Fg!iylpz}ujfyE7(Z8Z!?cNYC+*S`iduII( zb%!hs!?f7*EPkzV@LSYexnkKi=1sd&uE@?2I5n?O>*b6}qtYDZ((4&{@#4OWxepe~ ze5!ik!`K?i|3KcvXev)7|L@f}U*qo^7VKZMK|O?nH&!#Qp6aw(F+`nF)R@s(x?$<}izN z*w6GAC6b|xm!nmeu^upqH}ekv_u!XP-N{G2tLo0KS*D+}$nM#~8UY~Wu6Q5x z_|7R=y(gKXv9o7~|NOBw@So<#H0@f(4b$fS+nw-weNIPo<>Lb;i|R^#-HV>RPW0i6 zOAjNXHMQAl=jq&Yt+Lv(Z@)$EJGREq=<;0)7hYDZvd?m^bv=GeZd?92mVUn$Kgme{ zr0h$kD|KEkU63hLx#h<7c;j!0x4-OZ+p&DH;O~6anmL8#>#~oRB?T5=O}0)`yq#Gm zGk5Q2w*85_N*`^OXZ-k{;XI4W0qxz_cfHtgMV;ktEf@Q*moqtLrq0^+^XJFhJzM_o z)SJN(Tx6BR(`;@f5zKU5>cNFOt@}?&iM_rg6017+eENRbM<;CoZQFU1U(-eD{s^GNZ+Q%MMQA&(kZu$=lpIyCArj zr-$ppvf3~6{t10l&|d4}Y*!=AXJ& zSi!Wy)9PCiQ_z)m(N}Yn6xEwIzAw4Ex%MK{l08f-?;R-hn4sGjrtRST!{gq|Q;$M^ zY6J_5SZO>n-VowBK`r#%wTJ7z6~2qE^FQm*W@hpIyyNQI0a8YD?99&|HBN25vSa;6 z>*hOMlcde|nl~J`S=4d++2YT(C9!5Yr)C%KzaZcuC%45$=i>E)UzBPeH!aUt-}1Zp zbI|*~by7tWnO*P4>Md3`sW>G2u(x!gY{BD}6IDAN_XobM&K2DH@bT<<9tX@`h%uRe zw~yd3mb7T5T-f+aZ(ZsS+3TlbBLfWPoc7zi{Y<%I z^}mNrO}=+j-tFc-c|BTq-G!M>`F%UAqrTkE`kBAt(<+1g4{GkK-m!mUpE*;$TPpd| z`YA6rEr~k0x#&2bdaU>7SOrU|knq1TQ$N^wU)=WmQ>Bb(@0>ipMRJGqKb_nEMD9qO z%fE9=>Ytg-eCfTb?_T)lJ1eJ)A4)nu(M-tPF23gBq1t8DrHj-2E$0_5`10RWebOUQ z{-CCAf$g)cq~+XS%LItN7CGy(F(>qS)lz?niEkC$3eMiBT)cN{p#%5L;D*xA5+_Uc zC^TJ6`RH}wiSnYw(*L#9GcOxdEcp8&w6?Ng+cEbINtZ9q?tfP(dRwY8tb0L$#-AU3 z%CnCMaYX*QopiT-*~6uFsngp2PKw_*v86D!E`IyoxeWiT?o_S%o7gF8pV3y){OD1z z%7z`Et{=4+cAoV8_|`|K!5mbB-m8oc#C8dy487EZp-{OIO2E-^KuToz8TW$S9T zY?^#z-CE&^{HNPaN?i8ds>t?f!Hq6$pSj`Uyhm-VVmfoQe>Nu<`u@0is?)8r+&X&V z;a8W=xY^5h$o$X{628(RcR^lx`>#)~p-S79M4b_joO;nT);%fuUiXpy%deGBug^Bw zZ*|?ab9=II#1k|2vp;V72dwLPy6(}@0?U_7?>GFIx~Aw>$+0aj{ch{cE}PHr_}UHe z4TVWAMTJ{B{+l1L-n+qY&%$HZ3b*8M+qiDuhQ}#x))KXW|2C@ay*KS>MY!0++Ee+e zIU0)FCoSx2xpZ5bt;@`}Xja7bU8^pXNoDCznX1{X%J+=~`E2kMyeY`v@~ zvPwx{#rORB^8yDNueK{M$$ENZRkGB|DZ=l?WrXLf2ynmLbBaeQ-SJKO6_(%Eey{hO zCl)GH$+$RNGk_>E4}Tw9~K zte@HYWvrQb>exNS(zjZF((9Xc>sO=*>)BTrHykR~stHzge3#F6ZBFjr+TEwj?w$Ny zQ+YHvYX1wy;}_p4@F^yJ4y`q?zrLRFed=t9ltZ=il4hM>r*y;Z#qRcfY{gs7=4@#z znilxJfsg&2@YZive>(i@UMi!P;v&0g(`Vl`Gs0iV-@0jeasQQQj*qAICMk09t`3)O z{jx#(K(t%^D&DzvwTr&3Y`7PFMu2rst+YatNb{xTF|(DHc8W61<5(VcY3H0+!De{2%_Y+Civpj9uFIu6OnG`^ElIrznkD>-ukf3gB=rO+v(-b`-~ z6TZuqbqXFz1+nVdn_dY_&AcJG`}KE)yoiUlz6YHNTO#6+q11VsgaK^+862lVWmx8MkAAU~}XI`=X<{T*?8Hd0hm}XU+bmAs0UT zoznmKeNy*NEL1)euGxP?YtthU_bIcE+|X5SEK)g8f9$pqqsGIhKcCzctNFOJe=eJQ z-2P1oyFbRvPbysJKTX_Zg0*{A)VjVJ-899};xpTIwx_(0Jel|MQqlIJPu0OoRrcN3 zU%shg($8rZS%1B1b$Ri=+MD~^J!XXgsz>BH0WkcmNn2m%|7#;UaQL7 z4IaCL**gGs4 z>v?3_wT@lp+`f&8w-+}C&Es})@;r6p@};l4dVF#(yt;pVeusC9;V$jl@4MsH1=#vL z(=b?4e`$V0$=mmnrE*tF&0106zB6;Bad#U3@(L!ijOkOkou2KuazvI{lyOQI@3Tj@ zM1FBpAGmxndH=U&g5@uukqr^80S zn`u=QZ?DaI#3z`UcBS*WPp3 znD{HobZ6g|eECg!8-q6#9PZJd|7)4(q+0oJakuX#&K7ize`Gm{qtCU$zOFuH%~{6y zJ=Mi`%=Y}3wqg4jb$Fi6jvld>_tTb|U19Zbr%15BKJC&syiiq`r<_ z^MrAX{*|uC3|-wxDgK5FA8!qkU%2~hPOoZ@+{ZQ{|Bm8SYm?8ls&Cj?om212QkdQ} zDU(}4$0qyR{Rzw3ei!AxUlFnXOT)WU_db1WOZ%|LG<(s6GrxU(CUO4V^eo_wtNWbP zMUJl*cs#3Fa>8%s1k0WqVrxC8NDp~xcAt_>5=zRU2d_wuUXU- zRllpP+})_=(Sclsh%HLn-~SCczBaKqd?5|71BS!De7;9KXu6th_u-yxcb*CV)#b{xF%_><@6jy?DF5AJ>R zYC_hbtJhM`nOwWHPb>MZNrdOxxp5Y*uRApUYK! zkNC2lU;b|A?2G5mg^BqDEap2hA-LtyN;_ViAIFmop7z!MVq7?N&ZCUa5iKVo7h@I? zZ&z|hHhRiu#`8(@??_C)Q4_3u{m!Rr2aWIBwWHXgJg=$53R9a71`Lyes0$D`E{Y! z#E;d?JAW$OKDqVV(!IB$cAfj1Ys1=`KV9!`{I2|$%Y0USjVL%_=<=leY4-E0#iy?; ztVt;U(x1uvx@lQw>7J;2b0m*1VCVnnZI^m_!-oaeLnoKq=_0C)S z(yTl^Jp9!K-Wp7JJ)JWkV8gVw+^+{ynuV11{Oi@*9{W}+nCHIo(_bu4RC{E%H9EOp zV%L5o>a=^BS?B>#ch)awYg`LMYfZC^6i#UR?<-C&o8x0P`Op`$LyE1R$Cu7i z*lD?KORG!nEvZcb-3yW;`aIVEsFG7J+WU4%^jwi=+x5C`M~iTT&EUJ?dQ0TVZ?P7| zjx*6=OIi=~Gkjq(boOfq3xCU9t(?`CAjC7%GH1_^V5XBkMPIDmF?exQ>)*cZa&Nz) zyyA=}ZahsKDLeeWSYP<}uWHJfg=UWem3ThimDnGaochFwtNY`HkV9TigMAH{91Yqo z7>Fc0ZqQO_JRp!PsI{B#LC|rj%L`aHv@N~9pl-z*VQw}%&KQ^Wh(COtDw_H@JL zw_p3Y?w#>vnJ%!{d)4d%?$@kqV{4A^J>P!xq`1V&b#;|{bDb;0S12#o&d?}zPo?d+ zmumf~yvDt2Ud>YRZh7|c@`FVCA7Sd+PFtF6Qqx`Bm`~j3S7~%#dB6Eq`yXcG>GQ?a z=J5B-+xoS6i|0E1xwa*<8&tOU&;9$~b4BsJlk$nR)p>Fyuk9V$*^Yk?IKQ(rmv`Cm z+RAySPMj5*U*Bnbvd8Uf;sxC=y*Kn3%hY#rbJ!c*JNDj_I>^zw?g2I!ANo zb-QA|Jq_oto^Px^tgI zG+4Xv-Ml>A{CUp%lSl4O=J-$*U#p(8$WUv2RmPJE8@Da8{5{{WV2Yu)p^foxfo)8u z=UJ|pUHUJ5zJuf5g-(C>teoeyd0({u!n^;Lzx@-h7yGwY!&>4}mfFS#+x`FL#EBNY z^E(tQ#hyOcL9v3u1G+mGw7yiBS0?cOS?d`A0iP+oTv zcirxXzyDdtZ=NZ&t!(#7jx|@K7S7a|r)TKh{rvmSdp~$JEOps?nX46V?%UV8W7i>t zy)uO+k35bnOg~vhB>9r#CY;Tvm*1-V@7f?4fsWLHL=2J+hbTW=@zbx4^J7 zAw(lp_5C9$oAj8dU-1b0e4xUfD=)aK>?zk(BW#O7a#Vt4G`FnJ=w z)9f$Kmc0|A!hA&5EUv4qRyc6xUB!Z!7go(1A1XG(>KzoFkv9ZR=`AN}*@ z$okSBpKZ0jR4xw+E6S-8c-=m?05_iI&CZ9v=DKY8U-`hlZkNq!Q=Nsb z-9OBVOsDeHnpkeuT4hk&+Szet)`mQen(MYn`73VsPno8DX?A!1pOdG%N+L66h|A_G zykO~en!AKsE600_g>_nqw$fD|$-`Imeo0D1##;m)y(d(dviWLjT4|c?R2$dJQ~Y?O zwpJNWE)wywH<_v!q9KuRu4g&(v58ak*1fp)e&;`KEvj=nv1 ze8HEL=L_YhK04M^y5Ot2e6$UtlrTej!79IbcJEjfj%w)s^>;LxDV}hjy|^%)^&X$N z7k7`_$F&KP1-Czz@jPc1HP~37GHb6nUt8t$^$JCq{4XwbWZu=O%d0*pR4qBLzWw?> z_^=hw|`Ln#>QI&xKc2RDOu4{aPW+ zb+t1$EwQQJ|Iz!VFXk^3P8pT2(Pd^jo~#>@VOyjv$gFeZ&L!5nZx5Jm7E-FQIJ2zY zpUvP+{_*yh_wPO&3*tCw7QvQwWO{N>&VCko9jo5>X2Zr^+q?y9cG^YDPY{36%)jsJ z-}cD|e;KTPRq~@+KK%NTv!5gH$E{rSIrX32OU=4EyH3TWzfXQ%Y`Na=d6DIL!}l^- z+v`0us~OUFr>LHM`|@4^^J{0t8a$&Qt|38+V zyS02y%$J%o#qSTi)3mqpHBFCtF6?_M{;z$@k=C!Lo3+h1OuTl@I;C6tS<=fH&+9X* z77H*j1U_cJFY8&SzVjHH4ep72To$h@F4lF=HTuQFQ2hJD%CnEo?eFN_|J{M1Dc0zm&z(mP%6Z;)i#x_n#lnngvML|sx; zZmdl6nqz9VptEVIvPPWZ#s>zG$?uJP;)g_)b3 zZ>vcCkCw&lUdcd74c?qeLyKQeC=nRt~ps?~Q22=p$zK zRx2<3h;}+SBbB=>>v-Y`;b}V_^#^9`(KV3m^wC~2XzPGkFWoW z2zohb!P|Rlb~vTKpEPs9gx%b?7bZUUa=d-v=+5cWy;L%N)9>t7Za+6?*DbB{^AF6d z|90)q+?NxN#TrM}Xr0tQZl{{NyfFlU{QULfi~L&uK7`~=lCABX9q)NWBY$?GbbrgI-HX24?rc@O zamsZ;-}}ky*IoPlPVvLG#(MkajDPl~HM?7_jCr5tKH4(l`dizJ;+sCbci*~Y#V+nc z)xT=BwXeHAdneiX;QF7#?9cgsrdGcD9jtxh%HPS-^F-R5Hl>{^?)W6o?C~uB!tal_ z(mafRJmF2rX?dZhe8zW+{?kv%eEAnIMoZep%;9%lS6RB^p-XhNt*dZz*g`AELry^?U`1crN@2ZH4{zoD7nUj_NPayD@FAmr+q&1HTrJRr#sb`7D+Vcf0^X0zgT(= z=asKo*Vi%Rt_%44Z|@`FcIJuxA2ZLau#mPZ-F{#A_>?V$N1O^z@1JEcJAz}^<4*zM z%+vRowVi)AdEU~QTsv>-mF%gz=d<^|%!%)+%Iz~Vo8G1#{J&Jp?z@hn<$|(vPbR;Q zn{PF*Y%!1O)5fo>?PMY~!$NlOb~K${wP&?A|78`sHECt6Z<*K5_+_`SMD`U&^^eDj zJyL}$Zk}Dkb;~`<^6B-v%Tj%=y_8wGh{;@I$CgRA_T^nXyYp!z)5P)(yrrE9>w^bpLM5R zzHZtXV)$XQgPq~MIKxcFwFi#d$30H;4p~xsxKu3Iw|6CX!*1^-n^&BeRU&)+)z(9P z|F^OI5sq0Y`Z?x&zHEwQ6SGra{`m`2QnUMNNY-CoBYei=F;H<(&xXOt4S+* zJVUG8{=8iFTND3B3OSdbT=C$tY>lr!kbYiIe7BW;#wJa+R?an*ZlhC zsHpFZ|92VsL?!mSO7M#F__I8@`KD{};qa~VZQPnW9xl6m?_&Ae99?aS!c=5$@tuFzjTbM-C@$joAIlPLXq?|#79v(=f?qhjn$)zfE|IN-nJ?CF?ZsFtzj`mQqxAW$1-mpr~bgInl z(6rq60K?O__UAwRs`P(R@XOh3lh!Y15$Ri&Up&ub_vSrY_IXV(R?mL+q$)cq_uK94 z$KmTlRpwoe*I3Wf%=%CDXvl;~<~!fX3+2t_zxMlAY2@)c=1zZdVhdXu-WtC>JN>m_ z{-2OqhVM`RxzE-Q`+1^pzLao!5Z9(}XZN!9*S5`-mpk`3uiU*zq3-_mNs(W_Zk}@g zLtoMVDC5m3+2wop+RHjEe7S$m-F21j#;=?=w>eB$_`oT|O2zeVZGp`piRXPzvIif; zu}HdzuDamZ(t7i1b5P3(BP9kF*KOBbO`OEk|Kt`s3VONx5|iX3KX!F#4LIHIVi(Y7MR=Bb`X`-#xzFdxFF$>nX z+;?98WMjj(`-l0em%B9S-1vX=<7)j$VW;QKa8eWDUZJLROxIJ{t zn`eLg_F3y2la%v0GA0Q2PuSl>n^;%35J9V~nS^lA7Cz<;%Ql4wFh55)$zWHw5J9*ivf-=Qt za!>8P+NJs|S$EhYc;*h#gDy^ISkBnC?zww>0^bTfr>z3&y%HB%(<{^VE?B6N$bRTN z%f<;y(l>58(spji62Fd<7vKKo&ylZ`>t8snXNB{PUxr5)r=+d_t@LDHbHH`JkDt%1 zsJnY__f`jCyZ67=X&lpi_9}K6JKOcO#d|~}_d6|%TehQsf8yJ`JjY|fCwweYbUy9; zbo4vp;r*HWtz~Z9b99_x^vGjY;}dU3jsUJho!)kPuSrMB96ym&-WUDwfUo18;#m{# zA1__u^v8SC8to_fhgP-CufP9G_vf{rt4?aV%`1-jGfT8G?EfSI(d!r4mF~E?bc-z7 zyDe#=N5sAIrOcjx)x{PS&eQc`ssQf9bfO z%jWdio%3>9{_$M!xj??a2caEm;;lRqw*x+FJ-T*W_P>nfoAc+Q)46p*q9^+GO8dTi zhTU8l8Rp#OCcZy?1-aedH65Hh-{;)Fn;(Dlo;%pO$>DWuyMSbk&yPpRw;LbWO;u2E z4G@cO_$hZh-S@zrWwU-=nDR=i?fo4+_ZDBz*Z%8YX1Jc7`LXZMkw0IKMu(jaUvFt~ zKe||zsUiIM#Ltq^k~#63OH{oN7_qX8iL!2E*|OdB$z8p&ovu88wGSL;ZB6u8z4%4l zgzJYsww}_Dwid0K!4s5m@)x^Z`hy?2^KV?YI(vJOuXSdL%U}N!eNw7+x=3jT^x3GZFjYjZ?xKZbfO^7C*>8(XZ(Bq;N4A* zBbo|gZb<>_oZrM{?@l^0hr8C^Q@ z$wfHLCLvR!D{8@=%BqQP%Kx8SQe1L0YvST9yZQV)Z|FsRxj*xa$CUr;)n;tWcviV6 z@zzXM@tbQh_iy`OyCa6bRDbLBFPFKeY+tKt{`TxSqs5&ZfA+V2IA#)TbpCQe(gfWV zT@#K~{Be^P(7t>l-f*Iw?D2IkdrFPP``AO%x48ZenRDIyu>1K3&+5Nx)o9mW{bI?r z)VAi$vzFOm;(?Bx$Dh4R)_PvJ|A~c3_TrOwGkj8+j=peNvFwPT>X&;Hs|;^EN%ohN zN@o%}>%Qp3+n1#-D|r)Lg&)|IYLtvHy3%TkK#(--nqA_2Ki? z4K?0rWVeY0E;?|xzNmuK4}*=O&&a(&^SecMvm zx7@va&il42zlC<_5uP8VGi+1Lmi~IP`j5SUtUot@O!o5Ak75M1{cg^ZzxFFS(bbc8 zlZD1U?%U^={9o>TBBAiY?P=bQUA12()LvewXM2^g%;U}Hj%llZdMkE6e!umP;8F>v zQ@0bBT0ALZznXJ?#csYE*RP1I50}pV&gHZHzT9zP$0sK5|7)*V5q2}h(c0_Tb!mP${xxqJ!709*3cuq`28EEbN_bF zT{gdI#gU*B3o}i$|2*vQy;{5Cg6=*0JVPN9@ zm%rHkzDWmeoZU9@wBaHBN85i@pW4__e!aG2s%qt4UWwp+m-lA}yZ5{dR$K9`vN}yUu8; zD_wg;-b;9~&|=+-ow_O4FIuhn96rHJzWkH#E(tq@Lz1rrjoXEeu1lCoo;YB`IY(o86MOL~!}W&q+Mn`OEc!2e zP|EgH^d*;fN3CvEOnCd~0n3Z{Pm$*9n*vw$Y*;VMZp*rU!9~~Z|B;JceBV&{B|7^4 zKi36oJwK>)>kI$;$dI&UvYuS)j@R;eteNh1SxeQT>K|>$w({E1`2THF#p;MepDEF6 zgqDUgGcKB4@c8hlRf}yV+DH0N;)n@dzVURXq)PA21&PaglcrC+q#0a!ROaX80Lf_& z3U@e$A80$;c!eQ1Y?@iav;yx_ygScL4LiE)_56c>Zp~Nu#VoV);+@jOTi!QQj_qo3 zvA?_dT<+s{Tqm!J#58cQ8+Hfd1EE7t&Qc6?o0!t@F2t z+se(Ke_fii`On-tT<`q;MY_MNN`G5t7%rjLq`KVdyKa%tEA!_w-+NU4HJ^TNmX6sf z-_*M84F9uV^EoBS`x`mjmJ8fjEj{PZ`HCAR8`D=DSed9l{g=D0*S9az9K?*;+!p>W zT*7$j-0Kbb8oNXkR%Pw*JZKssH$5<8ciolVN3B||tvq_ummSpjEymw8z2w-bMehW@ z=d55n_+2`AUdGqG9Tq0bc{o}mI1g;IYYNN1U$pOW&*!zjnlFe|+xEU#t(xe>c*Eaa z4(x4i~+7|Ht}u^ zxV3;a*ZK1&CJDpYf+A+KADXb7JmX-nVw2Fk7KItC#)>-Yo38!ayuFFWj3VHT1yKV7( zcxL&gRl!`#S4zqLGC#BEpJ&9i_U&Mpz7QH`e{{1@diG}Dna8#&4qIs#Mfs# zEV^P|Cv?&^t)|H;-~w~emWoZ+?QefhoqWA>u8rlDnX781TgL`>$H#^2J`p|nN!~`| zioAI`MQdKOEN}LeR9ik>bKR%LTalqcn@-L+yl$pqnyAu}l@`fgq^~z66pQR_Pe1f# z&3XMZM>gE*5NPMTHvhlaa}Fi*%bjnVDkdqPblfyiZbMhVsqc3}T?L;#_;IrMyrE_} z<7`&5HOmSo-F)(7%NN-LIy%&8+Ti;UIp81>=uf zJS}!QVACEB>0*n{w@we(blH>^y_nrprpPOj`MH>NtC8W%x$_lWP87Y_e&<2dR+|`c zg{R^Ay|W89o@YOKlZ`JeC2wElbg|!Gv&%Bx{+vDAI6v~5{K|cW_ul!&=U|4o>=J{Cm>Bvo@bLltgTc+$AZ}CUIBVRzT*C-=jyF_w?!vBH#Fx6f19> zu-e&ddlk1vnu&uJ6``|U5NxKYUJh!E29%*0}nf2<4 zSJ}Ei$1knb0*AvF&%gHemg)ENR*Qa?ec5hy`CM|=KS_(p53*t-RGWTpZJbmo9OJOS zE470sW6fnpL7T4CPn{JCuHNuy3*0u%K3e9zNOxLcy0G^1ZsCM^S^rz2GK8dLQhfIAtKIcoyIeCBc{kTAYjjPT*RL?^OJQ551LWhnKB z-94w&S#s!bu}-j3P4)a<$)l8}{VE5854Jyko6iz~ub>`4!onH{wL#Ok|& zQIB>y&C;2|b-1JdmiX!GC#MHK%gyL)w>H`R*7#pIr{x)=pHWtV&C_Sp*Z5uj(dOiC z-C1(V!%FUs`=hzxp2;Q8EI5mf9r)wA;g-(X6w{O^fl6G>!J)Ew*JgfkkNz`v-Rx!8 zg}b%teCo^;lj7_|A3e9Yw`-r$_lAS^Z_m72#JOC2|KT}`%VbZyU6QrkdEsH3^$wz0 zti`N`H@_ylP}G|n>E@cJoICTJ^uO+pdrr^1cfw9crBvfbdc4T@s*VrYG1B^H`Yg>1 zRDI6W?A<{8SJqzm(Gzi;v%#1j+SMud!$;C-Ui{7iM z*FT^C)1rNqMBg0YV*ZQTH}V9J9I!j7tJkT1hRN^$yu;?dLO=T?+3TE*Q8swtDtCyT z&2LUX%7yD3zB@%aSGJ{pc)VL$j-yPt@n%T>qW|hMUhiI>D6?uxP}2gQrau#Xe)G>< zeLGs;fLmqyqa~NF%<6PJQgp3IsYCS0gq@ot9p{)#)Be1YVP&Q<+eiKDyz3WipP+Z_ zd4+P-t>13IC@_@h((U~81ER*08&|~^M_vJY!y`}^nE5{e% z1?+s*JQEjO`?-rP*vW=RP4UXP$Bp(zXBD%4zI~)I&o#kmqE>(Y#je}F`O`!`Cfr$I zd3wG;)`Lrz^QOpuP3^nu?WA^fI>+2)J69h6ZJ7Mt__cXsM*fwz=^9G+E$2xFU)%PB zr5(ZO(=Rr# z^iEF?*`mH9rZMX5Eay4S5pVCFo&T$2#-8U!9aH!&b`<|B{#pFjUpcaDy4%J3#%y<5 z?()z7C(WT9uM)qKbKTpNBSoDzHBUOl2N-Im?(hp-TuI;U{=;jhs*Wx zS$c=K=PZ@!w7$B$Gtydi);rzj@A(`#e|*?A;b!tDZ+V&0CqbVAza@q*voB%afAp%a zTmG{0S6&ixw-l|uX6>Y2TwxfzzOAZr@}1Ihj^$fFb9j8pIx>H`t?v%yzy6atB45~6 z?rysFG4P&nf5Tf5ztrjH?y&5tj+>yrEBp9A|I&c}H!XAIzIdLI(p&9SQ_Y?15 z{2yG(S&y`JC%UR-N4MfOSc^rdsDt zYI!}j=j5&aIa|A@@8MkG)R^$ucf^^DZx^inB>w4kdiwM$Iro_M)s|)4of2B8@nDlu z$2n{9M|smtUwU$8m-#N*Qr23t-!DDT^|P^->t#3LCB+M^ZnTH&`5GdBcIumMjRz8Y z-(J#H+!kkMG&3t( zo9S=ue)~T;%X)s+1?HPpekBR5b~}ty?^sNFv;1Vp#g+c)Qoa{^Ke-v-5^Jtw)yF9fr>1Jucxx=k8 z%I2LpY^`UtjZN>Y78lHea3@6ZYy;We4BJMM4jso;LD}@J~5Ws<$jxL50a?PI3CV zwLJHio!jwlN9t0=msN4Atc(rL%6G_x8)&nLZt42MRd#e%SJnMFKj+Dw3*NIL)GmKt z8UNu|@4vf*9}rdVV>QaJjg$#?Tv@P6K`TaUL)TqV%Mh18iz01r3;vk8wJq-8>Kna_ zJ^X75UkgwFy-IuERH+lj%C`b-9*OoYd%EN=Py6{$PnFrFLzeiSHxTxs7#i<<;+nA%L%{%&J4M)tu#5C32dwnCn zys!PWPQSZqC98DDmiSfwGv74Ith;^U%i`iDmk(;itM&`7d3V0}YskdE33f_>2QPeV zlf83duDx~LkEQ<=xO{curn@W-lI?umCH(c!aN&uiN8M62A~tosN17s^?$+$ZN=`mtH$^}>Hwc*7ItFm7{Nes+IB=f7>1aq}iloX2+|u6@Q8 zUZYDZc@7z05bcg~etIh`?wr>{;jN1!)K79~C!Xuh-#RDgQ>UqupT^FYzke|}&skE# zG%?*J_|stnj;fXmWlsWGUM_SO_6uwMDDc#!MEqN>$O^YB)8;DaD$dMgcX`uT6)RP- z;OLiv$=?dNK8R@b)=a6s5vp1`d3w;S+=!N%=_UNV7cOaOx;mM!)N)nq^-7$!$5YW8Z3T7rfBLtV>E!5?D|cO*wI%+T?25nYUnCw>Il63I^+J82 zMt5IS%+Ydk48t%5oOs~BeI7f0*t*GRkC{NwlOFkRP zUpTPwLJQ~K^*deJ+B2r!e|*TELt6V^a{QJl!mmu!R@`ZIw*O?Fd~u2UvF3E=@)_w1 z)=n+<39S&d@>+geVxdk!2$N~rwWa2^Q#QUe&-6SUFYwS@>AYFOc?SC|o6Q^Q4}a}# zXN_~668WdgXN4%!U)!foL{p|+E9Nvmlj-xR==<9;>7Fk8p7ir=y))7mDQiEUrS>^P zFZo1b)0Feu1oxNvOy{kf>-l>T-?_7?Gmoy^F|FcEO6HkYrPJ@voMOlt)x5pl-GJ}^ zQ;E9s^M#LB?@QR-b?4~r1{1SRL6=jpH6MDWS3I>VV%s?}%=O&i-76no;;CV?Wn11- z_$Qw||47Tnju)ripSUV>UuLd(b(Nx)3J1@Kun_3Yy;g064zUW0S*n9Oj6&Fu7bPeb=EB#fMw$v*$p_kYGZnOP` zkX3KP4m7>kwDY8QVXU`S(`gMy4Sfyg$8}5^Io%hRRxN*5apBpknKrq1Gp1iy_q;K0 z`;_%3YooVvFF*S=Gl)Z9rj1RE`&gYe%O;N9wiBn!z99cYgel9}+AU*W<$iWCsYQp| z-*!)_Z<{PUA#LWxXVV&7pEZZ}sl?q>mA!dS{M%`fFV=JRmej8PxS_FjZ^6rhzyJPB zP)MEb8NbO|@%r+EZrL+dEp0Bd+O@SZuj#~X`?H75y+nlO}Cx?^C~jYUtI zXPn-`T~a>lw@ZG{9fT(=gj~4!P5KdbiT@#$`+Ts zE&He3E()mo7s4VJaddan(Mtv&Q_C+Wn+o)^bw{)vIls?+iOzAS_^Lbc0$2XZ9qAI@ z@xW-Nim#B?-Mw{QmkXN8T0H{cXzim47vt{4jH$psKM?(oOjkqx*c{7}c3yf84nG z?VFR$c8NI;g7`IR#pmm-42WVom65vpXyfDPZ{J@>F3(tgb02s9)E<7J_p6qKev4j| zW-c#bu=%nI&x72q(0d20&wJ(WQ+dAEyK-r6h~=y$TkUoQt@YfLc6zgL*I7gPc{8@U z?w;!IS3Ft4-l@56>aO<(cC5H|EqK+!%=ZW9Sl)07^1l`uX{Gmc$&F=cm^WCcos~w{q`k*Uh@3 z->-j&pVc?J-Sc3_i-&?P9&C3ap2wv-9AP>9I`!r~?z#2)NA@lfd}a0LN5sDU_mpS- zZu9q0Oeku8*8Pmt>O{oi?-f;RRzEd~a$U^R+QK5*Sm3B=dNx94m6nKr>@UwJa+z#x zl1E+iTna>X>D>Qp;kNKrK-sfhEzjdN|9p8vv4Qot#g(0Jo|dWDx<8(ODcMUTadT%P z`@4dpa!cI!!)JY3ocN=@HgJL8uM-Oxa?RR8!`im8Z`mHJ!5E&F>wa{f!|&bG_E!A( z;3|3j_2!}+RR3hbW&O0YDi}g{|LZg7nbi2PniiviYBmLHBNOQ?B#rH+&_V!MT zWUNT8|_ZttR7(@^ErIOq{ubO zYz_Vt7QV=Y3cblqUJ)TD<3>Yq0Mi`iFlNG0U` zNn=hchmOB&AzizAYH#X@5(D(r}a2)sLA@p>3r_0hiB*f`Nvekjx{g1Y$5)A)7oC` z;FOpPH+hy!Zt1ueu~yn&B`Br;K+Yv!*>5qWre6X-Hhucq^X%+QpXp!c6m*k*j1@9(x?`^n{n1tq-vUah-h|L?a9P}%Y6rr7_z zi}(3Ouxyg%d;0!a&V!go8C@bNYqUaZJd@nmBXinCwub+#7Hf*X_jA!BL$(8JN;Xwq zYyGvR?%LDBY~ECRXVy<~e>wST&wl%EcW_?VpT+KlO$-`p{2RE_TH4xs1xi?coZ)Hu z&=dGl@}NVK;kpGS&mA@&WO!~Cc`7_SgM7M;n@9+OEoB!wesZG1j z%N;w=C@mO%=?d40JQa^?T^ZIgJtjgqXKT;uFBC9|m;LzU*4NYXzZum{SbyTA-2Ko^ zQrkAn%~CieI=@0kV(RxR2TZ36Z?1TrlQ1h{^H<+l9r^yB&J;e2+C6c0uiEmpG6ypj zuVXKEwK<&B9;$1fe=Fj4lJBKG4@IkwORr`KUut*wV(cMvne*pnBp;nq5c**0vgI>B zD1=0ohu_>VXKKq^SlY8mtQkKwSbg|1(a+N~n zPm@%e(Ckuv*1r*LjtrX*6i3)DUcBlaN3C{1#RT{Dk*<9yZuc}7%{!TP$a2Sul%DI0 zrsStOU*c?=+Gu2Y^X|OjjTbacZ_d`4_)2olYSpi&E$?YOd;EUR9pebGO>9e!tF4*W z>KJ}Zb5r>K?S*GvRXeLk33|G|O6rh%n6>!T>N4fZ&8yxy#}yfLB^78t>@w-syLin(Q$0ZEcFxj;}LRGtPY{XRvIk&1Ef_{F5K{OVsr7&5HSV zaNpFMlPha;a&y<0&bT4rV|nP3!Cw2?;JzsNl3umd;lGY11?SvX_-u1z^NnETH1V8i zN6tpP_GcGaxU2uzKc$}Jz~%cUPs(d-Pu*YI6g%^qult)e`=Ste{_Z34`$A98(mAqN zWW|H^vz{)Pn6iG;jIBv^$KEzF&YV8)X5xL#@DDrF z7waom7Wkci_N}={>9N+UQ%$>{oJwmAyTl#z>RPRaOtd+ z&)oe#_=TEL-uINVBuH2o*nM&*er|LZG$ zSQ#!8p4%H!`CZfHf#|C(R($WCPBn~w;i^AF?8m;H=N>)lG(Y{p?sbH>`IZx}>P@5e z+_!9FHQ}((oB!&6Otvn^<;VM#AHI9YXsc84x31vX)uw&^{l9i7*nf&xCwd{zaM3F+ zi;GP$^-rJL}(bu4~f48!clJ6{npPdwQf!f5UDm_N|i?>s`adyYB|oS10hi)-PW7+Hqq~ z)6)fxe97T+=USHY?oplp=%2;f4MxJBU(FL;`0}ol&$W1$EjR8?PvY6!v_!}FIji_% zu}v?-m^aT(dw%ixLP?AFEcHB>E}Z+t{vwboMvwo9xV5@#(}xRltIz4YezxYxf&;hT z^fdoJ9CCZjly#^7KKec>Dq{I&?|^e3?-kA7oVD&{smKS(GapKXy89UZO@FKM>BkkW z!UdVh?E%g;%hiQESZpUgJTb9j)5aqI5Q8V*U7A;x`|H^F?0Ruy!dp>Ek0~=4f-E|# z6f|t#G&W7nu+?L6^E_a7?Aw8bS8p~uT)rh|ax(VkMFS7_UGYsL&ReI6<9o1#= zY+n}aH#p1XT(>3G`i(rF>brM8pZTd@z4d?R6TZ5nhXMq-R#;E{x0EK5)&9+Z9A~ey=q68ZrsblnD4t4S43n^oO@z% z*_X1(#TlOpbH27LT37ej`{8WOKlOH7^jEiXusJN3@G&d9_PrxJ?bDN^M{jS*IsP~7 z$q)N;J8J^xEQySp5_961ZtJrsM{(JtG1eT)(O-tm? zU;q92??s-|ADc8zcCC8ZmU*-9^-o8Mqn@*#x<+30z5VsD#o5!l-X7<4GH6P&a11gz zT(n2QYtyG-p_AsJ!DruZk$kjcp8TAuoy?C_&VE|7=GC&dCDnfq7MRTQN&kGbXzRTk z{uT1Sp}H1j?MjT=_PDA}z^!mnT4i8Z>E*J&27aG6<^3*vSNyng^S*iU%WB+QzRyND z#xOF6Z~Ad@4%ej45VdfP(5&9D=d5x4!i!JlY`k^j)=g^*E6d$GcI~XLsH*(^@T#ZIX&ZlcvV}o>9V%*>#Yxt+B#&Jh#&Pxa_-pT z;DFT5zJzltW^M4jHdXw{PU|0A zt_sH<*>1rf`#yK`7t8rtPpdaP*uAJq(myAzZK=by_V0ziHtH>T`1{;tVc&U;CwzLc z45t>)+g0ZM$%!}p)_N29H%=EApRM3D;b*yVQA^}v;<}KFq4&Fa-1>8#8F?Oiu=!Nu z;`K#o-T_O(WuDxY72W0H-STG6My2mH$t_bqyqqaHIlU%vqSOKI;t3B}B~GV5G!vXG z)4t(r+}rtrUFL_rn*4ehSD<)%R{`&wYeDH@!OyU#SFB-_0SIV@n2`+Se>fxcfH%wqrBzskxdURdL!$v!i# zu638el5?N<66c6|ad3C7QEr;neas}fIq@i?w%iH5TS?Yy#5RNm@!W`CB9O6+VZH6G zwyx(F7u+n>|8jcjNyFJw4V?}}ru3iof2qJeOL6@Q`BNb$E?w7*RXNIP^zrGlK$FFN z`ZC7;9aAr@W8Pjim(}Ec(q239#D0Sx4mbDzpZ+L#8q@2!#||*4mPN*7C>-qFe*Nz| zu1mq^KF<(5KI5Imp?m2v9fqEDGYYQoeK|kvc#B+iT@06eP*KMYHa`f8NSp_i~BP?3%;*8mzV~UosnlTUQI7@Ky^xyM5oZ4U_kJ zZoV>KI^@LLi63tt-aB=!+00e8Mw)IN($l(brA>2E-29&@;r7qp=KPG-r}po*Nnibl zcdHHmm9vSV7W+D6r(RUvmo4b}w&VWn8U88ii(SQz7pz%*^C9cqzCFUxyFYiyo#V0O z;;FvkR{!SK^Zs1{=UAN&YNytTcpdEB(WZgqD4uKPmDXQ<{&pYVm(|l_lwpehcJSrWT!U)v}40 zV48o5FmDDZi6;gd*5GE)~Pz4cPFRJm@2g6MfhEonfD3< zSHxf4{-SPj%zURA$xFMW7Fzt6DE;HH$=1H;)JaBHTFd7As(d#2s=daGD=F_(iVKAH zot{vm)_?n?T*|FB%M+h`e;j{m6r;9Lb;XUiWf~=+hgXMN3ruQXK8v3v&L&yX#!_o< z!23sxMwKm2C-{v*dw*PZF`uwG_mEJ5{@SOfoOgOw3a)>gk$+`Nqvef|i-(&IF?sbi zU7U8GYwu3JDbH*)o0jobs=gET_Dqm#+4gpq_N#88S#xc63Rnz|a2rOwuU zn-db89^U}#i6_+9dSJy0#s)(Hy^&vB& zAk-pB_rMMLEL$E+#p*w9vr-QjJD=oYlaA=}IXKO+Zepih%=rw>2dQ2gW_iuOGhuPx zjmCS|!lu@n6;EFGW69i_S#w3gjjpereRtutn%P$0gL~a1wiPg>JbI_#;q>Q$yOCGH zo;M0_9gSc8UEm!2qVGv5)4ufw5C3?qv3>FCF5&t}X>*}@PxBx38#hZ|J1t%uRrh#H zy4@sS^|v90!bje}Q#to3cmDlFJGEvVHQFxP9(HSQu!(xrS}4KaObi7VeG8Px09{hiZ(Su@}t IGXnzy0Iph;#sB~S literal 0 HcmV?d00001 diff --git a/docs/css/webfonts/fa-regular-400.eot b/docs/css/webfonts/fa-regular-400.eot new file mode 100644 index 0000000000000000000000000000000000000000..3ba8c46bf13e1767c93e9f8ff807aadfbe20e2f1 GIT binary patch literal 30788 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 literal 0 HcmV?d00001 diff --git a/docs/css/webfonts/fa-regular-400.svg b/docs/css/webfonts/fa-regular-400.svg new file mode 100644 index 00000000..74db206c --- /dev/null +++ b/docs/css/webfonts/fa-regular-400.svg @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/css/webfonts/fa-regular-400.ttf b/docs/css/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7412d88352a946a464b329e8ea0677e6b3b840d1 GIT binary patch literal 30560 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 ZCSNZ**sb?Vr+n#_zeaHvyEN(;835wkvq1m= literal 0 HcmV?d00001 diff --git a/docs/css/webfonts/fa-solid-900.eot b/docs/css/webfonts/fa-solid-900.eot new file mode 100644 index 0000000000000000000000000000000000000000..3c5350af8e72aced6e6409e184bb46420efc39c5 GIT binary patch literal 115148 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/css/webfonts/fa-solid-900.ttf b/docs/css/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f268151e6f282e84ddc4fb35f879dbf34e1a60d GIT binary patch literal 114928 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

@Dmf?A+|2It|Ic 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�sA$t}fgrx_$Bu4<=Rpy?oL%^||d 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 literal 0 HcmV?d00001 diff --git a/docs/css/webfonts/fa-solid-900.woff2 b/docs/css/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..84cadecde7c63f41cf3bea37d4556829cc2117ab GIT binary patch literal 44068 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

%hkOG zm(R_eQC+^vDcv|;iN~&Ljrx`)({vh)k5zfGGHctp9KU#;|MpG3?hRiqK1yVpR>(2i z<*=#wh36`H6*q2|bTpnVn7-)q1N&(TJAZ3&xWATqY5k)9oN&bEt8+Vo9#mao*j)JM z_L;NG*^0P+E&Zh$Ra>p?8EdviUN3mE#*;UKRU3Y$M=36T_O5)Uqt5%?yG@g_9-g1w zxNpNs4!#rnKD+#W;+Lw~G@EPrg}SGfh6gS&AJdJx)p=ec?biNYfr|+rzdUjb^l0$! zcz9Ok=Z|%N&*<2is_~06y}y55LFdSg8yRmFJc-?L;MkJj(x5kLlW!g^HZ{L}W`?xM zY@csRUS-;wa}PRwVbi~xT5EdDuJzWQ;9qkpL)W-PT>f~_`~B2k6CZnhI&^32uDJNm zZ;zkm+qL?$n3j6esi*QAc1m2YTeW0={gJ!kdnSr5;QEli=Em;ri!T13-Mm-vOZL{2 z2~i=6vVzJbL8te9w4b(JT>pP^O+2^e3yrH^mRrd`=lD?`AI<&Ia^ups@Al4LKG|l8 zKjQ#)|@h66-x~G;HQjw(GxeXpNh%qhs2|M{wrhmgPjuRYP8LMR%gyTx?(wh|6Pu46R#F56TT{9 z*lMvw@wda>r91fJAGHf=3i)n(zvjT5?`IY@HfDS7w$SaCc)ev0U&E6YN&orM^`Stk_lV)_P{rmnyeP+j>Z9e(>R`q+qt+l;HRxHYE|Abcuq&{78 zXZNERy93Wf@2Kl{{GGmGLi&@thTVBf=Hz+UIxy~)+BG+>N&b|;#NINV{~Wfj4galp zmM{M$^s{vBwhK84ud}V3j&u75Oc$u1-T1Y#a(0r>*v;d57wDm?|g0Mm$P4vPVwh7FIaeUlV!E@Dhrd!EhT}L4_(i1 z&N^0hvh0~3s|{QKmH_6I{pv~ArtnS8iJN?NL!RW^`h7dU-OG>PtM}yTdGokEcm5ds ztN3y{MAXLW>SO;MKmW>3k-2m7j>4|*&+i$#+Migl&-253%daaIc=yW}WS6uKmJk@^(-1(wsL%m$&b~vw5C)%O}@MFQ%{O zx@qk`O}1Ou4PI{qYOE zw{mA@@vrf}S<0(#K2P;{aRpyp%=?XxG^a+qu{kjLjFtZGgNL|zrVGd?UgY|}IVP8@ z)>iu0+J&E#rP=!r3V&EGa5kqaBQvSdeMfWDuNfE9Ke_up5TE%vEPmgm1(6%8zwlnT ztJnA_=fTqUgU_$~G`5@US(z+Vs4w%8ci*yA&#!cF&zh(?N$rX8qW!_eIbF*qeqj@C z*6iH3bfx&(b#XWTSsDCF`RC>x;NIA>LdrB~(W$iDNt!F4 zME_d8?c6Pa4Aw0&&kvcltJKp=l^LsY{zAfK3O;O@;))w%j=(~N}SO4Jht}rbInk3f$6TFYc@+c9;s;U)fe0H zZ(`{DXl04V>pv79TlUj`^|z7_T%V1*Pv||dOpe;8#HwuZ{qU>(ynF9oi{GlnF-P@= z!PXl(Ui*q&1eUQmn}$z%zP9K@&$1c53lG1UQKoVF_Qdbivo5^+CKnx8+8fU3yFIky z$bm%p4E?pXsh2(WrAOUdw{MAT=s*7FJ?!_*IKJ-Ckm4`tvtoX3Q)9O>?3dYg9)+ws zH!^a3Lj`_C$$i>-GSP?KlI8u0kCBfYLzCSD=c(E~2^U!A`^-M)rLsm)@7lF)1(z!i zI9%BnzA8lf^Gt~j_PTE;7p2aZ-?^!GckYu{2D-cLnHTI_xWXs>=rO%--m5K2^;)y~ z;%(D!GH*P6z`!Wx`T5<)qD>59lB{FBuca#p70X!L=5;2e>1h9Lux(zmJbSfqeWRjE zzkkNz8~ig{ui8aT{gl3%=fbbD&WU1=s^)NSpC{3LAyajdM{{Y+>-{642?%urXDMf zTJHFXyYGsJ*m}*JBP*umljKHvZNrExp+W77|OH||(+JPyC8 zbo}}BicXtLm(SY^-xt%@NZB#HBWe0x_v;mk4L?U${Rrfyns=~t)Ft|bz;I<8Il(w`Q1 z@&2LtlE+_#BnJI?&~DvwoAZ2=)31j=827C-{CVJ`yodFwnxm&yM$FT$SpG4?WMiGK zqv!9%VmtQkN${S<&oTeivPW}zRaKKB?p#eR7s<>_h;i^fXkneX==PtDC*40g2q<`d zcGhj*{^soC4dtbl&E8&8YZack-Btfyo^zUeg?HY6|DQsy^p4lN_OZ@$JKwY~VoTqy zU*?jr`TQEG?Ps?}&Pu%$&E&@|&vQ#DoC*_IE=5 zN5A~f7j*0Mxirb(lG3VQ;VK=8UpIU>T)}E$X7s&r>-8<-d>yBs$%=MNHgOD4ztRxf z`~LVgMu9cc7TXCVeZ0qL6LRi{AJ?z>vSy1y^!ORgXPs_!b+dD+*Tips z6ofpo^*_EV)Q>i3)Ze}*vwJzW!KG&cN6l&!oDS@~Cpza_c~O&pdq>~KW}~JF3fdR$ z-g~h*pnTDNoz}Ga2mb^fFa9l)d+ovo`7I_KjS6c^r(fG+lN!A@rSsFod*Pd&{keI3 z;=VJkXLzghW}dm4U-ABx^v@S}=2v$}9t^EfdBAdambc5y>)+Y9KmPG=)B9(`@tf_H z5OeZ#?gjw`E79XV+2?ut4OYHv7tp!5dh3UTzc1zo>!vzpIz?LPWf%Ngbx%=vPrh(n z9N(9m8y8}AmZmk$XLEf2d$rmp`RUVSjPDxHo~$6J9_Y{}RP1P(i!!epFH{MLCueWi{AOYB8JXs-Ta-MK#Dx!YKe#(#UF-1~3VOPlji-|m z_Wo5aeDU^J?*A3D6W-W6)LFaykvRTEm2;oZeFcZqPajunbC$o#Z8>$d;@{urzpk-9 zI$t4Qx3$dZaA825(DZ;4{8mP4*Y{bysb$;$?piGC{ooCcc}lDsLf-hM@!eg_cKAj6 z0h=e9d2T5z6-#AyX0~ism-5wUVZ;f>jm$_MR}_q zo|oudyyte}V_%njLTV=jia)(q&M4GYU|F1zx#3ys*V12_L57Yu{3cI+Z@)Zrdx&9b z*ag1dkK@;H3oy;hvXZ(GD!`P-dFA~Qt=V~ZElj!kaS?Xa2=n-`ur^#(_>(~W%xQkx#0 z|GjU{wyMeRFHFckcJpuiH{HM1;ygQ=dmTSbS+GS~$F?YAp{2*fXZvj*F4*6>yu(M+ zDfr2P>N%79vbkBrZa7&T-?~A4Z{tg5X48l1Q?h=1(El#H=7!h4*@f%hr*-O|)DN4+ zdOm#lR1M2>f|Is1pFS-5x$(gdCcP=k!u4#*3KzXU{%V@O#-AJfS35W7d0pIgz4*N1 z!8vR48xNH`hj>_r?^vT9+W6{*q_Ke5r7J13KiaR>i*$^X{PChZP5D@~&Zz?uO6h02 zOcIP-lJd_SGuGHMb=!=_q>FB?D?Dyp5z!S=m07wmpy#N@8IG=ssdkkQ7hIn4MOsN; z_3hv4S(m&^n$In{C>tlSA^ZZj;)KquCD#tURO8T8s}c|??%LZZz_jvk*why}s}Egy z$fdx>IRBntY4-J|^LGNjzT7auViPkrd*q2XVzRp<4zEcJU(mZ{Lixo5UpKcMe7NGQ zw({kB;l3QNdpC2bue#^H?4@pL%%y12#dlAB3Ff*ZZD+jFGwX7C{pwrU&7buC=l-j8 zX_zn2+I(G=q4D{>l%sWjZeHi#FX7f8k@n>@19R-{-@AT`s=09zFXa@9as*xJ*aJ885}>ItK^z8&7;bN6I#I!G*c)>kXPXGe5YU)8p1#5Tt6r z^wjah)<%}xD)(Et;sJ;5Ulg?NzHonGh-~?iO{~`{Lv}YUzkVwy?vdpjv%7qM*3F)u zZqO-kB3)s}*Uz(K|5!904y?>-pURVads9`zetDbh=W0?l^9>K@yiPPef1tR=bM2jP z>FuWvdv9B=dp1A!X3V{8AMdY%p)4ogf6?W=a6E)1R6Ojsglvw%jgoK6Pub3_zhiUR zX{K-Gl`GadOlw0|q`nu3V##k(TeR!$U9V)`-Ml8RZmYeR_RU!P@6l4>hbz|Hd0_Qk zuJXd8z9(-xPO-D(yEf~ZPK)X3?JfT3e{*P;E9c9KI@h)OAT1!b*}L$?{bSg ze$zQ~jMv@KEchijHJHgYqR2x-w5xHe?7^;t)qJN9{9DDdeD8vDk|CG&K2Pn;VE_HC z=TqiCR_B$O?oY}r(~sU&cCS*`kDr!d7n{F6=-s5vPq!?#dOgKJCDmnvNvOD;{vC_$ z8yE215-2rn6aQiOXzR2|rWkGAvbG#-EOMoq|s^X2UqkIm9jP6mFWhLe` z-22p@?c?^TNAT*W>%Xq6ow)x=vB2T=4&$_m9inr5lR_82@@q|F{%BZW%DL^tkts)g z<8KSrh6a^<>6yP;dDbcm&CfT?B3hXreC#_Wc88I@RWLX8S)|D16^rM`ZT|baCv?+{ zhcTaybKRfcaj8ko#^GcC_m#!lTt7%N&023=8+rYW`nS82i+ZLDZAm=8_9Sj7N+d`vglu-V@AWFD=p&x9lzVN9J=)?c^6Z9h!ZP6)75j2E`2k)Bp9@E zu6)9K7XE!b8**ftIG4u!wE1dt+2&pUl||k27Dr}EH#BJN_CCoi`;`=MTRUubpf#xGws%$|E$ElOPR zQTwgrFB7zQT`nKo;dUbHOK+-Wt@71LsmHU#jhh`7rOlcjwEa-wOV|7CjJ?g>K?|=G z=#;bcgm_#l$iDaVR>_~k@`rwRmoJ?zwAo`%ap)wgjD_Ld z2{|DXg0`PYJAPRIn&~|2k4xHgGc0#DX8oV4>pPKa*7S|{j$Mi4|HE2xdfnlo6>h2p z*^AvDPj#OA_ku-hnBXgw3tzH-AAjo~|KZCY^CRtb{I8t;{14vdskTJzQvRD;Pu{ey z@{PQ+W${114Zm%S`=?r0{a*Mp>hwz5jduLQ7HV-9sXRqxy;RB-#iwSD0WW2zPR zx|H~@`eize%X?#}T^R%WyRL(&%MX1Pzb|$_Zccr9)*8_p=Tq*tuDq3Pqq(HvMChao zDsLwh?-!W+ZlAW;lG5jke@_f^j#m(V@om3g_D3ZLzkn;RCO@|~KT~V&^!uY``SF0~ z(%(ii}9XwljK--pUCtlwn*{-3p-yN74m=l8y< zOE*r|bmIGew{~9nru`S%?MvV1uKFJHe@}RrM*e(Wq>Z8P0YO>EGtxUBAA}eK@0_D(=%F*8;H_uXwligEc}@3Umwy6FEEbrFxptqtu=K~vX{+i& zc3jx0WqDe^b*tyKFe8%N(b)t%VWeP60iav7J<5+>nnS>9jVmlgK4`99wphwsgoPw@)||G)F;2)8zsMK0O-VQReR7!i&#|sK zI?O`!#@zG!1u`Y)g-9k~^WY@R{!IocRIiE6(Rczn-{pzoE|Jb^kvuxB00d zD`Y#f+vwuzw;?@Gm#)01F!klrf4QwC!ddTx1(%4bD{^vrOtPD>)hnc<&vl`zp`+zx zWuMB2V#2e(G-){%UApk`g;OBAcGUbS4GNr{wZ8eRJ7)ZTQeL%pyUNl7{n^iwd_#7| z_Qif$tUp=cA`{7F)7__b zlH>g=E8YujpO)*>weojytKnZ~pOmjtR8%!|Ow_Hn*r;z2&!zlR{~(P5A0>PovLCt^35F{lVf_wMh2VXyr?7g`z7S%bqcDS6juW6j0;* zS3G^+-@c>ElOs1yocdI@)K~jac3+}Xwt2v#sy6%IlbCM!uh5@vdvDG9BO8~wEFgf{0KS}&z zMd!tZ`=)$yh)hrmEJ!+>%^4}*s&ppyl-j%1IqPg(AIA0UGv=JvzvHNJ23LV5uYhb{ zf>^ini!EHOVQ)RIWzThTmz&X1^ziYV6;t|UPEIbE;`m7Jiecbb}^3kMC^PMaASr+eEX&&RA z;W|&YXhsq1h9I4fF}~N-uWwbC?{508Yk2bN+Pb%eZ$BQgbI!trsmH?$zE8g5 zG54}|Owx*s2_o8lg+}W#=HJkNx#fZH@*mcJ%i97gAC=yU_$qt&b#lzr2_>!{-^ea& zVR+}Q&MbeYXtu@F7O!rG$EvbNCvaYrYginpe)2(>yd00j7HuWV4?`s}o|=fN$XF2{F&Grsy@rtBQs=cnT@t~0sn%Iy&} z^SRgrZxc0bU+wAaZ)P4oY2O<=LGSum_J7Rx=2$w;)YtYn{{N%9UHl{Ilh<@7ez?wB z^Zj<>$zLARE`=BEkU6(%!J+V{Pp?WbU3jwRP?X$`_-bWu6_Z%yg~DxnBTsC5#h4i3 zx1uigl=J4z&WBk~uRdy+rR%wxFpM{7*VpXCM_Z-#CQ6>LObV{NS837 zqa~t_k+o4*c3w*oO&6lVfx%P(t{;P8qbVnCwe7k37 zaaMgtv4U0a2kSq=f2zOZ?j7pntRFcI^s_`};Rb za{Zgz%&jd-6(Lu|u0P0qzWjy5Y+Gd~SwSA%AeJ3_tY^l=RTU9Q z=Rv=gJT1Rx9Q1On+dVF`j%z!VmZlekv86Qs2$-LEbne7mO4BzzH2k61t<7+Ifm9ER zu=|FM2QD}}u|!*oGG29H6mb0$!jhcJ)?TQ{H$6@2>VdsgW*`0q-~Z~mOfawN>)D%I zr&vDiI`yeN<#ZbRWbJPqV$0?c|rN^SB(ch^#-O1zXcSnuA3s;_8;4XPxNq(wS3XfJq>#25u2Lc7b zi_QeP1|C~1`C?5>yRtcV@9W$am!#Fpjvw>uKep@4r}{aB>##;KfVH+FHA z#JTt#vFELP(PdKHXwJ9xK&FN?u=D#pNxkWgpC`x7T{f=I9?L;Yt3P{3j}3 zxY@frRI)1$_``Pk^7NYuJK9PYDLma5XBg74{)hFvThmjPE^$2?m)}$-YcVY(!s3`x zt(&gOHH)pQ434f?(fCVS`j60Jq16s8?l}9KB~tjR=&IXclCGoW*f~+ zPWi)Ayi(-ne3xl;-LC(5CA(MmKHWEW(bZLQikJ6iUln|oKVcEi zZdG|F(M|cw^1?6kMJ?OvbocuX$G4IBHn+`1x@taeZyl8C#>%;>1{LCU?Hf zQ-JASR!-1ngSF2jFCSn2`FzNJo_R|udi7wnV@8> z`n1M4?fNWRpVKopOsSbK9<`bKa*dtp(?fgrJ4FX@PrW8T=R^4~f0;GNG{x93sXL0&i-*!K? z3ZC+HhRa#YE=hCD3zv##2rzHC&$Z7vYUi=%*?ZRR@LQ>QG`xPzYl|M-}DDUu; z%I98UYqsvwpHRtvOmo?>BheW$?g)WLn_&3&!yr`@N;ecal}*kZ~S z9lL>-p@?x_tIHR*%PJ}ke#i9AX`fywBzxnn$^&MP+Z($*Oy01(d~jOVuzYs7jz;yN z2=8D2BIJ@MnRP$${BN7^;H}YqxtaIh$VV*aJeZ@(xu$_b@$_x&!zrIPr%P!)yZ-3@ zzqBpd#agem4ySI_`kOZYT%XZA^S{@G4GL47`AnWY;QR1t(dtYY_r)ttukrKRakty_ z*7K+Zm0KkmpOks7Z)ez~{CPP8V~TsNrb5HCIlSN7>a5 z?^z!|xnC9ju)NCiKwjXM$HFUY<@Yzucq2Q<=l|c2{6et{_KUugmkitUyL`Faj;lBK z89OH&o=~>pi1w8ibC)lV>$vSaWyA4yA=|Xw;S+f0#LF-KQ(kL$TtRJGf7Rdpzy5t) zUlje-n`zqfPfxv<$XM?FQn4zm*H^kO9CO(+>&oLdL6+{jT+W@3 zmD}KQf7b7;+Wq?$ymt)X|NZX948h$8pTF8;V|p|%KU-02%kyNuwM{pSz6X~GsyURM zHCH%%`hSeiN(QF%(i7ZVOs+3=d3dUmVmkip(@g3$J}QwvJx;13bP|Kw<{SCpU$-1F zi{P8eAm3O~b2z+8g-Igx|BTDYD_$*{YtP_OF!%jk`^u;DT<(2mlS@|2&Fz?*&amPq{{EU3pT+-f%bL~wIBHI9 zs-mt9e2U7eeo?Gax z-oA20ky(sY;gkz3GSZXh6@PqkjW=4qZdT3ADO`On-B?tZW_^y1zB!U-?C{+JwO<5X{4e3!Rj?xT>zrOPbVv@m*Z z-yeENeEWQhB~7a4M>eGJl$NCFA9EARl@KgcF0g*(6x1A5xN_CDUE5Y&3#fK2d0t+8 zW=ZFQk4GB!s}|*iC(W;Eia2xg@B7<~3t6tOQ9crK>`3s1p2-~S_nNlXo-Y;m?g@O& ze?R5dx`{thWxlz!21@+-lcHre$J@`=Y~|P6d(Ia9c-?<*j)30%`JQeMt2REg5I<-C zVf8eN!@K^eTnyddHNimgZ&|v-2Y>a{rc!Qsm)2MB#btu;Cr-#W;=k51^{=IflY&F+ zjf0_Gk89uYoNNgRb&T|gl6v@v^YJmU6`TLswgzz+8s$b-r12b-DEfRg@?)%#{&l7r z;q#sG8qFKIayEQw{SmWB|3R9pNFT>}RiC$ce_S|1vm3Uo6Jk2^f4S-5BFDwE7}uXp zu$^RO%C-8?z4R3Y|8vC?Wa6biCtp3r%-b0<_xw3G=CqWj2?e}s)hY^}b}(Mvak+h! zcaFt|jjxW+*n0ENo1Ell)mam}_WyXtzfu0yu7#iNIo1@_Z~Ari<7YmO$IF-6If*+K z?wKMi;iKt(rE_gk)1JS{A-9dp8a5x7O#0f{@k{={!ZI;w&6l+|^0hZjy1oCw9D8ez zKkKp#1WrtG(BvwZn|L!7=xr>|FDzS0Ulg zRqV~fTSR61N_x_k%Fi#-fX@3@)Fbk-rLL79MAUb z^Q-0lr4^S~NNBEIIJ-Bks!(&$u8n^d$S<~bpJny$z+ArU{bF5@<;1%_FP@~3q_24+ zp!!MSs>=%}7I?{Ccs^13NOD>USEy*F+sxxUkJ=V<$sY+5-q^U-R>$Ralj!}u+S@*z zQ_-K}sc5+R-bGmj?*mV=)RsSI>r#EqRL-USCSh-Sp4HA8zSbYFW=-9{v3%pcD)H8H z$sdl`1hPbanK=94;_%=4Pgz>mMjs0LU%6(@zp06LKdC(*itJ1M|ccmxy-`$bO ze8$XXa>a-C_^DH!UY+X}t&5+StnlN_=C?C%>&JJQyh(`pAYheW^Qm`zuCf{_HL7@Zk6JuU_3Ub%Wcdz|cL%l-s5{I0ZEB z`?AGcD+*goEFhg713Q#;xuA)_f>#W&P>0=dyFlZf{g7+kLC} z+wPkp4L*~1?vhv78lwD{HIIo`_hze$`He5PQZAbQ(NDF<4>+PgA8?aPMN{MNWd<_UL%PT!qz z=HVUXZ?9I~TL0tprt{i*WmWwzdh73THQ8AG{CYkn|L61TPo^IFu*u5#uC2Pk8oR8A zsgB#jFKlYw{`R2bdA|AQ+W7iA=gAs9R@<9CMR7;CZ>HuUsbs~_1;76PfARg6IK%ZL z|I{a_>^>~_`?t^E*?TNk-_TY)x8-f}=hCf0RUC=}cVEaK6ie88Kh%(p8dFHBHcek$0l)acXWYwu6*VA;t3G+}pm@ga|c+w@PF zdGjvJP&7aF!oPh&=$!RIwR?X)HVcmF3NO5tX4Jo5oaL|29Pygq1(_?%e%zgFUme@9 z^8G5;O3N7rmmjvSD*apHasBKnIp52D8M}3V-4j@Ps&=vx*Ta9S7fj?>I!D(kjH&yr zS5wex<)CviLQN?)Yo-Y>eu*$X656@x5g)%>dWt)jNEGb z^60Jl$=>`Mo^*Bm`O}fvezBtDT!5yrfd8})swp)Jn@c!4x(jvJ--=3{x@MmFwjHW( zzZ`hEV5Xeq%UHikqo6}Ou9vJf7XG~P-5RsHrBn0U1T4Qj6!b4q(4NY!7$EmA^{k@SBPkw`qaB^wy4%3CpimCcU8gtuKkgVkFIstpP%yd$i#Ke(?4%t`abAoW{mN> zEhR6*B7f$7DVl$2#fdCaBTm(er2ng4vy-`+3rd_DgX?F!2~apiWxJ1uQoe;xSxxyPOVe}%!x?$+b`3MbVh z&YEVQ5k1r8%pbEWW+$#UoiO>A2JcHZllu|?TE!^gbg`_1Rg z|IaYC{XH$SYld`T$%!9}7an8Yc+B~7XZ64LY#nDC1CqRW+FshF2J3A6{XaI~5{=^^p;}mRmU1xROlfMuDm{s4{^ld}#;{8?jVH3+_ zM7b;XFP5!}IK=B#`K!nNV1?7IE@R30KNG9@+wOG7wzB=MRolG$_S5;FvO%bfwuNC1Gp2vNXqa^Iv4*v%) z-%YRjp||(Lk{Qyb(cLpytbQHdRFig1)i?A?;>zzmzvDfbwS`L>3l``tGz$22^{?c; zONRqPXL(2d{JM}m?Ngt>pWO4aHUd`N#vH6UO6@AU&rP)0*JtAKeV2<$l-%6@suxk} zu7$fk+?cdonNfgg`zNN3iXJ{7G}@+ z%^qxRc2ED|l1Jr%8+P`Y&iy$-=fUAQy^a!dcRCtRz5Mw+&nec&wT<=Bn{?~btyT9= z>e-*s6=Pjzb<*FX{9?MZ?ZWs=i+4>C;b>%X=iHUIVUPLLgZ~?SEKaN2Eil{~@bT*3 z`B%kqe?5A5Sl>+aYTdT~S%yneFUbk~Onzh~SGylysT{r3E{9ms^TB=XUJ^oO5 zWBCSN28jTl;^md+=l)%veM6+|_Tu30*M8SOH4bF6k@}XUxzzF6B{6-8y$|~q&lG;H zc&qH4qprh?ENykC$qmQv&X$YrsosCWbLsMoy=D6~?q4yQ_~p$BeNkOzsrLKq<$HcR z?+Gq?`}n8h>vX#r`yVaL7rN?k^zd8Hef+^5|M>*dX3mbjJK@OAn6mlx2}XTlCEuRx zF#qmQv{>_@Fghvc(9yHQb) z&B2h>YGLq|`DOVb=?L!qif=yIEn(|gDcTU6q`by8a8E&Yt+!WAv7$a#mhQo@OL88T z-V*A^=51D2^6}-kDrb9nX*z%AdD)7%+HKFPw;Dd~ID6r6g7qxBa8Ko%jb7fxHc#*T zc+oeD|J(w%ZJuIR^_H;qeV@O7df6%dV+$G^pIz9x(0Id_!}UHrj;!u+Iv@EYfB$~( zoU~?!-|@F*Z*J`{G#6iDX(4Qxa*?H7IAd>bpSE}Q)jsaHiv~$v$GBNPbCx>CrRZOB z`8>^XruOo_&25qOPgPbuUB5T!f!3sZ_XHLHzP8+_a9;6`b4V`x(qbd~iP_$tT{!1& ze6Txk&NYn{8H<*xyzY#gdZqCZ$6}MMvnOrew&>G*KaJp>T0y`5FBd%fuR!ao`H$OQ z=ZHLeyfF6~(}&1CKPL-oCjR_)B*&upZOpEs;0Hk`EI#pG3)v@8k@ajtn}@QFyv6U_ zF4Jcg&vqyLYCOw-+V8(grH#P%qQ{LJF6D4eYzc0=WA$Xmt0NLm&%EE3Hf6&8@a+b= z*2S8yr9)FbZrgF+$(d#2gIB*Ad-}GPRK(SKEL5#o`f1A2kDpa1SZQrIdAA|ZKDswk zBO}^1`^(3LW_B|cP1zHc^Pzgvj7>9?)b{_k^5#r^#aLjy!#ekT)Xi;^Z!hn=+Ig(@ z(az>Q_nWtK6)#cuPuu9av)v_E$t8t3fATypVeT!5g7-f4)V?->CFWrNp31*|oPXD+ zy}dMf*_S_ip0?B{C0T#@sqXjDV(I#()w`G{?~8B0ZYboP+?MiEE>vbZw+z#@jzg)Y zlX`vcYFQLczCAHdL2}wH3m5OkbH94sHXY2#dUlpIBFQ|pBeZYDh z+gr(;dxa+*p6=Wv%hlGoHO@pv%W3l2;+bhBf+Ag-PX142W=Y2Oa;AMcT{2l|_MA5! zNBfk1X8tqnN^-ri<8Py-l%Lkhg=KLp zXU}sh2hW>y*U02a^Yh^5hVrfpUd5%C`mVXzUMo>vl=kq|o3guKvco0a*DQbWYOB7j z`!)~xjrpZMOX3)>Rb4Gtx0G8GoyZ#I>T-A5>JJNJ4@Ft7Y>QgBP4H3j#Vsat*7z=n zRj@KXTNr8~+11cxCu?W0>*MdqE4IDWUU#suLN;%jNq+I3DGS$!oSki(oL>IOfPGW< znc(SS;=is7&EFnr#T{WIcm8`3D+sM!OzkB}|pUgg!3O^gk^6F(W^_9o| zzbo_q_h-NR@z+m6|NcJqx9pVh_cM^?aGbyMAdoe%n4E-1P4^_id8a&I}OzKN7l=Q3Z-Tgp0amHpH0 z4cA|txGQ+$6-%>AjG3>~46aHx2Z-MbvsC!ydV1Gm^@}2j%lziAy{zjub`<;k+YyKwriwJ-Q5`G zEqc}Z*5x<9pOuJQVet$!6I@x4IQ3>omHzhyFH6*PGw;s+t`VeZyTG+EJD_*3eZ|ac z$|+SR1Q;?eWVF6`Rq^_x-|~4GkK1O77(QZptyA&o$u`x$1;=J>WtDA{>CbucM2lP8 zuiuZq&TWZazQ4!HeKFj(3j<7)z1@^8gDx4J{@nMLTjDFvEWxX+l8tQBG#;)LT)U(r z;u+Vba}yW&#~M{v%>Tl+N?LRDx1w@-=+q} znf>^r!MHS`EGDU_s?lJXpGl$kBtxCm46a)nH(&LOSe!Ha#m}u=S6@rLO^tI+ao&IC zqjCMd#WyxsMJ#j5FO+<$=Y7pk-{I68sih59Ex2NMI#*3v-I>jBL~o|o%Sg#(E{Y4& z^_=Hrg-l94TT(qylvCGTS<(H$B+c{&{r``Wznr_IqZPd1-XFiumghP$k!8Yv&)^mGvlwYvTbJ6LqX5ta*mCYB1E!pcN&Min<(o0 z_WJIV?s@bo&N|h)WAomsX=in$Pwm?8n_+P)Cx4Bnw%w);O0CyE zuF=^U8lvQSx^a1$*kR$@vIm4_EIj(6OxG(#xm&wuEsOD@E2p3AnyaJL_u}h*)?m`q|iGv#Uhl%E`EC>)SIg4z9LL(*XI{k&A!g)>?*Ql{5aKmnxWLf zLzy>4FDdCvxg_>}`}?;y+h=dKxT3|&vSUiZG}fc8$EJySxad9l6Y1OKBLAIbG5006 z;Qd!u)V~q%y6dPkFYs&b*UviL+dod38Oc=3()43XX=vg}rnrQ%u8fHaMu((r4wVOO z)+{X-=UBVsUB`}KmZIcujwT!1-}^0ewHJEyDcI`od6_G>BA(S9xOwK|)QK0$7X0Ar z7D_NrR?WP5wdOUe?ro7-KNVtUPI!>a*FBuKY)S9KA5${FTBKIw`ztAbnfK3$`=4FGGnwLbJ;75R8SKlC zSY>wUlXSg(Tc^H=G!$qWdAV_SguSSFShlE^^AU61#urAngC?5cc)bli5mzaFy z++h5y(KP*$q=2(Qzy*U+)hQ<)7PehY;b#1(aNGU1tDE|iJ1-{aE<4szV)p6q86R&I zADgp#mbH2&RQ!J6P{sBs?~kX^ebva6^PJf)7aX4#=&5QJW}RCmU3sbWWk;nzx8RX! z^M!*#ejob$CXs#m1I-^ZS}sO;{Vlxqy5qIrt{*$piqF_+eYNS|d8{!%S8T?`zO_8B zUtM&YQ`s}?l*)5`n`7Mb6twvt8@-WP8&_4e@{#;`UfxR6hL`se+mG*!z9V{l^WM!t z@A=$ws>*j>-1vP$c$@7{!SFM(DesxeWhUIKc(qAp{r}6mk7m~!-3}MKxBKwgHG6mO zS+n;0gkFQcrS3Lw??!)krTOSX>V%1(stfYgxT@ zZ=1CGFPlwHAKiak`7FWPGhJ|{`0+%62z}YpD`rW&jmuvAH#~T0&&kkb9fzkox_L>i zj(Yq`vfl8W(Uz-w=G&+A)m>~a)3ovrO?|y#iFowe`&-Q~C0X{L=qmcS+_dIZpq=RtMbC+bDsa*cDJ-T*yiWM5}P@5r9Z8#t1YfB|Nr5~mp@Dm0zC^P z{3eK;-LS2GpL)lnH7jQ2&6xIf$2|F#z&T4IQ(9yb@bO-4?$6l{n{F>fLXT_vC#)&a70! zp{%6QCamImJKxJ9PN3I3RV4H>Z?jV>MAwbHK*Q7Bn^w)fcH#WV^W_rDD$eFMd2( zU?q3%U-qx9dh6Ha=e>U?FE@W)JcB@!pvYm)NsA<>J!TD@BpP~|_wpv$>z|tqx+a@| zE#3CIy>Qm_(%b!?cgdf>F3q4Q;b=HV0juXW@6lMjD|2@p%!RlAeynMPhoFo;j_~{c zlTXjn5i?m0Aq$ri4#l>URonk(G%eno zVqneMdYNs;)?-TyOoB4fKSe)V&NpXH!mRUKZ$5QaE(w15eksd?&X>DwLM-2T$r~B; zGBDKX@BeYC?^N!`-uo*p>UmnF1b27HN=)hg&EN3jj{TFyQ_s&mNw<7-`bdML&oYK| z76SnWiH13?vr1JxJv2>k$)1b;sUIuky7|n^US)@gO$VLtw0|k7PO>=lulL*JTgP*x zjuz@j8Gq&3Ua#}JHE?4sFW>9{!#U>a`5ya%H=LF;brWh4W_dh0@Z#MoTb#EasNI@p zysAn6a{9$=u_*WDDz%%H_P%?!UYGlf{Pee$5(yz{qL;7xd^q8AQejO_ftY5gPWjH3 ziLN*2YNjqdx~sBU@?c+^a*)YEPt#Ygl55lM{q8vY$!@c~osQzuhJ}BO@|(0|O;^-- z98XR5swi^ZGe=ZnasP(p2bTpGw$HOxJI~4?u_rpMX}xI73QM*34Lwa$T(+mp>y31{ zw`t*p+hwzOcGUh3QnN~(`KYk#wD%G|5B?o<-!McAhn!o>(Q>wX4rh>Joq>fwQmr#H z1LJ}EQ*vE%OkeNdRp8?&wB+7z|6E&k`pV2FSpqM(Z7!;$^saxgCTYsUbcQkm8$XQ+ z6Lp)M@3!tth~Q2Vu?sYHSj(@J6tU^4(Lu)OZ;MU-X>)CUvNpu{TE}DOy6XLGFKQp| zG5^&5%{2eqm1k?qs*3)yge?%8S$|>XN#mZwJ_j#oi>Xa&o4wU>l7R9{sFRuWWbM%=4i8+#4cWL-ZCe5V)C>a(`ajMTf{B&+PjP%C;t)wwXPc;e9Y=^36rHOFxMV%$4M@T=wt4mQzbr zxbJ-Qau$8Lji+PQ%fm*q=N#6NTqP6#_CccXvcRm$1JBxT@vHV-i!|@OdTk=tw*JZ+ zCz9T8SbLw3GcLnd`h!B%0}Z{Fqeph%Jbyh_{ssSzCmvNlS1I?e-=7xmT>AB5S=fi- z4*BJaCmxbaWv(vhIiQ{z==^EBpxG8A|Y4+rFQDm3T>2v%jw- z+~8kY$Ul~!7q+akEEQ(&`g-<=^vYQ_$2>nhV3}C;YUybn?IfNx6Bm8$-;*@MProm5 zd*rqGrH9%tWpDlZd!0i5mBp7f_Fmd#w}yY^>GRU3U0U=0ZhGUs@^0XPOXioX?nujI zN=YV7GmkHv&5*zPWVg-AqI)|JG+&V^+uh%2vB)D$l2uLib4TDZAx)Ep_M1LtyBD9< zoqa3dtCI|-?yR1@Cnm5;hleSetn&qcJj{p%LX+Embf#$3oI=U^xYh` zw#+#5TGZ$8+aDC(UVj>Fa`N}}s;7-T4iQM3G+FdQ;GMT&TBk#*yT~+sU zZ(p^0k^018^-&Uu<~!`pFWdqN0nRW-greyZ`93J%?X>6Fz@@^~2I_Zu{NW_C%+r zlz%dvA(OuS=qH5>EQJevdc;iiU;fZx(_~{%UR?QB@$a=8U(?iL*j}YCHcRIc$b5G5 z{X16YjmhZ~Pd_zrJWx|w=&aPEbmg=7Tb~>5a@xVu{O#D(NhX|A zCyT}Cw%_ZldMl|G$EES0ahHw!%RBcXFP@s~{@rumu@#9{k*D|6ueaZOZxNrwwyaLw zZ_QtMq}O{`Ri(1m8>M{v_x1Fq87dZA?%%#D`##>;?b`x#`ax?hVJ zH+V`b%DSFKS9=Pk^PS|2{l?3ft$oGrL1*&8 zH46>){y7n_+2X@CyLOp9VP_w0EuHXaL#l%dzu02^GcztEKC69kM?$+k?&P~2hh@yP zX1{$qsk?H)r;UfL2Qk&k)Bmy{YvEYF&h zCE01z$-T3Aac~y5&E~`>pR$VDS*26u*wxsIthT(IcJwLJ%dm@Yr&q378Z&F9xx?e+ ztGPX8Y*%C+9{$*A@$N$JXUT1hd$)1joV3{P+pCL#_viP!UT)D#SkG)LSM<~G%k!HL zA9^qrC;1w9F4Ev#>c*>eBA<8v?p(#~Ew?{0&SjDcRl4HQHA|ag=JdN2cJUkiKM9^( zrulQJ+s~V!|um_qZ|pj|V*V7D4>dXCMA(bb7_U;l9+$dcA4# zawkvDyz_nTaV_}^JY7>$eAeDR{^@{Bz-M#DdzYEECeBroy{xG6CGudxn%!+WuL~pY zNw1W7xlYvc+1x3?MMjqsDsM`Nted#DPR?QW)YE0Uk;`wN{r2eeeBad1(YNl|v}=9; zs{8-X+ z`6ER9$I{U9{x>oPHTeuik|jK{t~z2>AEdr|rmp0jG=s+|{gu9Pirtdp%m@AL%Nm#7 z+_T$mQ|AiSnReO*EkS2%zx}mPjX7OcKWov4@7%(fp&JehhwzE_=+1BYcI{w#G5dr& zY0B5b*IUE~x}@6O{W>@5^as)YAKCRgGoG*2)tDu@IHYA}zu5ZyckB|Yxu0x%_Fj6& LuX>|T`xzMk%tz8A literal 0 HcmV?d00001 diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a866ad4fdbe3891514924731327d3a88cdb337 GIT binary patch literal 15707 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 literal 0 HcmV?d00001 diff --git a/docs/glossary/api.html b/docs/glossary/api.html new file mode 100644 index 00000000..d5a8028a --- /dev/null +++ b/docs/glossary/api.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + +API | Steem Developer + + + + + + + + + + + + + + + +

+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ + +
+ + + + + + + + diff --git a/docs/glossary/chain_basics.html b/docs/glossary/chain_basics.html new file mode 100644 index 00000000..53bbead2 --- /dev/null +++ b/docs/glossary/chain_basics.html @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + +Chain Basics | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ + + + + + + + + + + + + +
TermDefinition
BlockchainDecentralized ledger and consensus protocol
SteemName of the blockchain and platform
+ +
+ + + + + + + + diff --git a/docs/glossary/governance.html b/docs/glossary/governance.html new file mode 100644 index 00000000..5d91a935 --- /dev/null +++ b/docs/glossary/governance.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + +Governance | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ + +
+ + + + + + + + diff --git a/docs/glossary/index.html b/docs/glossary/index.html new file mode 100644 index 00000000..f8bf0892 --- /dev/null +++ b/docs/glossary/index.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + + + + + + +Index | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal - Glossary

+ + + +
+
+
+
+ +

Chain Basics

+ +
+
Blockchain
+
Decentralized ledger and consensus protocol
+
+ +
+
Steem
+
Name of the blockchain and platform
+
+ +
+
Bandwidth
+
formerly the limit of data each account can send/use (replaced by Resource Credits)
+
+ +
+
Resource Credits
+
is the limit of data each account can utilize resources on the blockchain (also known as RC)
+
+ +
+
VESTS
+
Vests is underlying token that STEEM is derived from, and are share in Steem Power
+
+ +
+
STEEM
+
Currency of the blockchain, liquid version of Steem Power
+
+ +
+
SBD
+
Steem Backed Dollar, $1 worth of STEEM
+
+ +
+
Steem Power
+
Locked version of STEEM which gives account influence on the platform
+
+ +
+
Transaction
+
Operations/Activity/Write requests to the blockchain
+
+ +
+
Block
+
Bundle of transactions to be included in blockchain
+
+ +
+
Block Header
+
Information about block, root and witness who signed, etc.
+
+ +
+
Price feed
+
Feed that is maintained by witnesses to ensure SBD/STEEM price stability
+
+ +
+
Account
+
User account on Steem blockchain
+
+ +
+
Authority
+
Each Account has multiple authority and keys to manager different permissions on the platform
+
+ +
+
Owner
+
Owner authority/permission of account
+
+ +
+
Public Key
+
Public key of account's certain authority
+
+ +
+
Private Key
+
Private key to sign a transaction with account's authority, should be kept secret because it grants access to account
+
+ +
+
Wif
+
Wallet Import Format/Private key, should be kept secret because it grants access to account
+
+ +
+
Active key
+
The active key is used to make transfers and place orders in the internal market
+
+ +
+
Posting key
+
The posting key is used for posting and voting
+
+ +
+
Owner key
+
The owner key is the master key for the account and is required to change the other keys
+
+ +
+
Vote
+
Voting a content
+
+ +
+
Reputation
+
Account's reputation on platform
+
+ +
+
Markdown language
+
Easy to read and write, plain text format language commonly used to create Steemit articles
+
+ + + +
+
Mainnet
+
The 'production' Steem blockchain network wherein real STEEM is held and actual transactions take place.
+
+ +
+
Delegation
+
The assignment of a portion your Steem Power for use to another account (cannot be spent, can be reclaimed)
+
+ +
+
PowerUp
+
Convert STEEM to Steem Power and vice-versa with PowerDown
+
+ +
+ +

Governance

+ +
+
DPOS
+
Delegated Proof of Stake
+
+ +
+
Node
+
Servers running blockchain software
+
+ +
+
Witness
+
Witness is a position/role for the people who are chosen by community (delegate trust) to support platform and run consensus protocol to ensure security and validity of transactions/blocks on the blockchain
+
+ +
+
Hardfork
+
Process to release protocol/blockchain consensus upgrades
+
+ +
+
Softfork
+
Process to release protocol/blockchain software improvements
+
+ +
+
Witness Vote
+
Voting/electing witnesses with account's stake
+
+ +
+ +

Transactions

+ +
+
Transaction
+
Operations submitted to the blockchain
+
+ +
+
Pending Transaction
+
Transaction that is pending and to be included to the blockchain
+
+ +
+
Transaction Hex
+
Hash of the transaction
+
+ +
+
Signatures
+
Transaction signature signed by account with private key
+
+ +
+
Broadcast Transaction
+
Event where signed transaction is broadcasted to the network, so that witnesses could validate and include in block
+
+ +
+
Virtual operation
+
Operations that are derived from blockchain activity, but aren't actually stored as operations themselves (ex. curation and author rewards). They happen based on consensus from the blockchain based on other normal operations
+
+ +
+ +

API

+ + + +
+
Hot
+
Posts/Disccussions that are highly valued with shorter time interval update
+
+ +
+
Feed
+
Posts/Disccussions from followers of particular account
+
+ +
+
Active
+
Posts/Disscussions that are still actively being engaged
+
+ +
+
New
+
Newly created posts
+
+ +
+
Cashout
+
Posts which was paid out recently
+
+ + + +
+
Pending Payout
+
Estimated pending payout for blog posts/comments
+
+ +
+
Tags
+
Tags, categories, hashtags each post is assigned to.
+
+ + + +
+
Following
+
Account that is being followed
+
+ +
+
Follower
+
Account that is following the user
+
+ +
+
State
+
State of blockchain for path - accounts/tags/filters/posts
+
+ +
+
Dynamic Global Properties
+
Current blockchain global properties which is being in each block
+
+ +
+
Median Price
+
Median Price feed provided by all witnesses
+
+ +
+
Curator
+
A steem user who upvotes a post by using their daily voting power to assign value to a post that they believe has good quality content and should be seen and the author rewarded
+
+ +
+
Curation reward
+
The reward given to a curator, which is their portion of the 50% allocated to all curators that have upvoted a post
+
+ +
+
Resteem
+
(Reblog) re-posting another authors' post in your blog feed for your followers list
+
+ +
+ +

Market

+ +
+
Conversion Requests
+
Request submitted for Converting SBD to STEEM
+
+ +
+
Order Book
+
Internal market order book to exchange SBD<->STEEM
+
+ +
+
SMT
+
Smart Media Tokens
+
+ +
+ +
+
+
+ +
+ + + + + + + + diff --git a/docs/glossary/market.html b/docs/glossary/market.html new file mode 100644 index 00000000..0d5acf85 --- /dev/null +++ b/docs/glossary/market.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + +Market | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ + +
+ + + + + + + + diff --git a/docs/glossary/transactions.html b/docs/glossary/transactions.html new file mode 100644 index 00000000..c9cc47cc --- /dev/null +++ b/docs/glossary/transactions.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + +Transactions | Steem Developer + + + + + + + + + + + + + + + +
+

+ + Steem Developer logo +

+ + +
+ + +
+ + + + + + + + + + + +
+
+
+

Steem Developer Portal

+ + + +
+ + +
+ + + + + + + + diff --git a/docs/images/emblem.svg b/docs/images/emblem.svg new file mode 100644 index 00000000..4b5903b9 --- /dev/null +++ b/docs/images/emblem.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/docs/images/hero.png b/docs/images/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..7557cefeab258a2d3564bbee8c648b3fc6bc41e7 GIT binary patch literal 17212 zcmeAS@N?(olHy`uVBq!ia0y~yU^HT2V2I&hV_;x->u(v&z`($g?&#~tz_78O`%fY( z1A_yDr;B4q1>;*=_5_jZ8#h<)U0Hs`L6&imIpeZj3BfT33fFhOT-W*biTc69S>KI6&#q8*^5XMycTb=A)$`?E-}*AHJKO&V%Wvc`yI16V>qlW` z;lZh0U7{ zGnQp~NQo@d(O54lImh7ZjibrCy?-5bSU=hE!u6BIRq~g;8T*4AK6qcg(#YKOzDG_# z^9BSUh!no!&gDCZD;%syls?!%bQW3b&tpkagiO*cb31q|LgEdwQbB9mtNfz z|G)X=mA&29e|_&}jAw8Dpr^aO*?!Y^L0fmmMbgp&Z+53#J92PU--cBpK{KY#o8_VH zT5PrI@!9V>tb2OSZ2s~kY4EQajyRyP7#3lW_mBJPN5U-aPSWn;Qf464c_C3!~I>ZDZ`JH*2pbb5)ekj35asiW^+HWMplmfzZnnF$h0jE z-rAZ}+r(VM^rI~PogG`zm8rfmg8bb1a=a@!1q)s|8Kyj)RvelVWcXv{laDpE@3(%} zcrf)uRsXi>tutA*yp|g;%ZcCqh{4ey{iD`uWu=m%0a22#mFMr@_+`6F{kumz#&Jvf zO80!<>&z(9_?Nln>9@P5s`F&IgFIK?UA^9mjni=9f=sgl=73YG8Zpih?|Y7QU!4ew z43FM_1?PjN|8bsr+)9ee*?IB>ufJCUcbf12u5n<~l>PldYLBZ6Qj%)qb_#vwX5vao zN#lNeSar|;FIud7de(%Wd@c9$)6?CmuFw9sYf5d6(><`kVB@}P8*<-mD%~b?Ovo_b z^O(>+nTQ!@I9fh${KLP^#*9PanaQ<}PcQBG#jP}prEFr z*z13J>P^*zj4kfL3tUcRUOOX`Y zmBqw1RO7|GsF{g39$3%+rym&?R*@zWr?XC@;I6@@o%I#|u9>{fg;8G)o(yc;&(^i{ z)b@3e(;jyjgzNB6@3Ow8bNl@F^4r|fx(~W{$LaQPz2Y{tzL%jp|N9s9^57)N4GTNB zseL`_a8>l#n~1;Ge8=w`&7K^v@AJF3Pb^;_geoj}bNbY}MXHOo-AwxQ%3!zGhSO`x z&l(#gZ4y`+WdBxsos7NCx`XjrNwwdnE{hO)EWF0F)c0$mw!QB9;OzhD0-W35RD3l& zn|kSD^4TAzY3;8Cq$2JJe2A!zbBSHf;FbLD?9bSRi!v6hX?nN4xb^hx>x!)FBHgwX zsd`V(ivJ&+RPfVzJHKYPw8#Qhsr~=enmNvyExqa^G0{P19kbyduR}MxRS)~m)vwGr zcj@Zs@^z8Zt}1R_=fdb39a;X~);rQs<>e)hjuJQSHD-&K>22Nd$7==KrTqBKZ^FwZ z-c@8dTO@C4G0Hf`z;jn)!Azqm9k1_fed(W?@$FKscI}i$1-CY~JSdKNb2feEex2l3 zPamY~IDPH=+U+0fcl+O!XR}gLRK!9O-@U%==C)$F-rNb=>O5s9w}|6FrbW!agt2g;7Di3sy~DHZtqzGX}Min<-CpC;t# zw_6>*v+vl#;OQ%@r>)spdHU8;KkIcWPkJ}*O0(K{!RxUB+ zJeaVFD}a-G3v>JG>Hm+Uncan*?zfqtTuh$z3Gvj zJ>s9cPMu*@-?t)u&M)5&-pSj4@=ch!e^b#@|Jp-OG@HfDRjuN3FY0Kw-)j2jQZzmJ z=iO7hMarkwEYdt^zSt@FegNm}bi2>T?d7GUEB>|5UhMyNhCt2B-|2CGPV*ZD7JvFy zditNsgpd@e{q+xa_Rsm3r#JDt*X72uqw;JE4{?5;wU$bVfE1!_I)+3*L@1Lto z=P!8k`0D)0uRgu5wYzL`^8c@!yHt6X^cbwVeADuA|NOJ}tK+lME^bn6f8@GFG$e_+ zhf8nHhL@LiYDVO)SDvR`q#ta$(N0meD@Nn43G@EsN>{ckfBnR4{!U%9Y1OCFKV{du zmrOb%b@%-I^O93+Ytur)8k|zLD2GU=Hk-#uS-b3bbXDDzan;SQp=VRG=KlJ=;{Ko8 zr>2U$_s&{>f4VudQ_b?W)?a1yGyA@oP89stSUi1w-_eiX-|?iFGNw9hWl3fLa78J|C1Iv^|^SDD9p z{)orFQ&TVNNZ+q}w4h<>WMgfnuWs3|S0%`2}Zsm&;4<`G2mm+0V+*(8wjeQ%=tRuO-WA z_0y$CS8rP%`-^YZkq*Dm^|JSm_dmE|n|MZR=a+2>^;c63uWxitN@fy0b$iZ)Dq*>$ z2TYHiP)WMnVi@?fY;HjAW|q1Wyp~VxU2Z+}-cosY(w{%iF4)(`Pr7v^xNLzxuZQch zjZavgeO`BE>ZK6x7q^)HBwRSL=uwks&#%jVwbECAuRL`}Yr`U~lS`Oa{cy46Sd%{Y z)tAJk=t-Ne{QPdA=k7X(&%8eD zo^gHa%@EtdGaGJ5O#JYPPgZ)Gj4Bsb$eqjKue!?kOL)^_g1t{Wv>KiZPukWUR%&Hv z5`AQU$ufs)n>TGfI_rSepWj7wg(=y(0js8_nuiJo?!Im9Xj|#8;+3^y;hQ(nB|mqX zTw8Iqot2E%{SlBA3Xw|zUrCZWdvZo52PAEK_T+B9ilXay0dhb^6TM{#bN+gs-&YA80{MfH$ z?po;&Avc%InAx`X>b?~**cs~TRet`y zTr6p8T=1`Eme7h9VysSv8~$y((Vug{!Cd*UQsafJt(*3{i)(2sH&ovVf46_>brEG@ zM(JnDxp%*;y5eQNM! zzmKPEz6@jC*W-$|AHq4N-rY?nXSxXAd8 z^5KXw|Dls>G(TJ{-<|k!0q+8lnhTH5T@3v+3@@MBBk zrDpXaIXAYQCnuXl-!=-9Ir>rXedBAfb((J1azth9BA>-uRXNzI`%k`my7S`JWVwoG zzCxUja>MJN-WFfWJ#pi!^Jy+~)qffAb(u6SFzxowkJ%ma`^e}2ev8*0v-f0~mbPzC ze0-pYQRI@@*Z2Lax3-o_&rD^0bE|yW;-u|A7Y8LLoVjp=?{$Dluy>@w)T9@CxW7L1 z6=2_H%C~L8MXMia&&4Oa`!0N@>mUOp8AOEI^f4W{h|BwG3OWRMH z?&cC(9{7I{&NlDk(p*>*HO;)`UwT$j)@k0x*(YsNP0!b=JbloVQ2BnHk!Sooh9tL5 z-`@Bv(s(&xVr%=4L$$@nV#CUXHvSG*<9g&T?sRXFN7aOFQPKaM(|mpIe0ZRg$E;@i zL&b;BlJ7{|dR>_{9#^hNPl@02Z++&uXKK0Hag8RG`amJv`wCoG_PfaLH&-; z#{z}z?$te!-w_n?uG1p5XTnUg)R<3i1r@*TyfNANoyhfa_H$F7nLHJATv-10$(^1f zf1_V6ORU#X+C7t;lWwU<$v~{?ySg&pH}zi^8fGWWxmMi zFN`QF>DZL?VDI7Xm()M0y)N#gSz5IBU+ak|n9zu-D zhur&r8FSZt(Q*0t%A-NQ;`^gBx7_Bg*cc%D@z6FiyZYm+*cxXOmVmGLK3|5Z~j_*0Y(!Vo>JKJPW&Vt$fVlSKJ;y1p( zr(7?yJK98N!;ZVh*u0Y3-cEO$XSCrT_x3$IFJwNy!TDU&Lm>9mqN(!#lmC4YH0SAh zwXMElyW5Tj(+m}N9ErCqzqsr3ybe1<3p<~QLh12G%d>TC*WOu?o2RpC&0Eb`a$EO5 zlaP$GTJ-SYr1_uydb__|RlPSQBK3an6ppnr%*sA%bbI>NOkZndPabI$&jJl6WG_~pM3{5K06_V4BG zIr?eU)F3-uhRX-aH!s^Gvv|#JMbi}~H{6$mukih}?98kcvo0+=kjwk%L4E$oAGz~i zl*_ys;@mz-1pfm%_i!x#k6<#+F5=b zIN-7T@2Yo;cD(sjG;@i+isNy{_~M=(8<|4;LnpXj-qv&37quwt%ADl7NhfA%+Y^6pO$D$?8! zPBT5-6?0Y9y6;Dk&h43dpLG{cwL97+}KIgOnXVj!i8oXGlaJ8`BbtqzI1Nf zo|X5WeEv7>s(;9iLs#d2a$}v-u73Z&)Uu<75uU32X6b$+bV{MITq`bbTAPU+&dW(^*@dcs#tZkU9U})_mrT0nff{ zT9;j>KmAW_&#^E^O$L7cZ=t6g)?Rh4Z59g`58~hqX}p-y_(@BzuW4^{W1!i|bxRh_ zn{9H~`Oloby_>^xik+3FXYjl-%-yteiHAs6{pWkZvR|y-)NB^j6(p2YxaFjHSW7S2 z#$r`slM@H`lEF5E7+aQ&ec9(_zoI_II;*OA5tr;cZ|7PZ#1+9sDJH_7qvzjHD znL1Ozq>A@|*WIL)?fUUk-JIOCpRD>UzyIF?ci+S#?z7*`GpW6?#8Fp%!)4}}MwVke z+-J|Nj_5S8dZfAf|D#P-85dr>SuF3CNG6c3W+Ifi#xqPcS@1ASF7g7%9()wqo74|tIr{SK9NwMzeEucxQKPcn&GAd$XuAH!zJ>;1a*xuAY5E(-d`EthkiYBtBNGf8z6QN*oqI1LSohL`uWS5g z9E}P8#Jue<`~8+>tvcGmQ!VCgZx9x*-If)*rZdgzYU#tW=!B9T|L5n=o+ftU@tY4- zlI^Nn{#~^?!u8LtXohw1j}70=-~DH|i#~n&R$=YJPzTP`3lIEO$=WORIWIWgf4*tC zjlhM3J5w4SILv6VxAXN*G06NQpm+Aa^D99KOPh)3AKg0DQgJE4dgtvp){fM3TXslY z-B2)lOWmF;@*T^0jf^ZJBwj2_)$TjJ_jRb7+l(2liT95`J#zjJ!&a+gt9$p4EVtez zwDH@AlQ|i?g%5Aw`BSuu@tL3e)xhBDe{a37pL2TMnO@*od}G?l6Wwd4clf1E-5VsH z-^McKz_NI|wok#e$TUij>8-0~FX#C>-TUZU?%Pikn5S(y z`O2ho_9K^HZ$ysqN^9IKHh8^p#fJyCk0_n9UV7L}qG-0}`ZebFzQ5VMzUJ4l$MR(n zg4}%53<4hh+FE%1OzO=i8dI+Q(U_j9BJ4cGd;=2FZqkAa(GtqNbkGBf7a@cpTze-^T=tOi!^@4 z&RY0gScS*;=w=b)lbng_oHcBx4&73lyj!WfG-!8u_w2Lp?9Fx_;OGr2k$L8%kg!L8 zsY%Yc9>Kagt(EtAlZBMyqBj3!=rfqoGpS|ax;+Ya*@8X>tX=jk`phlwPZz%zYe>ud z7YKQFr@vIFW8K6j!f9paH%rU?OL%>dpOwj~@rfmqoY5QW(wriLiw6a`zddoBcl)lc z&g#Y{V>bn<`7;<9S4Cf%9MV@C9%6ogJ^I_^lSWd?-2W19{W$3P_|l^tsT-2_Zu@>D z_SNyj&lBEUxUtPu?{Y@n_1u+AydAs0^a|eI7b(o%tuK1rZK>+<9dGU%Ud~E=(EI=G zxgEuk$JW1Fb}h1bmu<@Nyj`XGOJ=5R5qc3O?H~G1XyWc$l3oeQwY8$Vo&VJC{3_md zUQ{H+>_`yP$M>9kPC&*F%60#lRSO*sJXpwk>F)1yH=o>@#>S%; z$n!#YVsu2Vo0-@{zHsN_&HlN~iY-E2J4<$=-1GFpF&S{M^#HyB-{_x3}8O zTD!ZOwT1njwf)x>bIiW(taR9YaOVkwjazuuKK?dYDaE3Ux0XdKr(M-$YW|TLq4cv3 zlGisD3cEQQue)!W8}=({XM^u7sSF*Pf1KC$wqI8iTFHC()}26I&HA=Wl79uJ)@FMC zdacdj-uiua&C3{^1G~g!ZA(`zd~vCA3g1bmYo;%HwiuY^_VkBbGUc^zZkTba zkj?m3^S>Gs_B21A%Sqtf3KSvAzA(V&QHb3?&^}? zWUPd*tqT^HZ1;P1=q2~jZqjmJj zvfsUn1C~Eyzb}8P>CPdq83synZajJCb9}|3wtl_C@Z;~5?r(K5cNdh*&q%#dI_biN zXtQ-OCthBTx%%2~p1Y)^+zUb5+#Ih57nWq?T|2(`TEf?NG8tW2v79Z_-?ZMpW47&Y z{2uGY+cLW=4CmJb=si60Q|U(3E9M9NMuv>e!aT|PEazrVI;F|klg3@MqqKhR+6!Oz zzu))ok)4j@^Ico^Key6nmfBjS!luXAWBMbFPwx0CCzg=SpZi4ryR3<4Is1cOB7Myn zspd+VWR+Ciesh-^b8G~%nyV!o(v57IOoHf2YqK+J@#(r=U=CIM%Xo9 z%G@C$?82!MkDb~c@-rEpTo-dPw7EFxcbY}2{=W2G!L$6&c=@w_dd+df$*tL4zbqu@ z{P7>@<&WiGR|l7#jX85CMgPUYUU$hz{$m&QX9=l(Jh`gp>Y9eC-WSm)7RdcR?ar;j z^ec5D!`~_Ej1I_Z?sj=*QL@^_aOziifp;^Wznb^8pC?($YkA_#xfAdHezVKAXrh8s z{x+!$ufpc#2XPQ=L z5IgyV4tK%kNBXzJ*57Ei+u42gm)4?dH_trYacA}PiCY8uBwVGwh3dJR7sl8bH16R3 zCaOPmqL%4bsUIcB6a6OE?mV*Z(%XXe8>!PpvNf56cV&8>++-beuxCfILYRuZ^n*`5 z4B6L|l{bssHe&2y3*Mj=a#HtYsF7gQ^UIDkH?Njmm2zDWqBZB7+204!tU{QZ9J4r@WiO_m#8-hRB{`w3RPv;UJFuSPn0>hAfbchk7Ajm^Zav}Mg3n;Spx z#(fCAk>L~8QJi+4X=9)n<4hg>(>^ZImwpPJ70kc=+xNa~`>R`FX*2As1TRfm^x(@; zA&U|l_FJz`$lU(y?b~yKQEDw;h3w2^+3@dkJySkUuNQDP?mh3t`bL;Le2=PNKw9@r zr-$7yQd8EwsEn*!Heaid(^dY~#=M)_pQo?cDOm3J-pOVC#}l8rvJ*bdQ2A2W^K|pC zzgv|%dyHQ61Z9eA%+! z>tM?(y~NqPM_+Y0{m4C2{Z0K=M49yp(<*D_!@L?hUO&57W*@$9k(};}`?o6?rroul zdwx^=_4+Mm>-_URad$ru`+r_BDl_CDS-pwmze_nJkTYsC!BsfcAiE8qfwJ!vI{Ji0+;o_Yo7xegW;+F|wjP2*&>xYNw z+3{?3U4GEKNKGSlwq;4!>ZI2l`}V%PICKE z^I7lrpOzoSXV!XMr4UbsQ$L?l=4(S}7#Qe~?QUiEaO zHO740tsG`*%jT~3wB?MFP_1{g&*9cJA7u9(;JG&aNYYL7nqN`7+sOuNZIqY@N}_mk=*igo_l^X*t7C`!ewmnms-H6*k3&|>i;YHt_$8;jlC-?TP+x?IhNouykJv$Lzp?2d?6 zlVZvK{keFTbo7Ed9RB^b9Bjp}7x(*!7fpLnW4&?$qkZIRu7C%J5B1Gq@$jC@SG1C4 z`YaxiH2DVU;7tphOc;{Z9AD^S#mdIFF8dB|_gPE%G>Fa^GM@Y392|z1=;F4(s=&ojH5L zo;h-%>weSZqnS;G?E-#l4i)FzrFlc_k=9whxcusC&ji{cEWDS)2zGfPAerQUwB}8Z^r-A(?eFh7g13E zFyW%a?8aR?^t}}X?rx~Oy6D(8<|9k{^|V~rESD}?wtZg3l|-|pOCzUyIritpIPoxC zztFP2zkNa6TG!{Pv!8gpnb(){Y}?^A<}*Uy8d;y@2-{i?l=+ z`slJ1nYrv(FXyo%uhoeys+2eU+Je*rS%MBr=6_ZfzTDW(cKyWR|0kBX>{oB%t`waR zpCv8+vgt=ul16@pOZ^#Vb^S)3zun9HCC+^PclO`rjO=@dA`IJQ7(GhLXJ)jAwViu$ zviXn#pZce53EP4$o#C>Vkh-^Oc6Rjg)tToGx1`Q@xmYH#@lsx9yV%zPuGlAGALnV< z?BkQ1xt1wdUDUg3S?QDNU2f|*GdwDOubKEG(NIA4;LOF2AsGxT4_-RB1nrhNp||2$ zjYWE&e^HQKJm0!^TO3#aJ#~BDuLs%JZrB`6^KY|bR7yGLbaVRcdo>GWg^Sy*12n_? zB!#+peArcFzD;Ohe7CB6^_!qV(>a#wn3F6eC10_d?=rAiyCULduuIe1qh-SZd zbYivm#o*)9nXGOc+A^Q>j;m;KXJ9r{C(Z`_Dv0m#T+co*Y_#sSvH*x z-lU?s;F#pcy|&^DPH7yK{L6G^ZqjVgPHr)&4Tl)EoY*hbAkr_yA}ROFY0@&*u)hl*6U92 zR5vp^p=r%_-nNwWAmfjDkJl?ZJX6mx*b!e>c4b@cKXz?-!#mq5OgTN}chuhfblvmk zpH#_UN$w>(Hd$w<9?mtKXp&^exn@tq^Hpu;>!n2;u4_eX{;9EN-&2{IZ@Fsf`@*kh zI;ekQ=kRXxe!8uH!HzwAasQr#R}_EF+!1kOm&^;d@O!KFdNc;7)_q9Mdwt2PziQjn z_D6H8YD(ib1^=q@Sg>EWO0~K#c0zOHh04Za{Wm>zd8$SwGt4|RU5`f#%uU?ycA9gs zqM2*1;)VF5M{BZXpI?4b&0%d6|JjSe3H6y~8vJwI)osK~(*At*776H0MGU0E3)7nv+mNLd2hm%{#G6|7Ezek(k&$-AYM^g!{;(R)x~of z`@g#?et%1OrDCGI8g zO>U{`Oxu1d3WEQ=~>gZaIf*W&8!`#v*OW|zbz9d9_Uhe%VDE@+Fdzb zDB`00^d+&0DJ#sxL|3Qwt*9#LZ%m(HZ@5kOfuF(7)RZ030dfLrr(d!hFAcXzd*N`- zFtT&^v=+;c4r$xh-k<*<&C>4Agp)a~|MP6Q3>VrN*ckG-J$Qe7k5YiK;)Mkrj%&65 zMI8_^V-daOyhB84u~W$gnYjxzPn^+fI~*x$P@QCSr0sSM^T{*2-u|9!V5iGBsX)Aw z;o|Cv2JSX-b3KZzwRCI@?3viMqKdY-E-*mSI^?v>T%x57b-d_@|U znOQ06vWcmDln4#~QNw4qK`Hg>!xd3#vDv~$+B!d8|8y?#mOr0?_1>?tPvn?BbNa}p zel~Ns@9}3pXM~it@V!fn9h%n+Otw6?o>ulnC-=~W?CQ6f=H{~fT+)Uj()R<_DnB}u zXl}7?_o96MIm~z7wciYGOWNSP^zYBkM_=CEd|Y68V^{FkqubRVsLV61+!D!DUHsW0 zBfvSB!z)rY;_~Mc5v~ePq)R^>diDN*%oK*IOr1IZKe+$6{^{nOnN!%_)IZcsc6cTr z@S*+i^M#yCP2@U`?i8=`W88E=@sb38RZ5&uPpw2(*MG^6p$+RSH)vbSyesJV^FVv+ z#eHJ`-^I`EY}%=@RaMz|&n1O0`C|+R&k0?B+IR5DWWKP-oc6PZ>!$rlNEBG&TG2N1 z;mWT;+Rk^IW%FKdxIB$%dk;@)@8{ds^}ZTyGz)oi;%{?^ve@H3YwPXjJ(}0}_c`sn zFR)_jf@}^$zc($Ng?AU8PM^w>eoEzbj^^s!9Kpx=x5=;Zp2nJ+c<+p$U!?3#4a?9^ zYF0}ff;O;)$@(L$Q{Uw1l`G609QgQ#O$Bm+qkJ?Y>72IFF_KL3Z;m(XBdycM7%ZuOs zsC}Kn=WCh%j8kKny3>~**nNL)tJ24oG9RA{0UU|DiYt2B8KqVxWN^*z_;pt7Xx8af zrVPr8J@N^S)=@sjx4u6*`_h+7Wx;9Qi`BU<>-!mIa^BnV)+C)Jy8oT)&QdK2v1?gH z<=I}A<|6TH+)J`0zDl3iG}*;ZmEBo*`<#6YLJ@|aojUivwlMj>v+|RG-Ug*Y19#gr+ORei61Y z(PN*I#64&Ar`FQvSqqG^_%^I~^PHhH?(Fii!&jab2i)0g{`KA$C00Ih)`Q{8l`W6{ z`}D;-#(!mEmV&)|#xd2j#Jz_)Cw?qTk?L9ZF*42Mj`bc1ziGcG3b$VPcjm>7KVA2B zbFbO)W#3D`cI1w;MsFX0vuZSC7xk8ce#l2-JnW}7Ed-Z%TMVG)CX_{wTw zW5m0|n;?~}@(uX}4hoa+;QvF6UbFN;MteqXm-(7gGxcz15q zDsjx(&mF#UqNCj|t&a+aRG;n0n9a$2QBbfVD~QkIL;f!_x5^tWlkP0y{ORyY@J68> zliYn1sUN#yo|%5&*PmGVDo{pclV4z!>Lx$WEBg+yNAo#te*0qIx7HcPHmY6R+IyZ) zkJ+Ih-DbEyCc=4k$%Lj|;_bfveBntB!YeMQF6Rq+yTfRwmncdvt|u@ zQO2w4*?c!%@7VQHLvH5kUHA5caosUr#4+!GnuL#B1UK`A_D#AWCY}vC+QQB`W~mYf z8ILWf*K0g{;)L4KYm-*+ZAgfC9du5RJuzkd{VKM9d(@|{ejQO}djI=UmuGzwT_0>K z+##G8skQCoitdAZKKuQ=9@%tVwdC84WH$HaZz*aLTevbVNF5aEls@ohl3=aW=__kD zTlKGA5XgA8iNWq^DmTda}G5vpOf5WCD zt3F^9GA0LS^B}^-Tk*t-drGl_~9al3lc3K zWjNjVr%T0&_$hYuk*g{^oo~g^1k>cOFl&M#{mX;Tc3`Vk7o(IeA|DY z@8Op;8$SQ|&U@V!H$EF=hS;>t?P|N6ajN*k5!I5N{CZ-lj_%22SKV*(CnvZv zf3Pw-Znf@RW#^js7bl+S#oDrNo$@(C+aPFR($2>XhHpL|?z#Hu&Yh!@XC)pcT%Kln z+RtiQy#Du!eabJsuKm>~t-iDRvK`>iUR>+5A|57&e6cywpOFQ{d*q1^Kq8n)mWPeEzgv$D@{;UnYdut(NM>TC1+Wbcd5>D z?UX9L$l+EZ_TSL_O6SD4ZpA!@P6!3OQu99Le1hZqv(^IdYxn!kzAp_b-LlzlhUCwW z4rTkTX9>v9X_xlD+fb)G@oe<2DznoD#w=@I)JI>}x4ZsL@`6b7iBtaP;`fw^NU_*; z`S|ZlKD+5}?(5jsnV;CxKHAG=7}b_C>^b;m<{`I)=3`b@v-l(#t+gU7HhmX5(JB^W z#nx15vCn4D6}PO#l5Ph+teg-WlU{C8?(|5h@bwjwyqf&_AA7qmojxtZtuyUP!=|#{ zk)fX06z)i$@*_=t-AWXk5zGoGP)LXQ@%+*=c94Za(%y z*g0gA{oz9|x#DN^m!&MRHC(sXbmyVa$#Ex@8%4DZk4#ZdFlswpCcdnTdrimr?K&qM zkKdl$r^%L^vof_KNx!{q;ZcWZ-E{%CrcaX*-n>bFr3<66-Ps-cL)A(zX5HSUs{YLG zr=MoF$-a`~lT3f1$Z4tzW7tWpiPzyAA6p9L3Rxq91Zp~t+QX&0GHx(}xD`SLzg zUdZCM>u9KQw_Ee+Vu@Ln{CP6+&$sDmzB%{9%C$^3T;ZL&zmLWPjSsBv940M3=h5+| z)cpc4=hW{i439!mP1D`4P4g*VE?OMv!YTS66JjxA(zM-uT>_r=05V&KMf?h)Lz7 ze9_-5^z*#$maj)G{p(L`fBWH7ZGX_hqd8ap^~`OXv|_Pr*uHaIUtY{V7JVoGPBE9) zjD&=XCu0Jqc2=!RTfr-PH!JR8n;GLWFM%tfPR%MZTUJHf=xopI_vU4f@8Mi}RdR>j z3C^qGOjp!)CT0Kgh;e(U=*_hGZ`7)f`R|`psQT_oW*Ldso+I&-R?Kt)=p8?4GLqk-77_Pxf=}t$ZLcGf*Molv|%%AN#gl;=Dh? zbi?~*nogTFU6gpI+K&z;vflCG5BHqt$a?2`k@t z@<7cZ?$P!l6CT>J%#r_`ERpcC(|0^5!sn!Cp_=c&ntcJOhZi9)&EuA zxxsjeaM(NbWm4YqH5E_)-&?&pGi~#yQyNhT*1v9K7&W{0M_>8s`t9S3(y9}?uEbqW zTL0kSY%ZQur%c};N?Z3>q%mJHma6`rQu881_R3v7&lB;Bxue(Zd88GvP}%bQ5stV= z5&s@32VeYo+wEQ~yIw<-&>=&^)_q)OR3j7QrkwN4C`s1T;Mux>(^2iYFq=5n=LhS) zI2z>oFnuqUN#|fI-jn;P;Ko*c;lpcwB(^ktvtAIp(fsfXe=iLF-Pw-W z{Yi~Cg`P+AdI`EU6znTf;)rVE_Dkj{c=TFRO`S2(h0ov7)794PiR(`G@0K1OADPvQ zZZEth_%xLNV295#9^PDKxT2$9rHyJ|B4kDpDkATo?WPre#&v$WYdW2@*jm_(hYP>UN+yic_8rR zl6`n^f@|Zo57OM;(xxWH+2<}@^%L1RiQ|uh?av~~{YP2X_JlZa`jwUoh-lfdq}X0$OIx77L|fitUZ>#p{$%k9VvUa- zqh>R|e8?8i%hh~VLXY(iTZ6`X1)IMwbb2JJMNTobIWJZaC^Af$@c3hFU#w8tw-<9K zKTHWz6z@H}agFx(a=kd~6FFu&Y%95Dwp==P=EA<-g)1z7Fy-FbnHCuq{$YZZY1Z0Z zyTqDZ7Wqw>W1=Exz0zP;*Rj;SuYRTd`H-u9BW*6{ z{s@QU{B$?P#oA3zh4l-4-X1&R)!}~Z$IF!&67sR_r~PjmZSm4>yqxjXU*h)K4&naW z#XtXqdoNRG(tczq!L{qC85s)gq;+Xkh|hGgbb zNi5T3Lb~Lq3qLsRS9VdOl=WX==akDzM><9KNu0Qt|1bD;QsJwdQk&weJNCjAMj_b| z&3b$nX8#l5Y-(IONcza`U<=Srsu?ONB*0~;h@xk|xf^^{XuV2=gRPdIopUhL4c!opZ zm{Xa~ei!fmN+~6R8Qg9@y4%uR8RWJw*6(hy+sQ9X4!r`y(fxUTk6Q7 z-8UYzu$ZaLTkPxpU*UgezShZ@hNtf*S~;2UFIZ!8H*1c|n`wSIObXxp+;lfA^el_X z`Qov_>toAQ#mzgHPTcFDAd>jTsBwPCruTi3!Ua|DLcrz^jpXfJ=`C5<=Q z$2Z?+NZM_jWVaz{!Te3pJwAPXJN@+}xStnk8}!XME26A&fqls>oeM!;5+ZL8^D47G z?%rFlo$J-be?9%C*XDi{l-?9&^KjSV16?k26Q=!6-_RNSxKYOJ5?h2)Y5y+o6VKlK zW_W#XTj|+NyUaq@y?Rm>BR6fq>x+Lg4*ECT==}RS?T+ZN6{qrLeOg*IQd^ZTD=lzv zb8k|c=Wc(4Z7)lCi=;$T;m^)T|98&`m~v{$hZ8fHelWg0QFo4?jrG?VJG*TRadYYz zr!VzdalxbTX67>=Jr3m(*6j-{-IkUqq&#F}`gm0*d(xpOo(n(TOo_=``D&GKdS!TW zf~%jD@ak!s7%%b}YoGGt-O+bwDwA~Ax2d|?ib3t`PR929+OqzHn{ri9fN#&u1#Sz) zM9m}m4fI*P7>nw!v_IWuWTd+*;X&fMHwO&gW}KK+a#mrB$s?;6|Bjwo*@`BK)lW;A>&H|m@$k{nyUriKy!L+Em#?fQa%9KU1FBPYomjXl#ZvO+^7j3A zXB^!*)ASKvI+u~+q8Iu{>^jO1Z1~{zr?fYrd1G#`n7Zg5q0{w3dkPOvZ2WLs@@A~_ zg=J#$5ff!J&bFuKJ7vyvsrHr6oLuH1Rl4MxNq^H5VTs0hnl=+`il!|OxUq@rF}KV* zTi!JpOH|683Y;cAuJ)`Dm=U1Zs_nvc-!mm4re9?Rlk}7cE~4|5f^PnHS{*Uv>?&<3 zg&Kq7Cn8qz2b}on(GsMVDRsT$)J^_`45w$$xO4ubv@d+DJMn>usjpY3{5vKKXWzZY zG|j|0-896w-*n~2Tw_w4FrUB9MAu=O>ytCKa<`WK{FD9CD)))Piz8FcEbh-1T;cXm zt#>}JreC5(r6uF`D@z(C{`?(eqC<#g4pDCvr4VCEYN@OJ*H>L|L7v=CC3(5>`ycoNwE2S)10UEr-VwuZT{suWVKXxJ>9dV zX5L=!_rCm^4#A0gzB9x|FKOIl{QIKFk!9K@FBjjO@z66TU=Dvrz+;DtiMDUn#+#~p zAKfN!ODOKRtgv$KiNgF8@k^o;IyRp7IawHbWvPvw$KvGFaK6`lPh)q^pE~c>)GWD` zmnR?S%G&!<&rD5K^1`MDt@BQenL-zisyBMhI~Xau!Ewi_fL4a7)f0p_-8c}Du-H98 z^W#C{@ySu;OEbnQ;SY# z1T!2zCvwR7v-+W5`rjUIS}E2ySGT28Vgj%KD!1iVV>-C_AMkO;*1Qk7@iAHL_=#1o zXFpgf`uV~6{QSofH}#i)et42S{gC(S@`BA?GrCu-$o>6wS+u5u($&2G4<%Yye-^fT zTrthE(CpbZW3%LDxpeC}S9RRD<<9+{KlkI-Kk0GrmQv~+}+3#&~ar|_pV-~Mi;oMs*CUIO; z+R@#xT!2&ASyUsag0Dm^EMmj+3d`)&7aI)zmtTnW`*(O^&YyLkcKTh3l3k_GcF^|) z^BLxeXZ#l56yPtcxbVeya$8Z~)7ks2*@|pJUp}78B+wWVfQr(aw z_Czc!DdA{EOxdvyN55&e{RzuGdZ26n{+QtqNht?va?O;F*QMW1&ybrY!&$DBc;ei(#>bW) zywmJv3HUskb$*V8#J!4o{xuZ|Y}4yreCzyh{%icO~Ztn;iL z+-r6`vAg~K*y6aF^CkbTz4TgQT`nZYW_LlreBEiLS^fX}w0gJf%+PFG?GRGDl~pat z;KI#n##X&*L9S$`zKIj(%+0s|^5{;w9Z#ah!?!sVUHfnE_!MT`Rq=cFf}Q_9%dVEI zoqej}Oy89Koo=14_v_oAP~W+N_kZ0xzv@|c1Ts$x=Iu?Cm>|!u*?cJRuQ&gPlW}_| zB~NDw;$GY|=Iv-sw`}y~2Tg$h$>o+h>dUV@=!(LN2 zc~QClZ9Sa^Th=i>E?5;Be*4Rkd7Qixxx2I<^vyKoY3^lUV0!N9;uw-?>sTC_yIX0Z ztTv~?lQ8Y`3wKZB|9NiJ2{v|i9;q!8Oy}{&7#glqv0#+=W69X|YNN4HkbdX_Xnp*m-Ib0sLb=3-oPMz!f`ikW3aNB=+U(2f1o?ST^I_bi!mgiG1 zGWPHLd_?%pro?xPdhD%>Hk}BluXuJbdflYunf7NkXO#Z`dr(JG^QXSu<5N@ZZ3`Fa zWOMv*-7@*qil)VkQ#{I;Qoa-gZMWUF@4Td?h1hhj-xr$?@SOY@D6{z8+d$TzzYm-Z zcK=#tKD~9m%mtr5<~<=1Z66Q2IWLIc-Fh|k;ak7O>pW7nTAh6MJ-+^(zRf+$ZsUCl z->2NH5z*53JC<=`$F?_C0ZX6jBwV;^Ww@!ATRckes5JMyxbLkC7ku=K(wTdB(WdD+ zr9l$2B)8_NCgj}fTW*LC-`nq`Os($Tzg}CrFt;v#>Fh05J5Log|DWi#MW>W; z2e+%Kr0dog!P8yZelv}q>6}t9QTV2H(n)jA`AvuR^ly{ZbG$pR_4NKz{~SGiv2B%YmR;-=^1nYkBUMsMG3d--c + + + + diff --git a/docs/images/logo_white.svg b/docs/images/logo_white.svg new file mode 100644 index 00000000..3cdde110 --- /dev/null +++ b/docs/images/logo_white.svg @@ -0,0 +1,12 @@ + + + Layer 1 + + + + + \ No newline at end of file diff --git a/docs/images/logotype_white.svg b/docs/images/logotype_white.svg new file mode 100644 index 00000000..656c9920 --- /dev/null +++ b/docs/images/logotype_white.svg @@ -0,0 +1,17 @@ + + + + steem-icon-typo copy + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/look.svg b/docs/images/look.svg new file mode 100644 index 00000000..3f937433 --- /dev/null +++ b/docs/images/look.svg @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/docs/images/menu.svg b/docs/images/menu.svg new file mode 100644 index 00000000..f468dc47 --- /dev/null +++ b/docs/images/menu.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/images/npm-logo.svg b/docs/images/npm-logo.svg new file mode 100644 index 00000000..13c79001 --- /dev/null +++ b/docs/images/npm-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/images/services-jussi/kitematic-example.png b/docs/images/services-jussi/kitematic-example.png new file mode 100644 index 0000000000000000000000000000000000000000..31f2381ef92d521075aeb37a92ac68158c89c5a3 GIT binary patch literal 417761 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

+qJpOCFjV8~cl$n)HeH@Vl#9 z3o{pW3#guWab!<%{oMwon{xB^wHw~PCGv5-f1=m%j~01JJ$!NXi4lwU^vDFB=Sy}u zZ)p)*sML3EMaPX4=_l70+*ec#U$Nqs)Rs%)v9j}$xLhq{)b8nQ)JjV`+2NhitS5PM z(xizbEudL`cdd5xOeH~k#TO_1JL+~Y`~K2(U-_?l{u?L=*EoQkXf7;*S zf_|xh|HVyZWnY4nAL=bLd)NN@ZQ7ED=bxNX_5F9UtNerX<&Xp6UjE12z1~f^cikYt z+1O@AfOxY1Z7vgau~3JE_s?d`yTbo^+84*nTLv04=WIz2=Ra`5S25wD|C+N$la&*4 zv$dzlN(akN)-y`Ew5(jT{n3dx*EAd=HkVv4H~DpbW7y+qEaE@p3mq>x#~;d7tU7nU zXP@Yl)8-q>WM@C=@myZyafwyGnl-%g&8++Zwf;#cQjIOut^)a#V1OUg@FNk25ajJFfb@bf$dx zhS`p0<(tpUNIz?E#BD?M;Wy!#zkGYcZYCaUzNxd)P<}!{^rdAdZc2SLZ~p7oX8Xyp z`}1ju>JvA076v@hwyg@j`ak{bs-XYMtMqPk-YZN0n7lroH7M=#tt0Q1cJGKPI@7&v zjm~VrB@>tYd*5+%%~|e0%N8DaZF}gw)amQ4_9+|rt)`xA+p*#G4ByQ{5&zS_2fX@! zE^gD#Gyk~v@2K3SyuwqbsaAcF_SaI)+snQ6E^A+$!#Mqu(3Gbi;p=!B&$}udem^m} z^@R+_?!RdvoZEs8yp{Bwf6SP@dQQEQ>eA2pdw=z_e?Q#+ba~?Qqo+CUyzcFq_dMYD z^r}gH>sls!j<7$^?fc9%`SXiUS=SbppG$uH%|V9CV&<#OnYTsvEMjl&Q7Qg><($2* zTv4iI=6<#Km7h0cvm2aV&3$ZNZht55myU`lNryiF3uKuQydWqGI*13kIF{u*jvlW+5)$Q5(V(F7CrYWGs zLtFGTia%`>Nv~wOZT{{+)qd{^nGL+RU;Np2%5a8D-(s1Ej4R^Pnf#9bW9avcJ0Wz7 z_jLOeVHxJF(&mTmm7l6Pmj2XVZ-(#>KDUR*FRYKV|1y6&%e05G2CHi=TiA32zU)tq z=1rciVf%j#Z{$hCsn)M-j#X4V+-^I4!jEmsRqD^0Wz5^mzV_kTQ-XP)4}O{HWMOY& zH1+D_t5YXQ|1Xiub5C)d`fV@kx3jlGT63Qy{}IY*t^9l^(C*EG1NRTxGhMY!TXFsN zrfp`;Q~$E(NMD|vB7ZDbxl>(#>Y>NK{bZ50&J3aqkZ~BvxtA}zW9-39I+a93& z=cR7Wyx*H0_W#;sI*Vu4;zus}Qd^$fGy3e`x?gR6v(ta;o)bd9TkT#-&u~8L{>r8A z-qG9AXJzA)6ZgsoCdDY^WLI+p+xOdaxYaEeV_IFkPB-wB8k_m^xCWWMP4BFWXT&M9 zm%YDxa6@^Pj!R61Zh`CW`{y1^zUckOaEX}J`B~~Vf8JVu*?vKvdCmDt7K`>(ec2iH z*5Z}@n}_Gyer=uc+SlvIboh0*Fr|RgWl#V~j+*gj9_|Muk ztK7tD!sqv^$|bL?zAvBMe^(&I@b<;UNnvyTY-Rs+mb0a@)$GUKV7Y^y)gPw2ZK!4nO3jCXiVujMMgIO>41l88Ikc-o2Sn|+IlHpk6woz^lvK7z?E zE}~25@9)HObG(`Uw{wdv@Lz8)kmGkQCOCD;G{0!Ih5ZLSo@sMm?B4cuPo&@%3F{zr zzWu%V-G|oyWr^OPZ^0gOeC?EnYtBsDWV*&BFXyzO@sv0(|8LTk`|kH|P;8gl-S5v4 zT%9d^@T1<;^CgB?o}KEgJa$?@`rw<7i>7_CF8ids=55fNn4;vkbIVRVHU8Ia%buwC zar0 z{lwJCK4nI%{;^+z>!h0(dg~p$a?bCsz3aRGezy#5L^g}ZhVRM%dR@tRL&@$1ytdFpoNnPgtrqI~gzEi>LoSHipLDo4b{{Q_~ zowGnMf;U*b$MJWLX<~_?xsQ`xQuk8PJtFTn=I^rqxQI8aXUgl>Cfd%I&uh4?f7GDx zMv7s^r4Vb#LZ_;3Jx6`b@U@~FGJoptNcu1M+jQCXA8Qf=IU*l)|xtY=BzcG z_e}Mi-*z5c$Qv!-+&Ag&boRtG$%VYV4a%2~DZSuyt<<$|FSqwS%p&_IICKg3wR`IN zy#dS0;@8ZNXAl1ymhkVVPQ~*WpRn_PwbW)6-K?!D{A4L*lE&8-n-QvPeeY7UK(|cM z25+ZDrL|f4x>XhndZ$lHy0D{)#gAP}vQ=hIzw7jQ4AZArth%w>lEt>VHSVa?f%H_f zJA1atPoAc&d@UlxRqKwNhWwPUxfRW|^G-jo@0sJ9Cg#ECU07uJEc3~w*Q%O!;U>T4 z@A6-EQBT#mZy%HI=Aa4TH){Xe?GUyscAJ`Wg<;<8b%}=#Wz7%}Y|hU0I{4&j;hD{w z8m9BqF5+~xZJjTqq`O#YzVb3(K}U<(-|B3$nT~!xs`RH%bKVSFp--~a^3jolZ|v&byR6@8kFR5BQZ& zPySGUOQ!d;#eqlnd~HHaoR>DXZ`^TERwmAN=A!>+9!4!=aJ|ZQd6V?{hZ!cU)7xd7 zZ!U8ExG7IrWVxZ3LA{hK|D_$#CbBxaE}XI0E$}tEe1){glPT+6Csyj5yt%+-vg?L@ zuN}NuC(ID2x2ah1TUD%^MJxOSi~gUm#P7~buOHgjQgeImVPWsdKkV(&)>awaI>T+n{JhE?n@-#y3AjFqK+!BaMy79~eV zn}56|P-SU*yX`+i^=65fIP1oDi*3c`*Lc5OdVkZ5q)9&|H|~6OUoYrSaSluN_Jsb& zs%djO7F-CF`CMe?syBaQ#fJ}yXSVz}eN%^b;z~c>rPHMkA6=e%{BL4#VEqf`idJ(M zy`#!GG5=-GF7x{To?*)V$dywTa>xF+o^koJ`TO{Z=AYK>nx$7|#^)d5#+_Z-EjlB2 z>aYEWPc1#RVb0s`?HoS8_xp%A9Z!nh_Sk2=<&TTWHd+BKKRiQQma%c#KZOlfH5}wf zxxtvRVM+cXr?8OHg=Ym{OpY@uT*0<}=haKfzr&|mhrDc1jn7-WvtBgpepYf(%-r^E zz0Vfj?m8@SWvBE8XUV;)%ilM$um2dlbbi3hIUe(Uycf7HeZ#T4xa-9137;P*E1i%` z5t;tzMdCUOv#U8b|192cCcD*RmYt|z+58vv)0Rx1to_U$v?u#0x2*eOm!*7#f|~hn zk7}Mf`J}?eAYF0YvvP;N{)rWWqHU8`t#H(wmNR$5irFc@G#)hiPQB)*R{8klSvRkB zIM!U%``}n}wUVzX32n`l_VW81os7F)T~WU~@2>2BOhS1s-K`(<-%H0IXts<;t9 zqsj3!+v4iCpESbv+lGao;4a_pIpM0XW^Mdzech?*Dq>TY3#eVxUZ1>T{bs{6lLWQB zZ{MBT@gwC3*NU1YZEjSE-&Pvh7v zL1s=1)E7LqU-s{|%JlOp-n~CRyIEdzj?=v*F}QEziux3mMqf=X&ABdJ`%kFr z{agF#ODxykh+}=Tva6+%vP~*ep2P&}t)4$`-mg<9cxInYF=U^(&&+9hUJ$6ty)$K_ z=_8S-*dn9VKE=BJI}K&he@YzBt2wkF>a~IXGLA{_@&&IM>goR8ubg}<_S5HPqitdP zf4wPpwD$aKe`(ppJ=3<=&I(z1zPsm}1Mh6}h=}XHd*>Bran&7#FW5gUxIm(}M^!kv zOJz}rhQFMMc7TGjeAsl=iPH-X?zdo)X*}=tK*_bdlb>VPjJfFRwZyLBU9UAo>5zu! z#qO_9`sQUb2~?Dnu8Iv?nsHOAL1$`)m7B%3)e#KG-Y-s&7V>({cWYtN)BZ03Pn$#e z?H4Xse94TnB`UtPy!8>Y>)ENYVF4PM5mwfZ?(e_8$ZMy`6#Ln6*H$5|*qWovs&VRM zfSphC2^;MKr6UrhZT~q|U&x*zmg75-_xnK^bLli$iPQ+V69&y0zujb=Z2Xn|w>>S0_KwxMf&c&LQ-cYq7{%vo+rSnzc8W{&4ag zZC!C)>YS^_hVYlXBFkQ=J#FY4LCvrm69IpWsw_LAMH z-b%~aN}!_=mc{4S3P=C%ySd|W_VHKIt=B|SPV0z-T|RwN#Lb}gd#H<8f!p(>V>{|H zb_KYL+bSpQH$ItGrm?tvZrbCTwf_U>m^##_y^c`Xu|sjDLhxhP?gdNw^et~MU)&Xt za-^=LbnjNren$Q0@cM#x4?C+rFZ+sVg#^!ZdTeGA_`or^Stgj=dy!Yf=G*2W_xG(wM;>0h9~y7i!R6Dv z1p%fra>F(?E%RHcb@b9RcAN{r4oa%)*~ypGE9~mo+p6$zXaAzDTNbG=ed6^okb9y< z;gZaoIP{cyLBsF@s*rp?@dNVC&t?XPjBoM3=+1;3Nd-jYy3#G)$ zzb@(3w`uh{xQ~BhXr$~ik%`$R>!rU<=W;l$>iyB%JG1uMyecJ&6Z!YL+g>+VbI3?E zF6jK)vhuE0SSDX>`tJu9{#?6qe(E)yiPu`A_hl~Z>GiNKb}(M$Ioa~`^;GL6Pvrz7 z?(F=;uvWTHWv<&QbH4@RrjTBKJ~V)b0bSuEX(DcVId~?Ggr0H!{lUB ztG0jQ;R*9SkI(OP)zMoYrz4=e6PNtfsylD}K+J6SuInnB#R?ebYdMxE1>I_S!o)-0FD5Z|`R} zcfal;dNlXVtx4`Tenh;hXP5r0BWqtE;{STvu~m!RgL9`XTHC(x`kBZbJ!U+K(s>)t zE?9Oc|E$C&!Kror|Nr+b%kB6Pd+XcAr@kes(NTx5YJ8IG|96>HNdGZ3Z#IJtcQD!^ z7TVF%w`}|K_la3aN-m62yMzsdPhaCt@pEC1iV1%o+hDv%XZ>NpA8rB_l2W}gVQE#F z!eXN8I-AysZxoxj<8@NqtqaO~=NfEX^{P}dX00CEY?X^lcN<@ouKKcS2B*u`m^mLG zHpFY~%<0OS9Oh=i`o+R;^|dvZRbM4f-1Qb=omKI{ z(boG9s?Q1ag}z>(v)1@&b(f5il;`Yzw}}Ur^RPd@@Oz8igg+{;w0w6h(0e=Sw2Wy| z(nX<*=g%kHUD*BOgL7$#URIAfdsEOu%}ZJGtz|Rq+w%i9lwC}Z-<&ZgzBYW}w2PJ% zTO<}wxAR#M>?=M)+o|xAh~@S#9&MLiA2d3wvgYj7+2U@W4%cS>TB}%PWT$twc-gD- z?^pR9PJLhVVcm7^iDzFwGWlA1?f)%)t!|T#sZVV7?k!q;t5f-^!cIf|Z<%j5hO7bm*&w(hGsb#u)G z`fx@15iyU%sq^N&+Y-~(epE0d{H=}lrwOO7AAi>M)%f#`s(W@(tG`)fZTlRyS@hOY z(`S*2r>AeyEc%(%RyEHc)-ANFJ%7I1p=BXeVUtxZr}JconM{e>{BC=JUi$AXrO9T= z=MGw~$o$LM&pd7MZJ+pDp}E&}y6#Q*KeICTsQ3b_o1dJZD;0jU2^t(Z4w}g>e!$w^ z(vbTgalWl}(FMPGZA&(EaO~mc7hm?@%F5zE0Q(}vO;@&b>K9!5&dFuEzSZWEqd?ZB zGuE9)=0#?I*tL`0Myu|o{LLe)qYa-IRr>tdnWFVocwOG1DR-wy*zPp-SvO|^uY%VC zzoU0nX8bsM-4Sx|#ewygXZ>F$A|?u6;FT1}DAl<({M)QgH?30ddr57&(Y`Dwa#<0> zr5H_@{U02=_pLPF@MC#t8ozC^`B(QxiuyfwL_Ybi{(SdzI^O~7d#)Q+_@$S!ct*4a za?H5gajnm1Zp4=-D?884D4BSa>2LL=`n7wD%KfIFt=gT;KYR$DI@F6H__??1*|1uI`F9guB!>2!n>yl?ctem>B77?NcSMpuq#IF!Ac zV647ISLa6NF3m~H{Kzy7>R3b%}r8JkGGK;+PW@_htF&_s<1g4yFH+ueg8d zZ?`qW%*FY~p01klt@u<_T+_RW`X7Ewwd4}tdi-+f=Zz-oRQK3!$*@~LanH7S(A81? z0hW@W)lr@B)lr*-&i^^D7;s`G$Gkb!U*>0-ccr=qfj45KEGcoM6`TBfspLKlgurb5#*@fhZ4L37+ z)pustiJ40H?QYw2!hTxBl?4Zb>leRE{Je^JhuG0?`i72A(_}BM>yqTtz1`Wr^GxB} zciAczzRfeu7CpS$c=|^R&qf`-P=iJOm2;v>ro56!p8nlxM(>NxF3s#a#-$py2Y#AH zZ!mV*$rkc(QSZZxD@BCz-W^%B+A_f47nk3D9j^0vksF`BUtOW6b3d_l+1p(U;yjD$ z>UQ+;{0FY2T#HpQ0!4=RCD**Fx{7F&;arWxBV=F7^zZ(o?iBc0J#UHxsII zCp>ZgZCE^;$@!Ss;upQoZ+K;kOKyGB{w?+F$BXsK)Ap_I+Nj!_Y502fjW4t1*VTKp z1zuYuVY5N<)1Dn&zU;b&OFS*Y?2MJK@Fkr~6Rs%L>Umxlz44XJVV)DAYYf}Uby~%% zuO)qTj@n|W6>{O^nQc5DGdaYhKYY4Uw#LS5;{1}lq%elNY}?!lH{Xu<``U2N`NSUn zhdJ&JANSq3w6kRP{G6ZMjAkZZ-#${kvzT>$dbX=>kn22f5@T?GU@Y+9-2U?n@9jgr z?tk_tdAr#UCxxb)o!6{#ihlNd$yVR???L3Yu9j(i@zMNx{owcnO&iNJ*7Gw--eZku zIiMG9_Vr8rvm42;e;KwX#MIbKnl!0}-#Wc=jnCzu$6ra!lFPl{t?hQzp!$)3&+7@& z)4$JUC{{n#(*EerZJQ5sEExWF9ewy^bWGk8u<=>AZj)O##%Dof!x+dC?A z>JJ>=|NqFj@SP6~YZTIUT|au9-F<_Jhvdp1e=e5VZ1^d7xGl8(f19>J@msYQ25W+t z{xCInzGwfTW7oF(r&NO0OS5~X+?(Q6TO@L}KSenB zNL>Y6cUx>nIRBM@CH&Uw-INX0gaYLkC4}4(%`H+@xOb5A@GVic*+zRF#Te}ha(VLR z;@SzH-zBcuC(+BYsK2*sk!j%_&HcJsu5rhk?B6q7oc?kD;{1y_ClnsNZw!0ZU--t& zA*{BeC7JFYO&FWPWQSiFWYzfPZuI? zKtsc@g>&F|c6g@v;U=Gh*xTbu|8IoE2`48f2J>GO{PE!^_lEu#Ka!>E45ZvnzdGT{ z^(t##?#ddGr)7f1;ct%Y-0(@la+&F-;MNuwVUyhG{&ShZlQwPh*rdt5{Ex_kj8KWA zlP7(A6l)^FXPMwB*bw&Z+Ljl;0@p-+P!C&oqhYCc*(1L@?lHA195#lX4Y)B&>E)-8 z7I#x)o82F0%?bS&pd#Ale%$NCR9$teiZZ9*&*>Ihu8ZGZfAqkOLo?S9|B#@DCj8q~U2i!^5~W^gsh6Ra0LD*Yq>ZoBOBLmtyvVs`LO(M;+2F1{`C=&!#O z@k>OP?U?Sf`2O7=N*QyM8K>v9DgL^~{X}aD|IK;!4k~gFlS;y(F6(oPaDEi22^Y&f zwc*6>9F58Izbu-v<_^o`b7v;r_F@c9j!sd`Xv%MyP}aF)dG{PErg_b{)GpJ?@Bi??HrpHWiA;sp%55J0ntY*5_{oYp zOuW923;tcKera}JQC<0@!@p%OLT(G1nR(f=rv40HrXUc!!dC3>MrQW1^#_+|$+xr~ zjD@V0Yh4j7@a})fs<&_2ez`tY&@p-+V;oz`v-EmOL~F{{f=hQ^hem2mUmqF%`A$I9 z*;3rdKI%?2{YS`x$_+*tQPQBS=C$G-1z%{(x1yFKIePtcg4S2ye!x{z4@5d zP_3Rm1;#ADsFMU+dPO$6|Mz zQNt)bxbkM2+@o1_Ipqn@9wf_`ojVmNx!ADc)_RSWzMFHc62CpzmJxi1>$~5Z<9l{W zpR9C0r&6R7wfdW)=Ysa&&pBr}j|sW%xwyS^TEAyvxWv`0aEG_AQUg|(MT!^%TfI8r zs(vLY{+QXbCn1a3@BVO^@l4lCxclTxx6Aq4b#C^Es?S&O-X~PBc9Lvbj@_CGJ&7yV z&1>jie=pImUFuV$O&$KXL=iR(}mj z7ZlU{wc(D6wzSBJ`LdOs%Z;wCUJ%?nhslstc$o_KwW32GzDAyj+RWVk?ub(O%T*b( zv}gY4JTR*vZ?n}?gTP0cchiCoU6o)x^)&eM=gDVWkp*=twf?{Gcm~IxAM%oqD>O zbBo`l#p!Q<-EUl+ko{qU|APNwXUa~mKC1dzf9q2=*&p1(*|jG^9M_3zElAth_Tt`3 z{ae>Ky^rpOoQqVj%BJk#7pcqpWPIMUF4eqju55ee>(j}CR?F)99pxn6%(+xP%lu`3 zqTE@Pn;U)Ax8;0y6V_#48M9ACSaxR6uNMmEwC{;| zxo*ByJQrv0pEB>(AEVd5ihnF;H3g zz*~7jCZEGHjpA>aR=>KQo#+2{v4kg0<(0p1i~DP_cp)P8v-V<3% z22I2C$umSY?Q3ySai37ERh<~JDvtB1R=Cqst)nM)PUm&~r1Ge*Uf>2#sEXaeb;|OI zu^ul4fD-zzThKXpaiA_)o_+rqIjsbC3LFR?qM9uC8~VRca_wQ6=6f!uj&Cq&|tQ7B}pEo&7 zC3h|i59BDw`LVs=TV%)P^<4`)&tKWE8s$1Ay8M7tj63HRS-a?Ul9i|a|2@9)#qDgx zcN&|SXXa#bv$wz5J?H+0I=g-_ih8Ed@9Fth+45pcTGCpWb z+LU}i<)-cSMg7)%H(O3UO;TXYUy%Ara zXm?sjwEq2j4o&Il;kQ*lsrx^Z#D77Zr?;}t%=qta(xQD3Hlp2FFUVwN82z7b?P=3| zhS&1tiJzut)pAcMYn;89NwMnH?3X{J&Kxlcb=|Vbvgg49`2|wO8n>+)&M{jnCtdVA z^DpS{rmVDhVd2|WOeHIyhHsFWbxZE>we|ZBhCPa2(y`P)_2=~0TQ9DTRy}ijm*`~w z)vRGzA1zO58#`>S(X=|p68fvm0SkPReYCXJ~XSdh@P% zhT?_UhYlWN34C6ERCPO>)8F*z^+!{Dm1S0Mcl>QMMfd8ne%}u&J(j$czg7!)s4e$w zJLh+u)9Sg_=N_HZyML}HZn3^w?)9;sKPl(_&J~+0*x7E(bDaF|bL*dntDP=rrmD~C z=V=o8tNDDTh0$qAPsuQi%*?ha_I^pfo=^T*_QpTr-oZ{M-^MO(JtZH(?!}D02Coff zPw*2=5~-X$=a|~r^aHb&z3T2f`TFSxj?1@sjyd}NSSMmTn{Qh}wnB`|mA}!FwY=R{ zJpwZG->R`6Tpt;kG?Qi4ivIBLSMOEqtohw%yrIfPInk3bwMHeZ|83`j->eGm`meM~ zeY`3gocQ&Ue=Ur=ar-XU(MPcxpInceRCVmijHVBjyc30H^F&AAnyK;CEX_o|r?>Rj zqYHETZoPPNTT$2`;iap}^mo1U_sex?O*09d|G`GsMC70Ss;vn{q5XQv?>fIl+~2cE zpmW>qnEN?j9-F&8T>4qV^WWp}wgvY#uY6(l+Gy3!Nwq7g#O3}z=VbB;I(i~&tBu&v zjV}(QT+vE#+kQj1oxf7aR*6NIO<$1X*p=TBYU}$mWiRRk`{`**?=_IPJLhWl;jUT_ z&-~77SJMRZr6Vrv-LoT8$c-&lc-dC}nB5Y&-mBla#-$7V@8?Dt%z3qI!H#*wQRUZtuf0FBvc9XcO6OAdwS)I;-2-O) zdf)vy`{Kp-=^N~BZ?@5$?NDo5P_M!C(r(kgXv2*4DgU^oq`mLFo!}>(9x3oS-F^Dv z*KZPDe1F+8`=H6YY2A-n3m32M-=;8Kea(K)-mA$b=awAXcJqb2>hXdDCl@sx$y)Vh zTFr+;zCR8{{{8so?Nr$e+kerGW~<(b%;76>H&lFN$7%i|uC8v2f=!oDhLz{fXDWVo zgFlB}GiJ{)=GbX#+PBYWpyy*Aj zg5t#qzk9Z_=KT7-J$4o6cXQ{DK`+{cgTx*jd6brte&T2Peu;;^jqL2T7pwoNp17&7 z^3UVkOip1*+sG}qW_=TVx%jxY4BrQb1FcF4-(&sO#q3`4q;9&6nDzB-hxTgr8oZp+ zd*J(zOS3qnFR*=9y1JRQByZ`rkgS~i>l+Js=GQXn8XD#?@=dnY@%bUXWb5Ml7t;z^ z@6Bzm&yL?pnn z9mi|OPTo{Y&h1*UY2RAG&&Aaxayz3gEeml5G5vb zjVVRQ=;?Il@12V;w3hfAnqL1DzO&?r%=D0j^H{GMPnpBs+bZ!sJ!-4)vyih(&fUse z5OZHpLtUi&@SB%XyZUVni&rh*HtDqZ;fGGY)F&-J-?YqTvxwpv#v5|R)ze**aweI{ zui$yla7%RN7xSwxX1YC9d$#=~V|L#>VYY=)ZG3t?Gk2EEHZDzevDvH7a${Fa9&h%d z#onGOm!oDT6>;3|-g>aV@bx~`du;g*U5{1;h}=w6wEUk__-OU485{p{ud#XDEm`+F z@cR$pA3f_@4|1N2n0-b1oha9%gZzpU7U%B`Z|�sqo4{Vbz=RgGXK0wrEB@o_5Ch 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%0A9-`gfQ<2ks5< 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 z∨ADAIbr{afm(51T44FHS4lrk=Cs@3UIDeb4Xy-1IDmJ43KSUZzi^`_l@^qK?OZ z%C|_qNnJVNLQ$;d+Xm>&@RAvGa^5Li(zoI~>6-n~vNhKzL@%`8tm@=Hb#Cd?KF!aH z3Tma8cO8B5cjC-+K_BVvC6SA&&T80A+s0DUwpO+>glp-NPcKYPh)9e1HhaJKtZ@76 z*ZJkA^9qjB^Itst?7Aa$Y4jd7l;vQcMPU=9Sx(q`fcG}u=VA)m{_LN8bvUDV=(pDW z3j-ZknKx_@J{lInBOTo*|0J|5E=;^;xjI{< z!E$Z*!A7ja|371CRZh^y{{*{(;K-$vesH%6jcxWaCly zTM41S3mb0nu_R8wZ2)OW(IY%vQEDl zY+wCQisx4@t5lGSM)dA})3AuAcP5v9Sk_@W%}Y!9Q0P`or8^<(XL-af%}^J~?)P#j zx@)_0N(<}D${U@l4>n&|SXSI+vAVghtXFfA&y{{Ii`KUxSIzf&_(d+NJZ0?WzwCU^ zE)I=3`((}7SB6c}mC(AllLsTjr_KCB>U=aIjeAA9>4G9CSAP)H zk)MCnr_{au!eMv#&_nCHY?JkN9{8Ce8f9FfS~FQr_1nHZADfiCRoCs*nKsSzg)wU~ zyPsIQ$i2el8S(KCo4!nYS6hgM zh=1J~!3P{E(v92aFP@;k{fl^h=;DPFH#%LJu*$~x_|dg*6E&-O%I_~Yvm!mR-PP=- z^%RFC$2k{vtvuxLw(6UUTHArU{T|j!m-*SRNpUXGcV4+`UY*yim+zx)-@bS&;ds!} zIITB(EFNmF30<+_K#*yBpw@;}F@nW~HL9%@-L_=gn|oKM)*f@+ufi7P zrP-c(rv7!C>dHfJFNSpCkw^q0Mm|KSGqn+#hKiQu8v)=c*q0iHwsmvkUx3@nmZOI z^6T!;t?5raYM8dU(wf)nw_U%t*6U=in;Tc$WSCmI=<=S&OG++JZVi*=&sW;O{i1Hk zsv~7ii9*ZP`^}rDTh|AUCJliE`!A_a-}@9N7wQJP*6(`?IS0A%zdg&QLxu%RAO64p zRn-5#U+~1K!#{0V9{e|S`Tu=g{U)i_$--KPs@?2&u%!vePHEnp>T+z7t@FeOrmXwl zbDncN{c`rHS388iRW5$H_+^IWWGDN|-}@aF910Ns6R68#%)a@NeWtQf{WTSrqBGO3 z?en=Cab?;45~Yh*L=JhbJ=<@=B*WNupkAEOkKteWdfoYw;QKTJ+8x3y*!&n)IZr%o z$z;#axW;DA9ELxP;tjL^92ZOoY`o^L|9`Q|C3`-mazrw;X8@VP5U|q|e1!f7eRlERUzxch96cq293ufTrd?lez7*Io4=O`0dn z_S(fviDQ4vG>)&2-ZuAFe@RIBStH}U^FOXT^&)mg@cWiCXQsaf=RvT8z;Ru`QfI<6 zhvCmfj^f`kjrD>|@={xlu1IXYU}^TRy+Sl-zj2yX@6W_

wZw7dY%sRK9Tb;o?^- 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 z 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

XBN#AG~nHN?BxD48$L*Y6~P;z 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 literal 0 HcmV?d00001 diff --git a/docs/images/steemdev.png b/docs/images/steemdev.png new file mode 100644 index 0000000000000000000000000000000000000000..6515bb5dcdec77da10d0c698e115dbcb6853bae1 GIT binary patch literal 7981 zcmeAS@N?(olHy`uVBq!ia0y~yV2oj4V2I^lV_;x-X?xF>fq{V~-O<;Pfnj4m_n$;o z1_rq&o-U3d6^w7^a@L5remfrj)yL_CqX^TYMK8MkIV!}&IdU+HvOe)J=-^mUq3!4x zcsQISs6qz8yRHWI|C1Idgp0@1u|JRM2#*=4yp7&`u z`Q+>K$tC4iSHHHtyMA^2-c@RkdN~ak)ef*Q^*A_XseJY4<=+rhSUQ72IDx6Otzpsb zWy=mtE3vU}-_`eSsWmUR5lHO}2T{hqT;bkIPeXr1d&dT+U0i$KJ^bk*cAo~2VFAjF z??v9Ne8b}TRZ&a#rfckRo;4d;#1fdm(%OviBJVUyg5sPmZJP3EUW`ZV{M=(UGeH*m z9580QFZym~P5T6$`@VOB+~#pUQdT>_GJ`?5KrKL;OT6;bv6MjjV-2^oUj6d%e(v;R z4#>U(EFD>%59hgQK7H%*w6di5R0hvFPPQ{3Z3#^299PyIy83CVi03LR(Rn=5nt3I! zja@$q3MVl6ET|J+QQI1QH29uRQ`w<2AI!ZxOv6||GlJ#j30ZV=iMuS#Y1m&Ml={!? zmDw_H+tf2>(?H&c;G7fNn%%6E${wT}{m|)~m}-A+2KO^tuueO{3+oF+H-F*oQDMH+ zzg&4)&Z~Ks4zJ&1VF;Gy6WUNE#4{uMU;QK><@FgtKVMzhx9Cu=b)HCZi6+ErqY-t0r%d0lRpe;EJ@vQ&mJY zpT5}i>Ct=kGrIc@=QeNiIk~9pt#$INBi#X)Q}dpFaq+MeF}_-sc<9L9sw0tYU?+=n zhP-}gWzNJ@EZyd6+k5XF=kpz_KIbL>cUtwb_DflHclX5V^izyKy@vTzO=^P)FWr zMLkz=NAD7a`M#IG-Y8c+%`-Zu%*$y3!ztw($u@~@YxzDwPxa}JcySMV~` zX~smeCM5m1rZ9zlI&c4(t*txnl*<}7dDOChySq&9@mDr3#@XwPW^7s(QQQ7iE!h&3 zG!Fb!d9c^>plj~ZC9lt}y2Iz+7Cu@0WPrHR@}^D8&MaLq;o6I(=gPDft2>>__DJ~Y zeh*SIbTouMY?D;(KVY-r*8Zx~0zUk8E4M8AvD^Cj^kX~EW`A8GJjL{{qmdS;$`QHk zMKT9LPUJ9R3Tx&5o&8W;dGWh|79$^ykGtb@r+n}-h&H=xx&6gm!TBdRwpZrP*)>nE z_a(#9*N`vnBbEn~m` zOw2PXOI6Lsr(u1r&KVxbyr&jTphPIZ!g9yY=Y{?M6!WV}TaIS_`Mmh5f~HBk%at9X z-@EMZ8oi!;se|i@-;RdZmtn{3oC4(*pACNa{IoPU@#hH?ym)vkyz=J;x7m8R!Z!m0 zkK8xBeb8Q9XX-n3?~i&st9ZBRFMhS-_TwShL*uR`7Oq1M8{i zNENZ=ij}KtcjO;e+S?f5w!FXNNAIKKv2CTo%MRI>FSuS=$bUUM1(X&VKYJg@<-fi! zYJNY*?fpq9S8~~08|Bx2C_WoCGelE&_pSe5PyY1+qbEYlR=T_Agj2*`{Auy zpMHKgQTZ@&;@XS4-%j_7EiM#~x%cc?b>5!O2Ty!hactY0%Jble$YR>%!?lis=f@U} zxUCm_Dpa~=UU}Yc_p4^+-G<^!KagoCp5NTz#_3=JcFj@uFq<(~`AzhcvgOM$NKMy}ESE$&)7+ z{;ms;Ud2|pQ>D1kQ0K|>_hHL^W?ozA&9Y;ikHQBI6%`ftc_C+~N48|>iL5edxpXjh zwV3=-8@B$vZu>>n@j5?h`joAu?Q6WCr25vOnw#DwGr#AbU+~x3$fH%P{LT^eD;g;} zTXSMvDl5+iuP9_p^}F?6Ls%yL?Qh=Q6S__Z9r(<+=3t%Wx4vcaie0QH&-1W7UNiT# z-RV!uuD*RNy#4XoC7aDN@0{#f@!{A`?Pt5ozgo}T;Ouniu2^X71HJjP4vD(XoG^Lj zyr{`@#O_<#ZS++=8C#VSd-6eBHC5l$LZ5&Yi+zhs49KD&7R;yZKt1q8jtig)S88oW)eR_P1x_KJ6!y{JGr|JXlc8%KW4 zRX?sW-8L8F%3@@_!|C(RboSZr+h0%o;o2`7mBc*X+FsOG@F({bC6tUdH%Qh|SuXIM}0(qB%k zC%5RDDXvtnYIM&^nzX&{<$jx!B|aYSGN!5796b7I4)4qVA5>oF&QUtze)IKZ@v7P9 z#4Bwq!WN2uHjlsbYZ6=6gNHZdnvIIC>Hl57{pH8owk_tns`vOlpT1{`?}8KeZWN!f zS>e3?$?i?pm;QYeTBmj8Tjag6v~!vc?MZg;ez(8rX3~DU$E`IwD9nndDD+g+Y3FKz z*MZk&t;x+6w|^nZeKLH()Vj$kaz~tBCEF~y@PFmLOs{=w*5phHxq3aM`{nF1+sSQD zQe;Q>X6HgV1f9&07y1pZ@X6nZ6E=_p|rrt&C1x{nzHU@&DQLH{1Pnb(LV_ z(v0%z^uPAGtd4_YV&lEva-o;boZ~#XcF#(e_Ib^>A8oDVy7YYE^eq=>Z`rEY&3@EZ zV#mE3EB!Z}mtAseMf+|Wo}kL}u6F{?w!Koiqv&CwnWY<~aVWHo@8ui+TVFkzGW&x* zZg*|z^sAJfcBX83&eoFX@VY7?+4<$E9g2LXY~{CIJo@(WZ=zLq_2k*2{>J33&ENIbv@2sptw)hsqr+vYSF_55boINB`c&_a_1^#P{4(j^y^A)i;4TsUc>MhD^-Cu` zdaqcsavh7K0?Tjz=$MFUYKL|lz5T4kEX(X*hF;}aY1g;8k~;5aI=pM!62r5=ws&^T zvx$@9)tsVUOIF^|;_A<2cDp`lk>*LqBtV8~je* z?5c3@{-~t9E&cV)D-JiUFLmA_|)-*%PwZ22^6KaU;uJkAb>bDuB& zF7%93$A3Y7HovgE+`QU_TH;y!!L=(_d1tC|*!;2EG*fX;_>Q~tyOx^%yrt9nGC;U@ zm3X1rlSSI=mdZIFzbLx#Zi3ClDK`1-Kb=D@%WL@y(uqQ^p0}e-@Z@RNb-ryVHt~*RZekl5JAFoK#V2&iW?wMBg)5^!Yj0%5%Z$BuvThe@$?&AU{9>iM@6OJ|kNdI?y<=K(>wCzQIj{YWOfOjc z&Sh5YstIZb{66qZS$n)BQLuMK>~}^Mf7ZJY^foy5y68}n~3+gs(7d3SBp6`k&=eG5)2_m|xNcaS|aUw4*n{&_>; zsvIR3si}%Pv!6}7acSP^z0ce@-goqWm{9)aYSa_m703DRzfuZ*kTvazUT(&U!Ub{P zU7y>yG*6J+bmxzbRb}X0ml+S;8lH3SaF@Ar>%y|Et_X<}s}CAYxzEe*Qk=4Rg3t3^ zKZ@T47Fwm$T)NSf^7J!bqMv$2(k0Qik6!%Gd*Ry_5c`22O%!T5?zP%U z?(Er!P4^a0=<`@{!0c8FxBnuI)iSBNpH&`v$DG^sMb<#G$6de7>*zfDICr_nxj!9l z`nkMcEv(br|1>G#s92rdw}Qf3FJtu9?L9r`aLN3`{Sq&ucTP2zcD{4$s=&m}YH!_d zoCwcc|1)&aq@=R{d6#(ZcjqMDy6wC)>s6w){a*V!R>yv{PA_ZhPTc?Zu=MQp!87&z zziP)!KY5PS2RSlQdcTNAN zj~4z_ee^eM$BU;bQ6HY~)cGa*aqGH*twx`(E%$GYFZI9jc;>f{&BjIMI{)O~G&Mii zIJwD8uj%f$Kf6D!Jk@wP+49?rSvTghT-q4&Kq+nG-dFQiNk(Mty{Xm8tv`{yu zGj0CuXFvS%6`bsH;pECfv8OYGzR3PuThMzfU>Dow!|UEW*gyAM|KVy*wpuN1tqbA5 z6{g;rx$}X#iSO)78FQ~mlvfu$-sI&i-L190aqe2tb!uOfQrLgg_9_k;ngeLBjuHNm8z!9tmu;Qz61aZRtM{H;5AXk$?Op!0BX*}n@^k+ePva6# z%kgiC-pbcic3wqgiPYz-Z+_<#F8{V@lGF))*~2AsIISA_{Jmu-#dZEzTA-hGbJndg zc@N&wUDZ2R&s@2ur7U&r0%iM}=YB^tWz5$e{IEJW;ljMU$hl=qy_c8$%&HHK&Ut?% zZBxvhuEN>-53^TA{cdqoGA~|v_|9johYS`CM>VajlRv&H4w>5ge1pz(-%Dv;2mP!< zR&6<$vn|Kv_-P%H%IF0ZQxc@I+-(lXn*DewSH@9L&J?ekp4xlgT-@u`g54^|+PdQT zEzb6^NpIYic3QeDm7{x21;g|8GU7M?3Y2e*onscZ|AzGc$mpnopQ4%T``_9sDJ>U! z`^HZ5&V~;fS+{c;O!u#vySC2meZBPr@B8^NZlbAG$M`lduy=mklKLuVJ~z*zmgV|O zen$LAv3z#y`J>GLT(iVCaG7^pc%8=;)3ooHlfM3;r>}BnG|W4FGGbS3`J>GmH=bU5 z^1^HK*RQuXiZuT?Wq9E1%x3%cU9!SIm9?U1Zl4ECp1IV#0`=Xa3w z|Dlt-Jk77*#sinvZxd#k+8*;YOX4b=v_j);Yr|8%nZF8yOdl;*?+Sh8OLY+{53`QkLXE_sLh+!{`1cK7R@tF|G2Bf<(JzQP7j&>V8Ull1#9KM zvNM9`ow>Q8=QLX8 zO9nJEoGadBJUypq($&(gql>~anzUAaf9n_J*yu?jD*9u$?TYfl# zGw1uX{}Wekx+C@^bHDuSt2SteT)~(sQ{cYFY z%6qqRX4<8rKE@gvu09uH=W$PNdbg#HONyuM`@?4IJ9g4MI*)I6TwD1uy=iZZ`9mKk zrL*bc&$?49G*q{FOVq^1J$sbEZp>4XK*_XifRTY|tSM~YJ z&JkHC_<7EuJyu6It*D>A>P53^x_HuqU%xIVYwr4d;o8=)?o(;a-3#~3uyb-c&sBcl z&Lit9O^d!SNMC;?woBVFrNE$C`R(5{-DkcbKO1&WvJq9w5SE?VN9LZGS>RZo6nX4<=I1H=hI=CZp0ZGu3~|48=l$bN4A-@6 z=lHjB2JFdq{&;S!=f`=o-se^dcC+^$5Zz(iw&=fPNWu=o^tlXE?p^OXSTWsK@rB+8 zn^_`Tth(3&=LfldjNXyCDE6wQ3)kJ(YCF90xi4RHY>0f|RMYV6?53`wT&L5kb7x7W zS)I?@d@}p{C(f+}9cCU~>^EB@X1v%q$7jup@~Yy19V_-o7_9#>aZ}M(-i+PcIZpfD zY*m%~o*VDZUY4@!M@-*p8P;jO+|u5W!u=Cxyz)}WIP9l=%|+u@`^Q;RxW36hIo(vg z;nD@MH6~kFv+o{qb+ugh*Y1Yi(dE8+M_)fIO_;O5@!*34MrV5W>ld#rw@nUr*jQk+ zZt~{M3$K4o$f-$c+P?E}=$GhRL4o{B4-0GAPc?nsRW8l(pKJ4V`#s*F>`PlM_}uch z=ZWozule8-`g(8DvzzJ@R_@c1zNUU}W8KL-|Cf6^o&C#|rsU1jI%-mqx9rW&*trao zk7ZRDB?y*OihP&r3-DxLrGBUsK0o9HhH-Lhx6efbX{h ze&1eoyn^qbv)k*V6-x^kIfVIEY<@mx_3@^c-#K`lT3`S1-ORoAzRBseeGc&*+|ujz zwQN;i`Zej}-(6W;;@Kas{bEtjxEs2|{Pv7*&-z{3(>d}Ey1Z$hm(}}q-jRhXj(pwB z`u)O|VR+ZIax! z%r`)c?VVif>gn;R*Ft!X8-u1&m^vM%dLF#)HB;+U#`kBUB|q3@g)>?-8V-J3za{h4 znO`Ov&$Ofcj3N1FYF^Z|A%Gl2( ze(GB_v*fOI5*IUMrUhTw$l(;qsaSC2uXO02iQa|Dc`Lb|GK0;vReKQhFe%Mn^`Dvv zPxqTWIVl#)*8kkI^^p1GYeCo5?H9h&^sPPDDh!^EYHDyOZPm`uR_iSNndB0ZbxWXz ze}$Qur}7D%?*TEVR@^$#_Zd9-bj6h^luP_sb5QG)!t4C~uXZJ+OzD*vC)_}v5qmF6$@^ABc0#h>pt*WlVt~%Q z<|%y|YoF`fJ5ZIfesX_z-fN8(*BPL>EJoJ@s|xn65}d}dBu}$HDd3H+#yySom#nzC zH;Ui?TEX-Bewu~*M@vx9DBR$vSYMFKA`}!AuyhXN(Qbd?-#a;HIrF}Z{FU{q(7yQ5 z6Y$(bgX)9bhqjuoy!|3^$*Ges-X6QrRC9~_RD17_$XhmlljmP5RssiJgYbv=hgrNn z6>4o-S|2zwEYH0E#&t@eRc^8G8zr#Tduwk|Hn<$X2l62DrTWWXNX97nsi ztt$?MYsW43p0&?0bLG~@vz`UJT0rK?zHxvi(q3IvUn(ei!hB(g{Lz{9Ke-#%2V`(h z^}iQT?fYyF*yGRJ8|t|(2G8AXC+dIclcLD`tMiVO9C;XRn`CCnRoNHjZ?({Q9yE+R z4-{O>Dy?{}n02*WY~@o$1O6im=dAJ+i<`F6R>UfJsa2QW?uX`9e|XnBJX3WLOK0*? zFyNT8S8iSH?_KscXX<~MxgoNWC3Evio-^L}~4 z7T>wTAFH-3(Y?HUa#BvW@V^}?clWjJ_~z5V`9h_jPGsHMqS}xy4(S*}rf3d2Dtr)GcdYd7?A8}=?VP$C ze?QXqFW~6Q?u|ak^2)aHK*)}5^Id-nxpZHMm?5clsP#+|H+23|PlzL@b+w@H>=3s7 zcRv~!-f1z8b6=#DCL3*I&j)3oqXUw^Cz$7CA`vnj~N&k7(8A5T-G@yGywqq CV_;4I literal 0 HcmV?d00001 diff --git a/docs/images/tutorials-recipes/jussi-multiplexer/network-diagram.png b/docs/images/tutorials-recipes/jussi-multiplexer/network-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a847899dd7b0cafcd0bfda976d14990255326ad6 GIT binary patch literal 34148 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 L{an^LB{Ts5WuXTC literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..89fe9f9b --- /dev/null +++ b/docs/index.html @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + +API Docs | Steem Developer + + + + + + + + + + + + + + + +
    +

    + + Steem Developer logo +

    + + +
    + + +
    + + + + + + + + + + + +
    +
    +
    +

    Steem Developer Portal

    + + + +
    + + + + + + + + +
    +
    +

    + + Welcome to Steem + + +

    + + +

    Welcome to the Steem Developer Portal!

    + +

    This site is designed to aid those interested in developing applications on the Steem blockchain.

    + +

    If you don’t know about Steem yet, visit steem.com.

    + +

    The code for this site is on github. If you’d like to see a specific improvement +you can either submit a pull request or file an issue. Please follow our +contribution guidelines

    + +

    Site Resources

    + +

    The quickstart section has some general information on working with nodes, and testnets.

    + +

    Our tutorials section will take you through the basics of interacting with Steem apis in Javascript, Python, and Ruby.

    + +

    More detailed API specs are available in the APPBASE API section. Those apis are under development, so please read +notes at the top of each section.

    + +

    You can find community resources, libraries, and more ‘human’ ways to get help and education in the communities section.

    + +

    The glossary has Steem specific terms that will help you understand documentation, whitepapers, and the speech of other steemians.

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + diff --git a/docs/introduction/welcome.html b/docs/introduction/welcome.html new file mode 100644 index 00000000..c3886d86 --- /dev/null +++ b/docs/introduction/welcome.html @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + +Welcome to Steem | Steem Developer + + + + + + + + + + + + + + + +
    +

    + + Steem Developer logo +

    + + +
    + + +
    + + + + + + + + + + + +
    +
    +
    +

    Steem Developer Portal

    + + + +
    +

    Welcome to the Steem Developer Portal!

    + +

    This site is designed to aid those interested in developing applications on the Steem blockchain.

    + +

    If you don’t know about Steem yet, visit steem.com.

    + +

    The code for this site is on github. If you’d like to see a specific improvement +you can either submit a pull request or file an issue. Please follow our +contribution guidelines

    + +

    Site Resources

    + +

    The quickstart section has some general information on working with nodes, and testnets.

    + +

    Our tutorials section will take you through the basics of interacting with Steem apis in Javascript, Python, and Ruby.

    + +

    More detailed API specs are available in the APPBASE API section. Those apis are under development, so please read +notes at the top of each section.

    + +

    You can find community resources, libraries, and more ‘human’ ways to get help and education in the communities section.

    + +

    The glossary has Steem specific terms that will help you understand documentation, whitepapers, and the speech of other steemians.

    + + +
    + + + + + + + + diff --git a/docs/js/adjust.js b/docs/js/adjust.js new file mode 100644 index 00000000..7cdb3b79 --- /dev/null +++ b/docs/js/adjust.js @@ -0,0 +1,35 @@ + +function DynamicAlign() { + var $window = $(window); + var windowsize = $window.width(); + if (windowsize > 1000) { + $('section.right-code > p.static-right-section-title').each(function () { + // compute right side + var $text = $(this)[0].innerHTML.replace(/\./g, '').replace(/\s+/g, '-').toLowerCase(); + var $section_id_name = $(this).parent().parent()[0].id; + var $right_position = $(this).position().top - $(this).parent().parent().offset().top; + // compute left side & match difference + var $left_item = $("#" + $section_id_name + " .left-docs" + " h3#" + $text); + if ($left_item) { + var $left_parent = $left_item.parent().parent().offset().top; + var $left_height = $left_item.position().top; + var $left_position = $left_height - $left_parent; + var $difference = $left_position - $right_position; + if ($difference<0) { + $left_item.css('margin-top', Math.abs($difference)); + } else { + $(this).css('margin-top', $difference); + } + + } + }); + } +}; + +window.onload = DynamicAlign; +window.onresize = DynamicAlign; + + + + + diff --git a/docs/js/lunr.min.js b/docs/js/lunr.min.js new file mode 100644 index 00000000..4fd086e7 --- /dev/null +++ b/docs/js/lunr.min.js @@ -0,0 +1,6 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.1 + * Copyright (C) 2016 Oliver Nightingale + * @license MIT + */ +!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.1",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n div.highlighter-rouge:first-of-type").each(function(i) { + + var $this = $(this).before("
      "), + $languages = $this.prev(), + $notFirst = $this.nextUntil(":not(div.highlighter-rouge)"), + $all = $this.add($notFirst); + + $all.add($languages).wrapAll("
      "); + + + listLanguages($all, $languages); + + $this.css('display', 'block'); + + $languages.find('a').first().addClass('active'); + + $languages.find('a').click(function() { + $all.css('display', 'none'); + $all.eq($(this).parent().index()).css('display', 'block'); + + $languages.find('a').removeClass('active'); + $(this).addClass('active'); + return false; + }); + + if ($languages.children().length === 0) { + $languages.remove(); + } + }); + + function listLanguages($el, $insert) { + $el.each(function(i) { + var title = $(this).attr('title'); + if (title) { + $insert.append("
    • " + title + "
    • "); + } + }); + } + + var href = $('.sidebar a').first().attr("href"); + + if (href !== undefined && href.charAt(0) === "#") { + setActiveSidebarLink(); + + $(window).on("scroll", function(evt) { + setActiveSidebarLink(); + }); + } + + function setActiveSidebarLink() { + $('.sidebar a').removeClass('active'); + var $closest = getClosestHeader(); + $closest.addClass('active'); + document.title = $closest.text(); + + } +}); + +function getClosestHeader() { + var $links = $('.sidebar a'), + top = window.scrollY, + $last = $links.first(); + + if (top < 300) { + return $last; + } + + if (top + window.innerHeight >= $(".main").height()) { + return $links.last(); + } + + for (var i = 0; i < $links.length; i++) { + var $link = $links.eq(i), + href = $link.attr("href"); + + if (href !== undefined && href.charAt(0) === "#" && href.length > 1) { + var $anchor = $(href); + + if ($anchor.length > 0) { + var offset = $anchor.offset(); + + if (top < offset.top - 300) { + return $last; + } + + $last = $link; + } + } + } + return $last; +} + + + +$(document).ready(function(){ + // Select all links with hashes + $('a[href*="#"]') + // Remove links that don't actually link to anything + .not('[href="#"]') + .not('[href="#0"]') + .click(function(event) { + // On-page links + if ( + location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') + && + location.hostname == this.hostname + ) { + // Figure out element to scroll to + var target = $(this.hash); + target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); + // Does a scroll target exist? + if (target.length) { + // Only prevent default if animation is actually gonna happen + event.preventDefault(); + $('html, body').animate({ + scrollTop: target.offset().top + }, 300, function() { + // Callback after animation + // Must change focus! + var $target = $(target); + $target.focus(); + if ($target.is(":focus")) { // Checking if the target was focused + return false; + } else { + $target.attr('tabindex','-1'); // Adding tabindex for elements not focusable + $target.focus(); // Set focus again + }; + }); + } + } + }); + + var navSectionList = document.getElementsByClassName("pnl-main-nav-section"); + var pathname = window.location.pathname; + var inPageContentNodes = []; + + Array.prototype.forEach.call(navSectionList, function(section) { + if(pathname == section.getAttribute("url")) { + section.classList.add("show-content"); + section.classList.add("lock-open"); + Array.prototype.forEach.call(section.getElementsByTagName('a'), function(a) { + var id = a.href.substring(a.href.indexOf('#') + 1); + var contentNode = document.getElementById(id); + if(contentNode) { + inPageContentNodes.push({ + "id":id, + "a":a, + "node":contentNode, + "top":contentNode.offsetTop, + "bottom":contentNode.offsetTop + contentNode.offsetHeight + }); + + } + + }); + } else { + section.getElementsByClassName("ctrl-nav-section")[0].addEventListener("click", function() { + section.classList.toggle("show-content"); + }); + } + }); + + window.onresize(function() { + inPageContentNodes.forEach(function(content) { + content.top = content.node.offsetTop; + content.bottom = content.node.offsetTop + contentNode.offsetHeight + }); + }); + + $(window).scroll(function (event) { + var scrollTop = $(window).scrollTop(); + var scrollBottom = scrollTop + window.innerHeight + inPageContentNodes.forEach(function(content) { + if((scrollBottom >= content.top && scrollTop < content.bottom)) { + content.a.classList.add('active'); + } else { + content.a.classList.remove('active'); + } + }); + }); +}); diff --git a/docs/js/search.js b/docs/js/search.js new file mode 100644 index 00000000..b9427e74 --- /dev/null +++ b/docs/js/search.js @@ -0,0 +1,102 @@ +(function () { + function getQueryVariable(variable) { + var query = window.location.search.substring(1), + vars = query.split("&"); + + for (var i = 0; i < vars.length; i++) { + var pair = vars[i].split("="); + + if (pair[0] === variable) { + return pair[1]; + } + } + } + + function getPreview(query, content, previewLength) { + previewLength = previewLength || (content.length * 2); + + var parts = query.split(" "), + match = content.toLowerCase().indexOf(query.toLowerCase()), + matchLength = query.length, + preview; + + // Find a relevant location in content + for (var i = 0; i < parts.length; i++) { + if (match >= 0) { + break; + } + + match = content.toLowerCase().indexOf(parts[i].toLowerCase()); + matchLength = parts[i].length; + } + + // Create preview + if (match >= 0) { + var start = match - (previewLength / 2), + end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength; + + preview = content.substring(start, end).trim(); + + if (start > 0) { + preview = "..." + preview; + } + + if (end < content.length) { + preview = preview + "..."; + } + + // Highlight query parts + preview = preview.replace(new RegExp("(" + parts.join("|") + ")", "gi"), "$1"); + } else { + // Use start of content if no match found + preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? "..." : ""); + } + + return preview; + } + + function displaySearchResults(results, query) { + var searchResultsEl = document.getElementById("search-results"), + searchProcessEl = document.getElementById("search-process"); + + if (results.length) { + var resultsHTML = ""; + results.forEach(function (result) { + var item = window.data[result.ref], + contentPreview = getPreview(query, item.content, 170), + titlePreview = getPreview(query, item.title); + + resultsHTML += "
    • " + titlePreview + "

      " + contentPreview + "

    • "; + }); + + searchResultsEl.innerHTML = resultsHTML; + searchProcessEl.innerText = "Showing"; + } else { + searchResultsEl.style.display = "none"; + searchProcessEl.innerText = "No"; + } + } + + window.index = lunr(function () { + this.field("id"); + this.field("title", {boost: 10}); + this.field("category"); + this.field("url"); + this.field("content"); + }); + + var query = decodeURIComponent((getQueryVariable("q") || "").replace(/\+/g, "%20")), + searchQueryContainerEl = document.getElementById("search-query-container"), + searchQueryEl = document.getElementById("search-query"), + searchInputEl = document.getElementById("search-input"); + + searchInputEl.value = query; + searchQueryEl.innerText = query; + searchQueryContainerEl.style.display = "inline"; + + for (var key in window.data) { + window.index.add(window.data[key]); + } + + displaySearchResults(window.index.search(query), query); // Hand the results off to be displayed +})(); diff --git a/docs/lib/scrape/api_definitions_job.rb b/docs/lib/scrape/api_definitions_job.rb new file mode 100644 index 00000000..5ae4f3b2 --- /dev/null +++ b/docs/lib/scrape/api_definitions_job.rb @@ -0,0 +1,124 @@ +require 'steem' + +module Scrape + + # Scrapes all known methods for all known APIs and saves them to as `.yml`. + class ApiDefinitionsJob + attr_accessor :url, :api_data_path, :jsonrpc + + DEFAULT_URL = 'https://appbasetest.timcliff.com' + DEFAULT_API_DATA_PATH = '_data/apidefinitions' + + def initialize(options = {url: DEFAULT_URL, api_data_path: DEFAULT_API_DATA_PATH}) + @url = options[:url] || DEFAULT_URL + @api_data_path = options[:api_data_path] || DEFAULT_API_DATA_PATH + @jsonrpc = Steem::Jsonrpc.new(url: @url) + end + + # Execute the job. + # + # @return [Integer] total number of methods added or changed in this pass + def perform + method_change_count = 0 + all_signatures = jsonrpc.get_all_signatures + + apis.each do |api, methods| + signatures = all_signatures.select { |k, v| k == api } + file_name = "#{api_data_path}/#{api}.yml" + api_method_change_count = 0 + puts "Definitions for: #{api}, methods: #{methods.size}" + + dirty, yml = if File.exist?(file_name) + [false, YAML.load_file(file_name)] + else + # Initialize + [true, [ + 'name' => api, + 'description' => nil, + 'methods' => [] + ]] + end + + signatures[api].each do |method, signature| + method_name = "#{api}.#{method}" + existing_api_method = yml[0]['methods'].reverse.find{|e| e['api_method'] == method_name} + + parameter_json = signature.args.to_json + expected_response_json = signature.ret.to_json + + if existing_api_method + + case api + when :condenser_api + # skipping signature analysis on condenser_api + # puts "A: " + existing_api_method['parameter_json'].inspect + # puts "B: " + parameter_json.inspect + # puts "C: " + existing_api_method['expected_response_json'].inspect + # puts "D: " + expected_response_json.inspect + next + else + if existing_api_method['parameter_json'] == parameter_json && + existing_api_method['expected_response_json'] == expected_response_json + next + else + existing_api_method['parameter_json'] = parameter_json + existing_api_method['expected_response_json'] = expected_response_json + puts "\tChanged: #{method}" + end + end + else + puts "\tAdding: #{method}" + end + + dirty = true + unless existing_api_method + yml[0]['methods'] << { + 'api_method' => method_name, + 'purpose' => nil, + 'parameter_json' => parameter_json, + 'expected_response_json' => expected_response_json + } + end + + api_method_change_count += 1 + method_change_count += 1 + end + + yml[0]['methods'].each do |method| + existing_api, existing_method = method['api_method'].split('.') + + unless methods.include?(existing_method.to_sym) + puts "\tDropped method: #{existing_method} (recommend removal from #{file_name})" + end + end + + next unless dirty + + File.open(file_name, 'w+') do |f| + f.write("# Generated by #{self.class.name.to_s}: #{Time.now.utc}\n") + f.write("# See: https://git.io/vx5CY\n") + f.write yml.to_yaml + end + + puts "\t#{api_method_change_count} methods added/updated in #{api}" + end + + method_change_count + end + private + def apis + apis = {} + + jsonrpc.get_methods do |methods| + methods.each do |method| + api, method = method.split('.').map(&:to_sym) + + apis[api] ||= [] + apis[api] << method + end + end + + apis + end + end +end \ No newline at end of file diff --git a/docs/lib/scrape/tutorials_job/base.rb b/docs/lib/scrape/tutorials_job/base.rb new file mode 100644 index 00000000..bc01be9f --- /dev/null +++ b/docs/lib/scrape/tutorials_job/base.rb @@ -0,0 +1,155 @@ +require 'git' + +module Scrape + module TutorialsJob + class Base + TMP_CHECKOUT = '/tmp/checkout' + + def initialize(options = {}) + @num = (options[:num] || '-1').to_i + @force = options[:force] == 'true' + @tutorial_github_url = options[:tutorial_github_url] #e.g.: https://github.com/steemit/devportal-tutorials-js.git + @tutorial_github_name = options[:tutorial_github_name] # e.g.: devportal-tutorials-js + @tutorial_url = options[:tutorial_url] # e.g.: https://github.com/steemit/devportal-tutorials-js + @dest_tutorials_path = options[:dest_tutorials_path] # e.g.: _tutorials-javascript + + @clone_tutorials_path = "#{TMP_CHECKOUT}/#{@tutorial_github_name}/tutorials" + end + + # Execute the job. + # + # @return [Integer] total number of tutorials added or changed in this pass + def perform + tutorial_change_count = 0 + tutorial_title_prefix = @tutorial_github_name.split('-').last.upcase + + clean_previous_clone + + Git.clone(@tutorial_github_url, @tutorial_github_name, path: TMP_CHECKOUT) + + Pathname.new(@clone_tutorials_path).children.sort.each do |path| + next unless File.directory? path + + slug = include_name = path.to_s.split('/').last + slug = slug.split('_') + num = slug[0].to_i + + next if @num != -1 && @num != num + + name = slug[1..-1].join '_' + title = slug[1..-1].map(&:capitalize).join ' ' + readme = "#{path}/README.md" + destination = "#{@dest_tutorials_path}/#{name}.md" + + if File.exists?(destination) && @force + puts "##{num}: \"#{title}\" already exists. Forcing." + elsif File.exists? destination + puts "##{num}: \"#{title}\" already exists. Skipping." + next + end + + parse_readme(readme) do |description, body| + template = <<~DONE + --- + title: '#{tutorial_title_prefix}: #{title}' + position: #{num} + description: #{description} + layout: full + --- + #{tutorial_repo_links title, include_name, tutorial_title_prefix} +
      + + #{rewrite_relative_links(rewrite_images body, include_name)} + + --- + + + DONE + + f = File.open(destination, 'w+') + f.puts template.strip + "\n" + f.close + end + + tutorial_change_count += 1 + end + + clean_previous_clone + + tutorial_change_count + end + private + def parse_readme(readme) + description = nil + body = '' + + File.open(readme, 'r').each_line do |line| + next if line =~ /^# / + + if description.nil? && !line.strip.empty? + description ||= "\"#{line.strip}\"" + + next + end + + body << line + end + + yield description, body + end + + def rewrite_images(body, include_name) + body = body.gsub(/!\[([^\]]+)\]\(([^)]+)\)/) do + alt, src = Regexp.last_match[1..2] + src = if src.include? '://' + src + else + src = src.split('/')[1..-1].join('/') if src.start_with? './' + "#{@tutorial_url}/blob/master/tutorials/#{include_name}/#{src}?raw=true" + end + + "![#{alt}](#{src})" + end + + body + end + + def rewrite_relative_links(body) + body = body.gsub(/\[([^\]]+)\]\(([^)]+)\)/) do + text, href = Regexp.last_match[1..2] + href = if href.include? '://' + href + elsif href.include? @tutorial_url + relative_href = href.gsub(/#{@tutorial_url}\/tree\/master\/tutorials\/(\d+)_([a-z0-9_]+)/) do + num, name = Regexp.last_match[1..2] + + name + end + + relative_href + else + relative_href = href.gsub(/..\/(\d+)_([a-z0-9_]+)/) do + num, name = Regexp.last_match[1..2] + + name + end + + relative_href + end + + "[#{text}](#{href})" + end + + body + end + + def tutorial_repo_links(title, include_name, tutorial_title_prefix) + "Full, runnable src of [#{title}](#{@tutorial_url}/tree/master/tutorials/#{include_name}) can be downloaded as part of the [#{tutorial_title_prefix} tutorials repository](#{@tutorial_url})." + end + + def clean_previous_clone + FileUtils.rm_rf(Dir.glob("#{TMP_CHECKOUT}/*")) + end + end + end +end diff --git a/docs/lib/scrape/tutorials_job/javascript.rb b/docs/lib/scrape/tutorials_job/javascript.rb new file mode 100644 index 00000000..b19693fe --- /dev/null +++ b/docs/lib/scrape/tutorials_job/javascript.rb @@ -0,0 +1,16 @@ +require 'git' + +module Scrape + module TutorialsJob + class Javascript < Base + def initialize(options = {}) + options[:tutorial_github_url] ||= 'https://github.com/steemit/devportal-tutorials-js.git' + options[:tutorial_github_name] ||= 'devportal-tutorials-js' + options[:tutorial_url] = 'https://github.com/steemit/devportal-tutorials-js' + options[:dest_tutorials_path] ||= '_tutorials-javascript' + + super + end + end + end +end diff --git a/docs/lib/scrape/tutorials_job/python.rb b/docs/lib/scrape/tutorials_job/python.rb new file mode 100644 index 00000000..c5cbdc1c --- /dev/null +++ b/docs/lib/scrape/tutorials_job/python.rb @@ -0,0 +1,16 @@ +require 'git' + +module Scrape + module TutorialsJob + class Python < Base + def initialize(options = {}) + options[:tutorial_github_url] = 'https://github.com/steemit/devportal-tutorials-py.git' + options[:tutorial_github_name] ||= 'devportal-tutorials-py' + options[:tutorial_url] = 'https://github.com/steemit/devportal-tutorials-py' + options[:dest_tutorials_path] ||= '_tutorials-python' + + super + end + end + end +end diff --git a/docs/lib/scrape/tutorials_job/ruby.rb b/docs/lib/scrape/tutorials_job/ruby.rb new file mode 100644 index 00000000..edb81b3f --- /dev/null +++ b/docs/lib/scrape/tutorials_job/ruby.rb @@ -0,0 +1,16 @@ +require 'git' + +module Scrape + module TutorialsJob + class Ruby < Base + def initialize(options = {}) + options[:tutorial_github_url] = 'https://github.com/steemit/devportal-tutorials-rb.git' + options[:tutorial_github_name] ||= 'devportal-tutorials-rb' + options[:tutorial_url] = 'https://github.com/steemit/devportal-tutorials-rb' + options[:dest_tutorials_path] ||= '_tutorials-ruby' + + super + end + end + end +end diff --git a/docs/quickstart/choose_library.html b/docs/quickstart/choose_library.html new file mode 100644 index 00000000..3bc68f65 --- /dev/null +++ b/docs/quickstart/choose_library.html @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + +Choose Library | Steem Developer + + + + + + + + + + + + + + + +
      +

      + + Steem Developer logo +

      + + +
      + + +
      + + + + + + + + + + + +
      +
      +
      +

      Steem Developer Portal

      + + + +
      +

      Getting started to develop robust and feature rich Steem applications couldn’t be easier. Accessing steem data is easy from various options depending on your infrastructure and objectives.

      + +

      Building a picture discovery app is a breeze with the JavaScript library. There is also a Python library available, Steemit.com and SBDS services, as well as many community projects which could be beneficial for your steem project.

      + +
      + + + + + + + + diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html new file mode 100644 index 00000000..2c42db3d --- /dev/null +++ b/docs/quickstart/index.html @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + +Quickstart | Steem Developer + + + + + + + + + + + + + + + +
      +

      + + Steem Developer logo +

      + + +
      + + +
      + + + + + + + + + + + +
      +
      +
      +

      Steem Developer Portal - Quickstart

      + + + +
      + + + + +
      +

      + + Choose Library + + +

      + + +

      Getting started to develop robust and feature rich Steem applications couldn’t be easier. Accessing steem data is easy from various options depending on your infrastructure and objectives.

      + +

      Building a picture discovery app is a breeze with the JavaScript library. There is also a Python library available, Steemit.com and SBDS services, as well as many community projects which could be beneficial for your steem project.

      + +
      + +
      +

      + + steemd Nodes + + +

      + + +

      Applications that interface directly with the Steem blockchain will need to connect to a steemd node. Developers may choose to use one of the public API nodes that are available, or run their own instance of a node.

      + +

      Public Nodes

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      URLOwner
      api.steemit.com@steemit
      api.steemitdev.com@steemit
      api.steemitstage.com@steemit
      api.steem.house@gtg
      appbasetest.timcliff.com@timcliff
      gtg.steem.house:8090@gtg
      rpc.curiesteem.com@curie
      rpc.steemliberator.com@netuoso
      rpc.steemviz.com@ausbitbank
      steemd.minnowsupportproject.org@followbtcnews
      steemd.privex.io@privex
      + +

      Private Nodes

      + +

      The simplest way to get started is by deploying a pre-built dockerized container.

      + +
      Dockerized p2p Node
      + +

      To run a p2p node (ca. 2GB of memory is required at the moment):

      + +
      Dockerized Full Node
      + +

      to run a node with all the data (e.g. for supporting a content website) that uses ca. 14GB of memory and growing:

      + +

      Syncing blockchain

      + +

      Normally syncing blockchain starts from very first, 0 genesis block. It might take long time to catch up with live network. Because it connectes to various p2p nodes in the Steem network and requests blocks from 0 to head block. It stores blocks in block log file and builds up the current state in the shared memory file. But there is a way to bootstrap syncing by using trusted block_log file. The block log is an external append only log of the blocks. It contains blocks that are only added to the log after they are irreversible because the log is append only.

      + +

      Trusted block log file helps to download blocks faster. Steemit Inc, provides public block log file which can be downloaded from here and there is also option from community witness @gtg which can be downloaded from here.

      + +

      Both block_log files updated periodically, as of May 2018 uncompressed block_log file size ~110 GB. Docker container on stable branch of Steem source code has option to use USE_PUBLIC_BLOCKLOG=1 to download latest block log and start Steem node with replay.

      + +

      Block log should be place in blockchain directory below data_dir and node should be started with --replay-blockchain to ensure block log is valid and continue to sync from the point of snapshot. Replay uses the downloaded block log file to build up the shared memory file up to the highest block stored in that snapshot and then continues with sync up to the head block.

      + +

      Replay helps to sync blockchain in much faster rate, but as blockchain grows in size replay might also take some time to verify blocks.

      + +

      There is another trick which might help with faster sync/replay on smaller equipped servers:

      + +
      while :
      +do
      +   dd if=blockchain/block_log iflag=nocache count=0
      +   sleep 60
      +done
      +
      + +

      Above bash script drops block_log from the OS cache, leaving more memory free for backing the blockchain database. It might also help while running live, but measurement would be needed to determine this.

      + +
      Few other tricks that might help:
      + +

      For Linux users, virtual memory writes dirty pages of the shared file out to disk more often than is optimal which results in steemd being slowed down by redundant IO operations. These settings are recommended to optimize reindex time.

      + +
      echo    75 | sudo tee /proc/sys/vm/dirty_background_ratio
      +echo  1000 | sudo tee /proc/sys/vm/dirty_expire_centisecs
      +echo    80 | sudo tee /proc/sys/vm/dirty_ratio
      +echo 30000 | sudo tee /proc/sys/vm/dirty_writeback_centisecs
      +
      + +

      Another settings that can be changed in config.ini is flush - it is to specify a target number of blocks to process before flushing the chain database to disk. This is needed on Linux machines and a value of 100000 is recommended. It is not needed on OS X, but can be used if desired.

      + +
      docker run \
      +    -d -p 2001:2001 -p 8090:8090 --name steemd-default \
      +    steemit/steem
      +
      +docker logs -f steemd-default  # follow along
      +
      +
      docker run \
      +    --env USE_WAY_TOO_MUCH_RAM=1 \
      +    -d -p 2001:2001 -p 8090:8090 --name steemd-full \
      +    steemit/steem
      +
      +docker logs -f steemd-full
      +
      + +
      + +
      +

      + + Steem Testnet + + +

      + + +

      Steem blockchain software is written in C++ and in order to modify the source code you need some understanding of the C++ programming language. Each Steem node runs an instance of this software, so in order to test your changes, you will need to know how to install dependencies which can be found in the Steem repo. This also means that some knowledge of System administration is also required. There are multiple advantages of running a testnet, you can test your scripts or applications on a testnet without extra spam on the live network, which allows much more flexibility to try new things. Having access to a testnet also helps you to work on new features and possibly submit new or improved pull requests to official the Steem GitHub repository.

      + +

      Steemit’s Testnet

      + +

      Steemit maintains a live testnet to which you can connect. In the near future, we expect the chain id to update with every code change. To get the current chain id for any HF20+ Steem testnet you can use the database_api.get_version api call (curl example included for your convenience). Be sure to point it at an api node on the testnet for which you want information!

      + +

      At the time of this writing, the connection information for Steemit’s testnet is as follows:

      + +
        +
      • ChainID: 46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32
      • +
      • Address prefix: TST
      • +
      • API node: https://testnet.steemitdev.com
      • +
      + +

      Running a Testnet Node

      + +

      First, let’s build steemd specifically for testnet. Recommended specs:

      + +
        +
      • Ubuntu Server 16.04 LTS
      • +
      • 100GB HDD
      • +
      • 16GB RAM (mostly needed for steemd build)
      • +
      + +
      sudo apt-get update && sudo apt-get dist-upgrade
      +sudo reboot
      +
      +sudo apt-get install autoconf automake autotools-dev bsdmainutils build-essential cmake doxygen \
      +   git libboost-all-dev libreadline-dev libssl-dev libtool ncurses-dev pbzip2 pkg-config \
      +   python3-dev python3-jinja2 python3-pip libbz2-dev libsnappy-dev\
      +   wget curl screen pv virtualenv nano xz-utils
      +mkdir -p src
      +cd src
      +git clone https://github.com/steemit/steem
      +cd steem
      +git checkout <20180824-testnet OR develop OR a more current branch>
      +git submodule update --init --recursive
      +mkdir -p build
      +cd build
      +cmake \
      +   -DCMAKE_BUILD_TYPE=Release \
      +   -DBUILD_STEEM_TESTNET=ON \
      +   -DENABLE_SMT_SUPPORT=ON \
      +   -DLOW_MEMORY_NODE=ON \
      +   -DCHAINBASE_CHECK_LOCKING=ON \
      +   -DCLEAR_VOTES=ON \
      +   -DSKIP_BY_TX_ID=ON \
      +   -DSTEEM_LINT_LEVEL=OFF \
      +   ..
      +make -j$(nproc) install
      +cd
      +mkdir -p testnet-data
      +nano config.ini
      +
      + +

      config.ini

      + +
      log-console-appender = {"appender":"stderr","stream":"std_error"}
      +log-file-appender = {"appender":"p2p","file":"logs/p2p/p2p.log"}
      +log-logger = {"name":"default","level":"info","appender":"stderr"}
      +log-logger = {"name":"p2p","level":"warn","appender":"p2p"}
      +
      +backtrace = yes
      +plugin = chain p2p webserver witness database_api network_broadcast_api block_api 
      +
      +shared-file-dir = "blockchain"
      +shared-file-size = 12G
      +p2p-endpoint = 0.0.0.0:2001
      +webserver-http-endpoint = 0.0.0.0:8751
      +webserver-ws-endpoint = 0.0.0.0:8752
      +
      +# testnet.steemitdev.com
      +p2p-seed-node = testnet.steemitdev.com:2001
      +
      + +
      steemd --data-dir=. --chain-id=46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32
      +
      + +

      Now let it sync, and you’ll have a shiny new testnet seed node to play with.

      + +

      Custom Testnet

      + +

      In order to create a custom, isolated, testnet separate from the Steemit’s we need to modify a few things mentioned in the previous section.

      + +

      In the file named steem/libraries/protocol/include/steem/protocol/config.hpp, we can see the first few lines dedicated to the Testnet section. The line starts with #ifdef IS_TEST_NET.

      + +

      Let’s say we want to create a custom testnet with an initial supply of 1,000,000 STEEM. We can change STEEM_INIT_SUPPLY 1,000,000 and by changing STEEM_CHAIN_ID_NAME "testnet", testnet to mytestnet we will automatically get a unique Chain ID for our testnet. The address prefix can be set to something like MTN and of course, we need to change the public and private keys to the genesis account. Note that the genesis account will receive the entire pre-mined supply of 1,000,000. That way, you can execute a setup script to fund any newly created accounts. Such a custom testnet will not have any additional hardware requirements to run.

      + +

      A minimum of 8GB RAM should be sufficient to run a custom testnet. Currently, Steem only has Linux and Mac compiling guides to build. A testnet can either be hosted locally, on a rented AWS, or dedicated bare metal servers so one can start testing functionality, explore different APIs, and start developing.

      + +

      One more crucial point to modify is to change the number of witnesses required to accept hardforks for a custom testnet, by default it is set to 17, we can change it to 1 STEEM_HARDFORK_REQUIRED_WITNESSES 1 so that only one node instance would be sufficient and the network will be still functional and fast.

      + +

      Another thing to note is that you can start a new chain with all previous hardforks already accepted, by changing the file named steem/blob/master/libraries/chain/database.cpp with the following function:

      + +

      void database::init_genesis( uint64_t init_supply ) inside try add this line:

      + +

      set_hardfork( 19, true );

      + +

      This would mean that 19 hardforks have been accepted by witnesses and the new chain will start with all previous forks included.

      + +

      After these changes, all we have to do is compile the source code and get the steemd executable. And once we fire up the custom testnet we can start testing and experimenting.

      + +

      If you want to port some data from Steem main network you can use Tinman, also developed by Steemit, to help with taking snapshots of the main network.

      + +

      Custom live testnet

      + +

      An example of a custom testnet run by Steem community member @almost-digital. It doesn’t have a snapshot of the main network

      + +
        +
      • ChainID: 79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673
      • +
      • Address prefix: STX
      • +
      • API node: https://testnet.steem.vc
      • +
      + + +
      + + + +
      + + + + + + + + diff --git a/docs/quickstart/steemd_nodes.html b/docs/quickstart/steemd_nodes.html new file mode 100644 index 00000000..63f8f76e --- /dev/null +++ b/docs/quickstart/steemd_nodes.html @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + +steemd Nodes | Steem Developer + + + + + + + + + + + + + + + +
      +

      + + Steem Developer logo +

      + + +
      + + +
      + + + + + + + + + + + +
      +
      +
      +

      Steem Developer Portal

      + + + +
      +

      Applications that interface directly with the Steem blockchain will need to connect to a steemd node. Developers may choose to use one of the public API nodes that are available, or run their own instance of a node.

      + +

      Public Nodes

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      URLOwner
      api.steemit.com@steemit
      api.steemitdev.com@steemit
      api.steemitstage.com@steemit
      api.steem.house@gtg
      appbasetest.timcliff.com@timcliff
      gtg.steem.house:8090@gtg
      rpc.curiesteem.com@curie
      rpc.steemliberator.com@netuoso
      rpc.steemviz.com@ausbitbank
      steemd.minnowsupportproject.org@followbtcnews
      steemd.privex.io@privex
      + +

      Private Nodes

      + +

      The simplest way to get started is by deploying a pre-built dockerized container.

      + +
      Dockerized p2p Node
      + +

      To run a p2p node (ca. 2GB of memory is required at the moment):

      + +
      Dockerized Full Node
      + +

      to run a node with all the data (e.g. for supporting a content website) that uses ca. 14GB of memory and growing:

      + +

      Syncing blockchain

      + +

      Normally syncing blockchain starts from very first, 0 genesis block. It might take long time to catch up with live network. Because it connectes to various p2p nodes in the Steem network and requests blocks from 0 to head block. It stores blocks in block log file and builds up the current state in the shared memory file. But there is a way to bootstrap syncing by using trusted block_log file. The block log is an external append only log of the blocks. It contains blocks that are only added to the log after they are irreversible because the log is append only.

      + +

      Trusted block log file helps to download blocks faster. Steemit Inc, provides public block log file which can be downloaded from here and there is also option from community witness @gtg which can be downloaded from here.

      + +

      Both block_log files updated periodically, as of May 2018 uncompressed block_log file size ~110 GB. Docker container on stable branch of Steem source code has option to use USE_PUBLIC_BLOCKLOG=1 to download latest block log and start Steem node with replay.

      + +

      Block log should be place in blockchain directory below data_dir and node should be started with --replay-blockchain to ensure block log is valid and continue to sync from the point of snapshot. Replay uses the downloaded block log file to build up the shared memory file up to the highest block stored in that snapshot and then continues with sync up to the head block.

      + +

      Replay helps to sync blockchain in much faster rate, but as blockchain grows in size replay might also take some time to verify blocks.

      + +

      There is another trick which might help with faster sync/replay on smaller equipped servers:

      + +
      while :
      +do
      +   dd if=blockchain/block_log iflag=nocache count=0
      +   sleep 60
      +done
      +
      + +

      Above bash script drops block_log from the OS cache, leaving more memory free for backing the blockchain database. It might also help while running live, but measurement would be needed to determine this.

      + +
      Few other tricks that might help:
      + +

      For Linux users, virtual memory writes dirty pages of the shared file out to disk more often than is optimal which results in steemd being slowed down by redundant IO operations. These settings are recommended to optimize reindex time.

      + +
      echo    75 | sudo tee /proc/sys/vm/dirty_background_ratio
      +echo  1000 | sudo tee /proc/sys/vm/dirty_expire_centisecs
      +echo    80 | sudo tee /proc/sys/vm/dirty_ratio
      +echo 30000 | sudo tee /proc/sys/vm/dirty_writeback_centisecs
      +
      + +

      Another settings that can be changed in config.ini is flush - it is to specify a target number of blocks to process before flushing the chain database to disk. This is needed on Linux machines and a value of 100000 is recommended. It is not needed on OS X, but can be used if desired.

      + +
      docker run \
      +    -d -p 2001:2001 -p 8090:8090 --name steemd-default \
      +    steemit/steem
      +
      +docker logs -f steemd-default  # follow along
      +
      +
      docker run \
      +    --env USE_WAY_TOO_MUCH_RAM=1 \
      +    -d -p 2001:2001 -p 8090:8090 --name steemd-full \
      +    steemit/steem
      +
      +docker logs -f steemd-full
      +
      + +
      + + + + + + + + diff --git a/docs/quickstart/testnet.html b/docs/quickstart/testnet.html new file mode 100644 index 00000000..184bac82 --- /dev/null +++ b/docs/quickstart/testnet.html @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + +Steem Testnet | Steem Developer + + + + + + + + + + + + + + + +
      +

      + + Steem Developer logo +

      + + +
      + + +
      + + + + + + + + + + + +
      +
      +
      +

      Steem Developer Portal

      + + + +
      +

      Steem blockchain software is written in C++ and in order to modify the source code you need some understanding of the C++ programming language. Each Steem node runs an instance of this software, so in order to test your changes, you will need to know how to install dependencies which can be found in the Steem repo. This also means that some knowledge of System administration is also required. There are multiple advantages of running a testnet, you can test your scripts or applications on a testnet without extra spam on the live network, which allows much more flexibility to try new things. Having access to a testnet also helps you to work on new features and possibly submit new or improved pull requests to official the Steem GitHub repository.

      + +

      Steemit’s Testnet

      + +

      Steemit maintains a live testnet to which you can connect. In the near future, we expect the chain id to update with every code change. To get the current chain id for any HF20+ Steem testnet you can use the database_api.get_version api call (curl example included for your convenience). Be sure to point it at an api node on the testnet for which you want information!

      + +

      At the time of this writing, the connection information for Steemit’s testnet is as follows:

      + +
        +
      • ChainID: 46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32
      • +
      • Address prefix: TST
      • +
      • API node: https://testnet.steemitdev.com
      • +
      + +

      Running a Testnet Node

      + +

      First, let’s build steemd specifically for testnet. Recommended specs:

      + +
        +
      • Ubuntu Server 16.04 LTS
      • +
      • 100GB HDD
      • +
      • 16GB RAM (mostly needed for steemd build)
      • +
      + +
      sudo apt-get update && sudo apt-get dist-upgrade
      +sudo reboot
      +
      +sudo apt-get install autoconf automake autotools-dev bsdmainutils build-essential cmake doxygen \
      +   git libboost-all-dev libreadline-dev libssl-dev libtool ncurses-dev pbzip2 pkg-config \
      +   python3-dev python3-jinja2 python3-pip libbz2-dev libsnappy-dev\
      +   wget curl screen pv virtualenv nano xz-utils
      +mkdir -p src
      +cd src
      +git clone https://github.com/steemit/steem
      +cd steem
      +git checkout <20180824-testnet OR develop OR a more current branch>
      +git submodule update --init --recursive
      +mkdir -p build
      +cd build
      +cmake \
      +   -DCMAKE_BUILD_TYPE=Release \
      +   -DBUILD_STEEM_TESTNET=ON \
      +   -DENABLE_SMT_SUPPORT=ON \
      +   -DLOW_MEMORY_NODE=ON \
      +   -DCHAINBASE_CHECK_LOCKING=ON \
      +   -DCLEAR_VOTES=ON \
      +   -DSKIP_BY_TX_ID=ON \
      +   -DSTEEM_LINT_LEVEL=OFF \
      +   ..
      +make -j$(nproc) install
      +cd
      +mkdir -p testnet-data
      +nano config.ini
      +
      + +

      config.ini

      + +
      log-console-appender = {"appender":"stderr","stream":"std_error"}
      +log-file-appender = {"appender":"p2p","file":"logs/p2p/p2p.log"}
      +log-logger = {"name":"default","level":"info","appender":"stderr"}
      +log-logger = {"name":"p2p","level":"warn","appender":"p2p"}
      +
      +backtrace = yes
      +plugin = chain p2p webserver witness database_api network_broadcast_api block_api 
      +
      +shared-file-dir = "blockchain"
      +shared-file-size = 12G
      +p2p-endpoint = 0.0.0.0:2001
      +webserver-http-endpoint = 0.0.0.0:8751
      +webserver-ws-endpoint = 0.0.0.0:8752
      +
      +# testnet.steemitdev.com
      +p2p-seed-node = testnet.steemitdev.com:2001
      +
      + +
      steemd --data-dir=. --chain-id=46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32
      +
      + +

      Now let it sync, and you’ll have a shiny new testnet seed node to play with.

      + +

      Custom Testnet

      + +

      In order to create a custom, isolated, testnet separate from the Steemit’s we need to modify a few things mentioned in the previous section.

      + +

      In the file named steem/libraries/protocol/include/steem/protocol/config.hpp, we can see the first few lines dedicated to the Testnet section. The line starts with #ifdef IS_TEST_NET.

      + +

      Let’s say we want to create a custom testnet with an initial supply of 1,000,000 STEEM. We can change STEEM_INIT_SUPPLY 1,000,000 and by changing STEEM_CHAIN_ID_NAME "testnet", testnet to mytestnet we will automatically get a unique Chain ID for our testnet. The address prefix can be set to something like MTN and of course, we need to change the public and private keys to the genesis account. Note that the genesis account will receive the entire pre-mined supply of 1,000,000. That way, you can execute a setup script to fund any newly created accounts. Such a custom testnet will not have any additional hardware requirements to run.

      + +

      A minimum of 8GB RAM should be sufficient to run a custom testnet. Currently, Steem only has Linux and Mac compiling guides to build. A testnet can either be hosted locally, on a rented AWS, or dedicated bare metal servers so one can start testing functionality, explore different APIs, and start developing.

      + +

      One more crucial point to modify is to change the number of witnesses required to accept hardforks for a custom testnet, by default it is set to 17, we can change it to 1 STEEM_HARDFORK_REQUIRED_WITNESSES 1 so that only one node instance would be sufficient and the network will be still functional and fast.

      + +

      Another thing to note is that you can start a new chain with all previous hardforks already accepted, by changing the file named steem/blob/master/libraries/chain/database.cpp with the following function:

      + +

      void database::init_genesis( uint64_t init_supply ) inside try add this line:

      + +

      set_hardfork( 19, true );

      + +

      This would mean that 19 hardforks have been accepted by witnesses and the new chain will start with all previous forks included.

      + +

      After these changes, all we have to do is compile the source code and get the steemd executable. And once we fire up the custom testnet we can start testing and experimenting.

      + +

      If you want to port some data from Steem main network you can use Tinman, also developed by Steemit, to help with taking snapshots of the main network.

      + +

      Custom live testnet

      + +

      An example of a custom testnet run by Steem community member @almost-digital. It doesn’t have a snapshot of the main network

      + +
        +
      • ChainID: 79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673
      • +
      • Address prefix: STX
      • +
      • API node: https://testnet.steem.vc
      • +
      + + +
      + + + + + + + + diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 00000000..0d963965 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1 @@ +Sitemap: https://developers.steem.io/sitemap.xml diff --git a/docs/search/index.html b/docs/search/index.html new file mode 100644 index 00000000..194c2530 --- /dev/null +++ b/docs/search/index.html @@ -0,0 +1,2456 @@ + + + + + + + + + + + + + + + + + + +Search | Steem Developer + + + + + + + + + + + + + + + +
      +

      + + Steem Developer logo +

      + + +
      + + +
      + + + + + + + + + + + +
      +
      +
      +

      Steem Developer Portal

      + + + +
      +
      +

      Search Results

      + +

      Loading results

      +
        +
        + + + + + + + +
        + + + + + + + + diff --git a/docs/services/imageHoster.html b/docs/services/imageHoster.html new file mode 100644 index 00000000..5f89ccb0 --- /dev/null +++ b/docs/services/imageHoster.html @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + +ImageHoster | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Definition

        + +

        Imagehoster is a Steem-powered image hosting and proxying service. Any image uploaded to, or proxied through, your Imagehoster has a copy stored within it. This means that the image continues to be available even if 3rd party sites go down or change their URLs. For as long as your instance of imagehoster is running the image will be available, anytime you need it.

        + +

        The purpose of this tool is to provide a way to host and proxy images used by condenser to help maintain the privacy of the authors and general users accessing the images.

        + +

        Using ImageHoster will help limit access to IP addresses of the general user. It will also strip image metadata related to the author’s geographical location. It also helps to verify that the original author uploaded the image they intended.

        + +

        The ability to upload images on steemit.com was originally added in January, 2017. Please note that this tool does not store any image data on the blockchain.

        + +

        Detaied information on Imagehoster can be found in its repository

        + +

        The API

        + +

        Below are examples of how to process images with the API

        + +
          +
        1. Upload an image
        2. +
        3. Fetch an uploaded image
        4. +
        5. Proxy and resize an image
        6. +
        7. Get user avatar image
        8. +
        9. Signing uploads
        10. +
        11. How to run
        12. +
        + +

        1. Upload an image

        + +

        POST /<username>/<signature>

        + +

        This returns a JSON object container the URL to the uploaded image, ex:

        + +
        {
        +    "url": "https://images.example.com/DQmZi174Xz96UrRVBMNRHb6A2FfU3z1HRPwPPQCgSMgdiUT/test.jpg"
        +}
        +
        + +

        For this to succeed it requires a signature from a Steem account in good standing.

        + +

        2. Fetch an uploaded image

        + +

        GET /<image_hash>/<filename>

        + +

        This downloads a previously uploaded image.

        + +

        <filename> is optional but can be provided to help users and applications understand the content type (Content-Type header will still always reflect actual image type)

        + +

        3. Proxy and resize an image

        + +

        GET /<width>x<hight>/<image_url>

        + +

        This downloads and serves the provided image_url. Something to note is that a copy will be taken of the image and will be served on subsequent requests, so even if the upstream is removed or changes, you will still get the original from the proxy endpoint.

        + +

        <width> and <height> can be set to 0 to preserve the image’s dimensions, if they are >0 the image will be aspect resized (down-sample only) to fit.

        + +

        4. Get user avatar image

        + +

        GET /u/<username>/avatar/<size>

        + +

        This presents the avatar for username. If no avatar is set, a default image will be served. This default is set in the service config.

        + +

        The sizes are:

        +
          +
        • small - 64x64
        • +
        • medium - 128x128
        • +
        • large - 512x512
        • +
        + +

        The avatars follow the same sizing rules as proxied images, so you not guaranteed to get a square image, just an image fitting inside of the size square

        + +

        5. Signing uploads

        + +

        Uploads also require a signature made by a Steem account’s posting authority. The account has to also be above a certain (service configurable) reputation threshold.

        + +

        Creating a signature for node.js and with dsteem:

        + +
        const dsteem = require('dsteem')
        +const crypto = require('crypto')
        +const fs = require('fs')
        +
        +const [wif, file] = process.argv.slice(2)
        +
        +if (!wif || !file) {
        +    process.stderr.write(`Usage: ./sign.js <posting_wif> <file>\n`)
        +    process.exit(1)
        +}
        +
        +const data = fs.readFileSync(file)
        +const key = dsteem.PrivateKey.fromString(wif)
        +const imageHash = crypto.createHash('sha256')
        +    .update('ImageSigningChallenge')
        +    .update(data)
        +    .digest()
        +
        +process.stdout.write(key.sign(imageHash).toString() + '\n')
        +
        + +

        6. How to run

        + +

        This imagehoster demo must be run through linux due to a dependency on the make commandline. +You will also require node.js and yarn to run

        + +
          +
        • +

          git clone https://github.com/steemit/imagehoster

          +
        • +
        • +

          Run make devserver

          +
        • +
        + +

        This will pull in all dependencies and spin up a hot-reloading development server. From there the HTTP methods can be used to alter the image loaded from the <./test> module.

        + +
          +
        • Run make lint to load the autolinter.
        • +
        • Run make test to run the unit tests for the active functions.
        • +
        + +

        Default configuration variables are in <./config/defailt.toml> and can be overridden by environment variables as definded in <./config/custom-enfironment-variables.toml>

        + +

        The load order for the config files are: env vars > config/$NODE_ENV.toml > config/default.toml

        + +
        + + + + + + + + diff --git a/docs/services/index.html b/docs/services/index.html new file mode 100644 index 00000000..9bdd820a --- /dev/null +++ b/docs/services/index.html @@ -0,0 +1,1259 @@ + + + + + + + + + + + + + + + + + + +Services | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal - Services

        + + + +
        + + + + +
        +

        + + Steemit.com + + +

        + + +

        steemit.com endpoints

        + +

        Steemit.com offers a few endpoints for getting common data. User profile and post JSON data is very convenient and simple by appending .json +to your request.

        + +

        Getting a particular user profile JSON:

        + +
        https://steemit.com/@curie.json
        +
        + +

        User object

        +
        {
        +   "user":{
        +      "id":81544,
        +      "name":"curie",
        +      "owner":{
        +         "weight_threshold":1,
        +         "account_auths":[],
        +         "key_auths":[["STM69WGR1yhUdKrnzwQLDPnXrW9kaAERwHze8Uvtw2ecgRqCEjWxT", 1]]
        +      },
        +      "active":{
        +         "weight_threshold":1,
        +         "account_auths":[],
        +         "key_auths":[["STM5GAbbS84ViMEouJL3LKcM8VZzPejn68AfPaYaLZZDdmy98kwU5", 1]]
        +      },
        +      "posting":{
        +         "weight_threshold":1,
        +         "account_auths":[["steemauto", 1]],
        +         "key_auths":[["STM5cmuKw6EPkZWeVNXcZorKtattZTX5wSopcRb4xNe6VhRKjETgv", 1]]
        +      },
        +      "memo_key":"STM7ZBi61xYz1b9STE1PHcAraPXJbvafzge3AcPjcfeq4XkKtM2At",
        +      "json_metadata":{
        +         "profile":{
        +            "profile_image":"https://i.imgur.com/Mjewc66.jpg",
        +            "name":"Curie",
        +            "about":"Discovering exceptional content. ",
        +            "location":"Worldwide",
        +            "website":"http://curiesteem.com"
        +         }
        +      },
        +      "proxy":"",
        +      "last_owner_update":"1970-01-01T00:00:00",
        +      "last_account_update":"2018-02-28T14:21:24",
        +      "created":"2016-09-02T10:44:24",
        +      "mined":false,
        +      "recovery_account":"anonsteem",
        +      "last_account_recovery":"1970-01-01T00:00:00",
        +      "reset_account":"null",
        +      "comment_count":0,
        +      "lifetime_vote_count":0,
        +      "post_count":1042,
        +      "can_vote":true,
        +      "voting_power":8927,
        +      "last_vote_time":"2018-06-21T19:42:33",
        +      "balance":"24.519 STEEM",
        +      "savings_balance":"0.000 STEEM",
        +      "sbd_balance":"36.736 SBD",
        +      "sbd_seconds":"11732264931",
        +      "sbd_seconds_last_update":"2018-06-21T19:35:00",
        +      "sbd_last_interest_payment":"2018-06-15T14:05:03",
        +      "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":"481.354811 VESTS",
        +      "reward_vesting_steem":"0.237 STEEM",
        +      "vesting_shares":"128367480.795804 VESTS",
        +      "delegated_vesting_shares":"0.000000 VESTS",
        +      "received_vesting_shares":"17069919.621493 VESTS",
        +      "vesting_withdraw_rate":"9672265.370398 VESTS",
        +      "next_vesting_withdrawal":"2018-06-24T14:01:51",
        +      "withdrawn":0,
        +      "to_withdraw":"125739449815180",
        +      "withdraw_routes":0,
        +      "curation_rewards":79730650,
        +      "posting_rewards":168964559,
        +      "proxied_vsf_votes":["1753316906111", 0, 0, 0],
        +      "witnesses_voted_for":1,
        +      "last_post":"2018-06-21T18:06:57",
        +      "last_root_post":"2018-06-19T13:16:15",
        +      "average_bandwidth":"540385456623",
        +      "lifetime_bandwidth":"33717478000000",
        +      "last_bandwidth_update":"2018-06-21T19:42:33",
        +      "average_market_bandwidth":"83841450748",
        +      "lifetime_market_bandwidth":"8042800000000",
        +      "last_market_bandwidth_update":"2018-06-19T04:21:42",
        +      "vesting_balance":"0.000 STEEM",
        +      "reputation":"418378051905700",
        +      "transfer_history":[],
        +      "market_history":[],
        +      "post_history":[],
        +      "vote_history":[],
        +      "other_history":[],
        +      "witness_votes":["curie"],
        +      "tags_usage":[],
        +      "guest_bloggers":[]
        +   },
        +   "status":"200"
        +}
        +
        + +

        Getting a particular post JSON:

        + +
        https://steemit.com/curation/@curie/the-daily-curie-12-13-feb-2017.json
        +
        + +

        Post object

        +
        {
        +   "post":{
        +      "id":1720643,
        +      "author":"curie",
        +      "permlink":"the-daily-curie-08-09-jan-2017",
        +      "category":"curation",
        +      "parent_author":"",
        +      "parent_permlink":"curation",
        +      "title":"The Daily Curie (08-09 Jan 2017)",
        +      "body":"<center>https://s29.postimg.org/dgtsfe7if/curie2.png</center>\n## Introduction\n[Curie](https://steemit.com/steemit/@donkeypong/announcing-project-curie-bringing-rewards-and-recognition-to-steemit-s-undiscovered-and-emerging-authors)  is a commu ...",
        +      "last_update":"2017-01-09T12:20:15",
        +      "created":"2017-01-09T12:20:15",
        +      "active":"2017-01-11T22:44:57",
        +      "last_payout":"2017-02-09T14:40:54",
        +      "depth":0,
        +      "children":36,
        +      "children_rshares2":"0",
        +      "net_rshares":0,
        +      "abs_rshares":0,
        +      "vote_rshares":0,
        +      "children_abs_rshares":0,
        +      "cashout_time":"1969-12-31T23:59:59",
        +      "max_cashout_time":"1969-12-31T23:59:59",
        +      "total_vote_weight":0,
        +      "reward_weight":10000,
        +      "total_payout_value":"0.000 SBD",
        +      "curator_payout_value":"0.000 SBD",
        +      "author_rewards":0,
        +      "net_votes":519,
        +      "root_comment":1720643,
        +      "mode":"archived",
        +      "max_accepted_payout":"0.000 SBD",
        +      "percent_steem_dollars":10000,
        +      "allow_replies":true,
        +      "allow_votes":true,
        +      "allow_curation_rewards":true,
        +      "url":"/curation/@curie/the-daily-curie-08-09-jan-2017",
        +      "root_title":"The Daily Curie (08-09 Jan 2017)",
        +      "pending_payout_value":"0.000 SBD",
        +      "total_pending_payout_value":"0.000 SBD"
        +   }
        +}
        +
        + +
        + +
        +

        + + SteemConnect + + +

        + + +

        A Look at the Why’s and How’s of SteemConnect

        + +

        Useful Links

        + + + +

        Why SteemConnect was implemented

        + +

        The goal of SteemConnect is to provide a safe way of connecting to the blockchain via 3rd party apps without compromising the security of your private keys and passwords. It’s a simple identity layer built on top of the blockchain allowing users safe access and developers the freedom of not having to handle the authentication system, i.e. managing users’ private keys and encryption. This means that devs won’t have to opensource their projects in order to gain user trust. When connecting to apps in this manner, neither SteemConnect nor the authorised app store the private keys as the posting key is incrypted on your cookie.

        + +

        How SteemConnect is implemented

        + +

        SteemConnect works by granting an access token to the requesting app once the application has been approved. +A full tutorial on how to set up an application, request authorisation and grant access can be found HERE

        + +

        Steem Authorisation and OAuth 2

        + +

        The OAuth protocol allows third party apps to grant limited access to an HTTP service, either on behalf of a resource owner or by allowing the app to obtain access on its own behalf. The authorisation is provided without the private key or password of the user being shared with the third party. +Simplified, the process includes the following steps:

        + +
          +
        1. The user is presented with an authorisation link that requests a token from the API
        2. +
        3. The user has to log in to the service to verify their identity whereupon they will be prompted to authorise the application
        4. +
        5. The user is redirected to the application redirect URI along with the access token
        6. +
        + +

        Once the application has an access token, it may use the token to access the user’s account via the API, limited to the scope of access, until the token expires or is revoked. +A full breakdown of OAuth2 and how it applies to SteemIt and SteemConnect can be found HERE

        + +

        For additional material you can refer to the original steemit blog post by busy.org

        + +
        + +
        +

        + + jussi + + +

        + +

        A reverse proxy that forwards json-rpc requests.

        + + +

        Jussi is a custom-built caching layer for use with steemd and other various services (such as SBDS).

        + +

        The purpose of this document is to help developers and node operators set up their own jussi node within a docker container.

        + +

        Intro

        + +

        Jussi is a reverse proxy that is situation between the API client and the steemd server. It allows node operators to route an API call to nodes that are optimized for the particular call, as if they are all hosted from the same place.

        + +

        Sections

        + + + +

        Installation

        + +
        To run jussi locally:
        + +
        git clone https://github.com/steemit/jussi.git
        +cd jussi
        +docker build -t="$USER/jussi:$(git rev-parse --abbrev-ref HEAD)" .
        +docker run -itp 9000:8080 "$USER/jussi:$(git rev-parse --abbrev-ref HEAD)"
        +
        + +

        Kitematic Example +jussi in a docker container as seen from Kitematic for macOS.

        + +
        Try out your local configuration:
        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[8675309], "id":1}' http://localhost:9000
        +
        + +

        See: Running Condenser, Jussi and a new service locally + adding feature flags to Condenser

        + +
        + +

        Adding Upstreams

        + +

        The default DEV_config.json is:

        + +
        {
        +   "limits":{"blacklist_accounts":["non-steemit"]},
        +   "upstreams":[
        +      {
        +         "name":"steemd",
        +         "translate_to_appbase":false,
        +         "urls":[["steemd", "https://steemd.steemitdev.com"]],
        +         "ttls":[
        +            ["steemd", 3],
        +            ["steemd.login_api", -1],
        +            ["steemd.network_broadcast_api", -1],
        +            ["steemd.follow_api", 10],
        +            ["steemd.market_history_api", 1],
        +            ["steemd.database_api", 3],
        +            ["steemd.database_api.get_block", -2],
        +            ["steemd.database_api.get_block_header", -2],
        +            ["steemd.database_api.get_content", 1],
        +            ["steemd.database_api.get_state", 1],
        +            ["steemd.database_api.get_state.params=['/trending']", 30],
        +            ["steemd.database_api.get_state.params=['trending']", 30],
        +            ["steemd.database_api.get_state.params=['/hot']", 30],
        +            ["steemd.database_api.get_state.params=['/welcome']", 30],
        +            ["steemd.database_api.get_state.params=['/promoted']", 30],
        +            ["steemd.database_api.get_state.params=['/created']", 10],
        +            ["steemd.database_api.get_dynamic_global_properties", 1]
        +         ],
        +         "timeouts":[
        +            ["steemd", 5],
        +            ["steemd.network_broadcast_api", 0]
        +         ],
        +         "retries": [
        +            ["steemd", 3],
        +            ["steemd.network_broadcast_api", 0]
        +         ]
        +      },
        +      {
        +         "name":"appbase",
        +         "urls":[["appbase", "https://steemd.steemitdev.com"]],
        +         "ttls":[
        +            ["appbase", -2],
        +            ["appbase.block_api", -2],
        +            ["appbase.database_api", 1]
        +         ],
        +         "timeouts":[
        +            ["appbase", 3],
        +            ["appbase.chain_api.push_block", 0],
        +            ["appbase.chain_api.push_transaction", 0],
        +            ["appbase.network_broadcast_api", 0],
        +            ["appbase.condenser_api.broadcast_block", 0],
        +            ["appbase.condenser_api.broadcast_transaction", 0],
        +            ["appbase.condenser_api.broadcast_transaction_synchronous", 0]
        +         ]
        +      }
        +   ]
        +}
        +
        + +

        Upstreams can be added to the upstreams array:

        + +
        {
        +  "name": "foo",
        +  "urls": [["foo", "https://foo.host.name"]],
        +  "ttls": [["foo", 3]],
        +  "timeouts": [["foo", 5]]
        +}
        +
        + +

        Once the above upstream is added to the local config and docker has been built, the following curl will work:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"foo.bar", "params":["baz"], "id":1}' http://localhost:9000
        +
        + +

        Note: if you set translate_to_appbase as true, jussi will do the translation for you and that specific endpoint will work with libraries that don’t yet support appbase.

        + +

        Benefits of jussi

        + +

        Time To Live

        + +

        Jussi can be configured with various TTL (Time To Live) schemes. A TTL is an integer value in seconds. Integers equal to or less than 0 have special meaning. A reasonable set of defaults would be:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        UpstreamAPIMethodParametersTTL (seconds)
        steemdlogin_apiallall-1
        steemdnetwork_broadcast_apiallall-1
        steemdfollow_apiallall10
        steemdmarket_history_apiallall1
        steemddatabase_apiallall3
        steemddatabase_apiget_blockall-2
        steemddatabase_apiget_block_headerall-2
        steemddatabase_apiget_contentall1
        steemddatabase_apiget_stateall1
        steemddatabase_apiget_state'/trending'30
        steemddatabase_apiget_state'trending'30
        steemddatabase_apiget_state'/hot'30
        steemddatabase_apiget_state'/welcome'30
        steemddatabase_apiget_state'/promoted'30
        steemddatabase_apiget_state'/created'10
        steemddatabase_apiget_dynamic_global_propertiesall1
        overseerallallall5
        conveyorallallall-1
        sbdsallallall3
        hivemindallallall3
        yoallallall3
        + +

        In this case, requests for login_api and network_broadcast_api have a TTL of -1, which means requests with those namespaces are not cached, whereas follow_api request have a TTL of 10 seconds.

        + +

        Some methods and parameters have their own TTL that overrides the general default, like database_api.get_block, which overrides database_api.*.

        + +
        Time to Live Special Meaning
        + +
          +
        • 0 won’t expire
        • +
        • -1 won’t be cached
        • +
        • -2 will be cached without expiration only if it is irreversible in terms of blockchain consensus
        • +
        + +

        If you have a local copy of jussi (see: Installation), you can change these defaults by modifying DEV_config.json.

        + +

        Multiple Routes

        + +

        Each urls key can have multiple endpoints for each namespace. For example:

        + +
        {
        +  "urls":[
        +    ["appbase", "https://api.steemitdev.com"]
        +  ]
        +}
        +
        + +

        … can also be expressed as:

        + +
        {
        +  "urls":[
        +    ["appbase","https://api.steemitdev.com"],
        +    ["appbase.condenser_api.get_account_history","https://api-for-account-history.steemitdev.com"],
        +    ["appbase.condenser_api.get_ops_in_block","https://api-for-get-ops-in-block.steemitdev.com"]
        +  ]
        +}
        +
        + +

        In these examples, the methods get_account_history and get_ops_in_block route to a dedicated API endpoint, while the rest of the appbase namespace routes to a common endpoint.

        + +

        Retry

        + +

        Adding a retries element defines the number of retry attempts, where 0 (or absent) means no retry. The maximum number of retries is 3.

        + +

        Note that retrying broadcast methods is not recommended, which is why the example explicitly sets steemd.network_broadcast_api to 0.

        + +

        json-rpc batch

        + +

        Normally, a request is made with a JSON Object ({}). But jussi also supports batch requests, which is constructed with a JSON Array of Objects ([{}]).

        + +

        For example, this would be a typical, non-batched JSON Object request that asks for a single block:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1}' https://api.steemit.com
        +
        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "previous":"0000000000000000000000000000000000000000",
        +      "timestamp":"2016-03-24T16:05:00",
        +      "witness":"initminer",
        +      "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +      "extensions":[
        +
        +      ],
        +      "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +      "transactions":[
        +
        +      ],
        +      "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +      "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +      "transaction_ids":[
        +
        +      ]
        +   }
        +}
        +
        + +

        To request more than one block using the batch construct, wrap each call in a JSON Array, that asks for two blocks in one request:

        + +
        curl -s --data '[{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1},{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[2], "id":2}]' https://api.steemit.com
        +
        + +
        [
        +   {
        +      "id":1,
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000000000000000000000000000000000000",
        +         "timestamp":"2016-03-24T16:05:00",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      }
        +   },
        +   {
        +      "id":2,
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "timestamp":"2016-03-24T16:05:36",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"1f3e85ab301a600f391f11e859240f090a9404f8ebf0bf98df58eb17f455156e2d16e1dcfc621acb3a7acbedc86b6d2560fdd87ce5709e80fa333a2bbb92966df3",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"00000002ed04e3c3def0238f693931ee7eebbdf1",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      }
        +   }
        +]
        +
        + +

        Error responses are returned in the JSON Array response as well. Notice the "WRONG" parameter in the second element. The first block is returned as expected, the second one generates an error.

        + +
        curl -s --data '[{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1},{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":["WRONG"], "id":2}]' https://api.steemit.com
        +
        + +
        [
        +   {
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000000000000000000000000000000000000",
        +         "timestamp":"2016-03-24T16:05:00",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      },
        +      "id":1
        +   },
        +   {
        +      "jsonrpc":"2.0",
        +      "error":{
        +         "code":-32000,
        +         "message":"Parse Error:Couldn't parse uint64_t",
        +         "data":{
        +            "code":4,
        +            "name":"parse_error_exception",
        +            "message":"Parse Error",
        +            "stack":[
        +               {
        +                  "context":{
        +                     "level":"error",
        +                     "file":"string.cpp",
        +                     "line":113,
        +                     "method":"to_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"Couldn't parse uint64_t",
        +                  "data":{
        +
        +                  }
        +               },
        +               {
        +                  "context":{
        +                     "level":"warn",
        +                     "file":"string.cpp",
        +                     "line":116,
        +                     "method":"to_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"",
        +                  "data":{
        +                     "i":"WRONG"
        +                  }
        +               },
        +               {
        +                  "context":{
        +                     "level":"warn",
        +                     "file":"variant.cpp",
        +                     "line":405,
        +                     "method":"as_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"",
        +                  "data":{
        +                     "*this":"WRONG"
        +                  }
        +               }
        +            ]
        +         }
        +      },
        +      "id":2
        +   }
        +]
        +
        + +

        Footnotes

        + + + +
        + +

        Latin

        + +
        +
        jussi
        +
        +noun
        +
        +declension: 2nd declension
        +gender: neuter
        +
        +Definitions:
        +  1. order, command, decree, ordinance, law
        +
        +
        + +
        + +
        +

        + + ImageHoster + + +

        + + +

        Definition

        + +

        Imagehoster is a Steem-powered image hosting and proxying service. Any image uploaded to, or proxied through, your Imagehoster has a copy stored within it. This means that the image continues to be available even if 3rd party sites go down or change their URLs. For as long as your instance of imagehoster is running the image will be available, anytime you need it.

        + +

        The purpose of this tool is to provide a way to host and proxy images used by condenser to help maintain the privacy of the authors and general users accessing the images.

        + +

        Using ImageHoster will help limit access to IP addresses of the general user. It will also strip image metadata related to the author’s geographical location. It also helps to verify that the original author uploaded the image they intended.

        + +

        The ability to upload images on steemit.com was originally added in January, 2017. Please note that this tool does not store any image data on the blockchain.

        + +

        Detaied information on Imagehoster can be found in its repository

        + +

        The API

        + +

        Below are examples of how to process images with the API

        + +
          +
        1. Upload an image
        2. +
        3. Fetch an uploaded image
        4. +
        5. Proxy and resize an image
        6. +
        7. Get user avatar image
        8. +
        9. Signing uploads
        10. +
        11. How to run
        12. +
        + +

        1. Upload an image

        + +

        POST /<username>/<signature>

        + +

        This returns a JSON object container the URL to the uploaded image, ex:

        + +
        {
        +    "url": "https://images.example.com/DQmZi174Xz96UrRVBMNRHb6A2FfU3z1HRPwPPQCgSMgdiUT/test.jpg"
        +}
        +
        + +

        For this to succeed it requires a signature from a Steem account in good standing.

        + +

        2. Fetch an uploaded image

        + +

        GET /<image_hash>/<filename>

        + +

        This downloads a previously uploaded image.

        + +

        <filename> is optional but can be provided to help users and applications understand the content type (Content-Type header will still always reflect actual image type)

        + +

        3. Proxy and resize an image

        + +

        GET /<width>x<hight>/<image_url>

        + +

        This downloads and serves the provided image_url. Something to note is that a copy will be taken of the image and will be served on subsequent requests, so even if the upstream is removed or changes, you will still get the original from the proxy endpoint.

        + +

        <width> and <height> can be set to 0 to preserve the image’s dimensions, if they are >0 the image will be aspect resized (down-sample only) to fit.

        + +

        4. Get user avatar image

        + +

        GET /u/<username>/avatar/<size>

        + +

        This presents the avatar for username. If no avatar is set, a default image will be served. This default is set in the service config.

        + +

        The sizes are:

        +
          +
        • small - 64x64
        • +
        • medium - 128x128
        • +
        • large - 512x512
        • +
        + +

        The avatars follow the same sizing rules as proxied images, so you not guaranteed to get a square image, just an image fitting inside of the size square

        + +

        5. Signing uploads

        + +

        Uploads also require a signature made by a Steem account’s posting authority. The account has to also be above a certain (service configurable) reputation threshold.

        + +

        Creating a signature for node.js and with dsteem:

        + +
        const dsteem = require('dsteem')
        +const crypto = require('crypto')
        +const fs = require('fs')
        +
        +const [wif, file] = process.argv.slice(2)
        +
        +if (!wif || !file) {
        +    process.stderr.write(`Usage: ./sign.js <posting_wif> <file>\n`)
        +    process.exit(1)
        +}
        +
        +const data = fs.readFileSync(file)
        +const key = dsteem.PrivateKey.fromString(wif)
        +const imageHash = crypto.createHash('sha256')
        +    .update('ImageSigningChallenge')
        +    .update(data)
        +    .digest()
        +
        +process.stdout.write(key.sign(imageHash).toString() + '\n')
        +
        + +

        6. How to run

        + +

        This imagehoster demo must be run through linux due to a dependency on the make commandline. +You will also require node.js and yarn to run

        + +
          +
        • +

          git clone https://github.com/steemit/imagehoster

          +
        • +
        • +

          Run make devserver

          +
        • +
        + +

        This will pull in all dependencies and spin up a hot-reloading development server. From there the HTTP methods can be used to alter the image loaded from the <./test> module.

        + +
          +
        • Run make lint to load the autolinter.
        • +
        • Run make test to run the unit tests for the active functions.
        • +
        + +

        Default configuration variables are in <./config/defailt.toml> and can be overridden by environment variables as definded in <./config/custom-enfironment-variables.toml>

        + +

        The load order for the config files are: env vars > config/$NODE_ENV.toml > config/default.toml

        + +
        + +
        +

        + + SBDS + + +

        + + +

        sbds is a tool for easily querying the data of the Steem Blockchain.

        + +

        While providing direct interfaces to several pluggable storage architectures that may be used for querying the blockchain, sbds may also be used as a lower level API upon which other applications can be built.

        + +

        Docker Hub

        + +
        docker run -d steemit/sbds
        +
        + +

        Python 3

        +
        pip3 install -e git+git@github.com:steemit/sbds.git#egg=sbds
        +
        + +

        Examples

        + +

        Stream blocks 1 to 3450000 from our dev S3 bucket

        +
        sbds checkpoints get-blocks s3://steemit-dev-sbds-checkpoints/gzipped --start 1 --end 3450000
        +
        + +

        Stream blocks 8000000 to the last block from your local copy of our S3 bucket

        +
        sbds checkpoints get-blocks /home/ubuntu/checkpoints/gzipped --start 8000000
        +
        + +

        Stream all blocks from your local copy of our S3 bucket

        + +
        sbds checkpoints get-blocks /home/ubuntu/checkpoints/gzipped
        +
        + +

        Routes

        + +

        Coming soon.

        + +
        + + + +
        + + + + + + + + diff --git a/docs/services/jussi.html b/docs/services/jussi.html new file mode 100644 index 00000000..86fc7adb --- /dev/null +++ b/docs/services/jussi.html @@ -0,0 +1,855 @@ + + + + + + + + + + + + + + + + + + +jussi | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Jussi is a custom-built caching layer for use with steemd and other various services (such as SBDS).

        + +

        The purpose of this document is to help developers and node operators set up their own jussi node within a docker container.

        + +

        Intro

        + +

        Jussi is a reverse proxy that is situation between the API client and the steemd server. It allows node operators to route an API call to nodes that are optimized for the particular call, as if they are all hosted from the same place.

        + +

        Sections

        + + + +

        Installation

        + +
        To run jussi locally:
        + +
        git clone https://github.com/steemit/jussi.git
        +cd jussi
        +docker build -t="$USER/jussi:$(git rev-parse --abbrev-ref HEAD)" .
        +docker run -itp 9000:8080 "$USER/jussi:$(git rev-parse --abbrev-ref HEAD)"
        +
        + +

        Kitematic Example +jussi in a docker container as seen from Kitematic for macOS.

        + +
        Try out your local configuration:
        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[8675309], "id":1}' http://localhost:9000
        +
        + +

        See: Running Condenser, Jussi and a new service locally + adding feature flags to Condenser

        + +
        + +

        Adding Upstreams

        + +

        The default DEV_config.json is:

        + +
        {
        +   "limits":{"blacklist_accounts":["non-steemit"]},
        +   "upstreams":[
        +      {
        +         "name":"steemd",
        +         "translate_to_appbase":false,
        +         "urls":[["steemd", "https://steemd.steemitdev.com"]],
        +         "ttls":[
        +            ["steemd", 3],
        +            ["steemd.login_api", -1],
        +            ["steemd.network_broadcast_api", -1],
        +            ["steemd.follow_api", 10],
        +            ["steemd.market_history_api", 1],
        +            ["steemd.database_api", 3],
        +            ["steemd.database_api.get_block", -2],
        +            ["steemd.database_api.get_block_header", -2],
        +            ["steemd.database_api.get_content", 1],
        +            ["steemd.database_api.get_state", 1],
        +            ["steemd.database_api.get_state.params=['/trending']", 30],
        +            ["steemd.database_api.get_state.params=['trending']", 30],
        +            ["steemd.database_api.get_state.params=['/hot']", 30],
        +            ["steemd.database_api.get_state.params=['/welcome']", 30],
        +            ["steemd.database_api.get_state.params=['/promoted']", 30],
        +            ["steemd.database_api.get_state.params=['/created']", 10],
        +            ["steemd.database_api.get_dynamic_global_properties", 1]
        +         ],
        +         "timeouts":[
        +            ["steemd", 5],
        +            ["steemd.network_broadcast_api", 0]
        +         ],
        +         "retries": [
        +            ["steemd", 3],
        +            ["steemd.network_broadcast_api", 0]
        +         ]
        +      },
        +      {
        +         "name":"appbase",
        +         "urls":[["appbase", "https://steemd.steemitdev.com"]],
        +         "ttls":[
        +            ["appbase", -2],
        +            ["appbase.block_api", -2],
        +            ["appbase.database_api", 1]
        +         ],
        +         "timeouts":[
        +            ["appbase", 3],
        +            ["appbase.chain_api.push_block", 0],
        +            ["appbase.chain_api.push_transaction", 0],
        +            ["appbase.network_broadcast_api", 0],
        +            ["appbase.condenser_api.broadcast_block", 0],
        +            ["appbase.condenser_api.broadcast_transaction", 0],
        +            ["appbase.condenser_api.broadcast_transaction_synchronous", 0]
        +         ]
        +      }
        +   ]
        +}
        +
        + +

        Upstreams can be added to the upstreams array:

        + +
        {
        +  "name": "foo",
        +  "urls": [["foo", "https://foo.host.name"]],
        +  "ttls": [["foo", 3]],
        +  "timeouts": [["foo", 5]]
        +}
        +
        + +

        Once the above upstream is added to the local config and docker has been built, the following curl will work:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"foo.bar", "params":["baz"], "id":1}' http://localhost:9000
        +
        + +

        Note: if you set translate_to_appbase as true, jussi will do the translation for you and that specific endpoint will work with libraries that don’t yet support appbase.

        + +

        Benefits of jussi

        + +

        Time To Live

        + +

        Jussi can be configured with various TTL (Time To Live) schemes. A TTL is an integer value in seconds. Integers equal to or less than 0 have special meaning. A reasonable set of defaults would be:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        UpstreamAPIMethodParametersTTL (seconds)
        steemdlogin_apiallall-1
        steemdnetwork_broadcast_apiallall-1
        steemdfollow_apiallall10
        steemdmarket_history_apiallall1
        steemddatabase_apiallall3
        steemddatabase_apiget_blockall-2
        steemddatabase_apiget_block_headerall-2
        steemddatabase_apiget_contentall1
        steemddatabase_apiget_stateall1
        steemddatabase_apiget_state'/trending'30
        steemddatabase_apiget_state'trending'30
        steemddatabase_apiget_state'/hot'30
        steemddatabase_apiget_state'/welcome'30
        steemddatabase_apiget_state'/promoted'30
        steemddatabase_apiget_state'/created'10
        steemddatabase_apiget_dynamic_global_propertiesall1
        overseerallallall5
        conveyorallallall-1
        sbdsallallall3
        hivemindallallall3
        yoallallall3
        + +

        In this case, requests for login_api and network_broadcast_api have a TTL of -1, which means requests with those namespaces are not cached, whereas follow_api request have a TTL of 10 seconds.

        + +

        Some methods and parameters have their own TTL that overrides the general default, like database_api.get_block, which overrides database_api.*.

        + +
        Time to Live Special Meaning
        + +
          +
        • 0 won’t expire
        • +
        • -1 won’t be cached
        • +
        • -2 will be cached without expiration only if it is irreversible in terms of blockchain consensus
        • +
        + +

        If you have a local copy of jussi (see: Installation), you can change these defaults by modifying DEV_config.json.

        + +

        Multiple Routes

        + +

        Each urls key can have multiple endpoints for each namespace. For example:

        + +
        {
        +  "urls":[
        +    ["appbase", "https://api.steemitdev.com"]
        +  ]
        +}
        +
        + +

        … can also be expressed as:

        + +
        {
        +  "urls":[
        +    ["appbase","https://api.steemitdev.com"],
        +    ["appbase.condenser_api.get_account_history","https://api-for-account-history.steemitdev.com"],
        +    ["appbase.condenser_api.get_ops_in_block","https://api-for-get-ops-in-block.steemitdev.com"]
        +  ]
        +}
        +
        + +

        In these examples, the methods get_account_history and get_ops_in_block route to a dedicated API endpoint, while the rest of the appbase namespace routes to a common endpoint.

        + +

        Retry

        + +

        Adding a retries element defines the number of retry attempts, where 0 (or absent) means no retry. The maximum number of retries is 3.

        + +

        Note that retrying broadcast methods is not recommended, which is why the example explicitly sets steemd.network_broadcast_api to 0.

        + +

        json-rpc batch

        + +

        Normally, a request is made with a JSON Object ({}). But jussi also supports batch requests, which is constructed with a JSON Array of Objects ([{}]).

        + +

        For example, this would be a typical, non-batched JSON Object request that asks for a single block:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1}' https://api.steemit.com
        +
        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "previous":"0000000000000000000000000000000000000000",
        +      "timestamp":"2016-03-24T16:05:00",
        +      "witness":"initminer",
        +      "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +      "extensions":[
        +
        +      ],
        +      "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +      "transactions":[
        +
        +      ],
        +      "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +      "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +      "transaction_ids":[
        +
        +      ]
        +   }
        +}
        +
        + +

        To request more than one block using the batch construct, wrap each call in a JSON Array, that asks for two blocks in one request:

        + +
        curl -s --data '[{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1},{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[2], "id":2}]' https://api.steemit.com
        +
        + +
        [
        +   {
        +      "id":1,
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000000000000000000000000000000000000",
        +         "timestamp":"2016-03-24T16:05:00",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      }
        +   },
        +   {
        +      "id":2,
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "timestamp":"2016-03-24T16:05:36",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"1f3e85ab301a600f391f11e859240f090a9404f8ebf0bf98df58eb17f455156e2d16e1dcfc621acb3a7acbedc86b6d2560fdd87ce5709e80fa333a2bbb92966df3",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"00000002ed04e3c3def0238f693931ee7eebbdf1",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      }
        +   }
        +]
        +
        + +

        Error responses are returned in the JSON Array response as well. Notice the "WRONG" parameter in the second element. The first block is returned as expected, the second one generates an error.

        + +
        curl -s --data '[{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[1], "id":1},{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":["WRONG"], "id":2}]' https://api.steemit.com
        +
        + +
        [
        +   {
        +      "jsonrpc":"2.0",
        +      "result":{
        +         "previous":"0000000000000000000000000000000000000000",
        +         "timestamp":"2016-03-24T16:05:00",
        +         "witness":"initminer",
        +         "transaction_merkle_root":"0000000000000000000000000000000000000000",
        +         "extensions":[
        +
        +         ],
        +         "witness_signature":"204f8ad56a8f5cf722a02b035a61b500aa59b9519b2c33c77a80c0a714680a5a5a7a340d909d19996613c5e4ae92146b9add8a7a663eef37d837ef881477313043",
        +         "transactions":[
        +
        +         ],
        +         "block_id":"0000000109833ce528d5bbfb3f6225b39ee10086",
        +         "signing_key":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +         "transaction_ids":[
        +
        +         ]
        +      },
        +      "id":1
        +   },
        +   {
        +      "jsonrpc":"2.0",
        +      "error":{
        +         "code":-32000,
        +         "message":"Parse Error:Couldn't parse uint64_t",
        +         "data":{
        +            "code":4,
        +            "name":"parse_error_exception",
        +            "message":"Parse Error",
        +            "stack":[
        +               {
        +                  "context":{
        +                     "level":"error",
        +                     "file":"string.cpp",
        +                     "line":113,
        +                     "method":"to_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"Couldn't parse uint64_t",
        +                  "data":{
        +
        +                  }
        +               },
        +               {
        +                  "context":{
        +                     "level":"warn",
        +                     "file":"string.cpp",
        +                     "line":116,
        +                     "method":"to_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"",
        +                  "data":{
        +                     "i":"WRONG"
        +                  }
        +               },
        +               {
        +                  "context":{
        +                     "level":"warn",
        +                     "file":"variant.cpp",
        +                     "line":405,
        +                     "method":"as_uint64",
        +                     "hostname":"",
        +                     "timestamp":"2018-05-21T18:02:41"
        +                  },
        +                  "format":"",
        +                  "data":{
        +                     "*this":"WRONG"
        +                  }
        +               }
        +            ]
        +         }
        +      },
        +      "id":2
        +   }
        +]
        +
        + +

        Footnotes

        + + + +
        + +

        Latin

        + +
        +
        jussi
        +
        +noun
        +
        +declension: 2nd declension
        +gender: neuter
        +
        +Definitions:
        +  1. order, command, decree, ordinance, law
        +
        +
        + +
        + + + + + + + + diff --git a/docs/services/sbds.html b/docs/services/sbds.html new file mode 100644 index 00000000..706d189b --- /dev/null +++ b/docs/services/sbds.html @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + +SBDS | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        sbds is a tool for easily querying the data of the Steem Blockchain.

        + +

        While providing direct interfaces to several pluggable storage architectures that may be used for querying the blockchain, sbds may also be used as a lower level API upon which other applications can be built.

        + +

        Docker Hub

        + +
        docker run -d steemit/sbds
        +
        + +

        Python 3

        +
        pip3 install -e git+git@github.com:steemit/sbds.git#egg=sbds
        +
        + +

        Examples

        + +

        Stream blocks 1 to 3450000 from our dev S3 bucket

        +
        sbds checkpoints get-blocks s3://steemit-dev-sbds-checkpoints/gzipped --start 1 --end 3450000
        +
        + +

        Stream blocks 8000000 to the last block from your local copy of our S3 bucket

        +
        sbds checkpoints get-blocks /home/ubuntu/checkpoints/gzipped --start 8000000
        +
        + +

        Stream all blocks from your local copy of our S3 bucket

        + +
        sbds checkpoints get-blocks /home/ubuntu/checkpoints/gzipped
        +
        + +

        Routes

        + +

        Coming soon.

        + +
        + + + + + + + + diff --git a/docs/services/steemconnect.html b/docs/services/steemconnect.html new file mode 100644 index 00000000..845de43c --- /dev/null +++ b/docs/services/steemconnect.html @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + +SteemConnect | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        A Look at the Why’s and How’s of SteemConnect

        + +

        Useful Links

        + + + +

        Why SteemConnect was implemented

        + +

        The goal of SteemConnect is to provide a safe way of connecting to the blockchain via 3rd party apps without compromising the security of your private keys and passwords. It’s a simple identity layer built on top of the blockchain allowing users safe access and developers the freedom of not having to handle the authentication system, i.e. managing users’ private keys and encryption. This means that devs won’t have to opensource their projects in order to gain user trust. When connecting to apps in this manner, neither SteemConnect nor the authorised app store the private keys as the posting key is incrypted on your cookie.

        + +

        How SteemConnect is implemented

        + +

        SteemConnect works by granting an access token to the requesting app once the application has been approved. +A full tutorial on how to set up an application, request authorisation and grant access can be found HERE

        + +

        Steem Authorisation and OAuth 2

        + +

        The OAuth protocol allows third party apps to grant limited access to an HTTP service, either on behalf of a resource owner or by allowing the app to obtain access on its own behalf. The authorisation is provided without the private key or password of the user being shared with the third party. +Simplified, the process includes the following steps:

        + +
          +
        1. The user is presented with an authorisation link that requests a token from the API
        2. +
        3. The user has to log in to the service to verify their identity whereupon they will be prompted to authorise the application
        4. +
        5. The user is redirected to the application redirect URI along with the access token
        6. +
        + +

        Once the application has an access token, it may use the token to access the user’s account via the API, limited to the scope of access, until the token expires or is revoked. +A full breakdown of OAuth2 and how it applies to SteemIt and SteemConnect can be found HERE

        + +

        For additional material you can refer to the original steemit blog post by busy.org

        + +
        + + + + + + + + diff --git a/docs/services/steemit.html b/docs/services/steemit.html new file mode 100644 index 00000000..1ba75b95 --- /dev/null +++ b/docs/services/steemit.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + +Steemit.com | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        steemit.com endpoints

        + +

        Steemit.com offers a few endpoints for getting common data. User profile and post JSON data is very convenient and simple by appending .json +to your request.

        + +

        Getting a particular user profile JSON:

        + +
        https://steemit.com/@curie.json
        +
        + +

        User object

        +
        {
        +   "user":{
        +      "id":81544,
        +      "name":"curie",
        +      "owner":{
        +         "weight_threshold":1,
        +         "account_auths":[],
        +         "key_auths":[["STM69WGR1yhUdKrnzwQLDPnXrW9kaAERwHze8Uvtw2ecgRqCEjWxT", 1]]
        +      },
        +      "active":{
        +         "weight_threshold":1,
        +         "account_auths":[],
        +         "key_auths":[["STM5GAbbS84ViMEouJL3LKcM8VZzPejn68AfPaYaLZZDdmy98kwU5", 1]]
        +      },
        +      "posting":{
        +         "weight_threshold":1,
        +         "account_auths":[["steemauto", 1]],
        +         "key_auths":[["STM5cmuKw6EPkZWeVNXcZorKtattZTX5wSopcRb4xNe6VhRKjETgv", 1]]
        +      },
        +      "memo_key":"STM7ZBi61xYz1b9STE1PHcAraPXJbvafzge3AcPjcfeq4XkKtM2At",
        +      "json_metadata":{
        +         "profile":{
        +            "profile_image":"https://i.imgur.com/Mjewc66.jpg",
        +            "name":"Curie",
        +            "about":"Discovering exceptional content. ",
        +            "location":"Worldwide",
        +            "website":"http://curiesteem.com"
        +         }
        +      },
        +      "proxy":"",
        +      "last_owner_update":"1970-01-01T00:00:00",
        +      "last_account_update":"2018-02-28T14:21:24",
        +      "created":"2016-09-02T10:44:24",
        +      "mined":false,
        +      "recovery_account":"anonsteem",
        +      "last_account_recovery":"1970-01-01T00:00:00",
        +      "reset_account":"null",
        +      "comment_count":0,
        +      "lifetime_vote_count":0,
        +      "post_count":1042,
        +      "can_vote":true,
        +      "voting_power":8927,
        +      "last_vote_time":"2018-06-21T19:42:33",
        +      "balance":"24.519 STEEM",
        +      "savings_balance":"0.000 STEEM",
        +      "sbd_balance":"36.736 SBD",
        +      "sbd_seconds":"11732264931",
        +      "sbd_seconds_last_update":"2018-06-21T19:35:00",
        +      "sbd_last_interest_payment":"2018-06-15T14:05:03",
        +      "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":"481.354811 VESTS",
        +      "reward_vesting_steem":"0.237 STEEM",
        +      "vesting_shares":"128367480.795804 VESTS",
        +      "delegated_vesting_shares":"0.000000 VESTS",
        +      "received_vesting_shares":"17069919.621493 VESTS",
        +      "vesting_withdraw_rate":"9672265.370398 VESTS",
        +      "next_vesting_withdrawal":"2018-06-24T14:01:51",
        +      "withdrawn":0,
        +      "to_withdraw":"125739449815180",
        +      "withdraw_routes":0,
        +      "curation_rewards":79730650,
        +      "posting_rewards":168964559,
        +      "proxied_vsf_votes":["1753316906111", 0, 0, 0],
        +      "witnesses_voted_for":1,
        +      "last_post":"2018-06-21T18:06:57",
        +      "last_root_post":"2018-06-19T13:16:15",
        +      "average_bandwidth":"540385456623",
        +      "lifetime_bandwidth":"33717478000000",
        +      "last_bandwidth_update":"2018-06-21T19:42:33",
        +      "average_market_bandwidth":"83841450748",
        +      "lifetime_market_bandwidth":"8042800000000",
        +      "last_market_bandwidth_update":"2018-06-19T04:21:42",
        +      "vesting_balance":"0.000 STEEM",
        +      "reputation":"418378051905700",
        +      "transfer_history":[],
        +      "market_history":[],
        +      "post_history":[],
        +      "vote_history":[],
        +      "other_history":[],
        +      "witness_votes":["curie"],
        +      "tags_usage":[],
        +      "guest_bloggers":[]
        +   },
        +   "status":"200"
        +}
        +
        + +

        Getting a particular post JSON:

        + +
        https://steemit.com/curation/@curie/the-daily-curie-12-13-feb-2017.json
        +
        + +

        Post object

        +
        {
        +   "post":{
        +      "id":1720643,
        +      "author":"curie",
        +      "permlink":"the-daily-curie-08-09-jan-2017",
        +      "category":"curation",
        +      "parent_author":"",
        +      "parent_permlink":"curation",
        +      "title":"The Daily Curie (08-09 Jan 2017)",
        +      "body":"<center>https://s29.postimg.org/dgtsfe7if/curie2.png</center>\n## Introduction\n[Curie](https://steemit.com/steemit/@donkeypong/announcing-project-curie-bringing-rewards-and-recognition-to-steemit-s-undiscovered-and-emerging-authors)  is a commu ...",
        +      "last_update":"2017-01-09T12:20:15",
        +      "created":"2017-01-09T12:20:15",
        +      "active":"2017-01-11T22:44:57",
        +      "last_payout":"2017-02-09T14:40:54",
        +      "depth":0,
        +      "children":36,
        +      "children_rshares2":"0",
        +      "net_rshares":0,
        +      "abs_rshares":0,
        +      "vote_rshares":0,
        +      "children_abs_rshares":0,
        +      "cashout_time":"1969-12-31T23:59:59",
        +      "max_cashout_time":"1969-12-31T23:59:59",
        +      "total_vote_weight":0,
        +      "reward_weight":10000,
        +      "total_payout_value":"0.000 SBD",
        +      "curator_payout_value":"0.000 SBD",
        +      "author_rewards":0,
        +      "net_votes":519,
        +      "root_comment":1720643,
        +      "mode":"archived",
        +      "max_accepted_payout":"0.000 SBD",
        +      "percent_steem_dollars":10000,
        +      "allow_replies":true,
        +      "allow_votes":true,
        +      "allow_curation_rewards":true,
        +      "url":"/curation/@curie/the-daily-curie-08-09-jan-2017",
        +      "root_title":"The Daily Curie (08-09 Jan 2017)",
        +      "pending_payout_value":"0.000 SBD",
        +      "total_pending_payout_value":"0.000 SBD"
        +   }
        +}
        +
        + +
        + + + + + + + + diff --git a/docs/siteicon.png b/docs/siteicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fed4b7deb8faf6ae194f44bf1a50c359343a3923 GIT binary patch literal 2631 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 literal 0 HcmV?d00001 diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 00000000..4d39af9a --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,531 @@ + + + +https://developers.steem.io/apidefinitions/account-by-key-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/account-history-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/block-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/broadcast-ops-comment +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/broadcast-ops +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/condenser-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/database-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/debug-node-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/follow-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/jsonrpc +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/market-history-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/network-broadcast-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/rc-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/tags-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/apidefinitions/witness-api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/community/developeradvocate +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/community/overview +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/community/resources +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/chain_basics +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/governance +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/index +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/market +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/glossary/transactions +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/introduction/welcome +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/quickstart/choose_library +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/quickstart/steemd_nodes +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/quickstart/testnet +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/services/imageHoster +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/services/jussi +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/services/sbds +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/services/steemconnect +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/services/steemit +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/testnet/index +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/testnet/tools +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials/index +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/account_reputation +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/blog_feed +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/claim_rewards +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/client_signing +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/convert_sbd_to_steem +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/create_account +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/delegate_power +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/edit_content_patching +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/follow_a_user +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_account_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_account_replies +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_delegations_by_user +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_follower_and_following_list +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_post_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_post_details +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_posts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_state_replacement_api +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/get_voters_list_on_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/getting_started +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/grant_active_permission +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/grant_posting_permission +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/power_down +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/power_up_steem +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/reblogging_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/search_accounts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/search_tags +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/set_withdraw_route +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/steemconnect +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/stream_blockchain_transactions +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/submit_comment_reply +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/submit_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/transfer_steem_and_sbd +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/vote_on_content +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-javascript/witness_listing_and_voting +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/account_reputation +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/claim_rewards +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/delegate_power +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/edit_content_patching +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/follow_a_user +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_account_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_account_replies +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_delegations_by_user +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_follower_and_following_list +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_post_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_post_details +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_posts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/get_voters_list_on_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/getting_started +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/grant_active_permission +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/grant_posting_permission +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/password_key_change +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/power_down +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/power_up_steem +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/reblogging_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/search_accounts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/search_tags +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/stream_blockchain_transactions +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/submit_comment_reply +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/submit_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/transfer_STEEM_and_SBD +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/using_keys_securely +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/vote_on_content +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-python/witness_listing_and_voting +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/estimate_upvote +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/forum-market-bandwidth +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/jussi-multiplexer +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/plugin_and_api_list +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/understanding-configuration-values +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/understanding-dynamic-global-properties +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/vest-to-steem +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/blog_feed +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/edit_content_patching +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/follow_another_user +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_account_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_account_replies +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_post_comments +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_post_details +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_posts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/get_voters_list_on_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/getting_started +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/reblogging_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/search_accounts +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/search_tags +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/stream_blockchain_transactions +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/submit_comment_reply +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/tutorials-ruby/submit_post +2018-10-18T14:29:07-05:00 + + +https://developers.steem.io/CONTRIBUTING + + +https://developers.steem.io/apidefinitions/ + + +https://developers.steem.io/community/ + + +https://developers.steem.io/unused/community + + +https://developers.steem.io/unused/database_api + + +https://developers.steem.io/unused/docker + + +https://developers.steem.io/ + + +https://developers.steem.io/quickstart/ + + +https://developers.steem.io/services/ + + +https://developers.steem.io/unused/steemd + + +https://developers.steem.io/unused/tags + + +https://developers.steem.io/unused/tutorials + + diff --git a/docs/testnet/index.html b/docs/testnet/index.html new file mode 100644 index 00000000..9a64b8ca --- /dev/null +++ b/docs/testnet/index.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + +Steem Testnet | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Steem Testnet + + +

        + + +

        Steem blockchain software is written in C++ and in order to modify the source code you need some understanding of the C++ programming language. Each Steem node runs an instance of this software, so in order to test your changes, you will need to know how to install dependencies which can be found in the Steem repo. This also means that some knowledge of System administration is also required. There are multiple advantages of running a testnet, you can test your scripts or applications on a testnet without extra spam on the live network, which allows much more flexibility to try new things. +Having access to a testnet also helps you to work on new features and possibly submit new or improved pull requests to official the Steem GitHub repository.

        + +

        Running Testnet

        + +

        By following official build steps and enabling the BUILD_STEEM_TESTNET flag during compilation, you should be able to run the Steem Testnet locally on your workstation and join the development testnet. Docker can also be used to get started quickly. Compilation generates the steemd executable which is the main daemon for the Steem network. Additional cli_wallet can also be compiled to test/connect to an instance of steemd and request some data from the network, but it is not necessary to run a node.

        + +

        The development testnet requires a certain minimum set of hardware requirements, depending on the type of compile flags that have been enabled. Because it is a mirror of the live network, private keys are the same for accounts up to the point of the snapshot timestamp of the testnet.

        + +

        Joining/Running the development testnet requires around 10 GB for block log on an SSD and 8 GB RAM. The CPU requirements are the same.

        + +

        Testnet has the following parameters by default (as of this writing):

        + +
          +
        • Initial supply (250 billion) - STEEM_INIT_SUPPLY 250,000,000,000
        • +
        • Max number of blocks to be produced - TESTNET_BLOCK_LIMIT 3,000,000
        • +
        • Address prefix, prefix on public addresses - STEEM_ADDRESS_PREFIX "TST"
        • +
        • Chain id name, used for chain id - STEEM_CHAIN_ID_NAME "testnet"
        • +
        • Chain id, unique id hash of chain - STEEM_CHAIN_ID (fc::sha256::hash(STEEM_CHAIN_ID_NAME))
        • +
        • Public key of genesis account - STEEM_INIT_PUBLIC_KEY_STR
        • +
        • Account creation fee - STEEM_MIN_ACCOUNT_CREATION_FEE 0
        • +
        + +

        There are a number of other subtle changes that we don’t need to focus on right now.

        + +

        Live testnet

        + +
          +
        • ChainID: 46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32
        • +
        • Address prefix: TST
        • +
        • API node: https://testnet.steemitdev.com
        • +
        + +

        Anyone can join the Live testnet and start testing their node and applications, become a witness, and provide API (RPC) node for public use.

        + +

        Custom Testnet

        + +

        In order to create a custom testnet, separate from the development one, we need to modify a few parameters mentioned in the previous section.

        + +

        In the file named steem/libraries/protocol/include/steem/protocol/config.hpp, we can see the first few lines dedicated to the Testnet section. The line starts with #ifdef IS_TEST_NET.

        + +

        Let’s say we want to create a custom testnet with an initial supply of 1,000,000 STEEM. We can change STEEM_INIT_SUPPLY 1,000,000 and by changing STEEM_CHAIN_ID_NAME "testnet", testnet to mytestnet we will automatically get a unique Chain ID for our testnet. The address prefix can be set to something like MTN and of course, we need to change the public and private keys to the genesis account. Note that the genesis account will receive the entire pre-mined supply of 1,000,000. That way, you can execute a setup script to fund any newly created accounts. Such a custom testnet will not have any additional hardware requirements to run.

        + +

        A minimum of 8GB RAM should be sufficient to run a custom testnet. Currently, Steem only has Linux and Mac compiling guides to build. A testnet can either be hosted locally, on a rented AWS, or dedicated bare metal servers so one can start testing functionality, explore different APIs, and start developing.

        + +

        One more crucial point to modify is to change the number of witnesses required to accept hardforks for a custom testnet, by default it is set to 17, we can change it to 1 STEEM_HARDFORK_REQUIRED_WITNESSES 1 so that only one node instance would be sufficient and the network will be still functional and fast.

        + +

        Another thing to note is that you can start a new chain with all previous hardforks already accepted, by changing the file named steem/blob/master/libraries/chain/database.cpp with the following function:

        + +

        void database::init_genesis( uint64_t init_supply ) inside try add this line:

        + +

        set_hardfork( 19, true );

        + +

        This would mean that 19 hardforks have been accepted by witnesses and the new chain will start with all previous forks included.

        + +

        After these changes, all we have to do is compile the source code and get the steemd executable. And once we fire up the custom testnet we can start testing and experimenting.

        + +

        If you want to port some data from Steem main network you can use Tinman, also developed by Steemit, to help with taking snapshots of the main network.

        + +

        Custom live testnet

        + +
          +
        • ChainID: 79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673
        • +
        • Address prefix: STX
        • +
        • API node: https://testnet.steem.vc
        • +
        + +

        The above testnet is powered by community member @almost-digital and doesn’t have a snapshot of the main network.

        + +
        + +
        + + + + + + + + diff --git a/docs/testnet/tools.html b/docs/testnet/tools.html new file mode 100644 index 00000000..12421878 --- /dev/null +++ b/docs/testnet/tools.html @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + +Tools | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + +
        Testnet IDToolPurpose
        46d82abSteemit, Inc. Live Testnet EndpointFor anyone who wants to start testing their node and applications.
        79276aetestnet.steem.vcGeneral bootstrapping to testnet.steem.vc maintained maintained by @almost-digital.
        79276aeTestNET CondenserA condenser instance for testnet.steem.vc.
        + + +
        + + + + + + + + diff --git a/docs/touch-icon.png b/docs/touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..624d181cf367c34e74e15e4a24c5f168135dfa55 GIT binary patch literal 9648 zcmeAS@N?(olHy`uVBq!ia0y~yU~B|o4mJh`hK5L96$S>?a!(h>kcwMxZf9p-PLODL z=yTKkx+(i}yB*EH3vd05j@d5v?0$)RY48_LC5t!-v0IbA?A7B?RGsq0JMW%)CL;qH zxS%}$`Sja~`rn$F8uswSzwNmvD`R)0&T9U-I5CDN3;zf=tXFS$-=Fl~xbL_V!vuE* zyCc2-_wgRMuiICD}IB{exR&2=2E^B|w^&l;iu|le;{l~v=^(;;d6Z{!2 z3HY4TZ(&%VJu9(t7E8iZMTu$8ofs}K`bMg1H*9TLux5`b%Y~&39E=Tu0h`uVnS?NG zuv>pRtK`qO2UdFx*VlKy{vmhWSdSs1o}q<7LAW}!b{5M5XT^@!#!^fXz6`UejbEX6nmJJKy(;E- z^j(6N@lQI#t?Lf^zt}POJAcT%-^Gxyk%5D8|IMwiEJ!+IAhGRzRU_Ub50!7@vR$%+%+pLStjSR}&W#K16*BkOCL zCWBn7!@mFA%nbYd7&^PX${Fl*fBrk_azK`mfyse`;Q;ftdl^CvMI29d7MQR&)G~B& zJ~;E;_rJd455@ECr;`|18Uz>`)-i11IB?eaz(oND(-`FhrWr~spYH6?VRK;MU}RX6 z!eGHP%a_AKifKdABDV`ZF(t2ltJ$pc1r~-4M`8rFaUA&Lq;P)vVnv42 znp{q54X!>cjwezL!OlqFJmPpmjiH<0@ytbm22~CRL&lnqwZZ@V6@SPX3oaeK zpmcO$u3&>Imt#h}6hlM+!>rCymV}v339*7qYD{2<9;jiupvIsr$n-Cp<3P^QYg@Oi z{r%>*+HS7w-5iajJ}e9z2TEUmJh!;}S9803O6`>Urfm;G?N6^|Y{)#Bb}3A%VSc$* z_D_Y=Qk&-8S+}M(RHBJH^1UicBV$AT)Ez69nlfy9$$!~zd)ATdpFi)e&iobf&n!%$ z>GTm-^}~Da8!$L9tYiA%X7<uld#K|*?GFGV1u1z?#&Z(fH zprGRay|!bgA9+VAJ24!%&v_u^-Zv}R>~)53zME@(T5Q6rF^hvuhL`b!A;a&?th2mt zmhbhg{OeH6QKZJiFj?qz8Rr4{PgQpnH{`i+F!=Z}%r{|6xEs<}eRrL4@PzN7*Qffk zH0wOi;80+wVpedszBc3K$=_Go73%AbxG+>mHJC9fuyl62wJ?0}5jvWs-Vl9E=Dn!9 zgR#o|@TupoN;hfPy-dF&$iU*@$T06~)wwf`HF<(f*Jn9TFcf6i^>#IU~E{& zFh#qet(58cUb_e9ly#YYaWDut9Ao)lrZIJWMeUJu=BxCYt{S+oFmUxe=l*<%=|_tB zlh z=#GyoyANE8Y~f(Iq~1`O$XN5mduitHrM6E}8O;66pQV9oD5|sK6+=x5{5VH{_pGN z(AawM!h}^EMT-kvH%NWDBEZ1(VlIPSc+LN`*$hTHOtbri4_c=RUJ1XU!}fw(_~)ah zB@AkM){Jj%@qXUss+n%1m}BS1vi;7VoO!d9PKYbJFkI;OeQ;;SDu#VOpMH}4{j}zq z@R4Vw=gyu#8yw7%{QIJSKQE&~gC0x3$G7fMV)-EDj>2AWz-*8|!(7ox2U z zGX6(g+xz{&zoG_)K9#1@Qo#%E3=4ksC%g?kaP0JR{We<*lTiB!;*4{TGUU!aFpH@p zKcgT;>(RvtYk%9XQ(AGo;<|tWLnz~#+r2!DGVv_0Unz0OUvg()mS9}Ty+A5Nz=8k9 z{=V6dlq#Az8hjHLa&&MlcrJR-)q0Q6J!J){rbfX7wuOvq6dQzv52{+{tnOam=E`u0 z>Bg4Udm&;Bf)_g7osTjKIJR&&1TysJHvUf$mZ%C5G&$m$@Lp<_AaCOohB^fX1u3g7 z95-~>c#nN zMk}=NUVh25;K3<@N0XMQCb}E4E#?-UVV1e@;?$4JwYXhhn0yw_cD%1Yla)JUhSA*W zeZTEaJ~{JmPWAlvf6wjw{%YA00so0|-sg|(X{l9c($3&DY!u>J5X0HP^udf(kVnei z^h>9}qoevwk>U>FCSHsd49_yV3k9Eiy)swek?5`ReY>(NuU-l~t-HWajbZtLn%17} zZU0(0&T%O|Wz*l2wSGPKonuWVvl%oP%3Tv|1XI4|?s4+idEmG2wFl4UA4=My&9JRu z4%_GDN)j8im{dO8FVDMO7r~+F%(SABVcko&sW*ciCZ6ban#2Bi2lL?$SHTRX_-Jv7 zt1fyiKI#!Q^P~J2L>go-z5L>H=DFS9>_CK`!Jku?TS_Bj2H#3OUTR5Z~ke!qQ1B50i#QSBZsEw$KZ{3 zU)cZaX-x}c_`Ab#kIE5oC4)H}n|9bKJ9%)jERa5EzVU<(R|3QPd6{C5qy-c9-QS|s zB)94IRgP zx;Y(K6^^`D+L7pd)0T8$?3#pfm?UVSVCRebQK;gzV028#c(WYoAdB`ka|F%XA1}DKA6Byzw|C)2{ejoVY;|-0U z`CFnKt{Nn+W)(^0?hsLKV!1Y9>t(0EPAB$HbeOu}D$^=9Z6=S0Ny`{KHY!CV=n7^u zUf;HIYOdm^iVp=RL)VJ+a6GV%IkLND!piOk$!j#da~H}7epoB+B*%L7U|k4jr81L8 zx$C0!=|(dnolabF4QO3>y^G_^76Gn(c8V^6lWaSsLfG#w@G?+r;I~p@-#k-Ce!BX3 zo;544O6WxkGIH%Jxqa-~Unh@+yi537eWe5rL^v{RZWZWy@c)*Ra%V-&MuGavw=P}k zTlHWbD`SbV$vH6?~K*z+2P1>cPU-x(imQHR!N9c==xmP;y}W zq0Qx3H~YqM%?G)6dCF`V0~lJAGGNdB3=n8~7_J9nSJqgcTf!zCNy?$$KuMEnm{x_8**fXD++#xIYUqLo@I z;#qbZ-YE=VnZ>3ygNS_1bIcAJz9w1v8`~+D#^; zNNsTce7d()si1$I=L6d|JUj?SedNb~5c=yPu zidXy!kKz%-w)VDXNk1+eHEH;LRO52PT9FGJyYH78u$J)h^M`UMzI(^NC!nIOA+zDn z;d_7ohQziPGSnM9U|1`*Ur<=orlUe-t?B}`N3E})U)$1s%{Mx4E60+<4?irvYOf&F z^2vGm?A*0xx1(ZH%1a;KN)i#WKjhHyLEwU$!>qZ@8hh=f&Eq1Rju+44-xF_s|M%yb zd7ppUo&Wr|ZeQYD))`s}_crl9FtK}f(B1K5Rh<9Q;*YXSuhW>n9)A_o@@CuRt+lmo zzjkp(i_I7AOcG-2+#J{ucFrxJ=d{GN?Y>tJ@P;tQDejiN5q_nk|JaY*n+!@WHB;Yp zF*|K(`tkSQid(N{U7!3|IA;}G-eRdA8~44l;Lq41+B7}M%PQJVI#cM$+*!BGCm76O zzR-2~^4+%wmY&;`_2AaIJ;(VtZ*m^|JZsXqMP?V=_uAIloSYE$Y5K`)ZVT>qe$Bi5 zolTGH=E>Heb5lypau~8*s`iM=O&3^Our>7RQO%E>;khf>41)g{>tFx6V?wOJmcMEh zW;#YHM{-q;ovy2IP;b7}b^ZEn@mBApx>p&}x{80#zg6ycLXYE?ILEy`s<{iqRNU4G ztQA^O6|C&C@5rz1PZM@dZ2R>+xb@A28y7YRI!a%+6DZ3&Ws#l!$V_vvY3Omc|SZTIH9u2H2hbB5G2NeBW&kUn+%7z8wI;wcmz8u z-`*ZI^MQiLeuaozs~hHjZf|>HliRd-FV_L3bWw+r z@7n@q>4Y(#iguFcewoyi)U4e3LbqO>sq^z_Upsqqx8Rh_r=bpCKU@%4&9LbI zhu=?9mRx^ascCBHS?sN`Vf%s)YbNkK6*%qlf+84`{ z^DKE$+3eiBhs^R1i&kybWpb3bWX12{?IZPl$KBg49n+3J|GaeZtam{+;xin*cSUIA zd~T32<`0Nrt+6mNnxx>eMQ85ZxvTi6Ig3Ba-?F5iyERuXU{R^ugf=0u&;#8XnaZsl z(|9Ytuzbpl`WW+IQNWF7jL)~8V-7gv_v6?xqt=dp;!gsNKD{hHTFiL=<+k9BPKlNF z2?CA*x4E1&XREk~^h~>ueL{Qdd+wCx_@50{PA&l$hM|Qlf>^leVW56$jbTY zWb2+;mwxSYI5>Itk9`g+9=hB2$k&IZYM&4^?iHHWepHZkz3P;0>!+dLs#T&wQQyH~L#DtbyDllcbDJ?bKxDi3`AaWQ?$Ip$d# zBO=9wSR=15UFQ)K=Xg5wv6{ev|3Rw*GG@qLf3wHyIivfAh@Tl67i$B;K3(J667$@2 zpJk6_>h6FOW{qN-KWEKhPnh^=so9fbfr^Qx>M9YBAFSvQ=(y&Zc44aggQ<&*t@!FD+;n0#l8*#Z+qfza-?eiB4 z76+zS{x$oizs8pP-t$KJ=l|yJy`TPV_qBVw<3hfk{5pMstdlbH-@kvDXEdkWNx9eX zwc)<0hou(Nf%SR@&hul~o60!02JO9cVESZc^;>akb)_a&Dqmwhmp!4Vk*6U(HepfS zHrBP=cl^J4F~@&7K410mJ>Dq(A1=*X?lK(cT^s%D+POC?T&5h5pLF0i+qiQA*e0x5A#Tdd@P3y===`|- zyc&)5U+Q)xJiw>5hid#)+Y)rxkZ?5MSQjc5CY$tu1f3uFKu}9e2KnxgkdA#T1r0E{(=O z&j+&1^3Te`b}QwHT;B9$ecEQvY7GZF&OHj8HF6*KC3+_8Zsf1p;r(U8d)77VCMFv3 zh72cE8?UI{k}tfz;a>1=o;xZRWJ8$lX9ir7y!hQyr;St9mMMPmE}&V`^EH5v|`QoE3VAuoNst`MgM3~F*wYi!0o#C-nGpy@0wqo zA{fXtUvh_MLbTQ%mMI60Phwc!&XlrbX&R4ds>_rEmd%$u7q|<}$Y7YTS?|Kyo#O8V zEcY(oXYgUF!-3u;>o2`Un;0GZIIpNQvR^#Mf2sP_F2_oh4@pmdZuFHlU$_4H>pQw! z6T+GFy_w9JycVQBP-~2{ebRpMonXesK%N8}6$5vnAG!-zxR}j3YgV=YN#9U)U>&53FEQHf3!1BlP0JA88k+HxhFBoOe88x!4#UD>f>E^nP*87WBQ#xzhU}0|Tec zRENU{^5-)MF*H07+L0U}$C)wzz}ef|^L&jNPINtso&D_o#{{7t;qO8jvq2}VA+be&5_dUS;#7}yMXM+2Y&CT=X{_=?u6mT+f`>c1?zHgG= zOct{x-E%GG_iP{ymd93%l5@3 zelsTz56(N&S?(EpNdDS2)qEm@qRI-Ecb-h$yfLaDQg2NS|8~%gqf`87W(a=+ll%&ch7oH2^2a0QMhq-)Q&C>W8?d>@dX7zm*cKoT*i?V+pT1*o4aYF zQq&aP=BTZCqFXX=sujozism+HcrCgZ;H?|<%l7|ao9~uI`|W@HVXm54{CrOJ`vcQc z!fsx>bLep)W7h#&(Z;Jc#AO%?zg5ghnp0fD{`|6a;+5_L z7gLy^LVqqkznrZ6a@pdoYuD{twoL}Aa0SO5qe*#re)m^g`tp}u{1}6UHj}p&)AC-H zod(|=>p%3~5SL}Jzp`*f`0_=kJtpitaQVr}YalWAI=$NTXz5C({R| zmp&@8T*?Q#4rtcJur(}~pX_NR;&w>o`n7wZ@w;cMFJ-LIWLmAo^u4#mGc#*d)Zguu zejJPiK`dgSEPfK4RZcH-)ms=U7Myd5l;x7^%OUw+0m1$qrZy2(LS8WAbFly%=)&qpA_f( zhm8j#+YU2q+NZh3_obimL*s}W_12X;^}n@pDD0kn=vL1@!%4ootc%>gguY3C!!78L z=9=I;`(nG>CeOm8qTTztYLoRC6c#IOSff;MjiZ>6A&{?C{K~`(gGn!A9`F@2GDz~Y znqTRxNLRW2<%w1MOm2n~NpcJPjxa0VO#Ad{s_v>|^Jj1~aMap6%)XH97ITJm-fQ_! z`rlkR74H0PxOQyW&d!e?bKPRLw77l0a^+K>KtsTNrfXY&)?^-W59$5BN^5#1CnHA) z%d`@W)FU19WvmRoME#fO>tgblYsLThl|zBamEg8t>|R<-`;+76FkG^iT6K=u-?hSf z-)igSul5N1W@4SNE@kt|bIvC__N!ct44pMipy7(j?6WoH{^vSQ?_|(bWZ2S_l89tF|T-C1E=dn=F*myFZwChE!L`ay!tEr z4YwFbeC5+KtcLFcr{)Emf5$C;oFSw_Vb7XrpDmUD6<7RtV0=%ADd6GuCcAhk$(xBs z>VH*zJ|4PtdQ$uj2CZvczgC}pDy%&F)wu)J?|2wiv^=@8&}=%ho0ZO zzr?to_mJz-5W5wP)!xk#g65TG4>p@kt!xf3>v*0ap!{grIkp$shrK%63L>PB2(Nlt zTT-i}oOGJ^;ViSs+j*VtD#SfuF;v=iLm=*A+NS#odw5dW&#zo|e7(Bh#+yMG%yX6G zC0k|}E!+|Pz1C)_V^7D~I!l32VxEkG{>o!VBk#Yy!}-RiMH>rF95`t*;WF>y)$8D~5$5-re3RG&?)or#*V*0Ae4yugU;cti#X&|Rm*+tT)R#7NF+S<*n{&P8 z!Q?=f_E`r%Eo5Z*Vf>SCX=CNABOT|aG=`NN{WF8{PfE#?8!Ijy=z7h~a#FC}Lk{BXUVuOzEUr(lwV;U>)obAt{{VO(?k#>YD^ z6Bg~*7a_1XZNjIgyv!Lc27wyfif*fUrUahS|7Dk|kl|wx_(dpU!jx74a2_iO!X4P?%k+Vnj2@<*0(ZpAjAr9VuU{)}Y4(X=TbQux*0*WFx(Ddo&} z4I6a-#6yN5~AZ+{#J3? zJalciF^?_v_Q{W(n;3H*cPD7c`tMs9*mEO}?P*lyS%z)1gVoj3lYj5B-?8t7!0lE1 z7cN&{pFi(rD#QO~m-GDJ&Mn!xQiJF4@yu*_a&d) zMbU*fvP8|_9nE~ru&DmP6-E(}BT7@dxVn`1*5*cauiY2^%BkShgeTADJ#YLj{-pZ+ z@44^i+&S!M=%mNh5PfT@z8OQSjYinR*oV%=9HOQS`%bp^KRMpPsKNHj`ewP!2!^w@? za(&f8#4CYz1Gfnh;PKJV6S>EDwS95Q|}20UKBXV#k@T?2-tJ-Z~D7#6-{ zb?}?F(}jV-v0*~%f946{ebNl;Cw3hDzG4S^NyM4$Z34f}E?0Qce^9FaDkt-U(4fvI zS)#w3n-~_xGdoPzxVLTV7CAEpF&4)N$AasYKQ`U{!*P=R9N&Xhw`IF|8eHECPI>w4 zuxY77d`>*egsavKo$LF7#(8~BAhHS&x$oVt{?cS-*nerNPg`oA^&DY^ z_2>R?eJq>NX;v!1@FQ8^%=&LX&##D<+E#nf;ohwOtJl5HJbpWk;lX_qQ$2eTE|&WS za!zs*|9dnTX8dRN5ucg1_sr*pj{;f`Kc4qCHOXXVFjk)XD#@nB%aGw%$oB7{`&aWY zoSB#5oa`2RwRq<1)o;0ZivHR+*lRHOm8%DL^Dvxwx$Z!C?8E(flY4LMyPyzW_WyBK z$gf2ckIAwzd}{ZZmKNR+v&8fH=kr+sdMg4ojTt7?8^zw;w~FgN?@WF11VN{x(trQF z_$TfBa4s7ISO1yowp+C&w%0m3vC97SS@Di7v|jw`gbRO}MJ6-9ESXux`uyrt-ct+y ztY>(-`?q}P-qg_Y*E|e6+S`6zU@J}MPq}1xTU=|({Pz2y@#{m=-FX>yO!wIEuOm5Z z<}^XUS*tIepYZC{pMO4S8yOkCKb{e~%vSw#-K5USgFI)yTsvQoTIm}0^~ekM1tOLc zPMVxJGClQ~;>;?g1BcrF6~B|`V)^yuoqqX0#yt)hk#mdVE@&6`3$VS&@817vN&MGM z=NTH(4=cRR`OL}uC3sc4Ot*c5D@*qD+$&-GxBET2K9eyqVY%AtD?eBB&08fG@rN-- zB_eqD!b(?@)vXB;cNOL@+~6!6++DxF?*Cr42i4Wz-`@%maVY$wcQ-`KEccR2bjb=O zj;;lw?1C(T*Mr)dn)R$SB<5u%t;t-m^4c%?8Lo4=nk+0hbo;u*jyTGMta!9QWL3iD zFHcp!#O#P|a^f{p`}n(Yvs&f%Lp$Gx?`SBuytlk)#-@DXk6D?g_q~$5k?u6>@pG;J zj?4^K_f*u(?t0XBPH6uMldeC^J5^8Jzh3k2!ZW>o)9vj%3~O4s9-8J=d(k^eAT896 zb?SukO#$0OMDC0JXFu!c_jLbxh6DQxOlQ8iI&agwQ!kc!WnPR`{IKigFOho3LDq!~=| z+wQvi&|j_fb3Ubg)oOHoxSjLP>p9+1>;1jr9-A*HypzGO;AZOjbhDLL{8rpin|i%0 zuppf4Uwy^z6>sET=k-|D}1`JLcrAsw#YC+u9p zqFZn@AX2xcd|LdKLOl&*udw6x3kqMDF)$<-B`3d~*muED^hu@a`aMC<>Ni?Und;Rn zTKk}G{`+$u>R)Z&U&hDv=Pd9H$5$F8A z=isq$uTahF6BfKOu1UQqT63{(z0vwT0n4UvK5Z)U+F!bxk>SemCr94uF8p?ueaq5k zj!$` +1. **Skill aquired paragraph** Defines clearly the knowledge/skill aquired by successfully + completing the tutorial. One sentence long. +1. **Description paragraph** The description goes into greater detail. It is intended to + help the consumer decide if the tutorial is appropriate for consumption. This may + include examples of applicability (where the operation(s) in this tutorial would be + useful) If there are areas of likely interest that the tutorial does *not* cover, + that is explained as well. + +#### Intro +* Titled with `## Intro` One or two paragraphs that give context and background. This + section gives users who are interested some of the philosophical points of what the + tutorial is doing, or should do. + + +#### LIST OF STEPS/OPERATIONS IN THE TUTORIAL +* This section is titled `## Steps` +* If there are 2 or more steps to the tutorial an in-order, + titled and numbered list of steps (must use `1.` for each step). + A brief description is recommended but not needed. If there are + 'complication' scenarios as described in + [#46](https://github.com/steemit/devportal/issues/46), those are enumerated here. +* Each step should have its name bolded. And should link to the tutorial step + + +#### TUTORIAL +* The tutorial in detail, with each step titled & numbered exactly as output in the above section. +* Tutorial section begins with a horizontal rule `---`. There is no large text + + + +##### TUTORIAL STEP +* Each step describes what happens in that step. +* Each step should start with `#### ` +* A step may be numbered as a "primary" step ex: `1.` or a "secondary" step `1.a.` +* If there is a code-block that the writer feels should be in the "right-code" section of the + developer portal, that code-block should be created with `~~~` + * there may be only one `~~~` code-block per api step (but multiple ` ``` `) +* A step includes no more than one api call + * If there is an api call, there is a block with the title "Query" showing + the parameters for the call, and at least one block titled "Response" + showing a possible response from the api (multiple possible responses may be + shown, so long as they are numbered/labels and there are adequate descriptions + of each response & why it would be emitted by the API) + + +##### DONE STATEMENT +* *optional* - a wrapup of some kind. +* A simple, bolded statement telling the consumer they're done. + + +#### RUN INSTRUCTIONS +* Titled `## To Run` Describes the running environment + (may link to external doc for brevity) with the final "run" instruction(s) + listed here, as well as any tutorial specific configurations or settings. + If the tutorial/recipe does not have runnable code, states that. + + +#### Troubleshooting - optional +Any issues that may require troubleshooting + +#### FOOTNOTES - optional +A section for any caveat, gotchas, references. The `46` _Simple Arguments_, _Advanced Arguments_, & _Expanded Results_ should be able to point to Steem's API specification in the devportal for the relevant calls. If the specification isn't clear enough, it needs to be updated. + + +### LINGUISTIC PRECISION +It's very important that the tutorials be both accurate and precise in their language. +* a `function` something used within the client +* a `api call`or `rpc` is a call made between the client and the server. Ex in `client.database.call('get_active_votes', [author, permlink])` is an api call and should be referred to in a manner similar to _the rpc `get_active_votes` ..._. When referencing `.call()` it is a function. +* `` tags that take the user to a different page/site should be referred to as links +* `` ` + Steem Developer logo + + + +
        + + +
        + + + + + + + + + + + + +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/blog_feed.html b/docs/tutorials-javascript/blog_feed.html new file mode 100644 index 00000000..29b197fd --- /dev/null +++ b/docs/tutorials-javascript/blog_feed.html @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + +JS: Blog Feed | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Blog Feed + + +

        + +

        By the end of this tutorial you should know how to fetch most recent five posts from particular user on Steem.

        +
        + + +

        Full, runnable src of Blog Feed can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial pulls a list of the most recent five user’s posts from the blockchain and displays them in simple list. Also some notes about usage of client.database.getDiscussions API.

        + +

        Intro

        + +

        Tutorial is demonstrates the typical process of fetching account blog posts. It is quite useful if you want to embedd your blog posts on your website these tutorial will help you achieve that goal as well. This tutorial will explain and show you how to access the Steem blockchain using the dsteem library to build a basic blog list of posts filtered by a tag

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to use proper connection and network
        2. +
        3. Query format Simple query format to help use fetch data
        4. +
        5. Fetch data and format Fetch data and display in proper interface
        6. +
        + +
        + +

        1. Configure connection

        + +

        In order to connect to the live Steem network, all we have to do is provide connection url to a server that runs on the network. dsteem by default set up to use live network but it has flexibility to adjust connection to any other testnet or custom networks, more on that in future tutorials.

        + +

        In first couple lines we require package and define connection server:

        + +
        const { Client } = require('dsteem');
        +
        +const client = new Client('https://api.steemit.com');
        +
        + +

        2. Query format

        + +
          +
        • You can add a tag to filter the blog posts that you receive from the server, since we are aiming to fetch blog posts of particular user, we will define username as tag.
        • +
        • You can also limit the number of results you would like to receive from the query
        • +
        + +
        var query = {
        +    tag: 'steemitblog', // This tag is used to filter the results by a specific post tag
        +    limit: 5, // This limit allows us to limit the overall results returned to 5
        +};
        +
        + +

        3. Fetch data and format

        + +

        client.database.getDiscussions function is used for fetching discussions or posts. The first argument to this function determines which equivalent of the appbase condenser_api.get_discussions_by_* api calls it’s going to use. Below is example of query and keyword ‘blog’ indicates condenser_api.get_discussions_by_blog and somewhat counter-intuitively query.tag indicates the account from which we want to get posts.

        + +
            client.database
        +        .getDiscussions('blog', query)
        +        .then(result => {
        +            var posts = [];
        +            result.forEach(post => {
        +                const json = JSON.parse(post.json_metadata);
        +                const image = json.image ? json.image[0] : '';
        +                const title = post.title;
        +                const author = post.author;
        +                const created = new Date(post.created).toDateString();
        +                posts.push(
        +                    `<div class="list-group-item"><h4 class="list-group-item-heading">${title}</h4><p>by ${author}</p><center><img src="${image}" class="img-responsive center-block" style="max-width: 450px"/></center><p class="list-group-item-text text-right text-nowrap">${created}</p></div>`
        +                );
        +            });
        +
        +            document.getElementById('postList').innerHTML = posts.join('');
        +        })
        +        .catch(err => {
        +            alert('Error occured' + err);
        +        });
        +
        + +

        The result returned form the service is a JSON object with the following properties:

        + +
        [
        +    {
        +        "id": 37338948,
        +        "author": "steemitblog",
        +        "permlink": "join-team-steemit-at-tokenfest",
        +        "category": "steemit",
        +        "parent_author": "",
        +        "parent_permlink": "steemit",
        +        "title": "Join Team Steemit at TokenFest!",
        +        "body":
        +            "<a href=\"https://tokenfest.adria.digital\"><img src=\"https://i.imgur.com/fOScDIW.png\"/></a>\n\nHello Steemians! If you’d like to meet Team Steemit live-in-person, or are just interested in attending what promises to be a great blockchain conference, join us at <a href=\"https://tokenfest.adria.digital/\">TokenFest</a> in San Francisco from March 15th to 16th. \n\nSteemit CEO, Ned Scott, will be participating in a fireside chat alongside Steemit’s CTO, Harry Schmidt, as well as the creator of Utopian.io, Diego Pucci. Steemit will also be hosting the opening party on Thursday night and we’d certainly love to meet as many of you as possible IRL, so head on over to https://tokenfest.adria.digital/ and get your tickets while you can. \n\n*Team Steemit*",
        +        "json_metadata":
        +            "{\"tags\":[\"steemit\",\"tokenfest\",\"conference\"],\"image\":[\"https://i.imgur.com/fOScDIW.png\"],\"links\":[\"https://tokenfest.adria.digital\",\"https://tokenfest.adria.digital/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +        "last_update": "2018-03-07T23:22:54",
        +        "created": "2018-03-07T20:56:36",
        +        "active": "2018-03-13T01:40:21",
        +        "last_payout": "1970-01-01T00:00:00",
        +        "depth": 0,
        +        "children": 29,
        +        "net_rshares": "11453442114933",
        +        "abs_rshares": "11454054795840",
        +        "vote_rshares": "11454054795840",
        +        "children_abs_rshares": "13568695606090",
        +        "cashout_time": "2018-03-14T20:56:36",
        +        "max_cashout_time": "1969-12-31T23:59:59",
        +        "total_vote_weight": 3462435,
        +        "reward_weight": 10000,
        +        "total_payout_value": "0.000 SBD",
        +        "curator_payout_value": "0.000 SBD",
        +        "author_rewards": 0,
        +        "net_votes": 77,
        +        "root_comment": 37338948,
        +        "max_accepted_payout": "0.000 SBD",
        +        "percent_steem_dollars": 10000,
        +        "allow_replies": true,
        +        "allow_votes": true,
        +        "allow_curation_rewards": true,
        +        "beneficiaries": [],
        +        "url": "/steemit/@steemitblog/join-team-steemit-at-tokenfest",
        +        "root_title": "Join Team Steemit at TokenFest!",
        +        "pending_payout_value": "46.436 SBD",
        +        "total_pending_payout_value": "0.000 STEEM",
        +        "active_votes": [
        +            {
        +                "voter": "steemitblog",
        +                "weight": 0,
        +                "rshares": "1870813909383",
        +                "percent": 10000,
        +                "reputation": "128210130644387",
        +                "time": "2018-03-07T20:56:36"
        +            },
        +            {
        +                "voter": "kevinwong",
        +                "weight": 526653,
        +                "rshares": "2208942520687",
        +                "percent": 5000,
        +                "reputation": "374133832002581",
        +                "time": "2018-03-08T04:27:00"
        +            }
        +        ],
        +        "replies": [],
        +        "author_reputation": "128210130644387",
        +        "promoted": "0.000 SBD",
        +        "body_length": 754,
        +        "reblogged_by": []
        +    }
        +]
        +
        + +

        From this result we have access to everything associated to the post including additional metadata which is a JSON string that must be decoded to use. This JSON object has additional information and properties for the post including a reference to the image uploaded. And we are displaying this data in meaningful user interface. Note: it is truncated to one element, but you would get five posts in array

        + +

        That’s all there is to it.

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/01_blog_feed
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/claim_rewards.html b/docs/tutorials-javascript/claim_rewards.html new file mode 100644 index 00000000..dd3fc96e --- /dev/null +++ b/docs/tutorials-javascript/claim_rewards.html @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + +JS: Claim Rewards | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Claim Rewards + + +

        + +

        Learn how to claim rewards from unclaimed reward balance using Steemconnect as well as client signing method.

        +
        + + +

        Full, runnable src of Claim Rewards can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial runs on the main Steem blockchain. And accounts queried are real users with unclaimed balances.

        + +

        Intro

        + +

        This tutorial will show few functions such as querying account by name and getting unclaimed rewards. We are using the call function provided by the dsteem library to pull accounts from the Steem blockchain. A simple HTML interface is used to capture the account and its unclaimed balance as well as allowing interactively claim rewards.

        + +

        Steps

        + +
          +
        1. App setup Setup dsteem to use the proper connection and network.
        2. +
        3. Search account Get account details after input has account name
        4. +
        5. Fill form Fill form with account reward balances
        6. +
        7. Claim reward Claim reward with Steemconnect or Client signing options
        8. +
        + +

        1. App setup

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Search account

        + +

        After account name field is filled with some name, we do automatic search for account by name when input is focused out. HTML input forms can be found in the index.html file. The values are pulled from that screen with the below:

        + +
            const accSearch = document.getElementById('username').value;
        +    const _accounts = await client.database.call('get_accounts', [[accSearch]]);
        +    console.log(`_accounts:`, _accounts);
        +
        + +

        3. Fill form

        + +

        After we fetched account data, we will fill form with reward balance and show current reward balance details.

        + +
        const name = _accounts[0].name;
        +const reward_steem = _accounts[0].reward_steem_balance.split(' ')[0];
        +const reward_sbd = _accounts[0].reward_sbd_balance.split(' ')[0];
        +const reward_sp = _accounts[0].reward_vesting_steem.split(' ')[0];
        +const reward_vests = _accounts[0].reward_vesting_balance.split(' ')[0];
        +const unclaimed_balance = `Unclaimed balance for ${name}: ${reward_steem} STEEM, ${reward_sbd} SBD, ${reward_sp} SP = ${reward_vests} VESTS<br/>`;
        +document.getElementById('accList').innerHTML = unclaimed_balance;
        +document.getElementById('steem').value = reward_steem;
        +document.getElementById('sbd').value = reward_sbd;
        +document.getElementById('sp').value = reward_vests;
        +
        + +

        4. Claim reward

        + +

        We have 2 options on how to claim rewards. Steemconnect and Client signing options. We generate Steemconnect link to claim rewards, but you can also choose client signing option to claim rewards right inside tutorial.

        + +

        In order to enable client signing, we will generate operation and also show Posting Private key (wif) field to sign transaction right there client side. +Below you can see example of operation and signing transaction, after successful operation broadcast result will be shown in user interface. It will be block number that transaction was included.

        + +
        window.submitTx = async () => {
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('wif').value
        +    );
        +    const op = [
        +        'claim_reward_balance',
        +        {
        +            account: document.getElementById('username').value,
        +            reward_steem: document.getElementById('steem').value + ' STEEM',
        +            reward_sbd: document.getElementById('sbd').value + ' SBD',
        +            reward_vests: document.getElementById('sp').value + ' VESTS',
        +        },
        +    ];
        +    client.broadcast.sendOperations([op], privateKey).then(
        +        function(result) {
        +            document.getElementById('result').style.display = 'block';
        +            document.getElementById(
        +                'result'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +};
        +
        + +

        That’s it!

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/21_claim_rewards
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/client_signing.html b/docs/tutorials-javascript/client_signing.html new file mode 100644 index 00000000..023caf0a --- /dev/null +++ b/docs/tutorials-javascript/client_signing.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + +JS: Client Signing | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Client Signing + + +

        + +

        By the end of this tutorial you would know how to sign, verify broadcast transactions locally on Steem.

        +
        + + +

        Full, runnable src of Client Signing can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial gives you overview of how client side transaction signing works under the hood.

        + +

        Purpose is to guide you through the steps required so that you could adapt this in your own applications.

        + +

        We have predefined accounts to select for you to quickly use and few transaction types to test the process.

        + +

        Intro

        + +

        Client side signing of transaction is yet another way of interacting with Steem blockchain. Compare to Steemconnect method, client signing doesn’t rely on other servers to generate and verify transaction, except when transaction is broadcasted to the network, it should be routed through one of the servers connected to that network or blockchain. It can be your own local machine running Steem blockchain or it could be any other publicly accessible servers.

        + +

        Steps

        + +
          +
        1. App setup Import dsteem into app.js and prepare it to communicate with a Testnet instance of Steem blockchain
        2. +
        3. Get globals Network globals
        4. +
        5. Account selection Select predefined account
        6. +
        7. Operation selection Select common operations
        8. +
        9. Generate transaction Generate transaction with selected account and operation
        10. +
        11. Sign and verify transaction Sign and verify signature of the transaction
        12. +
        13. Broadcast transaction Broadcast signed transaction to the network
        14. +
        + +

        1. App setup

        + +

        Testnet and Production networks only differ with few settings which helps developers to switch their application from testnet to production. One of these settings is addressPrefix - string that is defined and will be in front of every public address on that chain/network. Another one is chainId - id of that network. By defining those parameters we are selecting Testnet and connecting to publicly available server with help of dsteem library. First few lines of code in public/app.js gives you example of connection to different networks, testnet and production.

        + +
        opts.addressPrefix = 'TST';
        +opts.chainId =
        +    '46d82ab7d8db682eb1959aed0ada039a6d49afa1602491f93dde9cac3e8e6c32';
        +//connect to server which is connected to the network/testnet
        +const client = new dsteem.Client('https://testnet.steemitdev.com', opts);
        +
        + +
          +
        • Disclaimer: In this tutorial we are using testnet powered by community member (@almost-digital) and predefined accounts reside on this network only.
        • +
        + +

        2. Get globals

        + +

        To test connection as well as to get parameters of the connected network, we can use getDynamicGlobalProperties function from dsteem library. Only 2 fields are in our interesting for this tutorial, head_block_number - returns head or latest block number of the network, head_block_id - returns id of head block.

        + +

        Overview

        + +

        3. Account selection

        + +

        We have predefined list of accounts to help you with generate, sign, verify and broadcast transaction on testnet. Select list has posting private key for each account and onchange selection event we keep account name and credentials in memory. accountChange function shows example of turning plain posting private key into private key buffer format that is understandable by dsteem.

        + +
        privateKey = dsteem.PrivateKey.fromString(
        +    document.getElementById('account').value
        +);
        +
        + +

        Account and its credentials should belong to specified testnet/mainnet network to sign/verify/broadcast transactions properly.

        + +

        4. Operation selection

        + +

        Number of operations are also predefined to show you example of operation format. opChange also keeps selected operation name in memory.

        + +

        5. Generate transaction

        + +

        Next we have button which helps us to generate operation object. Depending on selected operation type we have different structure for operation object. Typically, each transaction object has following fields:

        + +
          +
        • ref_block_num - references block number in past, in this example we have chosen head block number, but it is possible to use a block number from up to 65,536 blocks ago. This is required in TaPoS (Transaction as Proof of Stake) to avoid network forks.
        • +
        • ref_block_prefix - reference buffer of block id of ref_block_num as prefix
        • +
        • expiration - transaction expiration date in future, in our example we have set it +1 minute into future
        • +
        • operations - array of operations, this field holds main information about transaction type and its structure which is recognized by the network
        • +
        • extensions - any extensions to the transaction to change its parameters or options
        • +
        + +

        Vote operation example

        + +
        op = {
        +    ref_block_num: head_block_number,
        +    ref_block_prefix: Buffer.from(head_block_id, 'hex').readUInt32LE(4),
        +    expiration: new Date(Date.now() + expireTime).toISOString().slice(0, -5),
        +    operations: [['vote', {
        +        voter: account,
        +        author: 'test',
        +        permlink: 'test',
        +        weight: 10000
        +    }]],
        +    extensions: [],
        +}
        +
        + +

        First item, operation type, vote and second item object with voter - account that is casting vote, author - author of post vote is being casted to, permlink - permanent link of the post, weight - vote weight 10000 being 100%, 1 being 0.01% smallest voting unit.

        + +

        And output of operation object/json is set to OpInput element.

        + +

        6. Sign and verify transaction

        + +

        Each operation needs to be signed before they can be sent to the network, transactions without signature will not be accepted by network. Because someone has to identify operation and sign it with their private keys. Sign transaction button calls for signTx function which is job is to sign selected operation and its obkect with selected account. And output result into TxOutput element.

        + +

        stx = client.broadcast.sign(op, privateKey)

        + +

        Verifying transaction process is mostly done automatically but to show every step, we have included this process to check validity of the transaction signature. Verify transaction button calls verifyTx function. Function then verify authority of the signature in signed transaction, if it was signed with correct private key and authority. If verification is successful user interfaces adds checkmark next to button otherwise adds crossmark to indicate state of the signature.

        + +

        const rv = await client.database.verifyAuthority(stx)

        + +

        7. Broadcast transaction

        + +

        Final step is to broadcast our signed transction to the selected server. Server chosen in Connect section will handle propagating transction to the network. After network accepts transaction it will return result with transaction id, block_num that this transaction is included to, trx_num transaction number, and if it is expired or not.

        + +

        const res = await client.broadcast.send(stx)

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/03_client_signing
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/convert_sbd_to_steem.html b/docs/tutorials-javascript/convert_sbd_to_steem.html new file mode 100644 index 00000000..f70d935c --- /dev/null +++ b/docs/tutorials-javascript/convert_sbd_to_steem.html @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + +JS: Convert Sbd To Steem | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Convert Sbd To Steem + + +

        + +

        How to convert SBD to STEEM for a specified account.

        +
        + + +

        Full, runnable src of Convert Sbd To Steem can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of checking a specific users’ balances and then broadcasting the intended SBD conversion to the blockchain. Demo account information has been provided to assist with the tutorial. This tutorial has been set up for the testnet but can be easily be changed for production.

        + +

        It should be noted that the converted STEEM will not be available instantly as it takes 3.5 days for the transaction to be processed. It is also not possible to stop a conversion once initialised. During the 3.5 days for it to be converted and as the conversion price fluctuates you could actually be receiving less STEEM than what you should. Because of this, the method in this tutorial is NOT the preferred or most efficient way of converting SBD to STEEM. This tutorial just illustrates that it can be done in this manner.

        + +

        There is a marketplace on Steemit that allows you to “sell” your SBD instantly. With this process you can get your STEEM immediately and at the exact price that you expect. The market place is the better way to convert your SBD. This article provides more information on using the market to exchange your SBD to STEEM

        + +

        Steemconnect offers an alternative to converting SBD with a “simple link” solution. Instead of running through a list of operations on your account, you can simply use a link similar to the one below substituting the three parameters for your own details. You will be prompted to enter your username and password before the transaction will be executed. +https://steemconnect.com/sign/convert?owner=username&requestid=1234567&amount=0.000%20SBD +This is similar to the steemconnect links that have been covered in previous tutorials. For a list of signing operations that work in this manner you can go to https://v2.steemconnect.com/sign +This article has more information on using steemconnect

        + +

        Intro

        + +

        This tutorial uses the database API to gather account information for the current SBD and STEEM balances of the specified user. This information is then used to assist the user in completing the conversion request. The values are then captured and the operation is transmitted via the broadcast API. The parameters for this convert function are:

        + +
          +
        1. owner - The account for which the conversion is being done
        2. +
        3. requestid - Integer identifier for tracking the conversion. This needs to be a unique number for a specified user
        4. +
        5. amount - The amount of SBD to withdraw
        6. +
        + +

        The only other information required is the private active key of the user.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. User account User account is captured and balances displayed
        4. +
        5. Input variables Collecting the required inputs via an HTML UI
        6. +
        7. Broadcast operation Broadcasting the operation to the blockchain
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        import { Client, PrivateKey } from 'dsteem';
        +import { Testnet as NetConfig } from '../../configuration'; //A Steem Testnet. Replace 'Testnet' with 'Mainnet' to connect to the main Steem blockchain.
        +
        +let opts = { ...NetConfig.net };
        +
        +// //connect to a steem node, tesetnet in this case
        +const client = new Client(NetConfig.url, opts);
        +
        + +

        Above, we have dsteem pointing to the testnet with the proper chainId, addressPrefix, and endpoint by importing it from the configuration.js file. Due to this tutorial altering the blockchain it is preferable to not work on production.

        + +

        2. User account

        + +

        The user account is input through the UI. Once entered, the user can select the search button to display the SBD and STEEM balances for that account. During this step, a random number is also generated for the requestid. This value can be changed to any integer value as long as it is unique for the specific account. If the requestid is duplicated an error to do with “uniqueness constraint” will be displayed in the console. For ease of use values for a demo account has already been entered in the relevant fields once the page loads.

        + +
        window.onload = async () => {
        +    const account = NetConfig.accounts[0];
        +    document.getElementById('username').value = account.address;
        +    document.getElementById('privateKey').value = account.privActive;
        +};
        +
        + +

        With the account search function as seen below.

        + +
        window.submitAcc = async () => {
        +    const accSearch = document.getElementById('username').value;
        +
        +    const _account = await client.database.call('get_accounts', [[accSearch]]);
        +    console.log(`_account:`, _account);
        +
        +    const availSBD = _account[0].sbd_balance 
        +    const availSTEEM = _account[0].balance
        +
        +    const balance = `Available balance: ${availSBD} and ${availSTEEM} <br/>`;
        +    document.getElementById('accBalance').innerHTML = balance;
        +
        +    //create random number for requestid paramter
        +    var x = Math.floor(Math.random() * 10000000);
        +    document.getElementById("requestID").value = x
        +}
        +
        + +

        3. Input variables

        + +

        The parameters for the convert function are input in the UI and assigned as seen below once the user presses the convert button.

        + +
        //get all values from the UI
        +//get account name
        +const username = document.getElementById('username').value;
        +//get private active key
        +const privateKey = PrivateKey.fromString(
        +    document.getElementById('privateKey').value
        +);
        +//get convert amount
        +const quantity = document.getElementById('quantity').value;
        +//create correct format
        +const convert = quantity.concat(' SBD');
        +//assign integer value of ID
        +const requestid = parseInt(document.getElementById('requestID').value);
        +
        + +

        4. Broadcast operation

        + +

        With all the parameters assigned we create an array for the convert function and transmit it to the blockchain via the sendOperation function in the broadcast API.

        + +
        //create convert operation
        +const op = [
        +    'convert',
        +    { owner: username, amount: convert, requestid: requestid },
        +];
        +    
        +//broadcast the conversion
        +client.broadcast.sendOperations([op], privateKey).then(
        +    function(result) {
        +        console.log(
        +            'included in block: ' + result.block_num,
        +            'expired: ' + result.expired
        +        );
        +        document.getElementById('convertResultContainer').style.display = 'flex';
        +        document.getElementById('convertResult').className =
        +            'form-control-plaintext alert alert-success';
        +        document.getElementById('convertResult').innerHTML = 'Success';
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('convertResultContainer').style.display = 'flex';
        +        document.getElementById('convertResult').className =
        +            'form-control-plaintext alert alert-danger';
        +        document.getElementById('convertResult').innerHTML = error.jse_shortmsg;
        +    }
        +);
        +
        + +

        The results of the operation is displayed on the UI along with a block number in the console to confirm a successful operation.

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/32_convert_sbd_to_steem
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/create_account.html b/docs/tutorials-javascript/create_account.html new file mode 100644 index 00000000..60737af2 --- /dev/null +++ b/docs/tutorials-javascript/create_account.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + +JS: Create Account | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/delegate_power.html b/docs/tutorials-javascript/delegate_power.html new file mode 100644 index 00000000..2cac8b12 --- /dev/null +++ b/docs/tutorials-javascript/delegate_power.html @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + +JS: Delegate Power | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Delegate Power + + +

        + +

        Delegate power to other users using Steemconnect or Client-side signing.

        +
        + + +

        Full, runnable src of Delegate Power can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial runs on the main Steem blockchain. And accounts queried/searched are real accounts with their available VESTS balances and estimated STEEM POWER holdings.

        + +

        Intro

        + +

        This tutorial will show few functions such as querying account by name and getting account vesting balance. We then convert VESTS to STEEM POWER for convenience of user. And allow user to choose portion or all holdings of VESTS to delegate other users. A simple HTML interface is provided to capture the account with search and its VESTS balance as well as allowing interactively delegate.

        + +

        Steps

        + +
          +
        1. App setup Setup dsteem to use the proper connection and network.
        2. +
        3. Search account Get account details after input has account name
        4. +
        5. Calculate and Fill form Calculate available vesting shares and Fill form with details
        6. +
        7. Delegate power Delegate VESTS with Steemconnect or Client-side signing.
        8. +
        + +

        1. App setup

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Search account

        + +

        After account name field is filled with some name, we do automatic search for account by name when input is focused out. HTML input forms can be found in the index.html file. The values are pulled from that screen with the below:

        + +
            const accSearch = document.getElementById('username').value;
        +    const _account = await client.database.call('get_accounts', [[accSearch]]);
        +    console.log(`_account:`, _account);
        +
        + +

        3. Calculate and Fill form

        + +

        After we fetched account data, we will fill form with VESTS balance and show current balance details. Note, that in order to get available VESTS balance we will have to check if account is already powering down and how much is powering down, how much of VESTS were delegated out which locks them from being powered down. Available balance will be in avail variable, next for convenience of user, we convert available VESTS to STEEM with getDynamicGlobalProperties function and fill form fields accordingly.

        + +
            const name = _account[0].name;
        +    const avail = parseFloat(_account[0].vesting_shares) - (parseFloat(_account[0].to_withdraw) - parseFloat(_account[0].withdrawn)) / 1e6 - parseFloat(_account[0].delegated_vesting_shares);
        +
        +    const props = await client.database.getDynamicGlobalProperties();
        +    const vestSteem = parseFloat(parseFloat(props.total_vesting_fund_steem) *
        +        (parseFloat(avail) / parseFloat(props.total_vesting_shares)),6);
        +
        +    const balance = `Available Vests for ${name}: ${avail} VESTS ~ ${vestSteem} STEEM POWER<br/><br/>`;
        +    document.getElementById('accBalance').innerHTML = balance;
        +    document.getElementById('steem').value = avail+' VESTS';
        +
        + +

        Once form is filled with maximum available VESTS balance, you can choose portion or lesser amount of VESTS to delegate other user.

        + +

        4. Delegate power

        + +

        We have 2 options on how to delegate others. Steemconnect and Client-side signing options. By default we generate Steemconnect link to delegate power (delegate vesting shares), but you can choose client signing option to delegate right inside tutorial, note client-side signing will require Active Private key to perform the operation.

        + +

        In order to enable client signing, we will generate operation and also show Active Private key (wif) field to sign transaction client side. +Below you can see example of operation and signing transaction, after successful operation broadcast result will be shown in user interface. It will be block number that transaction was included.

        + +
        window.submitTx = async () => {
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('wif').value
        +    );
        +    const op = [
        +        'delegate_vesting_shares',
        +        {
        +            delegator: document.getElementById('username').value,
        +            delegatee: document.getElementById('account').value,
        +            vesting_shares: document.getElementById('steem').value,
        +        },
        +    ];
        +    client.broadcast.sendOperations([op], privateKey).then(
        +        function(result) {
        +            document.getElementById('result').style.display = 'block';
        +            document.getElementById(
        +                'result'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +};
        +
        + +

        That’s it!

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/25_delegate_power
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/edit_content_patching.html b/docs/tutorials-javascript/edit_content_patching.html new file mode 100644 index 00000000..b14df76b --- /dev/null +++ b/docs/tutorials-javascript/edit_content_patching.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + +JS: Edit Content Patching | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Edit Content Patching + + +

        + +

        By the end of this tutorial you should know how to patch post edits to Steem.

        +
        + + +

        Full, runnable src of Edit Content Patching can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and patching post using the broadcast.comment operation. Being able to patch a post is critical to save resources on Steem.

        + +

        Intro

        + +

        Tutorial is demonstrating the typical process of editing content that has been previously posted on the blockchain. Instead of replacing the entire body of the post, the Steem blockchain offers an alternative strategy. +In this tutorial, we will focus on properly patching existing content and then broadcasting the patch with a demo account on a testnet.

        + +

        We are using the broadcast.comment function provided by dsteem which generates, signs, and broadcast the transaction to the network. On the Steem platform, posts and comments are all internally stored as a comment object, differentiated by whether or not a parent_author exists. When there is no parent_author, it’s a post, when there is, it’s a comment. When editing a post, we need to make sure that we don’t resubmit the same post over and over again, which will spam the network and adds additional cost to operate the platform. Instead we will use a package called diff-match-patch, which allows us to only apply changes and save resources on the Steem platform.

        + +

        Steps

        + +
          +
        1. Configure testnet Testnet connection should be established with proper configurations
        2. +
        3. Get latest post Get @demo’s latest post for editing
        4. +
        5. Creating patch Creating patch with new edited text
        6. +
        7. Submit a patch Submit newly formatted post
        8. +
        + +

        1. Configure testnet

        + +

        As usual, we have a file called public/app.js, which holds the Javascript segment of the tutorial. In the first few lines, we have defined the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to community testnet
        +opts.addressPrefix = 'STX';
        +opts.chainId =
        +    '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673';
        +//connect to server which is connected to the network/testnet
        +const client = new dsteem.Client('https://testnet.steem.vc', opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint. Because this tutorial is interactive, we will not publish test content to the main network. Instead, we’re using testnet and a predefined account to demonstrate post patching.

        + +

        2. Get latest post

        + +

        Next, we have a main function which fires at on-load and fetches latest blog post of @demo account and fills in the form with relevant information.

        + +
        const query = { tag: 'demo', limit: '1' };
        +client.database
        +    .call('get_discussions_by_blog', [query])
        +    .then(result => {
        +        document.getElementById('title').value = result[0].title;
        +        document.getElementById('body').value = result[0].body;
        +        document.getElementById('tags').value = JSON.parse(
        +            result[0].json_metadata
        +        ).tags.join(' ');
        +        o_body = result[0].body;
        +        o_permlink = result[0].permlink;
        +    })
        +    .catch(err => {
        +        console.log(err);
        +        alert('Error occured, please reload the page');
        +    });
        +
        + +

        Notice, we are only fetching a single blog post by specifying a limit and we have filled all necessary fields/variables with the old content.

        + +

        3. Creating patch

        + +

        We have created a small function called createPatch to patch edits to the old content.

        + +
        function createPatch(text, out) {
        +    if (!text && text === '') return undefined;
        +    //get list of patches to turn text to out
        +    const patch_make = dmp.patch_make(text, out);
        +    //turns patch to text
        +    const patch = dmp.patch_toText(patch_make);
        +    return patch;
        +}
        +
        + +

        The createPatch function computes a list of patches to turn old content to edited content.

        + +

        4. Submit a patch

        + +

        Next, we have the submitPost function, which executes when the Submit button is clicked.

        + +
        //get private key
        +const privateKey = dsteem.PrivateKey.fromString(
        +    document.getElementById('postingKey').value
        +);
        +//get account name
        +const account = document.getElementById('username').value;
        +//get title
        +const title = document.getElementById('title').value;
        +//get body
        +const edited_body = document.getElementById('body').value;
        +
        +let body = '';
        +
        +//computes a list of patches to turn o_body to edited_body
        +const patch = createPatch(o_body, edited_body);
        +
        +//check if patch size is smaller than original content
        +if (patch && patch.length < new Buffer(o_body, 'utf-8').length) {
        +    body = patch;
        +} else {
        +    body = o_body;
        +}
        +
        +//get tags and convert to array list
        +const tags = document.getElementById('tags').value;
        +const taglist = tags.split(' ');
        +//make simple json metadata including only tags
        +const json_metadata = JSON.stringify({ tags: taglist });
        +//generate random permanent link for post
        +const permlink = o_permlink;
        +
        +client.broadcast
        +    .comment(
        +        {
        +            author: account,
        +            body: body,
        +            json_metadata: json_metadata,
        +            parent_author: '',
        +            parent_permlink: taglist[0],
        +            permlink: permlink,
        +            title: title,
        +        },
        +        privateKey
        +    )
        +    .then(
        +        function(result) {
        +            document.getElementById('title').value = '';
        +            document.getElementById('body').value = '';
        +            document.getElementById('tags').value = '';
        +            document.getElementById('postLink').style.display = 'block';
        +            document.getElementById(
        +                'postLink'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/><a href="http://condenser.steem.vc/${
        +                taglist[0]
        +            }/@${account}/${permlink}">Check post here</a>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +
        + +

        As you can see from the above function, we get the relevant values from the defined fields. Tags are separated by spaces in this example, but the structure of how to enter tags totally depends on your needs. We have separated tags with whitespaces and stored them in an array list called taglist, for later use. Posts on the blockchain can hold additional information in the json_metadata field, such as the tags list which we have assigned. Posts must also have a unique permanent link scoped to each account. In this case we are just creating a random character string.

        + +

        In the follow code, we patch the old content with new (or edited) content and make sure that the patch size is smaller than edited content, otherwise patching is unnecessary.

        + +
        //computes a list of patches to turn o_body to edited_body
        +const patch = createPatch(o_body, edited_body);
        +
        +//check if patch size is smaller than edited content itself
        +if (patch && patch.length < new Buffer(edited_body, 'utf-8').length) {
        +    body = patch;
        +} else {
        +    body = edited_body;
        +}
        +
        + +

        The next step is to pass all of these parameters to the client.broadcast.comment function. Note that in parameters you can see the parent_author and parent_permlink fields, which are used for replies (also known as comments). In our example, since we are publishing a post instead of a comment/reply, we will have to leave parent_author as an empty string and assign parent_permlink from the first tag.

        + +

        After the post has been broadcasted to the network, we can simply set all the fields to empty strings and show the post link to check it from a condenser instance running on the selected testnet. That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/12_edit_content_patching
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/follow_a_user.html b/docs/tutorials-javascript/follow_a_user.html new file mode 100644 index 00000000..7a92be29 --- /dev/null +++ b/docs/tutorials-javascript/follow_a_user.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + +JS: Follow A User | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Follow A User + + +

        + +

        Follow and unfollow a user / author.

        +
        + + +

        Full, runnable src of Follow A User can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of checking the follow status of an author and either follow or unfollow that user depending on the current status. This is done with the call operation as well as the broadcast.json operation.

        + +

        Intro

        + +

        We are using the broadcast.json operation provided by the dsteem library to follow or unfollow a selected author. There are 4 variables required to execute this operation:

        + +
          +
        1. follower - The specific user that will select the author to follow/unfollow (username).
        2. +
        3. privatekey - This is the private posting key of the user(postingKey).
        4. +
        5. following - The account/author that the user would like to follow (author).
        6. +
        7. what - The type of follow operation. This variable can have one of two values: blog, to follow an author, and a null value, unfollow the selected author.
        8. +
        + +

        A simple HTML UI is used to capture the required information, after which the broadcast operation can be compiled.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with the Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI
        4. +
        5. Get status Get the follow status for the specified author
        6. +
        7. Follow operation Execute the follow operation
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        import { Client, PrivateKey } from 'dsteem';
        +import { Testnet as NetConfig } from '../../configuration'; //A Steem Testnet. Replace 'Testnet' with 'Mainnet' to connect to the main Steem blockchain.
        +
        +let opts = { ...NetConfig.net };
        +
        +//connect to a steem node, testnet in this case
        +const client = new Client(NetConfig.url, opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint by importing from the configuration.js file. Because this tutorial is interactive, we will not publish test content to the main network. Instead, we’re using the testnet and a predefined account which is imported once the application loads, to demonstrate following of an author.

        + +
        window.onload = async () => {
        +    const account = NetConfig.accounts[0];
        +    const accountI = NetConfig.accounts[1];
        +    document.getElementById('username').value = account.address;
        +    document.getElementById('postingKey').value = account.privPosting;
        +    document.getElementById('author').value = accountI.address;
        +};
        +
        + +

        2. Input variables

        + +

        The required parameters for the follow operation is recorded via an HTML UI that can be found in the public/index.html file.

        + +

        The parameter values are allocated as seen below once the user clicks on the “Follow / Unfollow” button.

        + +
        window.submitFollow = async () => {
        +    //get private key
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('postingKey').value
        +    );
        +    //get account name
        +    const follower = document.getElementById('username').value;
        +    //get author permalink
        +    const following = document.getElementById('author').value;
        +
        + +

        3. Get status

        + +

        The current follow status for the author is called from the database and a variable is assigned in order to specify whether the follow operation should execute as follow or unfollow. For more information on this process you can refer to tutorial 19_get_follower_and_following_list.

        + +
        console.log({ follower: follower, following: following });
        +
        +    let status = await client.call('follow_api', 'get_following', [
        +        follower,
        +        following,
        +        'blog',
        +        1,
        +    ]);
        +
        +    console.log({ status: status });
        +
        +    if (status.length > 0 && status[0].following == following) {
        +        type = '';
        +    } else {
        +        type = 'blog';
        +    }
        +
        + +

        4. Follow operation

        + +

        A JSON with the collected input variables is created in order for the data object within the broadcast operation to be completed.

        + +
        const json = JSON.stringify([
        +    'follow',
        +    {
        +        follower: follower,
        +        following: following,
        +        what: [type], //null value for unfollow, 'blog' for follow
        +    },
        +]);
        +
        + +

        The broadcast.json operation requires a data object and private key in order the execute. For the follow/unfollow operation the variables in the object have predefined values. These values can change depending on the type of operation.

        + +
        const data = {
        +    id: 'follow',
        +    json: json,
        +    required_auths: [],
        +    required_posting_auths: [follower],
        +};
        +
        + +

        The broadcast operation is then executed with the created object and the private posting key. We also display the follow status on the UI in order for the user to know the whether the process was a success.

        + +
        client.broadcast.json(data, privateKey).then(
        +    function(result) {
        +        console.log('user follow result: ', result);
        +        document.getElementById('followResultContainer').style.display = 'flex';
        +        document.getElementById('followResult').className =
        +            'form-control-plaintext alert alert-success';
        +        if (type == 'blog') {
        +            document.getElementById('followResult').innerHTML =
        +                'Author followed';
        +        } else {
        +            document.getElementById('followResult').innerHTML =
        +                'Author unfollowed';
        +        }
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('followResultContainer').style.display = 'flex';
        +        document.getElementById('followResult').className =
        +            'form-control-plaintext alert alert-danger';
        +        document.getElementById('followResult').innerHTML = error.jse_shortmsg;
        +    }
        +);
        +
        + +

        If either of the values for the user or author does not exist the proper error result will be displayed on the UI. The result is also displayed in the console in order for the user to confirm that a block transaction has taken place. The status of the operation can be verified on the demo account.

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/18_follow_user
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_account_comments.html b/docs/tutorials-javascript/get_account_comments.html new file mode 100644 index 00000000..73f62eeb --- /dev/null +++ b/docs/tutorials-javascript/get_account_comments.html @@ -0,0 +1,610 @@ + + + + + + + + + + + + + + + + + + +JS: Get Account Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_account_replies.html b/docs/tutorials-javascript/get_account_replies.html new file mode 100644 index 00000000..99072895 --- /dev/null +++ b/docs/tutorials-javascript/get_account_replies.html @@ -0,0 +1,602 @@ + + + + + + + + + + + + + + + + + + +JS: Get Account Replies | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_delegations_by_user.html b/docs/tutorials-javascript/get_delegations_by_user.html new file mode 100644 index 00000000..bb416607 --- /dev/null +++ b/docs/tutorials-javascript/get_delegations_by_user.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + +JS: Get Delegations By User | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Delegations By User + + +

        + +

        View the vesting delegations made by a user as well as the delegations that are expiring.

        +
        + + +

        Full, runnable src of Get Delegations By User can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of calling delegation information from the steem blockchain using the database API. The account information provided has been chosen by random and the process is applicable to any user account on both the production server and the testnet.

        + +

        Intro

        + +

        This tutorial has two separate functions, one for viewing active delegations and one for viewing expiring delegations. Both of these use the database API to pull information from the steem blockchain. It should be noted that when a delegation is cancelled it will only be available after 7 days. The value of the delegation can also be changed at any time, either decreased or increased. The first function we use is getVestingDelegations for which we require the following parameters:

        + +
          +
        1. account - The username for which the query is done
        2. +
        3. from - The value from where to start the search. This can be used for paging. This parameter is optional
        4. +
        5. limit - The quantity of results that is queried from the blockchain. This parameter is optional
        6. +
        + +

        The second function is getExpiringVestingDelegations with parameters:

        + +
          +
        1. user - The account that the query is referencing
        2. +
        3. from time - The date from where the query will be run. Pending expirations clear after 7 days so it will never be older than that. This value can however be set to anytime before the 7 days of expiration and it will return the relevant transactions
        4. +
        5. limit - The quantity of results that is queried from the blockchain
        6. +
        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI
        4. +
        5. Database query Sending a query to the blockchain for the user delegations
        6. +
        7. Display results Display the results of the blockchain query
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//define network parameters
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to a steem node, production in this case
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        Above, we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint.

        + +

        2. Input variables

        + +

        The required parameters for the delegation query operation is recorded via an HTML UI that can be found in the public/index.html file. The values are pre-populated in this case but any account name can be used.

        + +

        Both of the query functions use the same input variables. The previous results are cleared each time at the start of the function. The parameter values are allocated as seen below, once the user clicks on either the “Display active delegations” or “Display expiring delegations” button.

        + +
        //active delegations function
        +window.createList = async () => {
        +    //clear list
        +    document.getElementById('delegationList').innerHTML = '';
        +
        +    //get username
        +    const delegator = document.getElementById('username').value;
        +
        + +

        3. Database query

        + +

        The queries are sent through to the steem blockchain using the database API and parameters as per the intro. The result of the query is displayed on the console as a control check.

        + +
        //active delegations function
        +delegationdata = await client.database.getVestingDelegations(delegator, "", 100);
        +    console.log(JSON.stringify(delegationdata));
        +
        + +
        //expiring delegations function
        +const delegationdata = await client.database.call('get_expiring_vesting_delegations',[delegator, "2018-01-01T00:00:00", 100]);
        +    console.log(delegationdata);
        +
        + +

        4. Display results

        + +

        Before the results are displayed a check is done whether there are in fact any transactions for the specific user.

        + +
        //active delegations function
        +if (delegationdata[0] == null) {
        +    console.log('No delegation information');
        +    document.getElementById('searchResultContainer').style.display = 'flex';
        +    document.getElementById('searchResult').className =
        +        'form-control-plaintext alert alert-danger';
        +    document.getElementById('searchResult').innerHTML =
        +        'No delegation information';
        +} else {
        +    document.getElementById('searchResultContainer').style.display = 'flex';
        +    document.getElementById('searchResult').className =
        +        'form-control-plaintext alert alert-success';
        +    document.getElementById('searchResult').innerHTML = 'Active Delegations';
        +}
        +
        + +
        //expiring delegations function
        +if (delegationdata[0] == null) {
        +    console.log('No delegation information');
        +    document.getElementById('searchResultContainer').style.display = 'flex';
        +    document.getElementById('searchResult').className =
        +        'form-control-plaintext alert alert-danger';
        +    document.getElementById('searchResult').innerHTML =
        +        'No delegation information';
        +} else {
        +    document.getElementById('searchResultContainer').style.display = 'flex';
        +    document.getElementById('searchResult').className =
        +        'form-control-plaintext alert alert-success';
        +    document.getElementById('searchResult').innerHTML = 'Expiring Delegations';
        +}
        +
        + +

        The result from the query is an array of objects. The results are displayed in a simple list.

        + +

        The active delegations functions returns the following values and are displayed on the UI as per below.

        + +
          +
        1. delegator - The user that made the delegation
        2. +
        3. delegatee - The user that the delegations has been made to
        4. +
        5. vesting_shares - The amount of VESTS that has been delegated
        6. +
        7. min_delegation_time - The time from which the delegation will be active
        8. +
        + +
        //active delegations function
        +delegationdata.forEach(newObj => {
        +    name = newObj.delegatee;
        +    shares = newObj.vesting_shares;
        +    document.getElementById('delegationList').innerHTML +=
        +        delegator + ' delegated ' + shares + ' to ' + name + '<br>';
        +});
        +
        + +

        The expiring delegations function returns the following values and are displayed on the UI as per below.

        + +
          +
        1. vesting_shares - The amount of VESTS that is pending expiration
        2. +
        3. expiration - The date at which the delegation will expire and the VESTS will be available again
        4. +
        + +
        //expiring delegations function
        +delegationdata.forEach(newObj => {
        +    shares = newObj.vesting_shares;
        +    date = expiration;
        +    document.getElementById('delegationList').innerHTML +=
        +        shares + ' will be released at ' + date + '<br>';
        +});
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/27_get_delegations_by_user
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_follower_and_following_list.html b/docs/tutorials-javascript/get_follower_and_following_list.html new file mode 100644 index 00000000..82e3d93c --- /dev/null +++ b/docs/tutorials-javascript/get_follower_and_following_list.html @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + +JS: Get Follower And Following List | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Follower And Following List + + +

        + +

        Get the followers of a user/author & the authors that user is following.

        +
        + + +

        Full, runnable src of Get Follower And Following List can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of calling both the follower and following functions from the STEEM API.

        + +

        Intro

        + +

        We are using the call operation provided by the dsteem library to pull the follow information for a specified user account. There are 4 variables required to execute this operation:

        + +
          +
        1. username - The specific user for which the follower(ing) list will be retrieved.
        2. +
        3. startFollower(ing) - The starting letter(s) or name for the search query.
        4. +
        5. followType - This value is set to blog and includes all users following or being followed by the user.
        6. +
        7. limit - The maximum number of lines to be returned by the query.
        8. +
        + +

        A simple HTML interface is used to capture the required information after which the function is executed.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with the Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI
        4. +
        5. Get followers/following Get the followers or users being followed
        6. +
        7. Display Display the array of results on the UI
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//define network parameters
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to a steem node, production in this case
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        Above, we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint.

        + +

        2. Input variables

        + +

        The required parameters for the follow operation is recorded via an HTML UI that can be found in the public/index.html file. The values have been pre-populated for ease of use but are editable.

        + +

        The parameter values are allocated as seen below once the user clicks on the “Get Followers” or “Get Following” button. +The two queries are very similar and run from two different functions activated from a button on the UI. The first line of both functions is used to clear the display before new information is queried.

        + +
        //Followers function
        +window.submitFollower = async () => {
        +    //clear list
        +    document.getElementById('followList').innerHTML = '';
        +
        +    //get user name
        +    const username = document.getElementById('username').value;
        +    //get starting letters / word
        +    const startFollow = document.getElementById('startFollow').value;
        +    //get limit
        +    var limit = document.getElementById('limit').value;
        +
        + +

        3. Get followers/following

        + +

        A list of followers or users being followed is called from the database with the follow_api available in the SteemJS library.

        + +
        //get list of followers
        +//getFollowers(following, startFollower, followType, limit)
        +    let followlist = await client.call('follow_api', 'get_followers', [
        +        username,
        +        startFollow,
        +        'blog',
        +        limit,
        +    ]);
        +
        +    document.getElementById('followResultContainer').style.display = 'flex';
        +    document.getElementById('followResult').className = 'form-control-plaintext alert alert-success';
        +    document.getElementById('followResult').innerHTML = 'Followers';
        +
        +
        +//get list of authors you are following
        +//getFollowing(follower, startFollowing, followType, limit)
        +    let followlist = await client.call('follow_api', 'get_following', [
        +        username,
        +        startFollow,
        +        'blog',
        +        limit,
        +    ]);
        +
        +    document.getElementById('followResultContainer').style.display = 'flex';
        +    document.getElementById('followResult').className = 'form-control-plaintext alert alert-success';
        +    document.getElementById('followResult').innerHTML = 'Following';
        +
        +
        + +

        4. Display

        + +

        The result returned from the query is an array of objects. The follower(ing) value from that array is displayed on both the UI and the console via a simple forEach array method.

        + +
        followlist.forEach(newObj => {
        +    name = newObj.follower;
        +    document.getElementById('followList').innerHTML += name + '<br>';
        +    console.log(name);
        +});
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/19_get_follower_and_following_list
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_post_comments.html b/docs/tutorials-javascript/get_post_comments.html new file mode 100644 index 00000000..d5d59dd0 --- /dev/null +++ b/docs/tutorials-javascript/get_post_comments.html @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + +JS: Get Post Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Post Comments + + +

        + +

        By the end of this tutorial you would know how to get comments made by others on any post.

        +
        + + +

        Full, runnable src of Get Post Comments can be downloaded as part of the JS tutorials repository. +

        + +

        The purpose of this tutorial is to a) demonstrate how to get a list of articles from the trending list on the blockchain, and b) fetch the contents of the selected post to display its title and body and c) fetch comments of the post and display them with author, body, created time and number of votes.

        + +

        We will also explain the most commonly used fields from the response object as well as parse body of each comment.

        + +

        Intro

        + +

        Each post might have comments/replies that is interesting and contributes to the topic and discussion. Steem offers out of box API for pulling replies for particular post with get_content_replies. We will fetch replies and list them in simple user interface.

        + +

        Steps

        + +
          +
        1. Fetching posts Getting trending posts
        2. +
        3. Post comments Open post and fetch comments
        4. +
        5. Query result Result of the query
        6. +
        + +

        1. Fetching post

        + +

        As mentioned in our previous tutorials we can fetch various lists of posts with different filters. Here, we are reusing some parts of that tutorial to list the top 5 trending posts. And we parse content of selected post to display few fields in a meaningful way.

        + +

        2. Post comments

        + +

        On selection of a particular post from the list, openPost function is fired as it is explained in Get Post Details tutorial. This function will call the get_content function to fetch content of the post. Right after root post is displayed properly, we use get_content_replies function to fetch comments made on that post, function requires author and permlink of the root post to fetch its comments.

        + +
        client.database.call('get_content_replies', [author, permlink]).then(result => {
        +    const comments = [];
        +    for (var i = 0; i < result.length; i++) {
        +        comments.push(
        +            `<div class="list-group-item list-group-item-action flex-column align-items-start">\
        +            <div class="d-flex w-100 justify-content-between">\
        +              <h5 class="mb-1">@${result[i].author}</h5>\
        +              <small class="text-muted">${new Date(
        +                  result[i].created
        +              ).toString()}</small>\
        +            </div>\
        +            <p class="mb-1">${md.render(result[i].body)}</p>\
        +            <small class="text-muted">&#9650; ${result[i].net_votes}</small>\
        +          </div>`
        +        );
        +    }
        +
        +    document.getElementById('postComments').style.display = 'block';
        +    document.getElementById('postComments').innerHTML = comments.join('');
        +});
        +
        + +

        We iterate each comment and format them properly in comments array. As mentioned in Get Post Details tutorial, we use remarkable library to parse the body of each comment into a readable format. Author, comment body, created time and number of votes on that comment is displayed with simple user interface.

        + +
        document.getElementById('postList').style.display = 'block';
        +document.getElementById('postBody').style.display = 'none';
        +document.getElementById('postComments').style.display = 'none';
        +
        + +

        The “go back” function simply hides and shows the post list.

        + +

        3. Query result

        + +

        The result is returned from the post content as a JSON object with the following properties:

        + +
        [
        +    {
        +        "id": 37338948,
        +        "author": "demo",
        +        "permlink": "re-join-team-steemit-at-tokenfest-20180500t181413163z",
        +        "category": "steemit",
        +        "parent_author": "steemit",
        +        "parent_permlink": "join-team-steemit-at-tokenfest",
        +        "title": "",
        +        "body": "Thank you for sharing",
        +        "json_metadata":
        +            "{\"tags\":[\"steemit\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +        "last_update": "2018-03-07T23:22:54",
        +        "created": "2018-05-00T20:56:36",
        +        "active": "2018-05-06T01:40:21",
        +        "last_payout": "1970-01-01T00:00:00",
        +        "depth": 1,
        +        "children": 1,
        +        "net_rshares": "11453442114933",
        +        "abs_rshares": "11454054795840",
        +        "vote_rshares": "11454054795840",
        +        "children_abs_rshares": "13568695606090",
        +        "cashout_time": "2018-05-07T20:56:36",
        +        "max_cashout_time": "1969-12-31T23:59:59",
        +        "total_vote_weight": 3462435,
        +        "reward_weight": 10000,
        +        "total_payout_value": "0.000 SBD",
        +        "curator_payout_value": "0.000 SBD",
        +        "author_rewards": 0,
        +        "net_votes": 77,
        +        "root_comment": 37338948,
        +        "max_accepted_payout": "0.000 SBD",
        +        "percent_steem_dollars": 10000,
        +        "allow_replies": true,
        +        "allow_votes": true,
        +        "allow_curation_rewards": true,
        +        "beneficiaries": [],
        +        "url":
        +            "/steemit/@steemitblog/join-team-steemit-at-tokenfest#@demo/re-join-team-steemit-at-tokenfest-20180500t181413163z",
        +        "root_title": "Join Team Steemit at TokenFest!",
        +        "pending_payout_value": "0.436 SBD",
        +        "total_pending_payout_value": "0.000 STEEM",
        +        "active_votes": [
        +            {
        +                "voter": "steemitblog",
        +                "weight": 0,
        +                "rshares": "1870813909383",
        +                "percent": 10000,
        +                "reputation": "128210130644387",
        +                "time": "2018-03-07T20:56:36"
        +            },
        +            {
        +                "voter": "kevinwong",
        +                "weight": 526653,
        +                "rshares": "2208942520687",
        +                "percent": 5000,
        +                "reputation": "374133832002581",
        +                "time": "2018-03-08T04:27:00"
        +            }
        +        ],
        +        "replies": [],
        +        "author_reputation": "128210130644387",
        +        "promoted": "0.000 SBD",
        +        "body_length": 0,
        +        "reblogged_by": []
        +    },
        +    {
        +        "id": 37338987,
        +        "etc.": "etc"
        +    }
        +]
        +
        + +

        From this result, you have access to comments made on selected post.

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/07_get_post_comments
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_post_details.html b/docs/tutorials-javascript/get_post_details.html new file mode 100644 index 00000000..7782ea38 --- /dev/null +++ b/docs/tutorials-javascript/get_post_details.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + +JS: Get Post Details | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Post Details + + +

        + +

        By the end of this tutorial you would know how to get post details and use them appropriately.

        +
        + + +

        Full, runnable src of Get Post Details can be downloaded as part of the JS tutorials repository. +

        + +

        The purpose of this tutorial is to a) demonstrate how to get a list of articles from the trending list on the blockchain, and b) fetch the contents of the selected post to display its title and body.

        + +

        We will also explain the most commonly used fields from the response object as well as parse body of the post.

        + +

        Intro

        + +

        Accounts have unique permlink - permanent link for each of their posts. And Steem blockchain provides API to directly fetch current state of the post and its details. We will be using get_content to retrieve additional details. We can easily reformat data in a way that fits out application.

        + +

        Steps

        + +
          +
        1. Fetching posts Trending posts list
        2. +
        3. Post content Extract content of the selected post
        4. +
        5. Query result Returned data
        6. +
        + +

        1. Fetching posts

        + +

        As mentioned in our previous tutorial we can fetch various lists of posts with different filters. Here, we are reusing some parts of that tutorial to list the top 5 trending posts.

        + +
        var query = {
        +    tag: '', // This tag is used to filter the results by a specific post tag.
        +    limit: 5, // This allows us to limit the total to 5 items.
        +    truncate_body: 1, // This will truncate the body of each post to 1 character, which is useful if you want to work with lighter array.
        +};
        +
        + +

        2. Post content

        + +

        On selection of a particular post from the list, openPost function is fired. This function will call the get_content function to fetch content of the post. get_content requires author and permlink of the post to fetch its data.

        + +
        client.database.call('get_content', [author, permlink]).then(result => {
        +    const md = new Remarkable({ html: true, linkify: true });
        +
        +    const body = md.render(result.body);
        +
        +    const content = `<div class='pull-right'><button onclick=goback()>Close</button></div><br><h2>${
        +        result.title
        +    }</h2><br>${body}<br>`;
        +
        +    document.getElementById('postList').style.display = 'none';
        +    document.getElementById('postBody').style.display = 'block';
        +    document.getElementById('postBody').innerHTML = content;
        +});
        +
        + +

        Steem allows any text-based format for the body, but apps often follow standard markdown with mix of few html tags. After we have fetched the content, we can use the remarkable library to parse the body of the post into a readable format. The title and body of the post are then displayed with a button at the top right corner to switch back to the post list.

        + +
        document.getElementById('postList').style.display = 'block';
        +document.getElementById('postBody').style.display = 'none';
        +
        + +

        The “go back” function simply hides and shows the post list.

        + +

        3. Query result

        + +

        The result is returned from the post content as a JSON object with the following properties:

        + +
        {
        +    "id": 37338948,
        +    "author": "steemitblog",
        +    "permlink": "join-team-steemit-at-tokenfest",
        +    "category": "steemit",
        +    "parent_author": "",
        +    "parent_permlink": "steemit",
        +    "title": "Join Team Steemit at TokenFest!",
        +    "body":
        +        "<a href=\"https://tokenfest.adria.digital\"><img src=\"https://i.imgur.com/fOScDIW.png\"/></a>\n\nHello Steemians! If you’d like to meet Team Steemit live-in-person, or are just interested in attending what promises to be a great blockchain conference, join us at <a href=\"https://tokenfest.adria.digital/\">TokenFest</a> in San Francisco from March 15th to 16th. \n\nSteemit CEO, Ned Scott, will be participating in a fireside chat alongside Steemit’s CTO, Harry Schmidt, as well as the creator of Utopian.io, Diego Pucci. Steemit will also be hosting the opening party on Thursday night and we’d certainly love to meet as many of you as possible IRL, so head on over to https://tokenfest.adria.digital/ and get your tickets while you can. \n\n*Team Steemit*",
        +    "json_metadata":
        +        "{\"tags\":[\"steemit\",\"tokenfest\",\"conference\"],\"image\":[\"https://i.imgur.com/fOScDIW.png\"],\"links\":[\"https://tokenfest.adria.digital\",\"https://tokenfest.adria.digital/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +    "last_update": "2018-03-07T23:22:54",
        +    "created": "2018-03-07T20:56:36",
        +    "active": "2018-03-13T01:40:21",
        +    "last_payout": "1970-01-01T00:00:00",
        +    "depth": 0,
        +    "children": 29,
        +    "net_rshares": "11453442114933",
        +    "abs_rshares": "11454054795840",
        +    "vote_rshares": "11454054795840",
        +    "children_abs_rshares": "13568695606090",
        +    "cashout_time": "2018-03-14T20:56:36",
        +    "max_cashout_time": "1969-12-31T23:59:59",
        +    "total_vote_weight": 3462435,
        +    "reward_weight": 10000,
        +    "total_payout_value": "0.000 SBD",
        +    "curator_payout_value": "0.000 SBD",
        +    "author_rewards": 0,
        +    "net_votes": 77,
        +    "root_comment": 37338948,
        +    "max_accepted_payout": "0.000 SBD",
        +    "percent_steem_dollars": 10000,
        +    "allow_replies": true,
        +    "allow_votes": true,
        +    "allow_curation_rewards": true,
        +    "beneficiaries": [],
        +    "url": "/steemit/@steemitblog/join-team-steemit-at-tokenfest",
        +    "root_title": "Join Team Steemit at TokenFest!",
        +    "pending_payout_value": "46.436 SBD",
        +    "total_pending_payout_value": "0.000 STEEM",
        +    "active_votes": [
        +        {
        +            "voter": "steemitblog",
        +            "weight": 0,
        +            "rshares": "1870813909383",
        +            "percent": 10000,
        +            "reputation": "128210130644387",
        +            "time": "2018-03-07T20:56:36"
        +        },
        +        {
        +            "voter": "kevinwong",
        +            "weight": 526653,
        +            "rshares": "2208942520687",
        +            "percent": 5000,
        +            "reputation": "374133832002581",
        +            "time": "2018-03-08T04:27:00"
        +        }
        +    ],
        +    "replies": [],
        +    "author_reputation": "128210130644387",
        +    "promoted": "0.000 SBD",
        +    "body_length": 754,
        +    "reblogged_by": []
        +}
        +
        + +

        From this result, you have access to everything associated with the selected post, including additional metadata which is a JSON string that must be decoded to use.

        + +
          +
        • id - Unique identifier that is mostly an implementation detail (best to ignore). To uniquely identify content, it’s best to use author/permlink.
        • +
        • author - The author account name of the content.
        • +
        • permlink - Permanent link of the content, must be unique in the scope of the author.
        • +
        • category - The main category/tag this content belongs to.
        • +
        • parent_author - Parent author, in case this content is a comment (reply).
        • +
        • parent_permlink - Parent permanent link, this will be the same as category for posts and will contain the permlink of the content being replied to in the case of a comment.
        • +
        • title - Title of the content.
        • +
        • body - Body of the content.
        • +
        • json_metadata - JSON metadata that holds extra information about the content. Note: The format for this field is not guaranteed to be valid JSON.
        • +
        • last_update - The date and time of the last update to this content.
        • +
        • created - The date and time this content was created.
        • +
        • active - The last time this content was “touched” by voting or reply.
        • +
        • last_payout - Time of last payout.
        • +
        • depth - Used to track max nested depth.
        • +
        • children - Used to track the total number of children, grandchildren, etc. …
        • +
        • net_rshares - Reward is proportional to liniar rshares, this is the sum of all votes (positive and negative reward sum)
        • +
        • abs_rshares - This was used to track the total absolute weight of votes for the purpose of calculating cashout_time.
        • +
        • vote_rshares - Total positive rshares from all votes. Used to calculate delta weights. Needed to handle vote changing and removal.
        • +
        • children_abs_rshares - This was used to calculate cashout time of a discussion.
        • +
        • cashout_time - 7 days from the created date.
        • +
        • max_cashout_time - Unused.
        • +
        • total_vote_weight - The total weight of voting rewards, used to calculate pro-rata share of curation payouts.
        • +
        • reward_weight - Weight/percent of reward.
        • +
        • total_payout_value - Tracks the total payout this content has received over time, measured in the debt asset.
        • +
        • curator_payout_value - Tracks the curator payout this content has received over time, measured in the debt asset.
        • +
        • author_rewards - Tracks the author payout this content has received over time, measured in the debt asset.
        • +
        • net_votes - Net positive votes
        • +
        • root_comment - ID of the original content.
        • +
        • max_accepted_payout - Value of the maximum payout this content will receive.
        • +
        • percent_steem_dollars - The percent of Steem Dollars to key, unkept amounts will be received as STEEM Power.
        • +
        • allow_replies - Allows content to disable replies.
        • +
        • allow_votes - Allows content to receive votes.
        • +
        • allow_curation_rewards - Allows curators of this content receive rewards.
        • +
        • beneficiaries - The list of up to 8 beneficiary accounts for this content as well as the percentage of the author reward they will receive in STEEM Power.
        • +
        • url - The end of the url to this content.
        • +
        • root_title - Title of the original content (useful in replies).
        • +
        • pending_payout_value - Pending payout amount if 7 days has not yet elapsed.
        • +
        • total_pending_payout_value - Total pending payout amount if 7 days has not yet elapsed.
        • +
        • active_votes - The entire voting list array, including upvotes, downvotes, and unvotes; used to calculate net_votes.
        • +
        • replies - Unused.
        • +
        • author_reputation - Author’s reputation.
        • +
        • promoted - If post is promoted, how much has been spent on promotion.
        • +
        • body_length - Total content length.
        • +
        • reblogged_by - Unused.
        • +
        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/05_get_post_details
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_posts.html b/docs/tutorials-javascript/get_posts.html new file mode 100644 index 00000000..83158546 --- /dev/null +++ b/docs/tutorials-javascript/get_posts.html @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + +JS: Get Posts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Posts + + +

        + +

        Query for the most recent posts having a specific tag, using a Steem filter

        +
        + + +

        Full, runnable src of Get Posts can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial pulls a list of the posts from different tags or filters and displays them. +Tags and filters are different. It’s important to understand them.

        + +

        Intro

        + +

        Tags & Filters are two different.

        + +

        A tag in Steem is much like a tag in Gmail, or Twitter. It’s a way to describe a +post as being relevant to a particular topic. Posts may have up to five tags on them, but there are limits when +querying (more on this later).

        + +

        A filter in Steem is a kind of built-in ‘view’ or ordering of posts. You can use the following filters: +trending, hot, new, active, and promoted. You’ll get a feel for the subtleties of each as you create your +application.

        + +

        Steps

        + +
          +
        1. UI - A brief description of the UI and inputting our query values
        2. +
        3. Construct query - Assemble the information from the UI into our filter & query
        4. +
        5. API call - Make the call to Steem
        6. +
        7. Handle response - Accept the response in a promise callback, then render the results
        8. +
        9. Example post object - An example post object from the response list
        10. +
        + +

        1. UI

        + +

        The source HTML for our UI can be found in public/index.html

        + +

        There are three input components to the UI.

        + +
          +
        • +

          Filters: where we select one of the five built in filter types.

          + +

          <select id="filters" class="form-control" >...

          +
        • +
        • +

          Tag: where we type in a single, arbitrary tag. (The Steem blockchain does not support searching on multiple tags)

          + +

          <input id="tag" class="form-control"/>

          +
        • +
        • +

          Get Posts: It’s a button. You click it, and we move on to assembling our post. +<button class="btn btn-primary" onclick="getPosts()">Get Posts</button>

          +
        • +
        + +

        Step-01-UI.png

        + +

        2. Construct query

        + +

        The filter and query are constructed within the async, globally available function getPosts

        + +

        The limit property you see below limits the total number of posts we’ll get back to something +managable. In this case, five.

        + +
        const filter = document.getElementById('filters').value;
        +const query = {
        +    tag: document.getElementById('tag').value,
        +    limit: 5,
        +};
        +
        + +

        3. API call

        + +

        The api call itself is fairly simple. We use getDiscussions. +The first argument, filter, is a simple string. +The second argument is our query object. +Like most of dsteem’s api functions, getDiscussions returns a Promise.

        + +
        client.database
        +    .getDiscussions(filter, query)
        +    .th..
        +
        + +

        4. Handle response

        + +

        When the promise returned by getDiscussions completes successfully, the function we pass to .then() +iterates over the entries response, and constructs html from it.

        + +
        ...ery)
        +.then(result => {
        +            console.log("Response received:", result);
        +            if (result) {
        +                var posts = [];
        +                result.forEach(post => {
        +                    const json = JSON.parse(post.json_metadata);
        +                    const image = json.image ? json.image[0] : '';
        +                    const title = post.title;
        +                    const author = post.author;
        +                    const created = new Date(post.created).toDateString();
        +                    posts.push(
        +                        `<div class="list-group-item"><h4 class="list-group-item-heading">${title}</h4><p>by ${author}</p><center><img src="${image}" class="img-responsive center-block" style="max-width: 450px"/></center><p class="list-group-item-text text-right text-nowrap">${created}</p></div>`
        +                    );
        +                });
        +
        +                document.getElementById('postList').innerHTML = posts.join('');
        +            } else {
        +                document.getElementById('postList').innerHTML = "No result.";
        +            }
        +        })
        +
        + +

        5. Example post object

        + +

        The result returned from the service is a JSON list. This is an example list with one entry.

        + +
        [
        +    {
        +        "id": 37338948,
        +        "author": "steemitblog",
        +        "permlink": "join-team-steemit-at-tokenfest",
        +        "category": "steemit",
        +        "parent_author": "",
        +        "parent_permlink": "steemit",
        +        "title": "Join Team Steemit at TokenFest!",
        +        "body":
        +            "<a href=\"https://tokenfest.adria.digital\"><img src=\"https://i.imgur.com/fOScDIW.png\"/></a>\n\nHello Steemians! If you’d like to meet Team Steemit live-in-person, or are just interested in attending what promises to be a great blockchain conference, join us at <a href=\"https://tokenfest.adria.digital/\">TokenFest</a> in San Francisco from March 15th to 16th. \n\nSteemit CEO, Ned Scott, will be participating in a fireside chat alongside Steemit’s CTO, Harry Schmidt, as well as the creator of Utopian.io, Diego Pucci. Steemit will also be hosting the opening party on Thursday night and we’d certainly love to meet as many of you as possible IRL, so head on over to https://tokenfest.adria.digital/ and get your tickets while you can. \n\n*Team Steemit*",
        +        "json_metadata":
        +            "{\"tags\":[\"steemit\",\"tokenfest\",\"conference\"],\"image\":[\"https://i.imgur.com/fOScDIW.png\"],\"links\":[\"https://tokenfest.adria.digital\",\"https://tokenfest.adria.digital/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +        "last_update": "2018-03-07T23:22:54",
        +        "created": "2018-03-07T20:56:36",
        +        "active": "2018-03-13T01:40:21",
        +        "last_payout": "1970-01-01T00:00:00",
        +        "depth": 0,
        +        "children": 29,
        +        "net_rshares": "11453442114933",
        +        "abs_rshares": "11454054795840",
        +        "vote_rshares": "11454054795840",
        +        "children_abs_rshares": "13568695606090",
        +        "cashout_time": "2018-03-14T20:56:36",
        +        "max_cashout_time": "1969-12-31T23:59:59",
        +        "total_vote_weight": 3462435,
        +        "reward_weight": 10000,
        +        "total_payout_value": "0.000 SBD",
        +        "curator_payout_value": "0.000 SBD",
        +        "author_rewards": 0,
        +        "net_votes": 77,
        +        "root_comment": 37338948,
        +        "max_accepted_payout": "0.000 SBD",
        +        "percent_steem_dollars": 10000,
        +        "allow_replies": true,
        +        "allow_votes": true,
        +        "allow_curation_rewards": true,
        +        "beneficiaries": [],
        +        "url": "/steemit/@steemitblog/join-team-steemit-at-tokenfest",
        +        "root_title": "Join Team Steemit at TokenFest!",
        +        "pending_payout_value": "46.436 SBD",
        +        "total_pending_payout_value": "0.000 STEEM",
        +        "active_votes": [
        +            {
        +                "voter": "steemitblog",
        +                "weight": 0,
        +                "rshares": "1870813909383",
        +                "percent": 10000,
        +                "reputation": "128210130644387",
        +                "time": "2018-03-07T20:56:36"
        +            },
        +            {
        +                "voter": "kevinwong",
        +                "weight": 526653,
        +                "rshares": "2208942520687",
        +                "percent": 5000,
        +                "reputation": "374133832002581",
        +                "time": "2018-03-08T04:27:00"
        +            }
        +        ],
        +        "replies": [],
        +        "author_reputation": "128210130644387",
        +        "promoted": "0.000 SBD",
        +        "body_length": 754,
        +        "reblogged_by": []
        +    }
        +    ...
        +]
        +
        + +

        And that’s all there is to getting top-level posts. See Get post comments for getting comments

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/04_get_posts
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_state_replacement_api.html b/docs/tutorials-javascript/get_state_replacement_api.html new file mode 100644 index 00000000..fc4039da --- /dev/null +++ b/docs/tutorials-javascript/get_state_replacement_api.html @@ -0,0 +1,870 @@ + + + + + + + + + + + + + + + + + + +JS: Get State Replacement Api | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get State Replacement Api + + +

        + +

        This is a list of replacement API calls for each of the different routes available from the getState function.

        +
        + + +

        Full, runnable src of Get State Replacement Api can be downloaded as part of the JS tutorials repository. +

        + +

        Intro

        + +

        With the getState API call retrieving ALL block information and now being deprecated, a more efficient process is required to call only the dataset that you require for a your specific application. There are a couple different routes (data groupings) that can be found within the getState function. Each of these will be described and a replacement API call will be discussed.

        + +

        Included in this single getState call is the list of content being requested, the latest Dynamic Global Properties, the latest Account Data for the authors included in the results, and the current feed price. The getState function is great in order to get the first 20 posts (and account information based on the post authors) based on the selected tag. If the query field is left empty getState automatically calls info based on the trending tag. getState can also be used to call information for a specific account.

        + +

        The call routes that will be covered are for:

        + +
          +
        1. accounts
        2. +
        3. content
        4. +
        5. feed_price
        6. +
        7. props
        8. +
        9. tags
        10. +
        11. tag_idx
        12. +
        13. witness_schedule
        14. +
        15. witnesses
        16. +
        + +

        Current getState() result:

        + +
        {
        +  "current_route": "",
        +  "props": {
        +    "head_block_number": 0,
        +    "head_block_id": "0000000000000000000000000000000000000000",
        +    "time": "1970-01-01T00:00:00",
        +    "current_witness": "",
        +    "total_pow": "18446744073709551615",
        +    "num_pow_witnesses": 0,
        +    "virtual_supply": "0.000 STEEM",
        +    "current_supply": "0.000 STEEM",
        +    "confidential_supply": "0.000 STEEM",
        +    "current_sbd_supply": "0.000 STEEM",
        +    "confidential_sbd_supply": "0.000 STEEM",
        +    "total_vesting_fund_steem": "0.000 STEEM",
        +    "total_vesting_shares": "0.000 STEEM",
        +    "total_reward_fund_steem": "0.000 STEEM",
        +    "total_reward_shares2": "0",
        +    "pending_rewarded_vesting_shares": "0.000 STEEM",
        +    "pending_rewarded_vesting_steem": "0.000 STEEM",
        +    "sbd_interest_rate": 0,
        +    "sbd_print_rate": 10000,
        +    "maximum_block_size": 0,
        +    "current_aslot": 0,
        +    "recent_slots_filled": "0",
        +    "participation_count": 0,
        +    "last_irreversible_block_num": 0,
        +    "vote_power_reserve_rate": 40,
        +    "average_block_size": 0,
        +    "current_reserve_ratio": 1,
        +    "max_virtual_bandwidth": "0"
        +  },
        +  "tag_idx": {"trending": []},
        +  "tags": {},
        +  "content": {},
        +  "accounts": {},
        +  "witnesses": {},
        +  "discussion_idx": {},
        +  "witness_schedule": {
        +    "id": 0,
        +    "current_virtual_time": "0",
        +    "next_shuffle_block_num": 1,
        +    "current_shuffled_witnesses": [],
        +    "num_scheduled_witnesses": 1,
        +    "top19_weight": 1,
        +    "timeshare_weight": 5,
        +    "miner_weight": 1,
        +    "witness_pay_normalization_factor": 25,
        +    "median_props": {
        +      "account_creation_fee": "0.000 STEEM",
        +      "maximum_block_size": 131072,
        +      "sbd_interest_rate": 1000
        +    },
        +    "majority_version": "0.0.0",
        +    "max_voted_witnesses": 19,
        +    "max_miner_witnesses": 1,
        +    "max_runner_witnesses": 1,
        +    "hardfork_required_witnesses": 17
        +  },
        +  "feed_price": {"base": "0.000 STEEM", "quote": "0.000 STEEM"},
        +  "error": ""
        +}
        +
        + +

        Use cases and data sets

        + +

        Route: getState(‘accounts’)

        + +
          +
        • +

          Purpose: Returns a list of account objects for the top 20 trending post authors or a single account if specified.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.getAccounts(['username'])
        +
        + +

        In order to get the full compliment of account information for a specified account, getAccounts can be used as in the example above. If you require this information for the top 20 trending authors, you can use the function as per getState('content') to retrieve the author names and then get the information per individual. The account information can be used to track balances, vesting, followers, witness votes and pending rewards among others.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "active": {
        +    "weight_threshold": 1,
        +    "account_auths": [],
        +    "key_auths": []
        +  },
        +  "average_bandwidth": 0,
        +  "average_market_bandwidth": 0,
        +  "balance": "0.000 STEEM",
        +  "can_vote": true,
        +  "comment_count": 0,
        +  "created": "2016-03-26T08:26:21",
        +  "curation_rewards": 396530808,
        +  "delegated_vesting_shares": "505881.492379 VESTS",
        +  "guest_bloggers": [],
        +  "id": 340,
        +  "json_metadata": {"profile":{"name":,"profile_image":}},
        +  "last_account_recovery": "1970-01-01T00:00:00",
        +  "last_account_update": "2018-08-30T01:48:15",
        +  "last_bandwidth_update": "1970-01-01T00:00:00",
        +  "last_market_bandwidth_update": "1970-01-01T00:00:00",
        +  "last_owner_update": "2017-11-22T03:58:09",
        +  "last_post": "2018-09-26T18:32:30",
        +  "last_root_post": "2018-09-26T16:07:51",
        +  "last_vote_time": "2018-09-26T16:23:09",
        +  "lifetime_bandwidth": 0,
        +  "lifetime_market_bandwidth": 0,
        +  "lifetime_vote_count": 0,
        +  "market_history": [],
        +  "memo_key": "",
        +  "mined": true,
        +  "name": "",
        +  "next_vesting_withdrawal": "1969-12-31T23:59:59",
        +  "other_history": [],
        +  "owner": {
        +    "weight_threshold": 1,
        +    "account_auths": [],
        +    "key_auths": []
        +  },
        +  "pending_claimed_accounts": 0,
        +  "post_bandwidth": 10000,
        +  "post_count": 6289,
        +  "post_history": [],
        +  "posting": {
        +    "weight_threshold": 1,
        +    "account_auths": [],
        +    "key_auths": []
        +  },
        +  "posting_rewards": 30925563,
        +  "proxied_vsf_votes": ["1466563679903716", "754759334883", 0, 0],
        +  "proxy": "",
        +  "received_vesting_shares": "0.000000 VESTS",
        +  "recovery_account": "steem",
        +  "reputation": "",
        +  "reset_account": "null",
        +  "reward_sbd_balance": "0.000 SBD",
        +  "reward_steem_balance": "0.000 STEEM",
        +  "reward_vesting_balance": "967.889424 VESTS",
        +  "reward_vesting_steem": "0.479 STEEM",
        +  "savings_balance": "0.000 STEEM",
        +  "savings_sbd_balance": "0.000 SBD",
        +  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
        +  "savings_sbd_seconds": "0",
        +  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
        +  "savings_withdraw_requests": 0,
        +  "sbd_balance": "0.000 SBD",
        +  "sbd_last_interest_payment": "2018-09-08T13:46:15",
        +  "sbd_seconds": "79984344",
        +  "sbd_seconds_last_update": "2018-09-26T17:36:15",
        +  "tags_usage": [],
        +  "to_withdraw": 0,
        +  "transfer_history": [],
        +  "vesting_balance": "0.000 STEEM",
        +  "vesting_shares": "26772189.757016 VESTS",
        +  "vesting_withdraw_rate": "0.000000 VESTS",
        +  "vote_history": [],
        +  "voting_manabar": {"current_mana": "5514091390534", "last_update_time": 1537978989},
        +  "voting_power": 2099,
        +  "withdraw_routes": 0,
        +  "withdrawn": 0,
        +  "witness_votes": [],
        +  "witnesses_voted_for": 24
        +}
        +
        + +

        Route: getState(‘content’)

        + +
          +
        • +

          Purpose: The content in getState calls the top 20 trending posts

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.call('get_discussions_by_trending',[{limit:20}])
        +
        + +

        While getState() truncates the post body at 1024 characters, getDiscussionsBy will not truncate the body unless you provide a truncate_body value in the query structure. getDiscussionsBy can be executed by trending, created, active, cashout, payout, votes, children, hot, feed, blog or comments. This provides a wide range by which the posts can be called depending on the specific needs. Within the query parameter specific tags, filters, authors and permlinks can be provided. The limit can also be increased to a maximum of 100 posts where getState is limited to the first 20. You can also refer to the get post tutorial for a simplified database call for posts. The detail provided by this statement can be used to track pending payouts, curator rewards and votes for the trending, or specified posts.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "abs_rshares": "60411661082705",
        +  "active": "2018-09-26T19:47:15",
        +  "active_votes": [],
        +  "allow_curation_rewards": true,
        +  "allow_replies": true,
        +  "allow_votes": true,
        +  "author": "therealwolf",
        +  "author_reputation": "100096076084764",
        +  "author_rewards": 0,
        +  "beneficiaries": [],
        +  "body": "......",
        +  "body_length": 4577,
        +  "cashout_time": "2018-10-02T13:52:24",
        +  "category": "witness-update",
        +  "children": 7,
        +  "children_abs_rshares": "60493226759117",
        +  "created": "2018-09-25T13:52:24",
        +  "curator_payout_value": "0.000 SBD",
        +  "depth": 0,
        +  "id": 63318715,
        +  "json_metadata": {"tags":[]},
        +  "last_payout": "1970-01-01T00:00:00",
        +  "last_update": "2018-09-26T19:17:33",
        +  "max_accepted_payout": "100000.000 SBD",
        +  "max_cashout_time": "1969-12-31T23:59:59",
        +  "net_rshares": "60411661082705",
        +  "net_votes": 179,
        +  "parent_author": "",
        +  "parent_permlink": "witness-update",
        +  "pending_payout_value": "80.490 SBD",
        +  "percent_steem_dollars": 10000,
        +  "permlink": "witness-essentials-hf20-ready",
        +  "promoted": "0.000 SBD",
        +  "reblogged_by": [],
        +  "replies": [],
        +  "reward_weight": 10000,
        +  "root_author": "therealwolf",
        +  "root_permlink": "witness-essentials-hf20-ready",
        +  "root_title": "Witness Essentials: HF20 Ready",
        +  "title": "Witness Essentials: HF20 Ready",
        +  "total_payout_value": "0.000 SBD",
        +  "total_pending_payout_value": "0.000 STEEM",
        +  "total_vote_weight": 7795119,
        +  "url": "/witness-update/@therealwolf/witness-essentials-hf20-ready",
        +  "vote_rshares": "60411661082705"
        +}
        +
        + +

        Route: getState(‘feed_price’)

        + +
          +
        • +

          Purpose: The price feed is used by the Steem blockchain when it calculates how many SBD it owes for its author rewards. It is also used to calculate the worth in $US displayed in the wallet. The price feed is the median price feed of the last 3.5 days of all the top 20 witnesses’ price feed.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.getCurrentMedianHistoryPrice()
        +
        + +

        This provides the same data as getState but is executed much faster due to the limited amount of information provided by this function.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "base": {"amount": 0.887, "symbol": "SBD"},
        +  "quote": {"amount": 1, "symbol": "STEEM"}
        +}
        +
        + +

        Route: getState(‘props’)

        + +
          +
        • +

          Purpose: Provides detailed information of the block properties. Block number, witness, current STEEM and SBD supply, pending rewards and total vesting fund and shares among others.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        //all block info
        +databaseAPI.getDynamicGlobalProperties()
        +//head block number only
        +blockchainAPI.getCurrentBlockNum()
        +//simple head block info
        +databaseAPI.getBlock(HeadBlockNum)
        +
        + +

        getDynamicGlobalProperties() provides the same level of information and tracks the same values for each created block. You can also call a simplified version of block info containing only the block_id, previous block_id, signing_key, timestamp, witness and witness signature by using the current head block number with the getBlock database call.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "average_block_size":122,
        +  "confidential_sbd_supply":"0.000 SBD",
        +  "confidential_supply":"0.000 STEEM",
        +  "current_aslot":26372251,
        +  "current_reserve_ratio":200000000,
        +  "current_sbd_supply":"14921682.900 SBD",
        +  "current_supply":"277501868.004 STEEM",
        +  "current_witness":"ausbitbank",
        +  "delegation_return_period":432000,
        +  "head_block_id":"0190f89c584661d6ffc78e17395df17ea5653197",
        +  "head_block_number":26278044,
        +  "last_irreversible_block_num":26278024,
        +  "max_virtual_bandwidth":"264241152000000000000",
        +  "maximum_block_size":65536,
        +  "num_pow_witnesses":172,
        +  "participation_count":126,
        +  "pending_rewarded_vesting_shares":"483834672.069834 VESTS",
        +  "pending_rewarded_vesting_steem":"237227.812 STEEM",
        +  "recent_slots_filled":"340282366911034938426725082362930003967",
        +  "reverse_auction_seconds":900,
        +  "sbd_interest_rate":0,
        +  "sbd_print_rate":10000,
        +  "sbd_start_percent":900,
        +  "sbd_stop_percent":1000,
        +  "time":"2018-09-26T08:52:33",
        +  "total_pow":514415,
        +  "total_reward_fund_steem":"0.000 STEEM",
        +  "total_reward_shares2":"0",
        +  "total_vesting_fund_steem":"196777383.890 STEEM",
        +  "total_vesting_shares":"397621943253.336916 VESTS",
        +  "virtual_supply":"294324509.379 STEEM",
        +  "vote_power_reserve_rate":10
        +}
        +
        + +

        Route: getState(‘tags’)

        + +
          +
        • +

          Purpose: Calls a list of trending tags with detailed information on each tag. The list is displayed alphabetically.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.call('get_trending_tags',[startingValue, limit])
        +
        + +

        The getTrendingTags function calls the same information as with getState but can be limited in the number of results. The data on each tag includes the number of votes and comments made with that tag as well as the total payouts for that tag. This is useful to determine which tags are most popular to assist in effective post creation.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "comments": 31203776,
        +  "name": "life",
        +  "net_votes": 54671586,
        +  "top_posts": 4996200,
        +  "total_payouts": "61584243.124 SBD",
        +  "trending": "114450355665"
        +}
        +
        + +

        Route: getState(‘tag_idx’)

        + +
          +
        • +

          Purpose: Provides a list of names (index) of the current tags (according to trending) available on the blockchain with no additional information.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.call('get_trending_tags',[startingValue, limit])
        +
        + +

        This information can be gained by the using the same method as for getState('tags') and then only displaying the name object of the array of tags provided. You can refer to the tutorial search tags for a detailed example of this.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "life"
        +  "photography"
        +  "kr"
        +  "steemit"
        +  "bitcoin"
        +}
        +
        + +

        Route: getState(‘witness_schedule’)

        + +
          +
        • +

          Purpose: Calls the current round’s schedule. Every round consists of 21 3-second blocks. This includes the top 19 witnesses, a miner witness, and a backup witness. The current_virtual_time is used to aid in choosing the next witness. next_shuffle_block_num indicates when the current list will be shuffled.

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        //full info
        +databaseAPI.call('get_witness_schedule',[])
        +//median props only
        +databaseAPI.getChainProperties()
        +
        + +

        If required you can also call the median_props values as standalone via the second function listed above.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "account_subsidy_rd": {
        +    "resource_unit": 10000,
        +    "budget_per_time_unit": 797,
        +    "pool_eq": 157691079,
        +    "max_pool_size": 157691079,
        +    "decay_params": {},
        +  },
        +  "account_subsidy_witness_rd": {
        +    "resource_unit": 10000,
        +    "budget_per_time_unit": 996,
        +    "pool_eq": 9384019,
        +    "max_pool_size": 9384019,
        +    "decay_params": {},
        +  },
        +  "current_shuffled_witnesses": ["followbtcnews", "good-karma", "smooth.witness", "anyx", "thecryptodrive", "jesta", "utopian-io", "cervantes", "roelandp", "aggroed", "blocktrades", "gtg", "xeldal", "lukestokes.mhth", "someguy123", "pfunk", "ausbitbank", "furion", "curie", "timcliff", "clayop"],
        +  "current_virtual_time": "376982753287696133965407589",
        +  "elected_weight": 1,
        +  "hardfork_required_witnesses": 17,
        +  "id": 0,
        +  "majority_version": "0.20.3",
        +  "max_miner_witnesses": 0,
        +  "max_runner_witnesses": 1,
        +  "max_voted_witnesses": 20,
        +  "median_props": {
        +    "account_creation_fee": "3.000 STEEM",
        +    "maximum_block_size": 65536,
        +    "sbd_interest_rate": 0,
        +    "account_subsidy_budget": 797,
        +    "account_subsidy_decay": 347321
        +  },
        +  "min_witness_account_subsidy_decay": 0,
        +  "miner_weight": 1,
        +  "next_shuffle_block_num": 26313756,
        +  "num_scheduled_witnesses": 21,
        +  "timeshare_weight": 5,
        +  "witness_pay_normalization_factor": 25
        +}
        +
        + +

        Route: getState(‘witnesses’)

        + +
          +
        • +

          Purpose: Calls a list of active witnesses with extended details, listed alphabetically

          +
        • +
        • +

          Replacement API call:

          +
        • +
        + +
        databaseAPI.call('get_witnesses_by_vote',['',limit])
        +
        + +

        This detailed information can be used to track the performance of a specific witness when deciding for who to vote or for your own witness statistics. The detail includes the amount of votes, blocks missed and also the SBD exchange rate (feed price) that this witness is reporting. This function calls the info listed according to total votes.

        + +
          +
        • Expected result:
        • +
        + +
        {
        +  "available_witness_account_subsidies": 9138354,
        +  "created": "1970-01-01T00:00:00",
        +  "hardfork_time_vote": "2018-09-25T15:00:00",
        +  "hardfork_version_vote": "0.20.0",
        +  "id": 9493,
        +  "last_aslot": 26387405,
        +  "last_confirmed_block_num": 26293189,
        +  "last_sbd_exchange_update": "2018-09-26T19:54:36",
        +  "last_work": "0000000048bf77f525731f28db7c1aa9ad853a475ccc78e71ea952a7782e5459",
        +  "owner": "gtg",
        +  "pow_worker": 0,
        +  "props": {
        +    "account_creation_fee": "3.000 STEEM",
        +    "maximum_block_size": 65536,
        +    "sbd_interest_rate": 0,
        +    "account_subsidy_budget": 797,
        +    "account_subsidy_decay": 347321
        +  },
        +  "running_version": "0.20.3",
        +  "sbd_exchange_rate": {"base": "0.893 SBD", "quote": "1.000 STEEM"},
        +  "signing_key": "STM5T98tp8jZRbs7zzyCg74o2siqBw2SXxoYaE1MCuwuCPeQwKrju",
        +  "total_missed": 535,
        +  "url": "https://steemit.com/witness-category/@gtg/witness-gtg",
        +  "virtual_last_update": "376717145948220892034052885",
        +  "virtual_position": "240558419146717570415939163840356145056",
        +  "virtual_scheduled_time": "376718433464807443533288610",
        +  "votes": "77454495589313361"
        +}
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/34_get_state_replacement_api
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/get_voters_list_on_post.html b/docs/tutorials-javascript/get_voters_list_on_post.html new file mode 100644 index 00000000..100062ec --- /dev/null +++ b/docs/tutorials-javascript/get_voters_list_on_post.html @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + + + + + +JS: Get Voters List On Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Get Voters List On Post + + +

        + +

        By the end of this tutorial you would know how to get voters list on any content.

        +
        + + +

        Full, runnable src of Get Voters List On Post can be downloaded as part of the JS tutorials repository. +

        + +

        The purpose of this tutorial is to a) demonstrate how to get a list of articles from the trending list on the blockchain, and b) fetch the voters of the selected post to display the account and date at which they voted.

        + +

        We will also explain the most commonly used fields from the response object.

        + +

        Intro

        + +

        Each post has voters that support content and play big role in reward distribution. Getting details of each voter and their vote value, time, etc. is another crucial information for authors and app developers. We will be using get_active_votes API call to retrieve that information right from Steem blockchain.

        + +

        Steps

        + +
          +
        1. Fetching posts Get trending post list
        2. +
        3. Voter information Voters information on selected post
        4. +
        5. Query result Example of result from query
        6. +
        + +

        1. Fetching posts

        + +

        As mentioned in our previous tutorial we can fetch various lists of posts with different filters. Here, we are reusing some parts of that tutorial to list the top 5 trending posts.

        + +
        var query = {
        +    tag: '', // This tag is used to filter the results by a specific post tag.
        +    limit: 5, // This allows us to limit the total to 5 items.
        +    truncate_body: 1, // This will truncate the body of each post to 1 character, which is useful if you want to work with lighter array.
        +};
        +
        + +

        2. Voter information

        + +

        On selection of a particular post from the list, openPost function is fired. This function will call the get_active_votes function to fetch the voters of the post. get_active_votes requires author and permlink of the post to fetch its data.

        + +
        client.database.call('get_active_votes', [author, permlink]).then(result => {
        +    console.log('votes', result, JSON.stringify(result));
        +
        +    var voters = [];
        +    voters.push(
        +        `<div class='pull-right'><button onclick=goback()>Close</button></div><br>`
        +    );
        +    result.forEach(voter => {
        +        const name = voter.voter;
        +        const time = new Date(voter.time).toDateString();
        +        voters.push(`${name} (${time})`);
        +    });
        +
        +    document.getElementById('postList').style.display = 'none';
        +    document.getElementById('postBody').style.display = 'block';
        +    document.getElementById('postBody').innerHTML = voters.join('<li>');
        +});
        +
        + +
        document.getElementById('postList').style.display = 'block';
        +document.getElementById('postBody').style.display = 'none';
        +
        + +

        The “go back” function simply hides and shows the post list.

        + +

        3. Query result

        + +

        The result is returned from the post content as a JSON object with the following properties:

        + +
        [
        +    {
        +        "voter": "gekko",
        +        "weight": 157,
        +        "rshares": 2626899959,
        +        "percent": 10000,
        +        "reputation": "1185517433922",
        +        "time": "2018-05-08T07:16:09"
        +    },
        +    {
        +        "voter": "embat",
        +        "weight": 154,
        +        "rshares": 2578364521,
        +        "percent": 10000,
        +        "reputation": "161340267374",
        +        "time": "2018-05-08T07:38:24"
        +    }
        +]
        +
        + +

        From this result, you have access to everything associated with the selected post, including additional metadata which is a JSON string that must be decoded to use.

        + +
          +
        • voter - The author account name of the vote.
        • +
        • weight - Weight of the voting power.
        • +
        • rshares - Reward shares.
        • +
        • percent - Percent of vote.
        • +
        • reputation - The reputation of the account that voted.
        • +
        • time - Time the vote was submitted.
        • +
        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/06_get_voters_list_on_post
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/getting_started.html b/docs/tutorials-javascript/getting_started.html new file mode 100644 index 00000000..b4928c0b --- /dev/null +++ b/docs/tutorials-javascript/getting_started.html @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + +JS: Getting Started | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Getting Started + + +

        + +

        Prepare your development environment to use Javascript with the Steem blockchain.

        +
        + + +

        Full, runnable src of Getting Started can be downloaded as part of the JS tutorials repository. +

        + +

        For Javascript tutorials, we will use the opensource library dsteem.

        + +

        Node.js

        + +

        To get the most out of these tutorials, you should be familiar with Node.js, ES6 aka es2015, the DOM, and modern Javascript programming practices. +You can still learn a lot of these if they aren’t in your base skill-set; it’ll be much easier if they are.

        + +

        Your Dev Environment

        + +

        These tutorials require Node.js 8.7+. Yarn is nice, but not required. Runnable versions of the tutorials are located in this github repo. +If you haven’t chosen an editor, you can use Atom, Sublime, Intellij, Vi, etc.

        + +

        If you want to keep multiple versions of Node on your system try Node Version Manager.

        + +

        Running a typical Tutorial

        + +

        Let’s say you wanted to run the very first tutorial, 01_blog_feed. Here’s how you’d do it:

        + +
          +
        1. +

          From Bash:

          + +
          git clone https://github.com/steemit/devportal-tutorials-js.git
          +
          +cd devportal-tutorials-js/tutorials/01_blog_feed
          +npm i
          +npm run dev-server
          +
          +
        2. +
        3. +

          open http://localhost:3000/ in your web browser

          +
        4. +
        + +
        ### Github
        +
        +If you'd rather clone projects in a windowed environment rather than the terminal, consider [Github Desktop](https://desktop.github.com/).
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/grant_active_permission.html b/docs/tutorials-javascript/grant_active_permission.html new file mode 100644 index 00000000..222b8bf3 --- /dev/null +++ b/docs/tutorials-javascript/grant_active_permission.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + +JS: Grant Active Permission | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Grant Active Permission + + +

        + +

        How to grant and revoke active permission to another user.

        +
        + + +

        Full, runnable src of Grant Active Permission can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of checking a specific users’ data, altering the array pertaining to the active account_auths, and then broadcasting the changes to the blockchain. Demo account information has been provided to assist with the tutorial. This tutorial has been set up for the testnet but can be easily be changed for production.

        + +

        Providing another user active permission for your account enables them to do fund transfers from your account. This can be usefull in setting up a secondary account(s) to manage funds for a main account or having a backup should you lose passwords for the main account.

        + +

        One of the common practice nowadays is to lend/delegate SP to another account, above same technique can be used to create market around it with minimum 3rd party trust. All your funds stay in your account. You can use/create automated system where you can lease for certain period of time and system can take care of payments and release of delegations (notify clients). Even better, you can use multi-signature feature to establish 100% trust where clients will have to confirm, approve transactions.

        + +

        Active permissions and authority should be used with utmost care, you don’t want to loose your funds. It is really not easy to hack Steem accounts, let alone take control over it. But without careful use (revealing private keys) loosing liquid funds are not that difficult and it takes only couple seconds to do that, keeping most value powered up always helps.

        + +

        this article has more detail around active authorities

        + +

        Intro

        + +

        This tutorial uses the database API to gather account information for the user that is granting active permission to a secondary user. This information is used to check current permissions as well as to build the broadcast operation. Granting or revoking active permission works by changing the array of usernames containing this information and then pushing those changes to the blockchain. The parameters for this updateAccount function are:

        + +
          +
        1. account - The username of the main account
        2. +
        3. active - Optional parameter to denote changes to the active authority type. This is the parameter that we will be changing in this tutorial
        4. +
        5. jsonMetadata - This is a string value obtained from the current account info
        6. +
        7. memoKey - This is the public memoKey of the user
        8. +
        9. owner - Optional parameter to denote changes to the owner authority type
        10. +
        11. posting - Optional parameter to denote changes to the posting authority type
        12. +
        13. privateKey - The private active key of the user
        14. +
        + +

        The only other information required is the username of the account that the active permission is being granted to.

        + +

        The tutorial is set up with three individual functions for each of the required operations - checking permission status, granting permission and revoking permission.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI.
        4. +
        5. Database query Sending a query to the blockchain for the active permissions (status)
        6. +
        7. Object creation Create the array and subsequent data object for the broadcast operation
        8. +
        9. Broadcast operation Broadcasting the changes to the blockchain
        10. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        import { Client, PrivateKey } from 'dsteem';
        +import { Testnet as NetConfig } from '../../configuration'; //A Steem Testnet. Replace 'Testnet' with 'Mainnet' to connect to the main Steem blockchain.
        +
        +let opts = { ...NetConfig.net };
        +
        +//connect to a steem node, testnet in this case
        +const client = new Client(NetConfig.url, opts);
        +
        + +

        Above, we have dsteem pointing to the testnet with the proper chainId, addressPrefix, and endpoint by importing it from the configuration.js file. Due to this tutorial altering the blockchain it is preferable to not work on production.

        + +

        2. Input variables

        + +

        The required parameters for the account status query is recorded via an HTML UI that can be found in the public/index.html file. Any active account information can be used for this tutorial but to make things easier we populate these fields once the UI loads.

        + +
        window.onload = async () => {
        +    const account = NetConfig.accounts[0];
        +    const accountI = NetConfig.accounts[1];
        +    document.getElementById('username').value = account.address;
        +    document.getElementById('privateKey').value = account.privActive;
        +    document.getElementById('newAccount').value = accountI.address;
        +};
        +
        + +

        All of the functions use the same input variables. Once the function is activated via the UI the variables are allocated as seen below.

        + +
        //get username
        +const username = document.getElementById('username').value;
        +//get private active key
        +const privateKey = PrivateKey.fromString(
        +    document.getElementById('privateKey').value
        +);
        +//get account to provide active auth
        +const newAccount = document.getElementById('newAccount').value;
        +
        + +

        3. Database query

        + +

        The queries are sent through to the steem blockchain with the database API using the getAccounts function. The results of the query is used to check the status of the current active authorisations and parameters as per the intro.

        + +
        //query database for active array
        +var _data = new Array
        +_data = await client.database.getAccounts([username]);
        +const activeAuth = _data[0].active;
        +
        +//check for username duplication
        +const checkAuth = _data[0].active.account_auths;
        +var arrayindex = -1;
        +var checktext = " does not yet have active permission"
        +for (var i = 0,len = checkAuth.length; i<len; i++) {
        +    if (checkAuth[i][0]==newAccount) {
        +        arrayindex = i
        +        var checktext = " already has active permission"
        +    }
        +}
        +
        + +

        The result of this status query is then displayed on the UI along with the array on the console as a check.

        + +
        document.getElementById('permCheckContainer').style.display = 'flex';
        +document.getElementById('permCheck').className = 'form-control-plaintext alert alert-success';
        +document.getElementById('permCheck').innerHTML = newAccount + checktext;
        +console.log(checkAuth);
        +
        + +

        4. Object creation

        + +

        The database query is the same for all the functions and is required to create an updated array to broadcast to the blockchain. This is how we determine whether a user permission will be added or revoked. The actual operation is the same apart from the array variable as can be seen below. The difference is in that when creating a permission, an element is added to the account_auths array where revoking removes an element from it.

        + +
        //add account permission
        +activeAuth.account_auths.push([
        +    newAccount,
        +    parseInt(activeAuth.weight_threshold)
        +]);
        +activeAuth.account_auths.sort();
        +
        +//revoke permission
        +activeAuth.account_auths.splice(arrayindex, 1);
        +
        + +

        When adding to the array (creaing permission) it is required to sort the array before we can broadcast. The Steem blockchain does not accept the new fields in the array if it’s not alphabetically sorted. +After the active array has been defined, the broadcast object can be created. This holds all the required information for a successful transaction to be sent to the blockchain. Where there is no change in the authority types, the parameter can be omitted or in the case of required parameters, allocated directly from the database query.

        + +
        //object creation
        +const accObj = {
        +    account: username,
        +    json_metadata: _data[0].json_metadata,
        +    memo_key: _data[0].memo_key,
        +    active: activeAuth,
        +}
        +
        + +

        5. Broadcast operation

        + +

        With all the parameters assigned, the transaction can be broadcast to the blockchain. As stated before, the actual broadcast operation for both new permissions and to revoke permissions use the same parameters.

        + +
        //account update broadcast
        +client.broadcast.updateAccount(accObj, privateKey).then(
        +    function(result) {
        +        console.log(
        +            'included in block: ' + result.block_num,
        +            'expired: ' + result.expired
        +        );
        +        document.getElementById('permCheckContainer').style.display = 'flex';
        +        document.getElementById('permCheck').className = 'form-control-plaintext alert alert-success';
        +        document.getElementById('permCheck').innerHTML = "permission has been revoked for " + newAccount;
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('permCheckContainer').style.display = 'flex';
        +        document.getElementById('permCheck').className = 'form-control-plaintext alert alert-danger';
        +        document.getElementById('permCheck').innerHTML = error.jse_shortmsg;
        +    }
        +);
        +
        + +

        The results of the operation is displayed on the UI along with a block number in the console to confirm a successful operation. If you add permission to an account that already has permission, or if your private key has been entered incorrectly, an error of “Missing Active Authority” will be displayed.

        + +

        Steemconnect offers an alternative to revoking active permission with a “simple link” solution. Instead of running through a list of operations on your account, you can simply use a link similar to the one below. You will be prompted to enter your usename and password and the specified user will have their permissions removed instantly. +https://v2.steemconnect.com/revoke/@username +This is similar to the steemconnect links that have been covered in previous tutorials. For a list of signing operations that work in this manner you can go to https://v2.steemconnect.com/sign

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/31_grant_active_permission
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/grant_posting_permission.html b/docs/tutorials-javascript/grant_posting_permission.html new file mode 100644 index 00000000..84965749 --- /dev/null +++ b/docs/tutorials-javascript/grant_posting_permission.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + +JS: Grant Posting Permission | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Grant Posting Permission + + +

        + +

        How to grant and revoke posting permission to another user.

        +
        + + +

        Full, runnable src of Grant Posting Permission can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of checking a specific users’ data, altering the array pertaining to the posting account_auths, and then broadcasting the changes to the blockchain. Demo account information has been provided to assist with the tutorial. This tutorial has been set up for the testnet but can be easily be changed for production.

        + +

        Providing another user posting permission for your account can be used to allow multiple users to submit posts on a single steemit community. @Utopian-Io is an example of such a community. There are also applications that allows you to schedule posts by automatically publishing on your behalf.

        + +

        Intro

        + +

        This tutorial uses the database API to gather account information for the user that is granting posting permission to another user. This information is used to check current permissions as well as to build the broadcast operation. Granting or revoking posting permission works by changing the array of usernames containing this information and then pushing those changes to the blockchain. The parameters for this updateAccount function are:

        + +
          +
        1. account - The username of the main account
        2. +
        3. active - Optional parameter to denote changes to the active authority type
        4. +
        5. jsonMetadata - This is a string value obtained from the current account info
        6. +
        7. memoKey - This is the public memoKey of the user
        8. +
        9. owner - Optional parameter to denote changes to the owner authority type
        10. +
        11. posting - Optional parameter to denote changes to the posting authority type. This is the parameter that we will be changing in this tutorial
        12. +
        13. privateKey - The private active key of the user
        14. +
        + +

        The only other information required is the username of the account that the posting permission is being granted to.

        + +

        The tutorial is set up with three individual functions for each of the required operations - checking permission status, granting permission and revoking permission.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI.
        4. +
        5. Database query Sending a query to the blockchain for the posting permissions (status)
        6. +
        7. Object creation Create the array and subsequent data object for the broadcast operation
        8. +
        9. Broadcast operation Broadcasting the changes to the blockchain
        10. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +//define network parameters
        +let opts = {};
        +opts.addressPrefix = 'STX';
        +opts.chainId =
        +    '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673';
        +//connect to a steem node, testnet in this case
        +const client = new dsteem.Client('https://testnet.steem.vc', opts);
        +
        + +

        Above, we have dsteem pointing to the testnet with the proper chainId, addressPrefix, and endpoint. Due to this tutorial altering the blockchain it is preferable to not work on production.

        + +

        2. Input variables

        + +

        The required parameters for the account status query is recorded via an HTML UI that can be found in the public/index.html file. The values are pre-populated in this case but any account name can be used.

        + +

        All of the functions use the same input variables. Once the function is activated via the UI the variables are allocated as seen below.

        + +
        //get username
        +const username = document.getElementById('username').value;
        +//get private active key
        +const privateKey = dsteem.PrivateKey.fromString(
        +    document.getElementById('privateKey').value
        +);
        +//get account to provide posting auth
        +const newAccount = document.getElementById('newAccount').value;
        +
        + +

        3. Database query

        + +

        The queries are sent through to the steem blockchain with the database API using the getAccounts function. The results of the query is used to check the status of the current posting authorisations and parameters as per the intro.

        + +
            //query database for posting array
        +    _data = new Array
        +    _data = await client.database.getAccounts([username]);
        +    const postingAuth = _data[0].posting;
        +
        +     //check for username duplication
        +    const checkAuth = _data[0].posting.account_auths;
        +    var arrayindex = -1;
        +    var checktext = " does not yet have posting permission"
        +    for (var i = 0,len = checkAuth.length; i<len; i++) {
        +        if (checkAuth[i][0]==newAccount) {
        +            arrayindex = i
        +            var checktext = " already has posting permission"
        +        }
        +    }
        +
        + +

        The result of this status query is then displayed on the UI along with the array on the console as a check.

        + +
        document.getElementById('permCheckContainer').style.display = 'flex';
        +document.getElementById('permCheck').className =
        +    'form-control-plaintext alert alert-success';
        +document.getElementById('permCheck').innerHTML = newAccount + checktext;
        +console.log(checkAuth);
        +
        + +

        4. Object creation

        + +

        The database query is the same for all the functions and is required to create an updated array to broadcast to the blockchain. This is how we determine whether a user permission will be added or revoked. The actual operation is the same apart from the array variable as can be seen below. The difference is in that when creating a permission, an element is added to the account_auths array where revoking removes an element from it.

        + +
        //add account permission
        +postingAuth.account_auths.push([
        +    newAccount,
        +    parseInt(postingAuth.weight_threshold),
        +]);
        +postingAuth.account_auths.sort();
        +
        +//revoke permission
        +postingAuth.account_auths.splice(arrayindex, 1);
        +
        + +

        When adding to the array (creaing permission) it is required to sort the array before we can broadcast. The steem blockchain does not accept the new fields in the array if it’s not alphabetically sorted. +After the posting array has been defined, the broadcast object can be created. This holds all the required information for a successful transaction to be sent to the blockchain. Where there is no change in the authority types, the parameter can be omitted or in the case of required parameters, allocated directly from the database query.

        + +
        //object creation
        +const accObj = {
        +    account: username,
        +    json_metadata: _data[0].json_metadata,
        +    memo_key: _data[0].memo_key,
        +    posting: postingAuth,
        +};
        +
        + +

        5. Broadcast operation

        + +

        With all the parameters assigned, the transaction can be broadcast to the blockchain. As stated before, the actual broadcast operation for both new permissions and to revoke permissions use the same parameters.

        + +
        //account update broadcast
        +client.broadcast.updateAccount(accObj, privateKey).then(
        +    function(result) {
        +        console.log(
        +            'included in block: ' + result.block_num,
        +            'expired: ' + result.expired
        +        );
        +        document.getElementById('permCheckContainer').style.display = 'flex';
        +        document.getElementById('permCheck').className =
        +            'form-control-plaintext alert alert-success';
        +        document.getElementById('permCheck').innerHTML =
        +            'posting permission has been granted to ' + newAccount;
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('permCheckContainer').style.display = 'flex';
        +        document.getElementById('permCheck').className =
        +            'form-control-plaintext alert alert-danger';
        +        document.getElementById('permCheck').innerHTML = error.jse_shortmsg;
        +    }
        +);
        +
        + +

        The results of the operation is displayed on the UI along with a block number in the console to confirm a successful operation. If you add permission to an account that already has permission will display an error of “Missing Active Authority”.

        + +

        Steemconnect offers an alternative to revoking posting permission with a “simple link” solution. Instead of running through a list of opetions on your account, you can simply use a link similar to the one below. You will be prompted to enter your usename and password and the specified user will have their posting permission removed instantly. +https://v2.steemconnect.com/revoke/@username +This is similar to the steemconnect links that have been covered in previous tutorials. For a list of signing operations that work in this manner you can go to https://v2.steemconnect.com/sign

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/28_grant_posting_permission
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/power_down.html b/docs/tutorials-javascript/power_down.html new file mode 100644 index 00000000..907bbf9f --- /dev/null +++ b/docs/tutorials-javascript/power_down.html @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + +JS: Power Down | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Power Down + + +

        + +

        Perform a power down on all or part of an account’s VESTS using either Steemconnect or client-side signing.

        +
        + + +

        Full, runnable src of Power Down can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial runs on the main Steem blockchain. Therefore, any accounts used here will affect real funds on the live network. Use with caution.

        + +

        Intro

        + +

        This tutorial will demonstrate a few functions such as querying account by name and determining the vesting balance of the related account. We are using the call function provided by the dsteem library to pull account data from the Steem blockchain. We then calculate STEEM Power from the VESTS (vesting shares) for the convenience of the user. We will use a simple HTML interface to capture the account and its VESTS. It also has an interactive UI to perform a power down in full or in part.

        + +

        Steps

        + +
          +
        1. App setup Setup dsteem to use the proper connection and network.
        2. +
        3. Search account Get account details after input has account name
        4. +
        5. Calculate and Fill form Calculate available vesting shares and fill the form with details
        6. +
        7. Power down Power down VESTS with Steemconnect or client-side signing.
        8. +
        + +

        1. App setup

        + +

        Below, we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Search account

        + +

        After the account name field has been filled with a name, we automatically search for the account by name when the input is focused out. The related HTML input forms can be found in the index.html file. The values are pulled from that screen with the following:

        + +
            const accSearch = document.getElementById('username').value;
        +    const _account = await client.database.call('get_accounts', [[accSearch]]);
        +    console.log(`_account:`, _account);
        +
        + +

        3. Calculate and Fill form

        + +

        Once the account data has been fetched, we will fill the form with VESTS balance and show current balance details. Note, that in order to get the available vesting shares we will have to check a few things:

        + +
          +
        • if account is already powering down
        • +
        • how much is currently powering down
        • +
        • how much has been delegated (because active delegation locks those funds from being powered down)
        • +
        + +

        Available balance will be in the avail variable.

        + +

        For the convenience of the user, we will convert available VESTS to STEEM with getDynamicGlobalProperties function and fill the form fields accordingly.

        + +
            const name = _account[0].name;
        +    const avail = parseFloat(_account[0].vesting_shares) - (parseFloat(_account[0].to_withdraw) - parseFloat(_account[0].withdrawn)) / 1e6 - parseFloat(_account[0].delegated_vesting_shares);
        +
        +    const props = await client.database.getDynamicGlobalProperties();
        +    const vestSteem = parseFloat(parseFloat(props.total_vesting_fund_steem) *
        +        (parseFloat(avail) / parseFloat(props.total_vesting_shares)),6);
        +
        +    const balance = `Available Vests for ${name}: ${avail} VESTS ~ ${vestSteem} STEEM POWER<br/><br/>`;
        +    document.getElementById('accBalance').innerHTML = balance;
        +    document.getElementById('steem').value = avail+' VESTS';
        +
        + +

        Once form is filled with the maximum available VESTS balance, we can choose the amount of VESTS to power down.

        + +

        4. Power down

        + +

        We have two options on how to Power down: Steemconnect and client-side signing. By default we generate a Steemconnect link to Power down (withdraw vesting), but we can also choose the client signing option to Power down right inside tutorial. Note: client-side signing will require Active Private key to perform the operation.

        + +

        In order to enable client signing, we will generate the operation and also show Active Private key (wif) field to sign transaction right there, client side.

        + +

        Below, we can see an example of the operation and signing transaction. After a successful broadcast, the result will be shown in user interface. It will show the block number that the transaction was included in.

        + +
        window.submitTx = async () => {
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('wif').value
        +    );
        +    const op = [
        +        'withdraw_vesting',
        +        {
        +            account: document.getElementById('username').value,
        +            vesting_shares: document.getElementById('steem').value,
        +        },
        +    ];
        +    client.broadcast.sendOperations([op], privateKey).then(
        +        function(result) {
        +            document.getElementById('result').style.display = 'block';
        +            document.getElementById(
        +                'result'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +};
        +
        + +

        That’s it!

        + +

        To run this tutorial

        + +
          +
        1. git clone https://github.com/steemit/devportal-tutorials-js.git
        2. +
        3. cd devportal-tutorials-js/tutorials/23_power_down
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/power_up_steem.html b/docs/tutorials-javascript/power_up_steem.html new file mode 100644 index 00000000..fa92b360 --- /dev/null +++ b/docs/tutorials-javascript/power_up_steem.html @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + +JS: Power Up Steem | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Power Up Steem + + +

        + +

        Power up an account’s Steem using either Steemconnect or a client-side signing.

        +
        + + +

        Full, runnable src of Power Up Steem can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial runs on the main Steem blockchain. And accounts queried are real users with liquid STEEM balances.

        + +

        Intro

        + +

        This tutorial will show few functions such as querying account by name and getting account balance. We are using the call function provided by the dsteem library to pull account from the Steem blockchain. A simple HTML interface is used to capture the account and its STEEM balance as well as allowing interactively power up part or all of STEEM to choose account.

        + +

        Steps

        + +
          +
        1. App setup Setup dsteem to use the proper connection and network.
        2. +
        3. Search account Get account details after input has account name
        4. +
        5. Fill form Fill form with account reward balances
        6. +
        7. Power up Power up STEEM with Steemconnect or Client-side signing.
        8. +
        + +

        1. App setup

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Search account

        + +

        After account name field is filled with some name, we do automatic search for account by name when input is focused out. HTML input forms can be found in the index.html file. The values are pulled from that screen with the below:

        + +
            const accSearch = document.getElementById('username').value;
        +    const _account = await client.database.call('get_accounts', [[accSearch]]);
        +    console.log(`_account:`, _account);
        +
        + +

        3. Fill form

        + +

        After we fetched account data, we will fill form with STEEM balance and show current balance details.

        + +
        const name = _account[0].name;
        +const steem_balance = _account[0].balance;
        +const balance = `Available Steem balance for ${name}: ${steem_balance}<br/>`;
        +document.getElementById('accBalance').innerHTML = balance;
        +document.getElementById('steem').value = steem_balance;
        +const receiver = document.getElementById('receiver').value;
        +
        + +

        4. Power up

        + +

        We have 2 options on how to Power up. Steemconnect and Client-side signing options. By default we generate Steemconnect link to Power up (transfer to vesting), but you can use client signing option to Power up right inside tutorial, note client-side signing will require Active private key to perform operation.

        + +

        In order to enable client signing, we will generate operation and also show Active Private key (wif) field to sign transaction right there client side. +Below you can see example of operation and signing transaction, after successful operation broadcast result will be shown in user interface. It will be block number that transaction was included.

        + +
        window.submitTx = async () => {
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('wif').value
        +    );
        +    const op = [
        +        'transfer_to_vesting',
        +        {
        +            from: document.getElementById('username').value,
        +            to: document.getElementById('receiver').value,
        +            amount: document.getElementById('steem').value,
        +        },
        +    ];
        +    client.broadcast.sendOperations([op], privateKey).then(
        +        function(result) {
        +            document.getElementById('result').style.display = 'block';
        +            document.getElementById(
        +                'result'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +};
        +
        + +

        That’s it!

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/22_power_up_steem
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/reblogging_post.html b/docs/tutorials-javascript/reblogging_post.html new file mode 100644 index 00000000..b762355f --- /dev/null +++ b/docs/tutorials-javascript/reblogging_post.html @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + +JS: Reblogging Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Reblogging Post + + +

        + +

        By the end of this tutorial you should know how to reblog (resteem) a blog from steem

        +
        + + +

        Full, runnable src of Reblogging Post can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will show the method of obtaining the relevant inputs for the reblog process followed by broadcasting the info to the steem blockchain using a demo account on the production server.

        + +

        Intro

        + +

        We are using the client.broadcast function provided by dsteem to reblog the selected blogpost. There are 4 variables that are required to perform this action:

        + +
          +
        • The account name that is doing the reblog
        • +
        • The private posting key of the account that is doing the reblog (this is not your main key)
        • +
        • The author of the post that is being reblogged
        • +
        • The title of the post that is being reblogged
        • +
        + +

        A simple HTML interface is used to capture the required information after which the transaction is submitted. There are two prerequisites within the reblog process in Steem that have to be adhered to, namely, the post must not be older than 7 days, and the post can only be reblogged once by a specific account. The fields have been populated with information to give an example of what it would look like but care has to be taken to provide correct details before the function is executed.

        + +

        This tutorial makes use of the This function is taken from the tutorial Blog Feed to get a list of trending posts.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to use the proper connection and network.
        2. +
        3. Collecting information Generating relevant posting information with an HTML interface.
        4. +
        5. Broadcasting the reblog Assigning variables and executing the reblog.
        6. +
        + +

        1. Configure connection**

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. Although this tutorial is interactive, we will not post to the testnet due to the prerequisites of reblogging. +There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +
        +//define network parameters
        +let opts = {};
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to a Steem node. This is currently setup on production, but we recommend using a testnet like https://testnet.steem.vc
        +const client = new dsteem.Client('https://api.steemit.com', opts);
        +
        + +

        2. Collecting information

        + +

        Next we have the submitPost function that collects the required fields for the reblog process via an HTML interface +after wich we assign them to variables for use later.

        + +
        //this function will execute when the HTML form is submitted
        +window.submitPost = async () => {
        +    //get private key
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('postingKey').value
        +    );
        +    //get account name
        +    const myAccount = document.getElementById('username').value;
        +    //get blog author
        +    const theAuthor = document.getElementById('theAuthor').value;
        +    //get blog permLink
        +    const thePermLink = document.getElementById('thePermLink').value;
        +
        + +

        3. Broadcasting the reblog

        + +

        Finally we create two variables to simply the client.broadcast function line and broadcast the reblog instruction.

        + +
        const jsonOp = JSON.stringify([
        +    'reblog',
        +    {
        +        account: myAccount,
        +        author: theAuthor,
        +        permlink: thePermLink,
        +    },
        +]);
        +
        +const data = {
        +    id: 'follow',
        +    json: jsonOp,
        +    required_auths: [],
        +    required_posting_auths: [myAccount],
        +};
        +
        +client.broadcast.json(data, privateKey).then(
        +    function(result) {
        +        console.log('client broadcast result: ', result);
        +    },
        +    function(error) {
        +        console.error(error);
        +    }
        +);
        +
        + +

        There are also two console functions an a ui output under Resteem Results defined in order to track if the reblog +as successful or not. If the broadcast succeeds the console.log will show the following:

        + +

        client broadcast result:

        + +
        {
        +    id: "f10d69ac521cf34b0f5d18d938e68c89e77bb31d",
        +    block_num: 22886453,
        +    trx_num: 35,
        +    expired: false
        +}
        +
        + +

        This indicates the block number at which the broadcast was sent as well as the transaction ID for the reblog.

        + +

        If the reblog fails the console.log will present a long line of error code:

        + +
        {
        +    name: "RPCError",
        +    jse_shortmsg: "blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
        +    jse_info: {
        +        ode: 10,
        +        name: "assert_exception",
        +        message: "Assert Exception",
        +        stack: Array(6)
        +    },
        +    message: "blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
        +    stack: "RPCError: blog_itr == blog_comment_idx.end(): Acco…lled (http://localhost:3000/bundle.js:440:690874)"
        +}
        +
        + +

        There is a line in the error log indicating “Account has already reblogged this post” indicating exactly that. This process can be run until a positive result is found.

        + +

        It should be noted that reblogging a post does not create a new post on the blockchain but merely shares the post to whomever is following the user doing the reblog. Along with reblogging the custom_json broadcast operation also includes options for following users and editing blog content. More information on how to use the broadcast operation and options surrounding the operation can be found on the Steem Devportal

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/14_reblogging_post
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/search_accounts.html b/docs/tutorials-javascript/search_accounts.html new file mode 100644 index 00000000..05cfd99b --- /dev/null +++ b/docs/tutorials-javascript/search_accounts.html @@ -0,0 +1,410 @@ + + + + + + + + + + + + + + + + + + +JS: Search Accounts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Search Accounts + + +

        + +

        By the end of this tutorial you should know how to call a list of user names from the steem blockchain

        +
        + + +

        Full, runnable src of Search Accounts can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will show the method of capturing a queried user name, matching that to the steem database and then displaying the matching names. This tutorial will be run on the production server.

        + +

        Intro

        + +

        We are using the call function provided by the dsteem library to pull user names from the steem blockchain. The information being pulled is dependent on two variables:

        + +
          +
        1. The max number of user names that needs to be displayed by the search
        2. +
        3. The string representing the first characters of the user name you are searching for
        4. +
        + +

        A simple HTML interface is used to both capture the string query as well as display the completed search. The layout can be found in the “index.html” file.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to use the proper connection and network.
        2. +
        3. Collecting input variables Assigning and collecting the necessary variables
        4. +
        5. Blockchain query Finding the data on the blockchain based on the inputs
        6. +
        7. Output Displaying query results
        8. +
        + +

        1. Configure connection

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +	'0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Collecting input variables

        + +

        Next we assign the max number of lines that will be returned by the query. We also use getElementById to retrieve the requested user name for searching from the HTML interface. The max value can very easily also be attained from the HTML side simply by adding another input line in index.html and a second getElementById line.

        + +
        const max = 10;
        +window.submitAcc = async () => {
        +    const accSearch = document.getElementById("username").value;
        +
        + +

        3. Blockchain query

        + +

        The next step is to pull the user names from the blockchain that matches the “username” variable that was retrieved. This is done using the database.call function and assigning the result to an array.

        + +
        const _accounts = await client.database.call('lookup_accounts',[accSearch, max]);
        +    console.log(`_accounts:`, _accounts);
        +
        + +

        4. Output

        + +

        Finally we create a list from the “_accounts” array generated in step 3.

        + +
        document.getElementById('accList').innerHTML = _accounts.join('<br>');
        +}
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/15_search_accounts
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/search_tags.html b/docs/tutorials-javascript/search_tags.html new file mode 100644 index 00000000..62730e3a --- /dev/null +++ b/docs/tutorials-javascript/search_tags.html @@ -0,0 +1,413 @@ + + + + + + + + + + + + + + + + + + +JS: Search Tags | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Search Tags + + +

        + +

        By the end of this tutorial you should know how to run a search for trending tags

        +
        + + +

        Full, runnable src of Search Tags can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial runs on the main Steem blockchain.

        + +

        Intro

        + +

        This tutorial will show the method of capturing a queried tag name and matching it to the steem database. We are using the call function provided by the dsteem library to pull tags from the steem blockchain. A simple HTML interface is used to both capture the string query as well as display the completed search.

        + +

        steps

        + +
          +
        1. Configure connection Configuration of dsteem to use the proper connection and network.
        2. +
        3. Search input Collecting the relevant search criteria
        4. +
        5. Run Search Running the search on the blockchain
        6. +
        7. Output Displaying the results of the search query
        8. +
        + +

        1. Configure connection

        + +

        Below we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Search input

        + +

        Collecting of the search criteria happens via an HTML input. The form can be found in the index.html file. The values are pulled from that screen with the below:

        + +
        const max = 10;
        +window.submitTag = async () => {
        +    const tagSearch = document.getElementById("tagName").value;
        +
        + +

        3. Run Search

        + +

        In order to access the blockchain to run the search a call function is used with the search field and maximum list items as parameters.

        + +
        const _tags = await client.database.call('get_trending_tags',[tagSearch, max]);
        +
        + +

        The result of the search is an array of tags along with their respective vital data like comments, payouts, etc.

        + +

        4. Output

        + +

        Due to the output from the call function being an array, we can’t use a simple post function to display the tags. The specific fields within the array needs to be selected and then displayed.

        + +
        console.log('tags: ', _tags);
        +var posts = [];
        +_tags.forEach(post => {
        +    posts.push(
        +        `<div class="list-group-item"><h5 class="list-group-item-heading">${
        +            post.name
        +        }</h5></div>`
        +    );
        +});
        +//disply list of tags with line breaks
        +document.getElementById('tagList').innerHTML = posts.join('<br>');
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/16_search_tags
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/set_withdraw_route.html b/docs/tutorials-javascript/set_withdraw_route.html new file mode 100644 index 00000000..3eb9bcdc --- /dev/null +++ b/docs/tutorials-javascript/set_withdraw_route.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + +JS: Set Withdraw Route | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Set Withdraw Route + + +

        + +

        Set routes to an account’s power downs or withdraws.

        +
        + + +

        Full, runnable src of Set Withdraw Route can be downloaded as part of the JS tutorials repository. +

        + +

        We will learn how to allocate a percentage for withdrawal to other accounts using Steemconnect as well as with the client-side signing method. This tutorial runs on the main Steem blockchain. Therefore, any accounts used here will affect real funds on the live network. Use with caution.

        + +

        Intro

        + +

        This tutorial will demonstrate a few functions such as querying account by name and determining the vesting balance of the related account. This will allow us to set “withdraw routes” to other accounts with a percent selection and auto power up function. This feature is quite useful if you want to withdraw a portion of your STEEM to a separate account or POWER UP other accounts as you withdraw from one account.

        + +

        Steps

        + +
          +
        1. App setup Setup dsteem to use the proper connection and network.
        2. +
        3. Get account routes Get account’s current routes
        4. +
        5. Fill form Fill form with appropriate data
        6. +
        7. Set withdraw route Set route with Steemconnect or client-side signing
        8. +
        + +

        1. App setup

        + +

        Below, we have dsteem pointing to the production network with the proper chainId, addressPrefix, and endpoint. There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        2. Get account routes

        + +

        After the account name field is provided, using the Get withdraw routes button, we can fetch the current withdraw routes, if they exist. The related HTML input forms can be found in the index.html file. The values are pulled from that screen with the following:

        + +
            const accSearch = document.getElementById('username').value;
        +
        +    const _account = await client.database.call('get_withdraw_routes', [accSearch]);
        +    console.log(`_account:`, _account);
        +
        + +

        3. Fill form

        + +

        After we have fetched the account data, we will show a list of current routes, if they exist, and display information to the user about how many much they can apply to other accounts.

        + +
        let info = '';
        +let sum = 0;
        +if (_account.length > 0) {
        +    for (var i = 0; i < _account.length; i++) {
        +        info += `${_account[i].to_account} - ${_account[i].percent / 100}%<br>`;
        +        sum += _account[i].percent / 100;
        +    }
        +} else {
        +    info += `No route is available!<br>`;
        +}
        +info += `You can set ${100 - sum}% remaining part to other accounts!`;
        +document.getElementById('accInfo').innerHTML = info;
        +
        + +

        Previous routes can be overwritten by changing and submitting a new transaction to the same account.

        + +

        We also generate a Steemconnect signing link.

        + +
        window.openSC = async () => {
        +    const link = `https://steemconnect.com/sign/set-withdraw-vesting-route?from_account=${
        +        document.getElementById('username').value
        +    }&percent=${document.getElementById('steem').value * 100}&to_account=${
        +        document.getElementById('account').value
        +    }&auto_vest=${document.getElementById('percent').checked}`;
        +    window.open(link);
        +};
        +
        + +

        4. Set withdraw route

        + +

        We have two options on how to Power down: Steemconnect and client-side signing. Since this action requires Active authority, both client-side and Stemconnect signing will require the Active Private key to sign the transaction. The transaction submission function appears as follows:

        + +
        window.submitTx = async () => {
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('wif').value
        +    );
        +    const op = [
        +        'set_withdraw_vesting_route',
        +        {
        +            from_account: document.getElementById('username').value,
        +            to_account: document.getElementById('account').value,
        +            percent: document.getElementById('steem').value * 100,
        +            auto_vest: document.getElementById('percent').checked,
        +        },
        +    ];
        +    client.broadcast.sendOperations([op], privateKey).then(
        +        function(result) {
        +            document.getElementById('result').style.display = 'block';
        +            document.getElementById(
        +                'result'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +};
        +
        + +

        That’s it!

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/26_set_withdraw_route
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/steemconnect.html b/docs/tutorials-javascript/steemconnect.html new file mode 100644 index 00000000..6d810e3c --- /dev/null +++ b/docs/tutorials-javascript/steemconnect.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + +JS: Steemconnect | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Steemconnect + + +

        + +

        Understand the basics of using Steemconnect with your Steem application.

        +
        + + +

        Full, runnable src of Steemconnect can be downloaded as part of the JS tutorials repository. +

        + +

        In this tutorial we will setup Steemconnect for demo application and step by step show the process of setting up dedicated account for your app to use Steemconnect Dashboard and setup backend of your application to use Steemconnect authorization properly.

        + +

        Intro

        + +

        The application in this tutorial asks the user to grant an access to demo-app and get token from Steemconnect. Once permission is granted, demo-app can get details of user via an api call that requires access token. +Purpose is to allow any application request permission from user and perform action via access token.

        + +

        Some other calls that require an access token (or login) are:

        + +
          +
        • Vote
        • +
        • Comment
        • +
        • Post
        • +
        • Follow
        • +
        • Reblog
        • +
        + +

        Learn more about Steemconnect operations here

        + +

        Steps

        + +
          +
        1. Steemconnect Dashboard Create account for application and set up dashboard
        2. +
        3. Initialize Steemconnect Initialize SDK in your application code
        4. +
        5. Login URL Form login url for user
        6. +
        7. Request token Request token with login url
        8. +
        9. Set token Set or save token for future requests
        10. +
        11. Get user data Get user details with token
        12. +
        13. Logout Logout user and clear token
        14. +
        + +

        1. Steemconnect Dashboard

        + +

        Steemconnect is unified authentification system built on top of Steem built in collaboration of Busy.org and Steemit Inc. +Layer to ensure easy access and setup for all application developers as well as secure way for users to interact with Steem apps.

        + +

        Setting up Steemconnect in your app is straight-forward process and never been this easy.

        + +

        Here are the steps that helps you to setup new app:

        + +

        1a. Visit Steemconnect Dashboard and login with your Steem credentials

        + +

        steemconnect_login

        + +

        1b. You will see Applications and Developers section, in Developers section click on My Apps

        + +

        steemconnect_dashboard

        + +

        steemconnect_new_app

        + +

        1c. Create New App using Steemconnect, which will help you create new Steem account for your application. Let’s call it demo-app for this tutorial purpose.

        + +

        steemconnect_account_create

        + +

        Account creation fee will be deducted from your balance, make sure you have enough funds to complete account creation.

        + +

        Next step is to login with account which has enough balance to pay for account creation fee.

        + +

        steemconnect_signin

        + +

        1d. Give your app name, description, icon image link, website (if available) and Redirect URI(s)

        + +

        steemconnect_myapps

        + +

        Application name and description should give users clear understanding what permissions it requires and what is the purpose of the app.

        + +

        App Icon field should be publicly accessible and available link to your logo or icon.

        + +

        Website field is homepage for the application if exist.

        + +

        Redirect URI(s) will be used within your application to forward user after authentification is successful. You can specify multiple callback URLs with each new line. Callback in Steemconnect SDK should match exactly one of URI(s) specified on this page. Due to security reasons if redirect URI(s) used in SDK is other than you specified, it will not work. +This is typical backend web development, we hope you know how to set up your backend/app to handle callback URLs.

        + +
          +
        • Disclaimer: All images/screenshots of user interface may change as Steemconnect evolves
        • +
        + +

        2. Initialize Steemconnect

        + +

        Once you have setup account for new application, you can setup application with Steemconnect authentification and API processes. +To do that, you will need to install sc2-sdk nodejs package with npm i sc2-sdk. +Within application you can initialize Steemconnect

        + +
        +

        app - is account name for application that we have created in Step I.3, callbackURL - is Redirect URI that we have defined in Step I.4, scope - permissions application is requiring/asking from users

        +
        + +

        Now that sc2-sdk is initialized we can start authentication and perform simple operations with Steemconnect.

        + +

        3. Login URL

        + +
        +

        getLoginURL function you see on the right side, returns login URL which will redirect user to sign in with Steem connect screen. Successfull login will redirect user to Redirect URI or callbackURL. Result of successful login will return access_token, expires_in and username information, which application will start utilizing.

        +
        + +

        4. Request token

        + +
        +

        Application can request returned link into popup screen or relevant screen you have developed. Popup screen will ask user to identify themselves with their username and password. Once login is successful, you will have Results

        +
        + +

        5. Set token

        + +
        +

        Returned data has access_token - which will be used in future api calls, expires_in - how long access token is valid in seconds and username of logged in user.

        +
        + +
        +

        After getting access_token, we can set token for future Steemconnect API requests.

        +
        + +

        6. Get user data

        + +
        +

        Users info can be checked with me which will return object +account - current state of account and its details on Steem blockchain, name - username, scope - permissions allowed with current login, user - username, user_metadata - additional information user has setup.

        +
        + +

        7. Logout

        + +
        +

        In order to logout, you can use revokeToken function from sc2-sdk.

        +
        + +

        That’s all there is to it.

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/02_steemconnect
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/stream_blockchain_transactions.html b/docs/tutorials-javascript/stream_blockchain_transactions.html new file mode 100644 index 00000000..61f6fc0a --- /dev/null +++ b/docs/tutorials-javascript/stream_blockchain_transactions.html @@ -0,0 +1,460 @@ + + + + + + + + + + + + + + + + + + +JS: Stream Blockchain Transactions | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Stream Blockchain Transactions + + +

        + +

        By the end of this tutorial you should know how to stream transactions and blocks from Steem blockchain.

        +
        + + +

        Full, runnable src of Stream Blockchain Transactions can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and streaming blocks using the blockchain.getBlockStream() operation. Being able to stream blocks is crucial if you are building automated or follow up scripts or detect certain type of transactions on network or simply use it for your backend application to sync and/or work with data in real-time.

        + +

        Intro

        + +

        Tutorial is demonstrating the typical process of streaming blocks on Steem. We will show some information from each block that is being streamed to give you an idea. Each block contains transactions objects as well but we will not show each of this data in user interface.

        + +

        We are using the blockchain.getBlockStream function provided by dsteem which returns each block after it has been accepted by witnesses. By default it follows irreversible blocks which was accepted by all witnesses. Function follows or gets blocks every 3 seconds so it would not miss any new blocks. We will then extract part of this data and show it in list.

        + +

        Steps

        + +
          +
        1. App setup Configure proper settings for dsteem
        2. +
        3. Stream blocks Stream blocks
        4. +
        5. Display result Show results in proper UI
        6. +
        + +

        1. App setup

        + +

        As usual, we have a file called public/app.js, which holds the Javascript segment of the tutorial. In the first few lines, we have defined the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +
        +let opts = {};
        +
        +//connect to production server
        +opts.addressPrefix = 'STM';
        +opts.chainId =
        +    '0000000000000000000000000000000000000000000000000000000000000000';
        +
        +//connect to server which is connected to the network/production
        +const client = new dsteem.Client('https://api.steemit.com');
        +
        + +

        Above, we have dsteem pointing to the live network with the proper chainId, addressPrefix, and endpoint. Because this tutorial requires active transactions to see some data.

        + +

        2. Stream blocks

        + +

        Next, we have a main function which fires at on-load and starts streaming blocks from network.

        + +
        stream = client.blockchain.getBlockStream();
        +stream
        +    .on('data', function(block) {
        +        //console.log(block);
        +        blocks.unshift(
        +            `<div class="list-group-item"><h5 class="list-group-item-heading">Block id: ${
        +                block.block_id
        +            }</h5><p>Transactions in this block: ${
        +                block.transactions.length
        +            } <br>Witness: ${
        +                block.witness
        +            }</p><p class="list-group-item-text text-right text-nowrap">Timestamp: ${
        +                block.timestamp
        +            }</p></div>`
        +        );
        +        document.getElementById('blockList').innerHTML = blocks.join('');
        +    })
        +    .on('end', function() {
        +        // done
        +        console.log('END');
        +    });
        +
        + +

        We have also defined Pause and Resume functions for relevant buttons to pause/resume stream at any moment.

        + +
        //pause stream
        +window.pauseStream = async () => {
        +    state = stream.pause();
        +};
        +
        +//resume stream
        +window.resumeStream = async () => {
        +    state = state.resume();
        +};
        +
        + +

        3. Display result

        + +

        In above scection, following line of code populates object with the data coming from Stream:

        + +
        blocks.unshift(
        +    `<div class="list-group-item"><h5 class="list-group-item-heading">Block id: ${
        +        block.block_id
        +    }</h5><p>Transactions in this block: ${
        +        block.transactions.length
        +    } <br>Witness: ${
        +        block.witness
        +    }</p><p class="list-group-item-text text-right text-nowrap">Timestamp: ${
        +        block.timestamp
        +    }</p></div>`
        +);
        +
        + +

        Example of output:

        + +
        {
        +    block_id: "015d34f12bced299cec068500fdbf3070016160c",
        +    extensions:[],
        +    previous:"015d34f021e85b437c9fcb8cf47d9e258a1ad7e4",
        +    signing_key:"STM5zNNjMyCKbhcPgo5ca7jq9UBGVzpq6yoaHw1R2dKaZdxhcuwuW",
        +    timestamp:"2018-05-30T14:27:36",
        +    transaction_ids:
        +        ["0e7ce7445884c44346da4dafdef99ea7fda60bd0", "194f404d3dab66459421792045625334f7465da1"],
        +    transaction_merkle_root:"bc39f1fb9edbb02200d1ab0e68d3dbc4afc62aca",
        +    transactions:[{}, {}],
        +    witness:"good-karma",
        +    witness_signature:"2005f2d5f9d4000ca2ba76db5e555982e3ca47d6f6516ea1bacb316545b478d6617987afd71b5bf0b3f231fdc140453f9043b8ea981220cecf44118d50eedbe870"
        +}
        +
        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/13_stream_blockchain_transactions
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/submit_comment_reply.html b/docs/tutorials-javascript/submit_comment_reply.html new file mode 100644 index 00000000..13870026 --- /dev/null +++ b/docs/tutorials-javascript/submit_comment_reply.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + +JS: Submit Comment Reply | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Submit Comment Reply + + +

        + +

        By the end of this tutorial you should know how to post a simple comment to Steem.

        +
        + + +

        Full, runnable src of Submit Comment Reply can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and posting comment using the broadcast.comment operation. +Being able to post a comment is critical to most social applications built on Steem.

        + +

        Intro

        + +

        We are using the broadcast.comment function provided by the dsteem library which generates, signs, and broadcasts the transaction to the network. On the Steem platform, posts and comments are all internally stored as a comment object, differentiated by whether or not a parent_author exists. When there is no parent_author, the it’s a post, when there is, it’s a comment. An account can broadcast a comment on the blockchain every 3 seconds (with every new block) enabling the user to comment as they wish with almost no wait time between commits.

        + +

        Steps

        + +
          +
        1. App setup Import dsteem into app.js and prepare it to communicate with a Steem blockchain
        2. +
        3. Choose parent post Choose a parent post on which to comment. Parse the author and permlink from it.
        4. +
        5. Add content Add body content to your comment
        6. +
        7. Get comment data Collect values from the UI
        8. +
        9. Create comment permlink Create a permlink for your comment
        10. +
        11. Build comment object Assemble the information into a valid comment object
        12. +
        13. Post comment Send the new comment to the blockchain & render the result.
        14. +
        + +

        1. App setup

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to community testnet
        +opts.addressPrefix = 'STX';
        +opts.chainId =
        +    '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673';
        +//connect to server which is connected to the network/testnet
        +const client = new dsteem.Client('https://testnet.steem.vc', opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint.
        +Because this tutorial modifies the blockchain, we will use a testnet and a predefined account to demonstrate comment publishing.

        + +

        2. Choose parent post

        + +

        We need to choose a parent post and parse out the parent author and parent permlink. +Below is a url that uses an instance of condenser pointed at our testnet.

        + +
        http://condenser.steem.vc/qbvxoy72qfc/@demo/dsf0yxlox2d
        +
        + +

        In this case. dsf0yxlox2d will be our parent permlink and @demo will be the the parent author.

        + +

        3. Add content

        + +

        We’ve added the parent post info and Some amazing content in our UI via the keyboard. +comment_reply_user_input.png

        + +

        4. Get Comment Data

        + +

        In the submitComment function, (runs when “Submit comment!” is clicked) +We gather information from the UI.

        + +
        //get private key
        +const privateKey = dsteem.PrivateKey.fromString(
        +    document.getElementById('postingKey').value
        +);
        +//get account name
        +const account = document.getElementById('username').value;
        +//get body
        +const body = document.getElementById('body').value;
        +//get parent author permalink
        +const parent_author = document.getElementById('parent_author').value;
        +//get parent author permalink
        +const parent_permlink = document.getElementById('parent_permlink').value;
        +
        + + + +

        Every post needs a unique permalink. +Because comments don’t typically have a title, we recommend using a random number for ours.

        + +

        Note: Take care of your users: Because permlinks are unique within an author’s scope, we recommend random numbers for comments; or at least making it a default in your settings.

        + +
        //generate random permanent link for post
        +const permlink = Math.random()
        +    .toString(36)
        +    .substring(2);
        +
        + +

        6. Build comment object

        + +

        We take the information we gathered from the UI and put it into a well structured comment object.

        + +
        const comment = {
        +    author: account,
        +    title: '',
        +    body: body,
        +    parent_author: parent_author,
        +    parent_permlink: parent_permlink,
        +    permlink: permlink,
        +    json_metadata: '',
        +};
        +
        + +

        7. Post comment

        + +

        We post the comment to the blockchain and render the resulting block number if successful, +or output an error to the console if there’s a failure.

        + +
        console.log('comment broadcast object', comment);
        +client.broadcast.comment(comment, privateKey).then(
        +    function(result) {
        +        console.log('comment broadcast result', result);
        +        document.getElementById(
        +            'postLink'
        +        ).innerHTML = `<br/><p>Included in block: ${
        +            result.block_num
        +        }</p><br/><br/><a href="http://condenser.steem.vc/@${parent_author}/${parent_permlink}">Check post here</a>`;
        +    },
        +    function(error) {
        +        console.error(error);
        +    }
        +);
        +
        + +

        A successful comment will output something like the following to the console: +successful console output

        + +

        That’s all there is to it.

        + +

        The broadcast operation has more to offer than just committing a post/comment to the blockchain. It provides a mulititude of options that can accompany this commit. The max payout and percent of steem dollars can be set. When authors don’t want all of the benifits from a post, they can set the payout factors to zero or beneficiaries can be set to receive part of the rewards. You can also set whether votes are allowed or not. The broadcast to the blockchain can be modified to meet the exact requirements of the author. More information on how to use the broadcast operation can be found on the Steem Devportal with a list of the available broadcast options under the specific Appbase API

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/11_submit_comment_reply
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/submit_post.html b/docs/tutorials-javascript/submit_post.html new file mode 100644 index 00000000..568dcccc --- /dev/null +++ b/docs/tutorials-javascript/submit_post.html @@ -0,0 +1,449 @@ + + + + + + + + + + + + + + + + + + +JS: Submit Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Submit Post + + +

        + +

        By the end of this tutorial you should know how to prepare comments for Steem and then submit using the broadcast.comment function.

        +
        + + +

        Full, runnable src of Submit Post can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will show the method of properly formatting content followed by broadcasting the information to the steem blockchain using a demo account on the testnet.

        + +

        Intro

        + +

        We are using the client.broadcast.comment function provided by dsteem which generates, signs, and broadcasts the transaction to the network. On the Steem platform, posts and comments are all internally stored as a comment object, differentiated by whether or not a parent_author exists. When there is no parent_author, then it’s a post, otherwise it’s a comment.

        + +

        Steps

        + +
          +
        1. App setup Configuration of dsteem to use the proper connection and network.
        2. +
        3. Fetch Steem Post or Comment data Defining information variables with the submitpost function.
        4. +
        5. Format and Broadcast Formatting the comments and submitting to the blockchain.
        6. +
        + +

        1. App setup

        + +

        Below we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint. Because this tutorial is interactive, we will not publish test content to the main network. Instead, we’re using the testnet and a predefined account to demonstrate post publishing. +There is a public/app.js file which holds the Javascript segment of this tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +let opts = {};
        +//connect to community testnet
        +opts.addressPrefix = 'STX';
        +opts.chainId =
        +    '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673';
        +//connect to server which is connected to the network/testnet
        +const client = new dsteem.Client('https://testnet.steem.vc', opts);
        +
        + +

        2. Fetch Steem Post or Comment data

        + +

        Next, we have the submitPost function which executes when the Submit post button is clicked.

        + +
        //get private key
        +const privateKey = dsteem.PrivateKey.fromString(
        +    document.getElementById('postingKey').value
        +);
        +//get account name
        +const account = document.getElementById('username').value;
        +//get title
        +const title = document.getElementById('title').value;
        +//get body
        +const body = document.getElementById('body').value;
        +//get tags and convert to array list
        +const tags = document.getElementById('tags').value;
        +const taglist = tags.split(' ');
        +//make simple json metadata including only tags
        +const json_metadata = JSON.stringify({ tags: taglist });
        +//generate random permanent link for post
        +const permlink = Math.random()
        +    .toString(36)
        +    .substring(2);
        +
        + +

        The getElementById function is used to obtain data from the HTML elements and assign them to constants. Tags are separated by spaces in this example and stored in an array list called taglist for later use. However, the structure of how to enter tags depends on your needs. Posts on the blockchain can hold additional information in the json_metadata field, such as the tags list which we have assigned. Posts must also have a unique permanent link scoped to each account. In this case we are just creating a random character string.

        + +

        3. Format and Broadcast

        + +

        The next step is to pass all of these elements in 2. to the client.broadcast.comment function.

        + +
        //broadcast post to the testnet
        +client.broadcast
        +    .comment(
        +        {
        +            author: account,
        +            body: body,
        +            json_metadata: json_metadata,
        +            parent_author: '',
        +            parent_permlink: taglist[0],
        +            permlink: permlink,
        +            title: title,
        +        },
        +        privateKey
        +    )
        +    .then(
        +        function(result) {
        +            document.getElementById('title').value = '';
        +            document.getElementById('body').value = '';
        +            document.getElementById('tags').value = '';
        +            document.getElementById('postLink').style.display = 'block';
        +            document.getElementById(
        +                'postLink'
        +            ).innerHTML = `<br/><p>Included in block: ${
        +                result.block_num
        +            }</p><br/><br/><a href="http://condenser.steem.vc/${
        +                taglist[0]
        +            }/@${account}/${permlink}">Check post here</a>`;
        +        },
        +        function(error) {
        +            console.error(error);
        +        }
        +    );
        +
        + +

        Note that the parent_author and parent_permlink fields are used for replies (also known as comments). In this example, since we are publishing a post instead of a comment/reply, we will have to leave parent_author as an empty string and assign the first tag to parent_permlink.

        + +

        After the post has been broadcast to the network, we can simply set all the fields to empty strings and show the post link to check it from a condenser instance running on the selected testnet.

        + +

        The broadcast operation has more to offer than just committing a post/comment to the blockchain. It provides a mulititude of options that can accompany this commit. The max payout and percent of steem dollars can be set. When authors don’t want all of the benifits from a post, they can set the payout factors to zero or beneficiaries can be set to receive part of the rewards. You can also set whether votes are allowed or not. The broadcast to the blockchain can be modified to meet the exact requirements of the author. More information on how to use the broadcast operation can be found on the Steem Devportal with a list of the available broadcast options under the specific Appbase API

        + +

        To Run the tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/10_submit_post
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/transfer_steem_and_sbd.html b/docs/tutorials-javascript/transfer_steem_and_sbd.html new file mode 100644 index 00000000..faca8e16 --- /dev/null +++ b/docs/tutorials-javascript/transfer_steem_and_sbd.html @@ -0,0 +1,460 @@ + + + + + + + + + + + + + + + + + + +JS: Transfer Steem And Sbd | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Transfer Steem And Sbd + + +

        + +

        Transfer both STEEM and SBD from one account to another.

        +
        + + +

        Full, runnable src of Transfer Steem And Sbd can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and submitting a transfer using the broadcast operation. Two demo accounts are provided to use on the testnet but all variables can be easily changed and applied to the production server.

        + +

        There is also an alternative method to transfer from one account to another using a hot signing link that can be generated via Steemconnect. You create a link using the to account, the amount, and a memo (optional comments). This link then allows you to do a transfer simply by adding the login details of the from account. This is a very simple way to send a payment request to any other user with the correct details already provided by the link.

        + +

        Intro

        + +

        We are using the broadcast.transfer function provided by the dsteem library to send the transaction through to the network. In order to do the transfer, two accounts are required. One the sender and the other the recipient. You also can’t transfer from and to the same account, which is why two accounts have been provided for this tutorial. There are 6 parameters required for the transfer operation:

        + +
          +
        1. Username - The username of the account making the transfer (from account)
        2. +
        3. Privatekey - This is the private active key of the sender
        4. +
        5. Recipient - The account that is receiving the STEEM or SBD (to account)
        6. +
        7. Memo - This is a text field which can be used for a comment on the transfer or it can be left empty
        8. +
        9. Amount - This is the amount of STEEM to transfer. This has to be a positive value with 3 decimals in order for the transaction to be completed
        10. +
        11. Type - This is the currency of the transfer, STEEM or SBD. This value has to be written ALL CAPS in order for the transaction to be completed
        12. +
        + +

        It is noteworthy that Steem Power (VESTS) cannot be transferred with this operation.

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Input variables Collecting the required inputs via an HTML UI
        4. +
        5. Object creation Creating an object to use in the broadcast operation
        6. +
        7. Broadcast Broadcasting the transfer to the blockchain
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        const dsteem = require('dsteem');
        +//define network parameters
        +let opts = {};
        +opts.addressPrefix = 'STX';
        +opts.chainId =
        +    '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673';
        +//connect to a steem node, testnet in this case
        +const client = new dsteem.Client('https://testnet.steem.vc', opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint.
        +Because this tutorial modifies the blockchain, we will use a testnet and predefined accounts to demonstrate the transfer process.

        + +

        2. Input variables

        + +

        The required parameters for the transfer operation is recorded via an HTML UI that can be found in the public/index.html file. The values are prepopulated in this case with testnet demo accounts. The transfer amount is set to 1.000 but any value can be input as long as the sender has enough STEEM to send.

        + +

        The parameter values are allocated as seen below, once the user clicks on the “Transfer” button.

        + +
        window.submitTransfer = async () => {
        +    //get all values from the UI
        +    //get account name of sender
        +    const username = document.getElementById('username').value;
        +    //get private active key
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('privateKey').value
        +    );
        +    //get recipient
        +    const recipient = document.getElementById('recipient').value;
        +    //get comments
        +    const comments = document.getElementById('comments').value;
        +    //get transfer amount
        +    const quantity = document.getElementById('quantity').value;
        +    //get transfer type
        +    const type = document.getElementById('type').value;
        +
        + +

        3. Object creation

        + +

        In the broadcast.transfer operation, the amount parameter is a combination of the transfer value and type which is why we concatenate the two values into a single variable. We then create a transfer object with the input variables to use within the broadcast operation.

        + +
        const transfer = quantity.concat(' ', type);
        +
        +//create transfer object
        +const transf = new Object();
        +transf.from = username;
        +transf.to = recipient;
        +transf.amount = transfer;
        +transf.memo = comments;
        +
        + +

        4. Broadcast

        + +

        We can complete the broadcast operation using the created object and the private active key received from the input UI. The result of the transfer is displayed on the UI to confirm whether it was a success or an error occurred. The result is also displayed in the console with the relevant block number or transfer error.

        + +
        client.broadcast.transfer(transf, privateKey).then(
        +    function(result) {
        +        console.log(
        +            'included in block: ' + result.block_num,
        +            'expired: ' + result.expired
        +        );
        +        document.getElementById('transferResultContainer').style.display =
        +            'flex';
        +        document.getElementById('transferResult').className =
        +            'form-control-plaintext alert alert-success';
        +        document.getElementById('transferResult').innerHTML = 'Success';
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('transferResultContainer').style.display =
        +            'flex';
        +        document.getElementById('transferResult').className =
        +            'form-control-plaintext alert alert-danger';
        +        document.getElementById('transferResult').innerHTML =
        +            error.jse_shortmsg;
        +    }
        +);
        +
        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/20_transfer_STEEM_and_SBD
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/vote_on_content.html b/docs/tutorials-javascript/vote_on_content.html new file mode 100644 index 00000000..a0594672 --- /dev/null +++ b/docs/tutorials-javascript/vote_on_content.html @@ -0,0 +1,554 @@ + + + + + + + + + + + + + + + + + + +JS: Vote On Content | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Vote On Content + + +

        + +

        Create a weighted up or down vote on a comment/post.

        +
        + + +

        Full, runnable src of Vote On Content can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and submitting a vote using the broadcast operation. +Because this tutorial essentially produces spam, it will be pointed at a Steem testnet. The testnet is an open resource, +so the default account and posting key in this tutorial may have been changed by another developer learning the ropes. +If that happens, you’ll want to create a new account on the testnet and use that account’s credentials instead.

        + +

        To learn more about the testnet, including an easy way to create a play account, visit https://testnet.steem.vc/

        + +

        Intro

        + +

        We are using the broadcast.vote function provided by the dsteem library to send the transaction through to the +network. On the Steem platform, posts and comments are all internally stored as a comment object, differentiated by +whether or not a parent_author exists. When there is no parent_author, then it’s a post, when there is, it’s a +comment. Voting is done on either of the two based on the author and permlink of the comment. There are 5 parameters +required for the voting operation:

        + +
          +
        1. Username - The username of the account making the vote (the voter)
        2. +
        3. Privatekey - This is the private posting key of the voter
        4. +
        5. Author - The author of the comment/post that the voter is voting on
        6. +
        7. Permlink - The unique identifier of the comment/post of the author
        8. +
        9. Weight - This is the weight that the vote will carry. The value ranges from -10000 (100% flag) to 10000 (100% upvote)
        10. +
        + +

        Due to the low amount of posts on the testnet we added an additional step to create a post before we vote on it. The values are auto loaded in the respective input boxes. A full tutorial on how to create a new post can be found on the Steem Devportal

        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Create new post Creating a new post on the testnet
        4. +
        5. Input variables Collecting the required inputs via an HTML UI
        6. +
        7. Broadcast Creating an object and broadcasting the vote to the blockchain
        8. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        import { Client, PrivateKey } from 'dsteem';
        +import { Testnet as NetConfig } from '../../configuration'; //A Steem Testnet. Replace 'Testnet' with 'Mainnet' to connect to the main Steem blockchain.
        +
        +let opts = { ...NetConfig.net };
        +
        +//connect to a steem node, testnet in this case
        +const client = new Client(NetConfig.url, opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint by importing from the configuration.js file. Because this tutorial is interactive, we will not publish test content to the main network. Instead, we’re using the testnet and a predefined account which is imported once the application loads, to demonstrate voting on content.

        + +
        window.onload = () => {
        +    const account = NetConfig.accounts[0];
        +    document.getElementById('username').value = account.address;
        +    document.getElementById('postingKey').value = account.privPosting;
        +};
        +
        + +

        2. Create new post

        + +

        A new blog post is created on the testnet with the necessary variables for the vote function being allocated as well. If a post is successfully created it will display a block number and a value will be assigned to the permlink variable.

        + +
        //refer to "10_submit_post" in the tutorials folder for creating a post on steemit
        +//create post function
        +window.createPost = async () => {
        +    //get private key
        +    const privateKey = createPrivateKey();
        +    //get account name
        +    const account = document.getElementById('username').value;
        +    //for content
        +    const time = new Date().getTime();
        +    //get title
        +    const title = `developers.steem.io - JS-T:17 ${time}`;
        +    //get body
        +    const body = `Go to [developers.steem.io](https://developers.steem.io) for the latest in Steem tutorials! This post was created by someone using the active version of those tutorials at  [https://github.com/steemit/devportal-tutorials-js](https://github.com/steemit/devportal-tutorials-js)
        +        
        +        ${time}`;
        +    //get tags and convert to array list
        +    const tags = 'blog';
        +    const taglist = tags.split(' ');
        +    //make simple json metadata including only tags
        +    const json_metadata = JSON.stringify({ tags: taglist });
        +    //generate random permanent link for post
        +    const permlink = Math.random()
        +        .toString(36)
        +        .substring(2);
        +
        +    client.broadcast
        +        .comment(
        +            {
        +                author: account,
        +                body: body,
        +                json_metadata: json_metadata,
        +                parent_author: '',
        +                parent_permlink: tags,
        +                permlink: permlink,
        +                title: title,
        +            },
        +            privateKey
        +        )
        +        .then(
        +            function(result) {
        +                document.getElementById('permlink').innerHTML = permlink;
        +                document.getElementById(
        +                    'postLink'
        +                ).innerHTML = `Included in block: <a href="http://condenser.steem.vc/${
        +                    taglist[0]
        +                }/@${account}/${permlink}" target="_blank">${
        +                    result.block_num
        +                }</a>`;
        +                document.getElementById('postResult').style.display = 'flex';
        +                document.getElementById('permlink').value = permlink;
        +            },
        +            function(error) {
        +                console.error(error);
        +            }
        +        );
        +};
        +
        + +

        You may have noted the mystery function createPrivateKey(). It’s a convenience function that allows us to give the +user some meaningful UI feedback if they put in a bad posting key. The important part of it is +return dsteem.PrivateKey.fromString(<somestring>) but its full glory can be seen in the snippet below

        + +
        const createPrivateKey = function() {
        +    try {
        +        return dsteem.PrivateKey.fromString(
        +            document.getElementById('postingKey').value
        +        );
        +    } catch (e) {
        +        const resultEl = document.getElementById('result');
        +        resultEl.className = 'form-control-plaintext alert alert-danger';
        +        resultEl.innerHTML = e.message + ' - See console for full error.';
        +        throw e;
        +    }
        +};
        +
        + +

        3. Input variables

        + +

        The required parameters for the vote operation is recorded via an HTML UI that can be found in the public/index.html file. The values are pre-populated in this case with a testnet demo account. The vote weight is input via a slider as this value can range between -10000 and 10000 denoting either a 100% flag or 100% upvote.

        + +

        The parameter values are allocated as seen below, once the user clicks on the “Submit” button.

        + +
        window.submitVote = async () => {
        +    //we'll make use of resultEl in multiple child scopes. This is generally good practice.
        +    const resultEl = document.getElementById('result');
        +    resultEl.innerHTML = 'pending...';
        +
        +    //get all values from the UI//
        +    //get account name of voter
        +    const voter = document.getElementById('username').value;
        +    //get private posting key
        +    const privateKey = createPrivateKey();
        +    //get author of post/comment to vote
        +    const author = document.getElementById('author').value;
        +    //get post permalink to vote
        +    const permlink = document.getElementById('permlink').value;
        +    //get weight of vote
        +    const weight = parseInt(
        +        document.getElementById('currentWeight').innerHTML,
        +        10
        +    );
        +    ....
        +
        + +

        The weight parameter is required to be an interger for the vote operation so we parse it from the UI text field. The permlink value is retrieved from the create post function.

        + +

        4. Broadcast

        + +

        We create a vote object with the input variables before we can broadcast to the blockchain.

        + +
        const vote = {
        +    voter,
        +    author,
        +    permlink,
        +    weight, //needs to be an integer for the vote function
        +};
        +
        + +

        After which we can complete the broadcast.vote operation with the created object and private posting key received from the input UI. The result of the vote is displayed on the UI to confirm whether it was a success or failed with details of that process being displayed on the console.

        + +
        client.broadcast.vote(vote, privateKey).then(
        +        function(result) {
        +            console.log('success:', result);
        +            resultEl.className = 'form-control-plaintext alert alert-success';
        +            resultEl.innerHTML = 'Success! See console for full response.';
        +        },
        +        function(error) {
        +            console.log('error:', error);
        +            resultEl.className = 'form-control-plaintext alert alert-danger';
        +            resultEl.innerHTML =
        +                error.jse_shortmsg + ' - See console for full response.';
        +        }
        +    );
        +
        +window.onload = () => {
        +    var voteWeightSlider = document.getElementById('voteWeight');
        +    var currentWeightDiv = document.getElementById('currentWeight');
        +    currentWeightDiv.innerHTML = voteWeightSlider.value;
        +    voteWeightSlider.oninput = function() {
        +        currentWeightDiv.innerHTML = this.value;
        +    };
        +
        + +

        More information on how to use the broadcast operation and options surrounding the operation can be found on the Steem Devportal

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/17_vote_on_content
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-javascript/witness_listing_and_voting.html b/docs/tutorials-javascript/witness_listing_and_voting.html new file mode 100644 index 00000000..d620e665 --- /dev/null +++ b/docs/tutorials-javascript/witness_listing_and_voting.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + +JS: Witness Listing And Voting | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + JS: Witness Listing And Voting + + +

        + +

        Create a list of available witnesses as well as vote for and remove your vote for a witness.

        +
        + + +

        Full, runnable src of Witness Listing And Voting can be downloaded as part of the JS tutorials repository. +

        + +

        This tutorial will take you through the process of preparing and submitting a vote using the broadcast operation. A demo account is provided to use on the testnet but all variables can be easily changed and applied to the production server.

        + +

        There is also an alternative method to vote for a witness using a hot signing link that can be generated via Steemconnect. You create a link using the witness name and the approve fields which denotes whether you want to vote for or remove the vote. This link then allows you to vote simply by signing in with your account details. This is a very simple way to send a vote request to any other user with the correct details already provided by the link.

        + +

        Intro

        + +

        We are using the account witness vote function to create the vote which we then commit to the steem blockchain with a broadcast operation from dsteem. We also look at the vote status for a specific user using the getAccounts function. The parameters required for the witness voting operation are:

        + +
          +
        1. limit - Used in creating the witness list. Denotes the maximum number of witnesses to display
        2. +
        3. voter - This is the account making the vote
        4. +
        5. privatekey - The private active key of the voter account
        6. +
        7. witness - The name of the witness being voted for
        8. +
        9. approve - This is a boolean value determining whether the voting opration is to vote for, or to remove a vote
        10. +
        + +

        Steps

        + +
          +
        1. Configure connection Configuration of dsteem to communicate with a Steem blockchain
        2. +
        3. Create witness list Displaying a list of active witnesses
        4. +
        5. Input variables Collecting the required inputs via an HTML UI
        6. +
        7. Voting status Confirming the current vote status for the selected witness
        8. +
        9. Broadcast Creating an object and broadcasting the vote to the blockchain
        10. +
        + +

        1. Configure connection

        + +

        As usual, we have a public/app.js file which holds the Javascript segment of the tutorial. In the first few lines we define the configured library and packages:

        + +
        import { Client, PrivateKey } from 'dsteem';
        +import { Testnet as NetConfig } from '../../configuration'; //A Steem Testnet. Replace 'Testnet' with 'Mainnet' to connect to the main Steem blockchain.
        +
        +let opts = { ...NetConfig.net };
        +//connect to a steem node, testnet in this case
        +const client = new Client(NetConfig.url, opts);
        +
        + +

        Above, we have dsteem pointing to the test network with the proper chainId, addressPrefix, and endpoint by importing from the configuration.js file. Because this tutorial is interactive, we will not publish test content to the main network. Instead, we’re using the testnet and a predefined account which is imported once the application loads, to demonstrate witness voting.

        + +
        window.onload = async () => {
        +    const account = NetConfig.accounts[0];
        +    document.getElementById('username').value = account.address;
        +    document.getElementById('activeKey').value = account.privActive;
        +};
        +
        + +

        2. Create witness list

        + +

        We create a list of the current active witnesses available. This gives a list from which to select a witness to vote for. The list retrieved from the blockchain has a maximum length of 100 witnesses. We query the blockchain with the getState function and then use a for loop to display the list. This function is initiated once the user inputs a value for the limit variable and clicks on the “Fetch current Witnesses” button.

        + +
        window.createList = async () => {
        +    //get list limit
        +    const limit = document.getElementById('limit').value;
        +
        +    const witnessdata = await client.database.getState('witnesses');
        +    var witnesses = [];
        +
        +    for (const witness in witnessdata.witnesses) {
        +        console.log('witness', witness);
        +        witnesses.push(
        +            `<li><a href="#" onclick="document.getElementById('witness').value = '${witness}';">${witness}</a></li>`
        +        );
        +    }
        +    console.log('witnesses', witnesses);
        +    document.getElementById('witnessList').innerHTML = witnesses.join('');
        +    document.getElementById('witnessListContainer').style.display = 'flex';
        +};
        +
        + +

        3. Input variables

        + +

        The required parameters for the vote operation is recorded via an HTML UI that can be found in the public/index.html file. The values are pre-populated in this case with a testnet demo account.

        + +

        The parameter values are allocated as seen below, once the user clicks on the “Submit Vote” button.

        + +
        window.submitVote = async () => {
        +    //get all values from the UI
        +    //get account name of voter
        +    const voter = document.getElementById('username').value;
        +    //get private active key
        +    const privateKey = dsteem.PrivateKey.fromString(
        +        document.getElementById('activeKey').value
        +    );
        +    //get witness name
        +    const witness = document.getElementById('witness').value;
        +
        + +

        4. Voting status

        + +

        The approve parameter within the vote function determines whether the user is voting for the witness or removing its vote. In order to get the correct value for this parameter we first need to identify whether the user has already voted for the specified witness or not. One of the fields from the account information (blockchain query) holds an array of all the witnesses currently voted for by the user. The check returns true if the user has already voted for the selected witness. The result of this query is displayed and the user is given a choice whether to proceed with the vote/unvote process or stop the process activating a new function for each of those choices.

        + +
            //check if witness is already voted for
        +    _data = new Array
        +    _data = await client.database.getAccounts([voter]);
        +    const witnessvotes = _data[0]["witness_votes"];
        +    const approve = witnessvotes.includes(witness);
        +    if (approve) {
        +        checkresult = "Witness has already been voted for, would you like to remove vote?"
        +        votecheck = "Vote removed"
        +    } else {
        +        checkresult = "Witness has not yet been voted for, would you like to vote?"
        +        votecheck = "Vote added"
        +    }
        +
        +    document.getElementById('voteCheckContainer').style.display = 'flex';
        +    document.getElementById('voteCheck').className = 'form-control-plaintext alert alert-success';
        +    document.getElementById('voteCheck').innerHTML = checkresult;
        +
        +    document.getElementById("submitYesBtn").style.visibility = "visible";
        +    document.getElementById("submitNoBtn").style.visibility = "visible";
        +
        + +

        5. Broadcast

        + +

        When the user decides to continue with the voting process the actual vote function is triggered and we create a vote object with the input variables before we can broadcast to the blockchain.

        + +
        window.submitYes = async () => {
        +        //create vote object
        +        const vote = [
        +        'account_witness_vote',
        +        { account: voter, witness: witness, approve: !approve },
        +        ];
        +
        + +

        The array cotains the function for the witness vote along with an object containing the needed parameters. We have to use the opposite of the approve variable that we created in the previous step. That variable is true if the user has already voted, and a value of true for the approve parameter means that the user is voting for the specified witness which will then return an error.

        + +

        After the object has been created we can broadcast the operation to the steem blockchain along with the private active key of the user. The result of the vote is displayed on the UI to confirm whether you voted for or removed a vote for the witness as well as error details should there be one.

        + +
        //broadcast the vote
        +client.broadcast.sendOperations([vote], privateKey).then(
        +    function(result) {
        +        console.log(
        +            'included in block: ' + result.block_num,
        +            'expired: ' + result.expired
        +        );
        +        document.getElementById('voteCheckContainer').style.display = 'flex';
        +        document.getElementById('voteCheck').className =
        +            'form-control-plaintext alert alert-success';
        +        document.getElementById('voteCheck').innerHTML = votecheck;
        +    },
        +    function(error) {
        +        console.error(error);
        +        document.getElementById('voteCheckContainer').style.display = 'flex';
        +        document.getElementById('voteCheck').className =
        +            'form-control-plaintext alert alert-danger';
        +        document.getElementById('voteCheck').innerHTML = error.jse_shortmsg;
        +    }
        +);
        +document.getElementById('submitYesBtn').style.visibility = 'hidden';
        +document.getElementById('submitNoBtn').style.visibility = 'hidden';
        +
        + +

        Should the user choose to stop the process the following function is executed.

        + +
        window.submitNo = async () => {
        +    document.getElementById('voteCheckContainer').style.display = 'flex';
        +    document.getElementById('voteCheck').className =
        +        'form-control-plaintext alert alert-success';
        +    document.getElementById('voteCheck').innerHTML =
        +        'Vote process has ben cancelled';
        +    document.getElementById('submitYesBtn').style.visibility = 'hidden';
        +    document.getElementById('submitNoBtn').style.visibility = 'hidden';
        +};
        +
        + +

        The option buttons (continue with voting process or stop) are disabled at the end of the process in order to remove confusion on what to do next or what the option buttons will do.

        + +

        To run this tutorial

        + +
          +
        1. clone this repo
        2. +
        3. cd tutorials/22_witness_listing_and_voting
        4. +
        5. npm i
        6. +
        7. npm run dev-server or npm run start
        8. +
        9. After a few moments, the server should be running at http://localhost:3000/
        10. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/account_reputation.html b/docs/tutorials-python/account_reputation.html new file mode 100644 index 00000000..95fc8cc7 --- /dev/null +++ b/docs/tutorials-python/account_reputation.html @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + +PY: Account Reputation | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-python/claim_rewards.html b/docs/tutorials-python/claim_rewards.html new file mode 100644 index 00000000..1060731b --- /dev/null +++ b/docs/tutorials-python/claim_rewards.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + +PY: Claim Rewards | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Claim Rewards + + +

        + +

        How to claim rewards using Python.

        +
        + + +

        Full, runnable src of Claim Rewards can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to check the STEEM, SBD and STEEM POWER rewards balances of an account on the Steem blockchain, and how to claim either a portion or all of the rewards for an account using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the claim_reward_balance method found within the commit class in the library. Before we transmit a claim, we use the get_account function to check the current rewards balance of the account to see what is available to claim. The claim method has 4 parameters:

        + +
          +
        1. reward steem - The amount of STEEM to claim
        2. +
        3. reward sbd - The amount of SBD to claim
        4. +
        5. reward vests - The amount of VESTS (STEEM POWER) to claim
        6. +
        7. account - The source account for the claim
        8. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check reward balance - Check current rewards balances of user account
        6. +
        7. Claim commit - Input amount of rewards to claim and commit to blockchain
        8. +
        9. Balance update - Check new rewards balances after completed claim
        10. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +from steem.amount import Amount
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the claim to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. There are some demo accounts available but we encourage you to create your own accounts on this testnet and create balances you can claim; it’s good practice.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node
        +client = steem.Steem(nodes=['https://testnet.steem.vc'],keys=[wif])
        +
        + +

        3. Check reward balance

        + +

        In order to get a clear picture of the available rewards that can be claimed, we send a query to the blockchain using the get_account function. From the result we can gather the rewards balances.

        + +
        #get account reward balances
        +userinfo = client.get_account(username)
        +
        +reward_steem = userinfo['reward_steem_balance']
        +reward_sbd = userinfo['reward_sbd_balance']
        +reward_sp = userinfo['reward_vesting_steem']
        +reward_vests = userinfo['reward_vesting_balance']
        +
        +print('Reward Balances:' + '\n' + 
        +    'STEEM: ' + reward_steem + '\n' + 
        +    'SBD: ' + reward_sbd + '\n' + 
        +    'STEEM POWER: ' + reward_sp + '\n' +
        +    'VESTS: ' + reward_vests
        +    )
        +
        +input('\n' + 'Press enter to continue to claim selection')
        +
        + +

        The result of the query is displayed in the console/terminal.

        + +

        4. Claim commit

        + +

        An option is provided to either claim all rewards at once or to specify specific amounts to be claimed for each individual reward balance. If you are using one of Steemit’s demo accounts, please leave some rewards for others to claim!

        + +
        #choice of claim
        +title = 'Please choose claim type: '
        +options = ['ALL', 'SELECTED', 'CANCEL']
        +option, index = pick(options, title)
        +
        + +

        When the option to claim all rewards is selected, the claim parameters are automatically assigned from the get_accounts query. We also check that there are in fact outstanding rewards balances before we commit the claim.

        + +
        #commit claim based on selection
        +if option == 'ALL':
        +    if Amount(reward_steem).amount + Amount(reward_sbd).amount + Amount(reward_vests).amount == 0:
        +        print('\n' + 'No rewards to claim')
        +        exit()
        +    else:
        +        client.claim_reward_balance(reward_steem, reward_sbd, reward_vests, username)
        +        print('\n' + 'All reward balances have been claimed. New reward balances are:' + '\n')
        +else:
        +    if option == 'CANCEL':
        +        print('\n' + 'Operation cancelled')
        +        exit()
        +    else:
        +        claim_steem = input('\n' + 'Please enter the amount of STEEM to claim: ') + ' STEEM'
        +        claim_sbd = input('Please enter the amount of SBD to claim: ') + ' SBD'
        +        claim_vests = input('Please enter the amount of VESTS to claim: ') + ' VESTS'
        +        if Amount(claim_steem).amount + Amount(claim_sbd).amount + Amount(claim_vests).amount == 0:
        +            print('\n' + 'Zero values entered, no claim to submit')
        +            exit()
        +        else:
        +            if claim_steem > reward_steem or claim_sbd > reward_sbd or claim_vests > reward_vests:
        +                print('\n' + 'Requested claim value higher than available rewards')
        +                exit()
        +            else:
        +                client.claim_reward_balance(claim_steem, claim_sbd, claim_vests, username)
        +                print('\n' + 'Claim has been processed. New reward balances are:' + '\n')
        +
        +
        + +

        When doing only a selected claim of available rewards, the values are captured in the console/terminal. The inputs cannot be negative, must be less than or equal to the available reward and at least ONE of the inputs needs to be greater than zero for the claim to be able to transmit. The result of the selected option is printed on the UI.

        + +

        5. Balance update

        + +

        As a final check we run the account query again to get updated values for the available rewards balances.

        + +
        #get updated account reward balances
        +userinfo = client.get_account(username)
        +
        +reward_steem = userinfo['reward_steem_balance']
        +reward_sbd = userinfo['reward_sbd_balance']
        +reward_sp = userinfo['reward_vesting_steem']
        +reward_vests = userinfo['reward_vesting_balance']
        +
        +print('STEEM: ' + reward_steem + '\n' + 
        +    'SBD: ' + reward_sbd + '\n' + 
        +    'STEEM POWER: ' + reward_sp + '\n' +
        +    'VESTS: ' + reward_vests
        +    )
        +
        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/23_claim_rewards
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/delegate_power.html b/docs/tutorials-python/delegate_power.html new file mode 100644 index 00000000..fdb27c05 --- /dev/null +++ b/docs/tutorials-python/delegate_power.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + +PY: Delegate Power | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Delegate Power + + +

        + +

        How to delegate or remove delegation of STEEM POWER to another user using Python.

        +
        + + +

        Full, runnable src of Delegate Power can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to delegate a portion of an accounts available VESTS (STEEM POWER) to another user on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the delegate_vesting_shares method found within the commit class in the library. When you delegate power you make a portion of your VESTS available to another user. This can empower an application, author, or curator to make higher votes. Before we do the delegation, we use the get_account function to check the current VESTS balance of the account to see what is available. This is not strictly necessary but adds to the useability of the process. It should be noted that when a delegation is cancelled the VESTS will only be available again after 7 days. The delegate_vesting_shares method has 3 parameters:

        + +
          +
        1. to_account - The account we are delegating shares to (delegatee)
        2. +
        3. vesting_shares - The amount of VESTS to delegate. This is required to be a string value
        4. +
        5. account - The source user account for the delegation (delegator)
        6. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check balance - Check current VESTS balance of user account
        6. +
        7. Delegation amount and commit - Input delegation amount and commit to blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        • pprint - print results in better format
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +import pprint
        +from steem.amount import Amount
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the transaction to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. We also check if the user name provided is active on the chain. There are some demo accounts available but we encourage you to create your own accounts on this testnet and create balances you can delegate.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        +#check valid user
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +
        + +

        3. Check balance

        + +

        In order to give the user enough information to make the delegation we check the current VESTS balance of the account using the get_account function. We also display a list of currently active delegations should the user choose to remove a delegation. You can refer to tutorial 29_get_delegations_by_user to see how this is done.

        + +
        #display active delegations (refer to tutorial #29_get_delegations_by_user)
        +delegations = client.get_vesting_delegations(username, '', 100)
        +if len(delegations) == 0:
        +	print('No active delegations')
        +else:
        +	pprint.pprint(delegations)
        +
        +#available VESTS
        +avail_vests = (Amount(userinfo['vesting_shares']).amount - 
        +    ((userinfo['to_withdraw']-userinfo['withdrawn'])/1000000)-
        +    Amount(userinfo['delegated_vesting_shares']).amount)
        +print('\n' + 'Available VESTS : ' + str(avail_vests))
        +
        +input('Press enter to continue' + '\n')
        +
        + +

        The result of the query is displayed in the console/terminal.

        + +

        4. Delegation amount and commit

        + +

        Both the vesting_shares and the to_account parameters are assigned via input from the terminal/console. The user is given the option to delegate power to or remove a currently active delegation from another user. We also check the to_account to make sure it’s a valid account name.

        + +
        #choice of action
        +title = ('Please choose action')
        +options = ['DELEGATE POWER', 'UN-DELEGATE POWER', 'CANCEL']
        +option, index = pick(options, title)
        +
        +if (option == 'CANCEL') :
        +    print('operation cancelled')
        +    exit()
        +
        +#get account to authorise and check if valid
        +delegatee = input('Please enter the account name to ADD / REMOVE delegation: ')
        +delegatee_userinfo = client.get_account(delegatee)
        +if(delegatee_userinfo is None) :
        +    print('Oops. Looks like user ' + delegatee + ' doesn\'t exist on this chain!')
        +    exit()
        +
        + +

        Any amount of VESTS delegated to a user will overwrite the amount of VESTS currently delegated to that user. This means that to cancel a delegation we transmit to the blockchain a vesting_shares value of zero. The inputs and function execution is based on the users choice. If you are using one of Steemit’s demo accounts, please leave some VESTS for others to delegate!

        + +
        if (option == 'DELEGATE POWER') :
        +    vesting_value = input('Please enter the amount of VESTS to delegate: ')
        +    vesting_shares = (str(vesting_value) + ' VESTS')
        +    client.delegate_vesting_shares(to_account=delegatee, vesting_shares=vesting_shares, account=username)
        +    print('\n' + str(vesting_shares) + ' have been successfully been delegated to ' + delegatee)
        +else :
        +    vesting_shares = '0 VESTS'
        +    client.delegate_vesting_shares(to_account=delegatee, vesting_shares=vesting_shares, account=username)
        +    print('Delegated VESTS have been successfully removed from ' + delegatee)
        +
        + +

        A confirmation of the transaction is displayed on the UI.

        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/27_delegate_power
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/edit_content_patching.html b/docs/tutorials-python/edit_content_patching.html new file mode 100644 index 00000000..da573a5c --- /dev/null +++ b/docs/tutorials-python/edit_content_patching.html @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + +PY: Edit Content Patching | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Edit Content Patching + + +

        + +

        How to edit post content with diff_match_patch using Python.

        +
        + + +

        Full, runnable src of Edit Content Patching can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to patch and update posts/comments on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        Being able to patch a post is critical to save resources on Steem. The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the diff_match_patch class for python to create a patch for a post or comment. We then use the post method found within the commit class in the library. It should be noted that comments and new post are both treated as commit.post operation with the only difference being that a comment/reply has got an additional parameter containing the parent post/comment. There is already a tutorial on how to create a new post so the focus of this tutorial will be on patching the content of the post. We will be using a couple of methods within the diff_match_patch class.

        + +

        diff_main - This compares two text fields to find the differences. +diff_cleanupSemantic - This reduces the number of edits by eliminating semantically trivial equalities. +diff_levenshtein - Computes the Levenshtein distance: the number of inserted, deleted or substituted characters +patch_make - Creates a patch based on the calculated differences. This method can be executed in 3 different ways based on the parameters. By using the two separate text fields in question, by using only the calculated difference, or by using the original text along with the calculated difference. +patch_apply - This applies the created patch to the original text field.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Post to update - Input and retrieve post information
        6. +
        7. Patching - Create the patch to update the post
        8. +
        9. New post commit - Commit the post to the blockchain
        10. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • diff_match_patch - used to compute the difference between two text fields to create a patch
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from diff_match_patch import diff_match_patch
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private posting key of the user in order for the transfer to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. There are some demo accounts available but we encourage you to create your own accounts on this testnet and create balances you can claim; it’s good practice.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private POSTING key: ') #demo account: 5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        + +

        3. Post to update

        + +

        The user inputs the author and permlink of the post that they wish to edit. It should be noted that a post cannot be patched once it has been archived. We suggest referring to the submit post tutorial to create a new post before trying the patch process.

        + +
        #check valid username
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +
        +post_author = input('Please enter the AUTHOR of the post you want to edit: ')
        +post_permlink = input('Please enter the PERMLINK of the post you want to edit: ')
        +
        +#get details of selected post
        +details = client.get_content(post_author, post_permlink)
        +
        +print('\n' + 'Title: ' + details['title'])
        +o_body = details['body']
        +print('Body:' + '\n' + o_body + '\n')
        +
        +n_body = input('Please enter new post content:' + '\n')
        +
        + +

        The user also inputs the updated text in the console/terminal. This will then give us the two text fields to compare.

        + +

        4. Patching

        + +

        The module is initiated and the new post text is checked for validity.

        + +
        #initialise the diff match patch module
        +dmp = diff_match_patch()
        +
        +#Check for null input
        +if (n_body == '') :
        +    print('\n' + 'No new post body supplied. Operation aborted')
        +    exit()
        +else :
        +    # Check for equality
        +    if (o_body == n_body) :
        +        print('\n' + 'No changes made to post body. Operation aborted')
        +        exit()
        +
        + +

        The diff is calculated and a test is done to check the diff length against the total length of the new text to determine if it will be better to patch or just replace the text field. The value to be sent to the blockchain is then assigned to the new_body parameter.

        + +
        #check for differences in the text field
        +diff = dmp.diff_main(o_body, n_body)
        +#Reduce the number of edits by eliminating semantically trivial equalities.
        +dmp.diff_cleanupSemantic(diff)
        +#check patch length
        +if (dmp.diff_levenshtein(diff) < len(o_body)) :
        +    #create patch
        +    patch = dmp.patch_make(o_body, diff)
        +    #create new text based on patch
        +    patch_body = dmp.patch_apply(patch, o_body)
        +    new_body = patch_body[0]
        +else :
        +    new_body = n_body
        +
        + +

        5. New post commit

        + +

        The only new parameter is the changed body text. All the other parameters to do a commit is assigned directly from the original post entered by the user.

        + +
        #commit post to blockchain with all old values and new body text
        +client.commit.post(title=details['title'], body=new_body, author=details['author'], permlink=details['permlink'],
        +    json_metadata=details['json_metadata'], reply_identifier=(details['parent_author'] + '/' + details['parent_permlink']))
        +
        +print('\n' + 'Content of the post has been successfully updated')
        +
        + +

        A simple confirmation is displayed on the screen for a successful commit.

        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/12_edit_content_patching
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/follow_a_user.html b/docs/tutorials-python/follow_a_user.html new file mode 100644 index 00000000..2671066e --- /dev/null +++ b/docs/tutorials-python/follow_a_user.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + +PY: Follow A User | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Follow A User + + +

        + +

        How to follow or unfollow an author using Python.

        +
        + + +

        Full, runnable src of Follow A User can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to follow or unfollow any author on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the follow and unfollow methods found within the commit class in the the library. Before we can follow/unfollow we first have to check what the current ‘follow status’ is of the author. We use another function for this which is explained in the tutorial entitled get_following_and_follower_list. There are 3 parameters within the follow/unfollow methods:

        + +
          +
        1. follow/unfollow - The name of the author that will be followed/unfollowed
        2. +
        3. what - The list of states to be followed. Currently this defaults to blog as it’s the only option available on the block chain at this stage
        4. +
        5. account - The name of the account that is executing the follow/unfollow
        6. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check author status - Validity check on requested autor to follow
        6. +
        7. Follow status - Check whether specified author is already followed
        8. +
        9. Follow/Unfollow commit - Follow/unfollow commit to the blockchain
        10. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to the testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We also require the private posting key of the user that wishes to follow a selected author in order to commit the action to the blockchain. This is why we have to specify this along with the testnet node. The values are supplied via the terminal/console before we initialise the steem class. We have supplied a test account, cdemo to use with this tutorial but any demo account set up on the testnet can be used.

        + +
        #capture user information
        +username = input('Please enter your username: ')
        +postingkey = input('Please enter your private posting key: ')
        +
        +#connect node and private posting key, demo account being used: cdemo, posting key: 5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz
        +s = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[postingkey])
        +
        + +

        3. Check author status

        + +

        To insure the validity of the follow process, we first check to see if the author provided by the user is in fact an active username. This is done with a simple call to the blockchain which returns an array of all the user information. If the author does not exist, the return value is null.

        + +
        #capture variables
        +author = input('Author to follow: ')
        +
        +#check author status
        +result = s.get_account(author)
        +
        + +

        Once the author name is confirmed to be valid we can move on to check the follow status of that author.

        + +

        4. Follow status

        + +

        If the author check comes back with a value we use a simple if statement to initialise the database query for the follow status. A comprehensive tutorial is available to retrieve a list of followers and users that are being followed in the tutorial specified in the intro. As we are only interested in a very specific author we can narrow the query results down to a single result. That result then determines what the available actions are.

        + +
        #result from previous step
        +if result :
        +	#check for author name in the current following list
        +	follow = s.get_following(username, author, 'blog', 1)
        +	if len(follow) > 0 and follow[0]['following'] == author :
        +		title = "Author is already being followed, please choose action"
        +	else:
        +		title = "Author has not yet been followed, please choose action"
        +else:
        +	print('Author does not exist')
        +	exit()
        +
        + +

        The result from the follow query is printed on the UI and the user is asked to select the next action to take based on that information. If the author does not exit the program exits automatically.

        + +
        #get index and selected action
        +options = ['Follow', 'Unfollow', 'Exit']
        +option, index = pick(options, title)
        +
        + +

        Once we know what the user wants to do, we can move on to the actual commit to the blockchain.

        + +

        5. Follow/Unfollow commit

        + +

        Once the user has selected which action to take we user another if statement to execute that selection.

        + +
        if option == 'Follow' :
        +	s.commit.follow(author, ['blog'], username)
        +	print(author + ' is now being followed')
        +else:
        +	if option == 'Unfollow' :
        +		s.commit.unfollow(author, ['blog'], username)
        +		print(author + ' has now been unfollowed')
        +	else:
        +		print('Action Cancelled')
        +
        + +

        A simple confirmation of the chosen action is printed on the screen.

        + +

        You can also check on the testportal for a list of the authors being followed by the demo account.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/18_follow_a_user
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_account_comments.html b/docs/tutorials-python/get_account_comments.html new file mode 100644 index 00000000..64de00fe --- /dev/null +++ b/docs/tutorials-python/get_account_comments.html @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + +PY: Get Account Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_account_replies.html b/docs/tutorials-python/get_account_replies.html new file mode 100644 index 00000000..f5eda339 --- /dev/null +++ b/docs/tutorials-python/get_account_replies.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + +PY: Get Account Replies | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_delegations_by_user.html b/docs/tutorials-python/get_delegations_by_user.html new file mode 100644 index 00000000..8150ebe9 --- /dev/null +++ b/docs/tutorials-python/get_delegations_by_user.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + +PY: Get Delegations By User | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Delegations By User + + +

        + +

        How to get a list of active or expiring vesting delegations using Python.

        +
        + + +

        Full, runnable src of Get Delegations By User can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to pull a list of both active and expiring vesting delegations from the Steem blockchain using the steem class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to pull information from the blockchain. We are using the get_vesting_delegations and get_expiring_vesting_delegations methods found within the steem class in the library. Each of these functions are executed separately. It should be noted that when a delegation is cancelled the VESTS will only be available again after 7 days. The value of the delegation can also be changed at any time, either decreased or increased. To get active delegations we need the following parameters:

        + +
          +
        1. account - The user account that the delegation list is being queried for
        2. +
        3. from-account - The account name from where to start the search. This parameter can be left empty to pull a list from the first delegatee
        4. +
        5. limit - The maximum amount of delegations that will be returned by the query
        6. +
        + +

        The function to query the expiring delegations use the the same parameters except that the start_account is replaced by a start_date. If this value is greater than 7 days from present, it will always include all delegations that are pending expiration.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to production
        2. +
        3. User input - Input user and limit parameters
        4. +
        5. Delegation lists - Selection of the type of list and blockchain query
        6. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 package:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the production server.

        + +
        from pick import pick
        +from steem import Steem
        +
        +import pprint
        +
        +client = Steem()
        +
        + +

        pprint is used to print the query results in an easier to read format

        + +

        2. User input

        + +

        The account and limit parameters are assigned via input from the console/terminal. We also check if the username provided does in fact exist on the blockchain using the get_account method also found within the steem class. This will return an null value if the name does not exist.

        + +
        #capture username
        +username = input('Username: ')
        +
        +#check username
        +result = client.get_account(username)
        +if not result:
        +	print('Invalid username')
        +	exit()
        +
        +#capture list limit
        +limit = input('Max number of vesting delegations to display: ')
        +
        + +

        3. Delegation lists

        + +

        We use two different functions to query active and expiring delegations, so the user is given a choice on which of these lists he wants to view.

        + +
        #list type
        +title = 'Please choose the type of list: '
        +options = ['Active Vesting Delegations', 'Expiring Vesting Delegations']
        +
        +#get index and selected list name
        +option, index = pick(options, title)
        +print('\n' + 'List of ' + option + ': ' + '\n')
        +
        + +

        Based on the result of the choice, the relevant blockchain query is executed and the result of the query displayed on the console/terminal.

        + +
        if option=='Active Vesting Delegations' :
        +    #active delegations
        +	delegations = client.get_vesting_delegations(username, '', limit)
        +	if len(delegations) == 0:
        +		print('No ' + option)
        +	else:
        +		pprint.pprint(delegations)
        +else:
        +    #expiring delegations
        +	delegations = client.get_expiring_vesting_delegations(username, "2018-01-01T00:00:00", limit)
        +	if len(delegations) == 0:
        +		print('No ' + option)
        +	else:
        +		pprint.pprint(delegations)
        +
        + +

        For both the queries the starting points were defined in such a way as to include all available data but this can be changed depending on the user requirements.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/29_get_delegations_by_user
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_follower_and_following_list.html b/docs/tutorials-python/get_follower_and_following_list.html new file mode 100644 index 00000000..ac44c8ac --- /dev/null +++ b/docs/tutorials-python/get_follower_and_following_list.html @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + +PY: Get Follower And Following List | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Follower And Following List + + +

        + +

        Tutorial pulls a list of the followers or authors being followed from the blockchain then displays the result.

        +
        + + +

        Full, runnable src of Get Follower And Following List can be downloaded as part of the PY tutorials repository. +

        + +

        This tutorial will explain and show you how to access the Steem blockchain using the steem-python library to fetch list of authors being followed or authors that a specified user is following.

        + +

        Intro

        + +

        We are using the get_followers and get_following functions that are built into the official library steem-python. These functions allow us to query the Steem blockchain in order to retrieve either a list of authors that are being followed or a list of authors that are currently following a specified user. There are 4 parameters required to execute these functions:

        + +
          +
        1. account - The specific user for which the follower(ing) list will be retrieved
        2. +
        3. start follower(ing) - The starting letter(s) or name for the search query. This value can be set as an empty string in order to include all authors starting from “a”
        4. +
        5. follow type - This value is set to blog and includes all users following or being followed by the user. This is currently the only valid parameter value for this function to execute correctly.
        6. +
        7. limit - The maximum number of lines that can be returned by the query
        8. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Input variables - Collecting the required inputs via the UI
        4. +
        5. Get followers/following Get the followers or users being followed
        6. +
        7. Print output - Print results in output
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages, pick - helps us to select the query type interactively. steem - steem-python library, interaction with Blockchain.

        + +

        First we import both libraries and initialize Steem class

        + +
        from pick import pick
        +from steem import Steem
        +
        +s = Steem()
        +
        + +

        2. Input variables

        + +

        We assign two of the variables via a simple input from the UI.

        + +
        #capture username
        +username = input("Username: ")
        +
        +#capture list limit
        +limit = input("Max number of followers(ing) to display: ")
        +
        + +

        Next we make a list of the two list options available to the user, following or followers and setup pick.

        + +
        #list type
        +title = 'Please choose the type of list: '
        +options = ['Follower', 'Following']
        +
        +#get index and selected list name
        +option, index = pick(options, title)
        +print("List of " + option)
        +
        + +

        This will show the two options as a list to select in terminal/command prompt. From there we can determine which function to execute. We also display the choice on the UI for clarity.

        + +

        3. Get followers/following

        + +

        Now that we know which function we will be using, we can form the query to send to the blockchain. The selection is done with a simple if statement.

        + +
        if option=="Follower" :
        +    follow = s.get_followers(username, '', 'blog', limit)
        +    # for follower in follow:
        +    #     lists.append(follower["follower"])
        +    # print(*lists, sep='\n')
        +else:
        +    follow = s.get_following(username, '', 'blog', limit)
        +    # for following in follow:
        +    #     lists.append(following["following"])
        +    # print(*lists, sep='\n')
        +
        + +

        The output is displayed using the same if statement and will be discussed in the next step.

        + +

        4. Print output

        + +

        Next, we will print the result.

        + +
        if option=="Follower" :
        +    # follow = s.get_followers(username, '', 'blog', limit)
        +    for follower in follow:
        +        lists.append(follower["follower"])
        +    print(*lists, sep='\n')
        +else:
        +    # follow = s.get_following(username, '', 'blog', limit)
        +    for following in follow:
        +        lists.append(following["following"])
        +    print(*lists, sep='\n')
        +
        + +

        The query returns an array of objects. We use the for loop to build a list of only the followers(ing) from that array and then display the list on the UI with line separators. This creates an easy to read list of authors.

        + +

        We also do a check for when the list is empty to display the proper message.

        + +
        #check if follower(ing) list is empty
        +if len(lists) == 0:
        +    print("No "+option+" information available")
        +
        + +

        This is a fairly simple example of how to use these functions but we encourage you to play around with the parameters to gain further understanding of possible results.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/19_get_follower_and_following_list
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_post_comments.html b/docs/tutorials-python/get_post_comments.html new file mode 100644 index 00000000..713d7255 --- /dev/null +++ b/docs/tutorials-python/get_post_comments.html @@ -0,0 +1,520 @@ + + + + + + + + + + + + + + + + + + +PY: Get Post Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Post Comments + + +

        + +

        Fetch comments made on each content or post using Python.

        +
        + + +

        Full, runnable src of Get Post Comments can be downloaded as part of the PY tutorials repository. +

        + +

        This tutorial will explain and show you how to access the Steem blockchain using the steem-python library to fetch list of posts and get replies info on selected post.

        + +

        Intro

        + +

        Steem python library has built-in function to get active voters information if post with author and permlink as an argument. Since we don’t have predefined post or author/permlink. We will fetch post list from previous tutorial and give option to choose one post to get its active voters. get_content_replies function fetches list of replies on content. Note that get_discussions_by_hot filter is used for fetching 5 posts and after selection of post tutorial uses author and permlink of the post to fetch replies.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Post list - List of posts to select from created filter
        4. +
        5. Replies list - Get replies list for selected post
        6. +
        7. Print output - Print results in output
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages, pick - helps us to select filter interactively. steem - steem-python library, interaction with Blockchain. pprint - print results in better format.

        + +

        First we import all three library and initialize Steem class

        + +
            import pprint
        +    from pick import pick
        +    # initialize Steem class
        +    from steem import Steem
        +
        +    s = Steem()
        +
        + +

        2. Post list

        + +

        Next we will fetch and make list of posts and setup pick properly.

        + +
            query = {
        +        "limit":5, #number of posts
        +        "tag":"" #tag of posts
        +        }
        +    #post list for selected query
        +    posts = s.get_discussions_by_hot(query)
        +
        +    title = 'Please choose post: '
        +    options = []
        +    #posts list options
        +    for post in posts:
        +        options.append(post["author"]+'/'+post["permlink"])
        +    # get index and selected filter name
        +    option, index = pick(options, title)
        +
        + +

        This will show us list of posts to select in terminal/command prompt. And after selection we will get index and post name to index and option variables.

        + +

        3. Replies list

        + +

        Next we will replies on selected post with get_content_replies.

        + +
          # get replies for given post
        +  replies = s.get_content_replies(posts[index]["author"],posts[index]["permlink"])
        +
        + +

        4. Print output

        + +

        Next, we will print result, replies on selected post, selected post details and number of replies.

        + +
          # print post details for selected post
        +  pprint.pprint(replies)
        +  pprint.pprint("Selected: "+option)
        +  pprint.pprint("Number of replies: "+str(len(replies)))
        +
        + +

        The example of result returned from the service is a JSON object with the following properties:

        + +
        [{'abs_rshares': 0,
        +  'active': '2018-06-15T10:43:36',
        +  'active_votes': [],
        +  'allow_curation_rewards': True,
        +  'allow_replies': True,
        +  'allow_votes': True,
        +  'author': 'sarcasms',
        +  'author_reputation': 1086863019,
        +  'author_rewards': 0,
        +  'beneficiaries': [],
        +  'body': 'follow us for news, media, memes, sports updates and lots '
        +          'more...',
        +  'body_length': 0,
        +  'cashout_time': '2018-06-22T10:43:36',
        +  'category': 'fiction',
        +  'children': 0,
        +  'children_abs_rshares': 0,
        +  'created': '2018-06-15T10:43:36',
        +  'curator_payout_value': '0.000 SBD',
        +  'depth': 1,
        +  'id': 53110589,
        +  'json_metadata': '{"tags":["fiction"],"users":["sarcasms"],"app":"steemit/0.1"}',
        +  'last_payout': '1970-01-01T00:00:00',
        +  'last_update': '2018-06-15T10:43:36',
        +  'max_accepted_payout': '1000000.000 SBD',
        +  'max_cashout_time': '1969-12-31T23:59:59',
        +  'net_rshares': 0,
        +  'net_votes': 0,
        +  'parent_author': 'muratkbesiroglu',
        +  'parent_permlink': 'short-sci-fi-story-the-android-that-sell-meaning',
        +  'pending_payout_value': '0.000 SBD',
        +  'percent_steem_dollars': 10000,
        +  'permlink': 're-muratkbesiroglu-short-sci-fi-story-the-android-that-sell-meaning-20180615t104323737z',
        +  'promoted': '0.000 SBD',
        +  'reblogged_by': [],
        +  'replies': [],
        +  'reward_weight': 10000,
        +  'root_author': 'muratkbesiroglu',
        +  'root_permlink': 'short-sci-fi-story-the-android-that-sell-meaning',
        +  'root_title': 'Short Sci-Fi Story: The Android That Sell Meaning',
        +  'title': '',
        +  'total_payout_value': '0.000 SBD',
        +  'total_pending_payout_value': '0.000 STEEM',
        +  'total_vote_weight': 0,
        +  'url': '/fiction/@muratkbesiroglu/short-sci-fi-story-the-android-that-sell-meaning#@sarcasms/re-muratkbesiroglu-short-sci-fi-story-the-android-that-sell-meaning-20180615t104323737z',
        +  'vote_rshares': 0},
        + {'abs_rshares': 0,
        +  'active': '2018-06-15T11:26:15',
        +  'active_votes': [],
        +  'allow_curation_rewards': True,
        +  'allow_replies': True,
        +  'allow_votes': True,
        +  'author': 'vicky3585',
        +  'author_reputation': 40338001,
        +  'author_rewards': 0,
        +  'beneficiaries': [],
        +  'body': 'lovely story keep it up...',
        +  'body_length': 0,
        +  'cashout_time': '2018-06-22T11:26:15',
        +  'category': 'fiction',
        +  'children': 0,
        +  'children_abs_rshares': 0,
        +  'created': '2018-06-15T11:26:15',
        +  'curator_payout_value': '0.000 SBD',
        +  'depth': 1,
        +  'id': 53114015,
        +  'json_metadata': '{"tags":["fiction"],"app":"steemit/0.1"}',
        +  'last_payout': '1970-01-01T00:00:00',
        +  'last_update': '2018-06-15T11:26:15',
        +  'max_accepted_payout': '1000000.000 SBD',
        +  'max_cashout_time': '1969-12-31T23:59:59',
        +  'net_rshares': 0,
        +  'net_votes': 0,
        +  'parent_author': 'muratkbesiroglu',
        +  'parent_permlink': 'short-sci-fi-story-the-android-that-sell-meaning',
        +  'pending_payout_value': '0.000 SBD',
        +  'percent_steem_dollars': 10000,
        +  'permlink': 're-muratkbesiroglu-short-sci-fi-story-the-android-that-sell-meaning-20180615t112615204z',
        +  'promoted': '0.000 SBD',
        +  'reblogged_by': [],
        +  'replies': [],
        +  'reward_weight': 10000,
        +  'root_author': 'muratkbesiroglu',
        +  'root_permlink': 'short-sci-fi-story-the-android-that-sell-meaning',
        +  'root_title': 'Short Sci-Fi Story: The Android That Sell Meaning',
        +  'title': '',
        +  'total_payout_value': '0.000 SBD',
        +  'total_pending_payout_value': '0.000 STEEM',
        +  'total_vote_weight': 0,
        +  'url': '/fiction/@muratkbesiroglu/short-sci-fi-story-the-android-that-sell-meaning#@vicky3585/re-muratkbesiroglu-short-sci-fi-story-the-android-that-sell-meaning-20180615t112615204z',
        +  'vote_rshares': 0}]
        +'Selected: muratkbesiroglu/short-sci-fi-story-the-android-that-sell-meaning'
        +'Number of replies: 18'
        +
        + +

        From this result you have access to everything associated to the replies including content of reply, author, timestamp, etc., so that you can be use in further development of application with Python.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/07_get_post_comments
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_post_details.html b/docs/tutorials-python/get_post_details.html new file mode 100644 index 00000000..97b6dd3d --- /dev/null +++ b/docs/tutorials-python/get_post_details.html @@ -0,0 +1,492 @@ + + + + + + + + + + + + + + + + + + +PY: Get Post Details | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Post Details + + +

        + +

        Get post details from list of posts from the blockchain with created filter and tag then display selected post details.

        +
        + + +

        Full, runnable src of Get Post Details can be downloaded as part of the PY tutorials repository. +

        + +

        We will explain and show you how to access the Steem blockchain using the steem-python library to fetch list of posts filtered by a filter and tag

        + +

        Intro

        + +

        Steem python library has built-in function to get details of post with author and permlink as an argument. Since we don’t have predefined post or author/permlink. We will fetch post list from previous tutorial and give option to choose one option/post to get its details. get_content function fetches latest state of the post and delivers its details. Note that get_discussions_by_created filter is used for fetching 5 posts which by default contains details of each post, but for purpose of this tutorial we will showcase get_content function to fetch details.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Post list - List of posts to select from created filter
        4. +
        5. Post details - Get post details for selected post
        6. +
        7. Print output - Print results in output
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages, pick - helps us to select filter interactively. steem - steem-python library, interaction with Blockchain. pprint - print results in better format.

        + +

        First we import all three library and initialize Steem class

        + +
            import pprint
        +    from pick import pick
        +    # initialize Steem class
        +    from steem import Steem
        +
        +    s = Steem()
        +
        + +

        2. Post list

        + +

        Next we will fetch and make list of posts and setup pick properly.

        + +
            query = {
        +        "limit":5, #number of posts
        +        "tag":"" #tag of posts
        +        }
        +    #post list for selected query
        +    posts = s.get_discussions_by_created(query)
        +
        +    title = 'Please choose post: '
        +    options = []
        +    #posts list options
        +    for post in posts:
        +        options.append(post["author"]+'/'+post["permlink"])
        +    # get index and selected filter name
        +    option, index = pick(options, title)
        +
        + +

        This will show us list of posts to select in terminal/command prompt. And after selection we will get index and post name to index and option variables.

        + +

        3. Post details

        + +

        Next we will fetch post details with get_content. By default get_discussions_by_created function already contains post details, but for this tutorial purpose we will ignore all other fields but only use author and permlink fields to fetch fresh post details.

        + +
        
        +details = s.get_content(posts[index]["author"],posts[index]["permlink"])
        +
        + +

        4. Print output

        + +

        Next, we will print result, details of selected post.

        + +
            # print post details for selected post
        +    pprint.pprint(details)
        +    pprint.pprint("Selected: "+option)
        +
        + +

        The example of result returned from the service is a JSON object with the following properties:

        + +
        {
        +    "id": 37338948,
        +    "author": "steemitblog",
        +    "permlink": "join-team-steemit-at-tokenfest",
        +    "category": "steemit",
        +    "parent_author": "",
        +    "parent_permlink": "steemit",
        +    "title": "Join Team Steemit at TokenFest!",
        +    "body":
        +        "<a href=\"https://tokenfest.adria.digital\"><img src=\"https://i.imgur.com/fOScDIW.png\"/></a>\n\nHello Steemians! If you’d like to meet Team Steemit live-in-person, or are just interested in attending what promises to be a great blockchain conference, join us at <a href=\"https://tokenfest.adria.digital/\">TokenFest</a> in San Francisco from March 15th to 16th. \n\nSteemit CEO, Ned Scott, will be participating in a fireside chat alongside Steemit’s CTO, Harry Schmidt, as well as the creator of Utopian.io, Diego Pucci. Steemit will also be hosting the opening party on Thursday night and we’d certainly love to meet as many of you as possible IRL, so head on over to https://tokenfest.adria.digital/ and get your tickets while you can. \n\n*Team Steemit*",
        +    "json_metadata":
        +        "{\"tags\":[\"steemit\",\"tokenfest\",\"conference\"],\"image\":[\"https://i.imgur.com/fOScDIW.png\"],\"links\":[\"https://tokenfest.adria.digital\",\"https://tokenfest.adria.digital/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +    "last_update": "2018-03-07T23:22:54",
        +    "created": "2018-03-07T20:56:36",
        +    "active": "2018-03-13T01:40:21",
        +    "last_payout": "1970-01-01T00:00:00",
        +    "depth": 0,
        +    "children": 29,
        +    "net_rshares": "11453442114933",
        +    "abs_rshares": "11454054795840",
        +    "vote_rshares": "11454054795840",
        +    "children_abs_rshares": "13568695606090",
        +    "cashout_time": "2018-03-14T20:56:36",
        +    "max_cashout_time": "1969-12-31T23:59:59",
        +    "total_vote_weight": 3462435,
        +    "reward_weight": 10000,
        +    "total_payout_value": "0.000 SBD",
        +    "curator_payout_value": "0.000 SBD",
        +    "author_rewards": 0,
        +    "net_votes": 77,
        +    "root_comment": 37338948,
        +    "max_accepted_payout": "0.000 SBD",
        +    "percent_steem_dollars": 10000,
        +    "allow_replies": true,
        +    "allow_votes": true,
        +    "allow_curation_rewards": true,
        +    "beneficiaries": [],
        +    "url": "/steemit/@steemitblog/join-team-steemit-at-tokenfest",
        +    "root_title": "Join Team Steemit at TokenFest!",
        +    "pending_payout_value": "46.436 SBD",
        +    "total_pending_payout_value": "0.000 STEEM",
        +    "active_votes": [
        +        {
        +            "voter": "steemitblog",
        +            "weight": 0,
        +            "rshares": "1870813909383",
        +            "percent": 10000,
        +            "reputation": "128210130644387",
        +            "time": "2018-03-07T20:56:36"
        +        },
        +        {
        +            "voter": "kevinwong",
        +            "weight": 526653,
        +            "rshares": "2208942520687",
        +            "percent": 5000,
        +            "reputation": "374133832002581",
        +            "time": "2018-03-08T04:27:00"
        +        }
        +    ],
        +    "replies": [],
        +    "author_reputation": "128210130644387",
        +    "promoted": "0.000 SBD",
        +    "body_length": 754,
        +    "reblogged_by": []
        +}
        +'Selected: steemitblog/join-team-steemit-at-tokenfest'
        +
        + +

        From this result you have access to everything associated to the post including additional metadata which is a JSON string (that must be decoded to use), active_votes info, post title, body, etc. details that can be used in further development of application with Python.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/05_get_post_details
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_posts.html b/docs/tutorials-python/get_posts.html new file mode 100644 index 00000000..81a84dbd --- /dev/null +++ b/docs/tutorials-python/get_posts.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + + + + + +PY: Get Posts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Posts + + +

        + +

        Tutorial pulls a list of the posts from the blockchain with selected filter and tag then displays output.

        +
        + + +

        Full, runnable src of Get Posts can be downloaded as part of the PY tutorials repository. +

        + +

        This tutorial will explain and show you how to access the Steem blockchain using the steem-python library to fetch list of posts filtered by a filter and tag

        + +

        Intro

        + +

        In Steem there are built-in filters trending, hot, created, active, promoted etc. which helps us to get list of posts. get_discussions_by_trending(query), get_discussions_by_hot(query), get_discussions_by_created(query), etc. functions are built-in in official library steem-python that we are going to use throughout all Python tutorials.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Filters list - List of filters to select from
        4. +
        5. Query details - Form a query
        6. +
        7. Print output - Print results in output
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages, pick - helps us to select filter interactively. steem - steem-python library, interaction with Blockchain. pprint - print results in better format.

        + +

        First we import all three library and initialize Steem class

        + +
            import pprint
        +    from pick import pick
        +    # initialize Steem class
        +    from steem import Steem
        +
        +    s = Steem()
        +
        + +

        2. Filters list

        + +

        Next we will make list of filters and setup pick properly.

        + +
            title = 'Please choose filter: '
        +    #filters list
        +    options = ['trending', 'hot', 'active', 'created', 'promoted']
        +    # get index and selected filter name
        +    option, index = pick(options, title)
        +
        + +

        This will show us list of filters to select in terminal/command prompt. And after selection we will get index and filter name to index and option variables.

        + +

        3. Query details

        + +

        Next we will form a query. In Steem,

        + +
          +
        • You can add a tag to filter the posts that you receive from the server
        • +
        • You can also limit the amount of results you would like to receive from the query
        • +
        + +
        query = {
        +    "limit":2, #number of posts
        +    "tag":"" #tag of posts
        +    }
        +#post list for selected query
        +posts = {0: s.get_discussions_by_trending(query),
        +         1: s.get_discussions_by_hot(query),
        +         2: s.get_discussions_by_active(query),
        +         3: s.get_discussions_by_created(query),
        +         4: s.get_discussions_by_promoted(query)
        +}
        +
        + +

        Above code shows example of query and simple list of function that will fetch post list with user selected filter.

        + +

        4. Print output

        + +

        Next, we will print result, post list and selected filter name.

        + +
            # print post list for selected filter
        +    pprint.pprint(posts[index])
        +    pprint.pprint("Selected: "+option)
        +
        + +

        The example of result returned from the service is a JSON object with the following properties:

        + +
        [
        +    {
        +        "id": 37338948,
        +        "author": "steemitblog",
        +        "permlink": "join-team-steemit-at-tokenfest",
        +        "category": "steemit",
        +        "parent_author": "",
        +        "parent_permlink": "steemit",
        +        "title": "Join Team Steemit at TokenFest!",
        +        "body":
        +            "<a href=\"https://tokenfest.adria.digital\"><img src=\"https://i.imgur.com/fOScDIW.png\"/></a>\n\nHello Steemians! If you’d like to meet Team Steemit live-in-person, or are just interested in attending what promises to be a great blockchain conference, join us at <a href=\"https://tokenfest.adria.digital/\">TokenFest</a> in San Francisco from March 15th to 16th. \n\nSteemit CEO, Ned Scott, will be participating in a fireside chat alongside Steemit’s CTO, Harry Schmidt, as well as the creator of Utopian.io, Diego Pucci. Steemit will also be hosting the opening party on Thursday night and we’d certainly love to meet as many of you as possible IRL, so head on over to https://tokenfest.adria.digital/ and get your tickets while you can. \n\n*Team Steemit*",
        +        "json_metadata":
        +            "{\"tags\":[\"steemit\",\"tokenfest\",\"conference\"],\"image\":[\"https://i.imgur.com/fOScDIW.png\"],\"links\":[\"https://tokenfest.adria.digital\",\"https://tokenfest.adria.digital/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
        +        "last_update": "2018-03-07T23:22:54",
        +        "created": "2018-03-07T20:56:36",
        +        "active": "2018-03-13T01:40:21",
        +        "last_payout": "1970-01-01T00:00:00",
        +        "depth": 0,
        +        "children": 29,
        +        "net_rshares": "11453442114933",
        +        "abs_rshares": "11454054795840",
        +        "vote_rshares": "11454054795840",
        +        "children_abs_rshares": "13568695606090",
        +        "cashout_time": "2018-03-14T20:56:36",
        +        "max_cashout_time": "1969-12-31T23:59:59",
        +        "total_vote_weight": 3462435,
        +        "reward_weight": 10000,
        +        "total_payout_value": "0.000 SBD",
        +        "curator_payout_value": "0.000 SBD",
        +        "author_rewards": 0,
        +        "net_votes": 77,
        +        "root_comment": 37338948,
        +        "max_accepted_payout": "0.000 SBD",
        +        "percent_steem_dollars": 10000,
        +        "allow_replies": true,
        +        "allow_votes": true,
        +        "allow_curation_rewards": true,
        +        "beneficiaries": [],
        +        "url": "/steemit/@steemitblog/join-team-steemit-at-tokenfest",
        +        "root_title": "Join Team Steemit at TokenFest!",
        +        "pending_payout_value": "46.436 SBD",
        +        "total_pending_payout_value": "0.000 STEEM",
        +        "active_votes": [
        +            {
        +                "voter": "steemitblog",
        +                "weight": 0,
        +                "rshares": "1870813909383",
        +                "percent": 10000,
        +                "reputation": "128210130644387",
        +                "time": "2018-03-07T20:56:36"
        +            },
        +            {
        +                "voter": "kevinwong",
        +                "weight": 526653,
        +                "rshares": "2208942520687",
        +                "percent": 5000,
        +                "reputation": "374133832002581",
        +                "time": "2018-03-08T04:27:00"
        +            }
        +        ],
        +        "replies": [],
        +        "author_reputation": "128210130644387",
        +        "promoted": "0.000 SBD",
        +        "body_length": 754,
        +        "reblogged_by": []
        +    },
        +    {
        +
        +    }
        +]
        +'Selected: hot'
        +
        + +

        From this result you have access to everything associated to the posts including additional metadata which is a JSON string (that must be decoded to use), active_votes info, post title, body, etc. details that can be used in further development of application with Python.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/04_get_posts
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/get_voters_list_on_post.html b/docs/tutorials-python/get_voters_list_on_post.html new file mode 100644 index 00000000..6d2dde70 --- /dev/null +++ b/docs/tutorials-python/get_voters_list_on_post.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + +PY: Get Voters List On Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Get Voters List On Post + + +

        + +

        Voters list and detail of each vote on selected content.

        +
        + + +

        Full, runnable src of Get Voters List On Post can be downloaded as part of the PY tutorials repository. +

        + +

        Tutorial will explain and show you how to access the Steem blockchain using the steem-python library to fetch list of posts and get voters info on selected post.

        + +

        Intro

        + +

        Steem python library has built-in function to get active voters information if post with author and permlink as an argument. Since we don’t have predefined post or author/permlink. We will fetch post list from previous tutorial and give option to choose one post to get its active voters. get_active_votes function fetches list of active voters on content. Note that get_discussions_by_active filter is used for fetching 5 posts which by default contains active_votes of each post, but for purpose of this tutorial we will use get_active_votes function to fetch voters info.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Post list - List of posts to select from created filter
        4. +
        5. Voters list - Get voters list for selected post
        6. +
        7. Print output - Print results in output
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages, pick - helps us to select filter interactively. steem - steem-python library, interaction with Blockchain. pprint - print results in better format.

        + +

        First we import all three library and initialize Steem class

        + +
            import pprint
        +    from pick import pick
        +    # initialize Steem class
        +    from steem import Steem
        +
        +    s = Steem()
        +
        + +

        2. Post list

        + +

        Next we will fetch and make list of posts and setup pick properly.

        + +
            query = {
        +        "limit":5, #number of posts
        +        "tag":"" #tag of posts
        +        }
        +    #post list for selected query
        +    posts = s.get_discussions_by_active(query)
        +
        +    title = 'Please choose post: '
        +    options = []
        +    #posts list options
        +    for post in posts:
        +        options.append(post["author"]+'/'+post["permlink"])
        +    # get index and selected filter name
        +    option, index = pick(options, title)
        +
        + +

        This will show us list of posts to select in terminal/command prompt. And after selection we will get index and post name to index and option variables.

        + +

        3. Voters list

        + +

        Next we will fetch active votes on selected post with get_active_votes. By default get_discussions_by_active function already contains active_votes list, but for this tutorial purpose we will ignore all other fields but only use author and permlink fields to fetch voters list.

        + +
        
        +voters = s.get_active_votes(posts[index]["author"],posts[index]["permlink"])
        +
        + +

        4. Print output

        + +

        Next, we will print result, details of selected post.

        + +
            # print voters list for selected post
        +    pprint.pprint(voters)
        +    pprint.pprint("Selected: "+option)
        +
        + +

        The example of result returned from the service is a JSON object with the following properties:

        + +
        [{'percent': 100,
        +  'reputation': '4675452335798',
        +  'rshares': 174045922,
        +  'time': '2018-06-13T05:27:06',
        +  'voter': 'ubg',
        +  'weight': 663},
        + {'percent': 3000,
        +  'reputation': 0,
        +  'rshares': '52213408920',
        +  'time': '2018-06-13T12:53:30',
        +  'voter': 'warofcraft',
        +  'weight': 99589},
        + {'percent': 10000,
        +  'reputation': '16976056264304',
        +  'rshares': '41495494555',
        +  'time': '2018-06-13T08:56:00',
        +  'voter': 'jiahn',
        +  'weight': 80257}
        +]
        +'Selected: steemitblog/join-team-steemit-at-tokenfest'
        +
        + +

        From this result you have access to everything associated to the voter including reputation of voter, timestamp, voter’s account name, percent and weight of vote, rshares reward shares values that you can be use in further development of application with Python.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/06_get_voters_list
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/getting_started.html b/docs/tutorials-python/getting_started.html new file mode 100644 index 00000000..639a4ce4 --- /dev/null +++ b/docs/tutorials-python/getting_started.html @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + +PY: Getting Started | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Getting Started + + +

        + +

        The official Steem library for Python is steem-python. It comes with a BIP38 encrypted wallet and a practical CLI utility called steempy.

        +
        + + +

        Full, runnable src of Getting Started can be downloaded as part of the PY tutorials repository. +

        + +

        The library was designed to allow Python developers to easily access the network as well as build utilities and applications.

        + +

        Currently steem-python documentation is generated in the standard pydoc format.

        + +

        Documentation is available at: Official steem-python Docs.

        + +
        + +

        Dev requirements

        + +

        In our Python tutorials we recommend developers to be familiar with following requirements/libraries.

        + +
          +
        • +

          Python developer should be familiar with Python 3.x and above

          +
        • +
        • +

          Medium knowledge of package manager pip/pip3 and/or pipenv is required, since our tutorials will be using package manager to get started quickly.

          +
        • +
        • +

          Terminal (Linux/Mac) or Cmd (Windows command prompt) knowledge is also required, since most python tutorials will only work with terminal and print out result in different formats.

          +
        • +
        • +

          Python environment path should be set up properly so that terminal can access proper python library without conflicts.

          +
        • +
        • +

          Additional and optional packages that we might use: setuptools, brew

          +
        • +
        + +

        To get started with Python, you can also check official Python installation and Python tutorial.

        + +

        To get started with our Python tutorials, checkout our first tutorial here.

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/grant_active_permission.html b/docs/tutorials-python/grant_active_permission.html new file mode 100644 index 00000000..fa5d8a6a --- /dev/null +++ b/docs/tutorials-python/grant_active_permission.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + +PY: Grant Active Permission | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Grant Active Permission + + +

        + +

        How to give another user active permission on your account using Python.

        +
        + + +

        Full, runnable src of Grant Active Permission can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to check if someone has got active permission for an account on the Steem blockchain and how to grant or revoke that permission using the commit class found within the steem-python library.

        + +

        Providing another user active permission for your account enables them to do fund transfers from your account. This can be useful in setting up a secondary account(s) to manage funds for a main account or having a backup should you lose passwords for the main account.

        + +

        One of the common practice nowadays is to lend/delegate SP to another account, above same technique can be used to create market around it with minimum 3rd party trust. All your funds stay in your account. You can use/create automated system where you can lease for certain period of time and system can take care of payments and release of delegations (notify clients). Even better, you can use multi-signature feature to establish 100% trust where clients will have to confirm, approve transactions.

        + +

        Active permissions and authority should be used with utmost care, you don’t want to lose your funds. It is really not easy to hack Steem accounts, let alone take control over it. But without careful use (revealing private keys) losing liquid funds are not that difficult and it takes only couple seconds to do that, keeping most value powered up always helps.

        + +

        this article has more detail around active authorities

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the allow and disallow methods found within the commit class in the library. Before we grant or revoke permission, we use the get_account function to check whether the requested user already has that permission or not. This is not strictly necessary but adds to the useability of the process. The allow method has 5 parameters:

        + +
          +
        1. foreign - The foreign account that will obtain access
        2. +
        3. weight - This is an optional parameter defining the weight to use. If not defined, the threshold value will be used. If the weight is smaller than the threshold, additional signatures will be required.
        4. +
        5. permission - The actual permission to modify. This value must be either “posting”, “active” or “owner”
        6. +
        7. account - The account to allow access to
        8. +
        9. threshold - The threshold that needs to be reached by signatures to be able to interact
        10. +
        + +

        The disallow method uses the same parameters except for weight which is not required.

        + +

        There is currently a bug with the disallow method when using it on the testnet that we normally connect to. Due to that bug, we are using the production server for this tutorial. Special care should be taken when creating transactions as everything we do will affect real accounts.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Input user info and connection to production
        2. +
        3. Username validation - Check validity of user and foreign account
        4. +
        5. Check permission status - Check current permission status of foreign account
        6. +
        7. Commit to blockchain - Commit transaction to blockchain
        8. +
        + +

        1. App setup and connection

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries for the application.

        + +
        import steembase
        +import steem
        +from pick import pick
        +
        + +

        We require the private active key of the user in order for the allow or disallow to be committed to the blockchain. The values are supplied via the terminal/console before we initialise the steem class with the supplied private key included.

        + +
        #capture user information
        +username = input('Enter username: ')
        +wif = input('Enter private ACTIVE key: ')
        +
        +#connect to production server with active key
        +client = steem.Steem(keys=[wif])
        +
        + +

        2. Username validation

        + +

        Both the main account granting the permission and the account that permission is being granted to are first checked to make certain that they do in fact exist. We do this with the get_account function.

        + +
        #check valid user
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +
        +#get account to authorise and check if valid
        +foreign_acc = input('Please enter the account name for ACTIVE authorisation: ')
        +if (foreign_acc == username) :
        +    print('Cannot allow or disallow active permission to your own account')
        +    exit()
        +foreign_userinfo = client.get_account(foreign_acc)
        +if(foreign_userinfo is None) :
        +    print('Oops. Looks like user ' + foreign_acc + ' doesn\'t exist on this chain!')
        +    exit()
        +
        + +

        3. Check permission status

        + +

        In order to determine which function to execute (allow or disallow) we first need to check whether the requested user already has permission or not. We do this with the same variable created in the previous step. The get_account function has a value - active - that contains an array of the all the usernames that has been granted active permission for the account being queried. We use this check to limit the options of the user as you cannot grant permission to a user that already has permission or revoke permission of a user that does not yet have permission. The information is displayed on the options list.

        + +
        #check if foreign_account already has active auth
        +_data = []
        +title = ''
        +for i in range(len(userinfo['active']['account_auths'])) :
        +    _data.append(userinfo['active']['account_auths'][i])
        +    if (_data[i][0] == foreign_acc) :
        +        title = (foreign_acc + ' already has active permission. Please choose option from below list')
        +        options = ['DISALLOW', 'CANCEL']
        +
        +if (title == '') :
        +    title = (foreign_acc + ' does not yet active permission. Please choose option from below list')
        +    options = ['ALLOW', 'CANCEL']
        +
        + +

        4. Commit to blockchain

        + +

        Based on the check in the previous step, the user is given the option to allow, disallow or cancel the operation completely. All the required parameters have already been assigned via console/terminal input and based on the choice of the user the relevant function can be executed. A confirmation of the succesfully executed action is displayed on the UI.

        + +
        option, index = pick(options, title)
        +
        +if (option == 'CANCEL') :
        +    print('operation cancelled')
        +    exit()
        +
        +if (option == 'ALLOW') :
        +    #allow(foreign, weight=None, permission='posting', account=None, threshold=None)
        +    client.allow(foreign=foreign_acc, weight=1, permission='active', account=username, threshold=1)
        +    print(foreign_acc + ' has been granted active permission')
        +else :
        +    #disallow(foreign, permission='posting', account=None, threshold=None)
        +    client.disallow(foreign=foreign_acc, permission='active', account=username, threshold=1)
        +    print('active permission for ' + foreign_acc + ' has been removed')
        +
        + +

        And that’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/31_grant_active_permission
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/grant_posting_permission.html b/docs/tutorials-python/grant_posting_permission.html new file mode 100644 index 00000000..1b2f791c --- /dev/null +++ b/docs/tutorials-python/grant_posting_permission.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + +PY: Grant Posting Permission | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Grant Posting Permission + + +

        + +

        How to give another user posting permission on your account using Python.

        +
        + + +

        Full, runnable src of Grant Posting Permission can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to check if someone has posting permission for an account on the Steem blockchain and how to grant or revoke that permission using the commit class found within the steem-python library.

        + +

        Providing another user posting permission for your account can be used to allow multiple users to submit posts on a single steemit community. @Utopian-Io is an example of such a community. There are also applications that allows you to schedule posts by automatically publishing on your behalf.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the allow and disallow methods found within the commit class in the library. Before we grant or revoke permission, we use the get_account function to check whether the requested user already has that permission or not. This is not strictly necessary but adds to the useability of the process. The allow method has 5 parameters:

        + +
          +
        1. foreign - The foreign account that will obtain access
        2. +
        3. weight - This is an optional parameter defining the weight to use. If not defined, the threshold value will be used. If the weight is smaller than the threshold, additional signatures will be required.
        4. +
        5. permission - The actual permission to modify. This value must be either “posting”, “active” or “owner”
        6. +
        7. account - The account to allow access to
        8. +
        9. threshold - The threshold that needs to be reached by signatures to be able to interact
        10. +
        + +

        The disallow method uses the same parameters except for weight which is not required.

        + +

        There is currently a bug with the disallow method when using it on the testnet that we normally connect to. Due to that bug, we are using the production server for this tutorial. Special care should be taken when creating transactions as everything we do will affect real accounts.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Input user info and connection to production
        2. +
        3. Username validation - Check validity of user and foreign account
        4. +
        5. Check permission status - Check current permission status of foreign account
        6. +
        7. Commit to blockchain - Commit transaction to blockchain
        8. +
        + +

        1. App setup and connection

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries for the application.

        + +
        import steembase
        +import steem
        +from pick import pick
        +
        + +

        We require the private active key of the user in order for the allow or disallow to be committed to the blockchain. The values are supplied via the terminal/console before we initialise the steem class with the supplied private key included.

        + +
        #capture user information
        +username = input('Enter username: ')
        +wif = input('Enter private ACTIVE key: ')
        +
        +#connect to production server with active key
        +client = steem.Steem(keys=[wif])
        +
        + +

        2. Username validation

        + +

        Both the main account granting the permission and the account that permission is being granted to are first checked to make certain that they do in fact exist. We do this with the get_account function.

        + +
        #check valid user
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +
        +#get account to authorise and check if valid
        +foreign_acc = input('Please enter the account name for POSTING authorisation: ')
        +if (foreign_acc == username) :
        +    print('Cannot allow or disallow posting permission to your own account')
        +    exit()
        +foreign_userinfo = client.get_account(foreign_acc)
        +if(foreign_userinfo is None) :
        +    print('Oops. Looks like user ' + foreign_acc + ' doesn\'t exist on this chain!')
        +    exit()
        +
        + +

        3. Check permission status

        + +

        In order to determine which function to execute (allow or disallow) we first need to check whether the requested user already has permission or not. We do this with the same variable created in the previous step. The get_account function has a value - posting - that contains an array of all the usernames that has been granted posting permission for the account being queried. We use this check to limit the options of the user as you cannot grant permission to a user that already has permission or revoke permission of a user that does not yet have permission. The information is displayed on the options list.

        + +
        #check if foreign_account already has posting auth
        +_data = []
        +title = ''
        +for i in range(len(userinfo['posting']['account_auths'])) :
        +    _data.append(userinfo['posting']['account_auths'][i])
        +    if (_data[i][0] == foreign_acc) :
        +        title = (foreign_acc + ' already has posting permission. Please choose option from below list')
        +        options = ['DISALLOW', 'CANCEL']
        +
        +if (title == '') :
        +    title = (foreign_acc + ' does not yet posting permission. Please choose option from below list')
        +    options = ['ALLOW', 'CANCEL']
        +
        + +

        4. Commit to blockchain

        + +

        Based on the check in the previous step, the user is given the option to allow, disallow or cancel the operation completely. All the required parameters have already been assigned via console/terminal input and based on the choice of the user the relevant function can be executed. A confirmation of the succesfully executed action is displayed on the UI.

        + +
        option, index = pick(options, title)
        +
        +if (option == 'CANCEL') :
        +    print('operation cancelled')
        +    exit()
        +
        +if (option == 'ALLOW') :
        +    #allow(foreign, weight=None, permission='posting', account=None, threshold=None)
        +    client.allow(foreign=foreign_acc, weight=1, permission='posting', account=username, threshold=1)
        +    print(foreign_acc + ' has been granted posting permission')
        +else :
        +    #disallow(foreign, permission='posting', account=None, threshold=None)
        +    client.disallow(foreign=foreign_acc, permission='posting', account=username, threshold=1)
        +    print('posting permission for ' + foreign_acc + ' has been removed')
        +
        + +

        And that’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/30_grant_posting_permission
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/password_key_change.html b/docs/tutorials-python/password_key_change.html new file mode 100644 index 00000000..85b716ff --- /dev/null +++ b/docs/tutorials-python/password_key_change.html @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + +PY: Password Key Change | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Password Key Change + + +

        + +

        How to change your accounts password and keys

        +
        + + +

        Full, runnable src of Password Key Change can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to change your account password and keys on the Steem blockchain using the steem class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to update your account details on the blockchain. We are using the AccountUpdate and commit.finalizeOp to make these changes. The AccountUpdate function creates the operation that we will be committing to the blockchain using the commit.finalizeOp function. We first get the existing keys from your account then recreate these from your new password. Once these have been created using your new password we commit them to the blockchain. The initial parameters we need to complete this operation are:

        + +
          +
        1. account - The user account that we will be changing
        2. +
        3. old_password - Your existing password for the account we are changing
        4. +
        5. new_password - The new password we will be updating your account with
        6. +
        + +

        Caution: +This functionality does not work on the TestNet so we will be modifying the live blockchain.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to production
        2. +
        3. User input - Input user and limit parameters
        4. +
        5. Connect to the blockchain - Connect to the blockchain using the parameters collected from the user
        6. +
        7. Configure new keys - Setup the new json object that will have the new keys derived from your new password
        8. +
        9. Commit changes to blockchain - Commit the account update to the blockchain
        10. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 package:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • steembase - library containing functions to manipulate private keys and passwords as well as commit the operation to the blockchain
        • +
        + +

        We import the libraries and get parameters from the user.

        + +
        import steem
        +import steembase
        +from steembase.account import PasswordKey
        +from steembase.account import PrivateKey
        +from steembase import operations
        +
        + +

        2. User input

        + +

        You will first be asked for the account that we will be modifying the password for. You will then be prompted to enter your existing password as well as your new password that we will update your account with.

        + +
        account = input('Account: ')
        +old_password = input('Current password: ')
        +new_password = input('New password: ')
        +
        + +

        3. Connect to the blockchain

        + +

        From the parameters that have been collected we will generate the private key for the account and connect to the Steem blockchain.

        + +
        old_owner_key = str(
        +    PasswordKey(account, old_password, "owner").get_private_key()
        +)
        +
        +client = steem.Steem(keys=[old_owner_key])
        +
        + +

        4. Configure new keys

        + +

        We will now generate new keys for each role using the new password as well as create the json that will be committed to the Steem blockchain. We generate new keys using the new password for each of these roles.

        + +
        new_public_keys = {}
        +
        +for role in ["owner", "active", "posting", "memo"]:
        +    private_key = PasswordKey(account, new_password, role).get_private_key()
        +    new_public_keys[role] = str(private_key.pubkey)
        +
        +new_data = {
        +    "account": account,
        +    "json_metadata": {},
        +    "owner": {
        +        "key_auths": [
        +            [new_public_keys["owner"], 1]
        +        ],
        +        "account_auths": [],
        +        "weight_threshold": 1
        +    },
        +    "active": {
        +        "key_auths": [
        +            [new_public_keys["active"], 1]
        +        ],
        +        "account_auths": [],
        +        "weight_threshold": 1
        +    },
        +    "posting": {
        +        "key_auths": [
        +            [new_public_keys["posting"], 1]
        +        ],
        +        "account_auths": [],
        +        "weight_threshold": 1
        +    },
        +    "memo_key": new_public_keys["memo"]
        +}
        +
        +print("New data:")
        +print(new_data)
        +
        + +

        5. Commit changes to blockchain

        + +

        The operations.AccountUpdate(**new_data) creates the operation that will be committed to the blockchain using the new json object we have created.

        + +

        Once we commit the changes to the blockchain using client.commit.finalizeOp the changes are committed and the password is updated.

        + +
        op = operations.AccountUpdate(**new_data)
        +
        +result = client.commit.finalizeOp(op, account, "owner")
        +print("Result:")
        +print(result)
        +
        + +

        If you update your password and attempt to update it again to quickly you will receive the following error.

        + +
        Assert Exception:_db.head_block_time() - account_auth.last_owner_update > STEEM_OWNER_UPDATE_LIMIT: Owner authority can only be updated once an hour.
        +
        + +

        You will need to wait at least an hour before attempting this again.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/33_password_key_change
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/power_down.html b/docs/tutorials-python/power_down.html new file mode 100644 index 00000000..85727464 --- /dev/null +++ b/docs/tutorials-python/power_down.html @@ -0,0 +1,468 @@ + + + + + + + + + + + + + + + + + + +PY: Power Down | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Power Down + + +

        + +

        How to power down (withdraw) your vesting shares using Python.

        +
        + + +

        Full, runnable src of Power Down can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to power down some or all of your available vesting shares (STEEM POWER) on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the withdraw_vesting method found within the commit class in the library. When you power down, the converted VESTS (STEEM POWER) will not be available as STEEM immediately. It is converted in 13 equal parts and transferred into your STEEM wallet weekly, the first portion only being available a week after the power down was initiated. Before we do the conversion, we check the current balance of the account to check how much STEEM POWER is available. This is not strictly necessary as the process will automatically abort with the corresponding error, but it does give some insight into the process as a whole. We use the get_account function to check for this. The withdraw_vesting method has 2 parameters:

        + +
          +
        1. amount - The amount of VESTS that will be withdrawn. This must be of the float data type
        2. +
        3. account - The specified user account for the transfer
        4. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check balance - Check current vesting balance of user account
        6. +
        7. Conversion amount and commit - Input of VESTS amount to convert and commit to blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +from steem.amount import Amount
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to the testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the conversion to be committed to the blockchain. This is why we have to specify this alongside the testnet node. The values are supplied via the terminal/console before we initialise the steem class. There is a demo account available to use with this tutorial but any account that is set up on the testnet can be used.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        + +

        3. Check balance

        + +

        In order to give the user enough information to make the conversion we check the current balance of the account using the get_account function.

        + +
        #get account balance for vesting shares
        +userinfo = client.get_account(username)
        +delegated_vests = userinfo['delegated_vesting_shares']
        +vesting_shares = userinfo['vesting_shares']
        +to_withdraw = float(userinfo['to_withdraw'])
        +withdrawn = float(userinfo['withdrawn'])
        +
        +available_vests = (Amount(vesting_shares).amount - Amount(delegated_vests).amount - 
        +     ((to_withdraw - withdrawn)/1000000))
        +
        +print('VESTS currently powering down: ' + str(to_withdraw/1000000) + ' VESTS' +
        +    '\n' + 'Available VESTS: ' + str(available_vests) + ' VESTS')
        +
        +input('\n' + 'Press enter to continue' + '\n')
        +
        + +

        The available vesting shares to withdraw is not directly available from the user information and needs to be calculated. In order to find the total VESTS available to power down we need to know how much is currently in power down, how much has been delegated and then the total amount of vesting shares. The values are assigned from the query directly as float type to make the calculations a little simpler. The results of the query and calculation are converted to string type and displayed in the console/terminal.

        + +

        4. Conversion amount and commit

        + +

        The user is given the option to withdraw all available vesting shares, a portion of the shares or to cancel the transaction completely.

        + +
        #choice of transfer
        +title = 'Please choose an option: '
        +options = ['Power down ALL', 'Power down PORTION', 'Cancel Transaction']
        +option, index = pick(options, title)
        +
        + +

        Based on the input from the user the amount variable can be assigned and the transaction committed to the blockchain. The amount must be between zero and the total amount of vesting shares (both pending conversion and available VESTS combined). The amount you set to be withdrawn will override the current amount of vesting shares pending withdrawal. If for example the user enters a new amount of ‘0’ shares to be withdrawn, it will cancel the current withdrawal completely.

        + +
        #parameters: amount, account
        +if (option == 'Cancel Transaction') :
        +    print('transaction cancelled')
        +    exit()
        +else :
        +    if (option == 'Power down ALL') :
        +        if (available_vests == 0) :
        +            print('No change to withdraw amount')
        +        else :
        +            amount = to_withdraw/1000000 + available_vests
        +            client.withdraw_vesting(amount, username)
        +            print(str(amount) + ' VESTS now powering down')
        +    else :
        +        amount = float(input('Please enter the amount of VESTS you would like to power down: '))
        +        if (amount < (to_withdraw/1000000 + available_vests)) :
        +            client.withdraw_vesting(amount, username)
        +            print(str(amount) + ' VESTS now powering down')
        +        else :
        +            if (amount == to_withdraw/1000000) :
        +                print('No change to withdraw amount')
        +            else :
        +                print('insufficient funds available')
        +
        + +

        The result is displayed on the console/terminal.

        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/25_power_down
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/power_up_steem.html b/docs/tutorials-python/power_up_steem.html new file mode 100644 index 00000000..c62f8964 --- /dev/null +++ b/docs/tutorials-python/power_up_steem.html @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + +PY: Power Up Steem | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Power Up Steem + + +

        + +

        How to power up your STEEM to STEEM POWER using Python.

        +
        + + +

        Full, runnable src of Power Up Steem can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to check the STEEM balance of an account on the Steem blockchain and how to power up your STEEM into STEEM POWER using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the transfer_to_vesting method found within the commit class in the library. When you power up you convert your STEEM into STEEM POWER to increase your influence on Steemit. Before we do the conversion, we use the get_account function to check the current STEEM balance of the account to see what is available to power up. This is not strictly necessary but adds to the useability of the process. The transfer_to_vesting method has 3 parameters:

        + +
          +
        1. amount - The amount of STEEM to power up. This must be of the float data type
        2. +
        3. to - The account to where the STEEM will be powered up
        4. +
        5. account - The source user account for the transfer
        6. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check balance - Check current vesting balance of user account
        6. +
        7. Conversion amount - Input power up amount and check valid transfer
        8. +
        9. Commit to blockchain - Commit transaction to blockchain
        10. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from steem.amount import Amount
        +from pick import pick
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the conversion to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. There are some demo accounts available but we encourage you to create your own accounts on this testnet and create balances you can claim; it’s good practice.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        + +

        3. Check balance

        + +

        In order to give the user enough information to make the conversion we check the current balance of the account using the get_account function.

        + +
        #check valid user and get account balance
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +balance = userinfo['balance']
        +
        +print('Available STEEM balance: ' + balance + '\n')
        +
        +input('Press any key to continue')
        +
        + +

        The results of the query are displayed in the console/terminal.

        + +

        4. Conversion amount

        + +

        Both the amount and the to parameters are assigned via input from the terminal/console. The user is given the option to power up the STEEM to their own account or to another user’s account. The amount has to be greater than zero and no more than the total available STEEM of the user. If you are using one of Steemit’s demo accounts, please leave some STEEM for others to power up! We also check the to account to make sure it’s a valid account name.

        + +
        #choice of account
        +title = 'Please choose an option for an account to transfer to: '
        +options = ['SELF', 'OTHER']
        +option, index = pick(options, title)
        +
        +if (option == 'OTHER') :
        +    #account to power up to
        +    to_account = input('Please enter the ACCOUNT to where the STEEM will be transferred: ')
        +    #check valid username
        +    result = client.get_account(to_account)
        +    if (not result) :
        +        print(to_account + ' doesn\'t exist on this chain!')
        +        exit()
        +else :
        +    print('\n' + 'Power up STEEM to own account' + '\n')
        +    to_account = username
        +
        +#amount to power up
        +amount = float(input('Please enter the amount of STEEM to power up: '))
        +
        + +

        5. Commit to blockchain

        + +

        Now that all the parameters have been assigned we can continue with the actual transmission to the blockchain. The output and commit is based on the validity of the amount that has been input.

        + +
        #parameters: amount, to, account
        +if (amount == 0) :
        +    print('\n' + 'No STEEM entered for powering up')
        +    exit()
        +else :
        +    if (amount > Amount(balance).amount) :
        +        print('\n' + 'Insufficient funds available')
        +        exit()
        +    else :
        +        client.transfer_to_vesting(amount, to_account, username)
        +        print('\n' + str(amount) + ' STEEM has been powered up successfully')
        +
        + +

        The result of the power up transfer is displayed on the console/terminal.

        + +

        As an added check we also display the new STEEM balance of the user on the terminal/console

        + +
        #get new account balance
        +userinfo = client.get_account(username)
        +balance = userinfo['balance']
        +print('New STEEM balance: ' + balance)
        +
        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/24_power_up_steem
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/reblogging_post.html b/docs/tutorials-python/reblogging_post.html new file mode 100644 index 00000000..264fc45e --- /dev/null +++ b/docs/tutorials-python/reblogging_post.html @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + +PY: Reblogging Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Reblogging Post + + +

        + +

        We will show how to reblog or resteem post using Python, with username and posting private key.

        +
        + + +

        Full, runnable src of Reblogging Post can be downloaded as part of the PY tutorials repository. +

        + +

        Tutorial will also explain and show you how to sign/broadcast transaction on Steem blockchain using the steem-python library.

        + +

        Intro

        + +

        Steem python library has built-in function to commit transaction and broadcast it to the network.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Post list - List of posts to select from trending filter
        4. +
        5. Enter user credentials - Enter user credentails to sign transaction
        6. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages, pick - helps us to select filter interactively. steem - steem-python library, interaction with Blockchain. pprint - print results in better format.

        + +

        First we import all three library and initialize Steem class

        + +
            import pprint
        +    from pick import pick
        +    # initialize Steem class
        +    from steem import Steem
        +
        +    s = Steem()
        +
        + +

        2. Post list

        + +

        Next we will fetch and make list of accounts and setup pick properly.

        + +
            query = {
        +      "limit":5, #number of posts
        +      "tag":"" #tag of posts
        +    }
        +    # post list from trending post list
        +    posts = s.get_discussions_by_trending(query)
        +
        +    title = 'Please choose post to reblog: '
        +    options = []
        +    # post list
        +    for post in posts:
        +      options.append('@'+post["author"]+'/'+post["permlink"])
        +
        +
        + +

        This will show us list of posts to select in terminal/command prompt. And after selection we will get formatted post as an option variable.

        + +

        3. Enter user credentials

        + +

        Next in order to sign transaction, application asks for username and posting private key to sign transaction and broadcast it.

        + +
          # get index and selected post
        +  option, index = pick(options, title)
        +  pprint.pprint("You selected: "+option)
        +
        +  account = input("Enter your username? ")
        +  wif = input("Enter your Posting private key? ")
        +
        +  # commit or build transaction
        +  c = Commit(steem=Steem(keys=[wif]))
        +
        +  # broadcast transaction
        +  c.resteem(option, account=account)
        +
        +
        + +

        That’s it, if transaction is successful you shouldn’t see any error messages, otherwise you will be notified.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/14_reblogging_post
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/search_accounts.html b/docs/tutorials-python/search_accounts.html new file mode 100644 index 00000000..d8f700da --- /dev/null +++ b/docs/tutorials-python/search_accounts.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + +PY: Search Accounts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Search Accounts + + +

        + +

        How to pull a list of the active user accounts or trending tags from the blockchain using Python.

        +
        + + +

        Full, runnable src of Search Accounts can be downloaded as part of the PY tutorials repository. +

        + +

        This tutorial will explain and show you how to access the Steem blockchain using the steem-python library to fetch a list of active authors or trending tags, starting the search from a specified value, and displaying the results on the console.

        + +

        Intro

        + +

        We are using the lookup_accounts and get_trending_tags functions that are built-in in the official library steem-python. These functions allow us to query the Steem blockchain in order to retrieve either a list of active authors or a list of trending tags. The option is available to either get a complete list starting from the first value on the blockchain or starting the list from any other closest match string value as provided by the user. Both of these functions have only two parameters:

        + +
          +
        1. account/aftertag - The string value from where to start the search. If this value is left empty the search will start from the first value available
        2. +
        3. limit - The maximum number of names/tags that the query retrieves
        4. +
        + +

        Steps

        + +
          +
        1. App setup - Library import and Steem class initialisation
        2. +
        3. List selection - Selection of the type of list
        4. +
        5. Get and display account names - Get a list of account names from the blockchain
        6. +
        7. Get and display trending tags - Get a list of trending tags from the blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages, pick - helps us to select the query type interactively. steem - steem-python library for interaction with the Blockchain.

        + +

        First we import both libraries and initialize Steem class

        + +
        from steem import Steem
        +from pick import pick
        +
        +
        +s = Steem()
        +
        + +

        2. List selection

        + +

        The user is given the option of which list to create, active accounts or trending tags. We create this option list and setup pick.

        + +
        #choose list type
        +title = 'Please select type of list:'
        +options = ['Active Account names', 'Trending tags']
        +
        +#get index and selected list name
        +option, index = pick(options, title)
        +
        + +

        This will show the two options as a list to select in terminal/command prompt. From there we can determine which function to execute.

        + +

        3. Get and display account names

        + +

        Once the user selects the required list, a simple if statement is used to execute the relevant function. Based on the selection we then run the query. The parameters for the lookup_accounts function is captured in the if statement via the terminal/console.

        + +
        if option=='Active Account names' :
        +	#capture starting account
        +	account = input("Enter account name to start search from: ")
        +	#input list limit
        +	limit = input("Enter max number of accounts to display: ")
        +	lists = s.lookup_accounts(account, limit)
        +	print('\n' + "List of " + option + '\n')
        +	print(*lists, sep='\n')
        +
        + +

        Once the list is generated it is displayed on the UI with line separators along with a heading of what list it is.

        + + + +

        The query for a list of trending tags is executed in the second part of the if statement. Again, the parameters for the query is captured via the terminal/console.

        + +
        else :
        +	#capture starting tag
        +	aftertag = input("Enter tag name to start search from: ")
        +	#capture list limit
        +	limit = input("Enter max number of tags to display: ")
        +	lists = s.get_trending_tags(aftertag, limit)
        +	print('\n' + "List of " + option + '\n')
        +	for names in lists :
        +		print(names["name"])
        +
        + +

        The query returns an array of objects. We use the for loop to build a list of only the tag names from that array and then display the list on the UI with line separators. This creates an easy to read list of tags.

        + +

        That’s it!.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/15_search_accounts
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/search_tags.html b/docs/tutorials-python/search_tags.html new file mode 100644 index 00000000..f0d50aba --- /dev/null +++ b/docs/tutorials-python/search_tags.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + +PY: Search Tags | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Search Tags + + +

        + +

        How to pull a list of the trending tags from the blockchain using Python.

        +
        + + +

        Full, runnable src of Search Tags can be downloaded as part of the PY tutorials repository. +

        + +

        Please refer to 15_search_accounts which includes a tutorial for trending tags as well.

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/stream_blockchain_transactions.html b/docs/tutorials-python/stream_blockchain_transactions.html new file mode 100644 index 00000000..7cc661fa --- /dev/null +++ b/docs/tutorials-python/stream_blockchain_transactions.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + +PY: Stream Blockchain Transactions | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Stream Blockchain Transactions + + +

        + +

        How to stream transactions on the live Steem blockchain

        +
        + + +

        Full, runnable src of Stream Blockchain Transactions can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to stream transactions on the Steem blockchain using the blockchain class found within the steem-python library.

        + +

        Intro

        + +

        Tutorial is demonstrating the typical process of streaming blocks on Steem. We will show some information from each block that is being streamed to give you an idea. Each block contains transactions objects as well but we will not show each of this data in user interface.

        + +

        We are using the blockchain.stream() function provided by steem-python which returns each block after it has been accepted by witnesses. By default it follows irreversible blocks which was accepted by all witnesses.

        + +

        Steps

        + +
          +
        1. App setup Configure imports and initialization of libraries
        2. +
        3. Stream blocks Stream blocks
        4. +
        5. Sample result Stream blocks
        6. +
        + +

        1. App setup

        + +

        In this tutorial we use 1 package:

        + +

        steem - steem-python library and interaction with Blockchain

        + +
        from steem.blockain import Blockchain
        +
        +blockchain = Blockchain()
        +
        + +

        Above we create an instance of Blockchain which will give us the ability to stream the live transactions from the blockchain.

        + +

        2. Stream blocks

        + +

        Next we create an instance of stream and then loop through the steam as transactions are available and print them to the screen.

        + +
        stream = blockchain.stream()
        +
        +for post in stream:
        +	print(post)
        +
        + +

        3. Sample result

        + +
        {
        +  "curator": "idx",
        +  "reward": "4.042446 VESTS",
        +  "comment_author": "blackbunny",
        +  "comment_permlink": "6tfv5e",
        +  "_id": "5801d1c99ca7ecd1d4387ebd89d4edab08612b35",
        +  "type": "curation_reward",
        +  "timestamp": "2018-09-21T21:11:02.005Z",
        +  "block_num": 26136919,
        +  "trx_id": "0000000000000000000000000000000000000000"
        +}
        +
        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/13_stream_blockchain_transactions
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/submit_comment_reply.html b/docs/tutorials-python/submit_comment_reply.html new file mode 100644 index 00000000..3a7bf47c --- /dev/null +++ b/docs/tutorials-python/submit_comment_reply.html @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + +PY: Submit Comment Reply | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Submit Comment Reply + + +

        + +

        How to submit a comment on a post to the Steem blockchain.

        +
        + + +

        Full, runnable src of Submit Comment Reply can be downloaded as part of the PY tutorials repository. +

        + +

        This tutorial will explain and show you how to submit a new comment to the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the post method found within the commit class in the the library. It should be noted that comments and post are both treated as a commit.post operation with the only difference being that a comment/reply has an additional parameter containing the parent post/comment. There are 11 parameters within the post method:

        + +
          +
        1. title - The title of the post. This is a required parameter but comments don’t have a title so the parameter is assigned an empty string value
        2. +
        3. body - The body of the post
        4. +
        5. author - The account that you are posting from
        6. +
        7. permlink - A unique adentifier for the
        8. +
        9. tags - Between 1 and 5 key words that defines the post
        10. +
        11. reply_idendifier - Identifier of the parent post(used for comments)
        12. +
        13. json_metadata - JSON meta objec that can be attached to the post
        14. +
        15. comment_options - JSON options object that can be attached to the post to specify additional options like ‘max_payouts’, ‘allow_votes’, etc.
        16. +
        17. community - Name of the community you are posting into
        18. +
        19. beneficiaries - A list of beneficiaries for posting reward distribution.
        20. +
        21. self_vote - Upvote the post as author right after posting
        22. +
        + +

        We will only be using the parameters titel, body, author, permlink and reply_identifier as they are all that is required for a basic comment operation. If you want to explore the other parameters further you can find more information HERE.

        + +

        A comment made on a post is defined as a root comment. You can also comment on someone elses (or your own) comment, in which case the parent parameters would be that of the comment, and not the original post.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to Steem node
        2. +
        3. Variable input and format - Input and creation of varialbes
        4. +
        5. Initialize steem class - Initialize the steem class with the relevant node and private key
        6. +
        7. Post submission and result - Committing of transaction to the blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 4 packages:

        + +
          +
        • random and string - used to create a random string used for the permlink
        • +
        • steem - steem-python library and interaction with Blockchain
        • +
        • steembase - used to connect to the testnet
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import random
        +import string
        +import steembase
        +import steem
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we have to connect to the testnet. There is a demo account available for use, cdemo with private posting key 5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz. You can also create your own demo account by following the instructions on the TESTNET site.

        + +

        2. Variable input and format

        + +

        The variables are captured via a simple string input and allocated as seen below. The wif variable is the private posting key of the user making the comment. This key is required to commit the post to the blockchain.

        + +
        #capture variables
        +parentAuthor = input('Parent author: ')
        +parentPermlink = input('Parent permlink: ')
        +author = input('Username: ')
        +wif = input('Private posting key: ')
        +body = input('Comment Body: ')
        +
        + +

        We join the two parent values and assign it to the reply_identifier parameter. We also use a random generator to create a new permlink for the post being created

        + +
        #combining parent values to create reply identifier
        +reply_identifier = '/'.join([parentAuthor,parentPermlink])
        +
        +#random generator to create post permlink
        +permlink = ''.join(random.choices(string.digits, k=10))
        +
        + +

        The random generator is limited to 10 characters in this case but the permlink can be up to 256 bytes. If the permlink value is left empty then it auto creates a permlink based on the title of the post. The permlink is unique to the author only which means that multiple authors can have the same title for thier post.

        + +

        3. Initialize steem class

        + +

        We initialize the steem class by connecting to the specific testnet node. We also require the private posting key of the contributing author in order to commit the post which is also specified during this operation.

        + +
        #connect node and private posting key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        + +

        4. Post submission and result

        + +

        The last step is to transmit the post through to the blockchain. This is done with the post method within the commit class. All the defined parameters are submitted with the function. As stated earlier in the tutorial, there are quite a few parameters for this function but for a basic comment these 5 are all that’s required.

        + +
        #commit post to blockchain
        +client.commit.post(title='', body=body, author=author, permlink=permlink, reply_identifier=reply_identifier)
        +
        +print("Comment created successfully")
        +print(permlink)
        +
        + +

        A simple confirmation is printed on the screen if the comment is committed successfully. We also print the permlink for the comment on screen. This is purely for convenience to make it easier to retrieve the permlink if a new author or the same author would like to another comment on the one just made.

        + +

        You can also check on the testportal for the comment or for a post to comment on. Alternatively you can create your own post to comment on following the 10_submit_post tutorial.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/11_submit_comment_reply
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/submit_post.html b/docs/tutorials-python/submit_post.html new file mode 100644 index 00000000..0bbbe2fc --- /dev/null +++ b/docs/tutorials-python/submit_post.html @@ -0,0 +1,449 @@ + + + + + + + + + + + + + + + + + + +PY: Submit Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Submit Post + + +

        + +

        How to submit post on Steem blockchain using Python.

        +
        + + +

        Full, runnable src of Submit Post can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial will explain and show you how to submit a new post to the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the post method found within the commit class in the the library. It should be noted that comments and new post are both treated as commit.post operation with the only difference being that a comment/reply has got an additional parameter containing the parent post/comment. There are 11 parameters within the post method:

        + +
          +
        1. title - The title of the post
        2. +
        3. body - The body of the post
        4. +
        5. author - The account that you are posting from
        6. +
        7. permlink - A unique adentifier for the
        8. +
        9. tags - Between 1 and 5 key words that defines the post
        10. +
        11. reply_idendifier - Identifier of the parent post(used for comments)
        12. +
        13. json_metadata - JSON meta objec that can be attached to the post
        14. +
        15. comment_options - JSON options object that can be attached to the post to specify additional options like ‘max_payouts’, ‘allow_votes’, etc.
        16. +
        17. community - Name of the community you are posting into
        18. +
        19. beneficiaries - A list of beneficiaries for posting reward distribution.
        20. +
        21. self_vote - Upvote the post as author right after posting
        22. +
        + +

        We will only be using the first 5 parameters as these are the only ones required to create a basic post. If you want to explore the other parameters further you can find more information HERE.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to Steem node
        2. +
        3. Variable input and format - Input and creation of varialbes
        4. +
        5. Post submission and result - Committing of transaction to the blockchain
        6. +
        + +

        1. App setup

        + +

        In this tutorial we use 4 packages:

        + +
          +
        • random and string - used to create a random string used for the permlink
        • +
        • steem - steem-python library and interaction with Blockchain
        • +
        • steembase - used to connect to the testnet
        • +
        + +

        We import the libraries, connect to the testnet and initialize the Steem class.

        + +
        import random
        +import string
        +import steembase
        +import steem
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        +#connect node and private posting key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=['5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz'])
        +
        + +

        Because this tutorial alters the blockchain we have to connect to the testnet. We also require the private posting key of the contributing author in order to commit the post which is why it is specified along with the testnet node. We have supplied a test account, cdemo to use with this tutorial.

        + +

        2. Variable input and format

        + +

        The first three variables are captured via a simple string input while the tags variable is captured in the form of an array.

        + +
        #capture variables
        +author = input('Username: ')
        +title = input('Post Title: ')
        +body = input('Post Body: ')
        +
        +#capture list of tags and separate by " "
        +taglimit = 2 #number of tags 1 - 5
        +taglist = []
        +for i in range(1, taglimit+1):
        +	print(i)
        +	tag = input(' Tag : ')
        +	taglist.append(tag)
        +
        + +

        The tags parameter needs to be in the form of a single string with the words split by an empty space, so we add a line to prepare that variable. We also use a random generator to create a new permlink for the post being created

        + +
        " ".join(taglist) #create string joined with empty spaces
        +
        +#random generator to create post permlink
        +permlink = ''.join(random.choices(string.digits, k=10))
        +
        + +

        The random generator is limited to 10 characters in this case but the permlink can be up to 256 bytes. If the permlink value is left empty then it auto creates a permlink based on the title of the post. The permlink is unique to the author only which means that multiple authors can have the same title for the thier post.

        + +

        3. Post submission and result

        + +

        The last step is to transmit the post through to the blockchain. This is done post method within the commit class. All the defined parameters are submitted with the function. As stated earlier in the tutorial, there are quite a few parameters for this function but for a basic post these 5 are the most important.

        + +
        client.commit.post(title=title, body=body, author=author, tags=taglist, permlink=permlink)
        +
        +print("Post created successfully")
        +
        + +

        A simple confirmation is printed on the screen if the post is committed successfully.

        + +

        You can also check on the testportal for the post.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/10_submit_post
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/transfer_STEEM_and_SBD.html b/docs/tutorials-python/transfer_STEEM_and_SBD.html new file mode 100644 index 00000000..447000e9 --- /dev/null +++ b/docs/tutorials-python/transfer_STEEM_and_SBD.html @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + +PY: Transfer Steem And Sbd | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Transfer Steem And Sbd + + +

        + +

        How to transfer STEEM and SBD to another account using Python.

        +
        + + +

        Full, runnable src of Transfer Steem And Sbd can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to to check the STEEM and SBD balance of an account and also how to transfer a portion of that to another user on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the transfer method found within the commit class in the library. Before we do the transfer, we check the current balance of the account to ensure that there are sufficient funds available. We also check if the intended recipient of the transfer is a valid user account. This is not strictly necessary as the process will automatically abort with the corresponding error, but it does give some insight into the process as a whole. We use the get_account function to check for this. The transfer method has 5 parameters:

        + +
          +
        1. to - The intended recipient of the funds transfer
        2. +
        3. amount - The amount of STEEM or SBD that the user wants to transfer. This parameter has to be of the float data type and is rounded up to 3 decimal spaces
        4. +
        5. asset - A string value specifying whether STEEM or SBD is being transferred
        6. +
        7. memo - An optional text field containing comments on the transfer. This value may begin with ‘#’ for encrypted messaging
        8. +
        9. account - The account that the funds are being transferred from
        10. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check balance - Check current STEEM and SBD balance of user account
        6. +
        7. Recipient input - Check for valid recipient account name
        8. +
        9. Transfer type and amount - Input of transfer type and the amount to transfer
        10. +
        11. Transfer commit - Commit of transfer to blockchain
        12. +
        + +

        1. App setup

        + +

        In this tutorial we use 2 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to the testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the transfer to be committed to the blockchain. This is why we have to specify this alongside the testnet node. The values are supplied via the terminal/console before we initialise the steem class. There is a demo account available to use with this tutorial but any account that is set up on the testnet can be used.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        + +

        3. Check balance

        + +

        In order to give the user enough information to make the transfer we check the current balance of the account using the get_account function.

        + +
        #get account balance for STEEM and SBD
        +userinfo = client.get_account(username)
        +total_steem = userinfo['balance']
        +total_sbd = userinfo['sbd_balance']
        +
        +print('CURRENT ACCOUNT BALANCE:' + '\n' + total_steem + '\n' + total_sbd + '\n')
        +
        + +

        The result of the query is displayed in the console/terminal.

        + +

        4. Recipient input

        + +

        The recipient account is input via the console/terminal and then a check is done whether that username does in fact exist.

        + +
        #get recipient name
        +recipient = input('Enter the user you wish to transfer funds to: ')
        +
        +#check for valid recipient name
        +result = client.get_account(recipient)
        +
        + +

        The query will return a null value if the account does not match to anything on the blockchain. This result is then used to determine the next step.

        + +

        5. Transfer type and amount

        + +

        If the query in the previous step returns a valid result the user is then given a choice of transfer types or to cancel the operation completely. If the username is not found the process aborts.

        + +
        if result:
        +    #choice of transfer
        +    title = 'Please choose transfer type: '
        +    options = ['STEEM', 'SBD', 'Cancel Transfer']
        +    # get index and selected transfer type
        +    option, index = pick(options, title)
        +else:
        +    print('Invalid recipient for funds transfer')
        +    exit()
        +
        + +

        Once the user chooses the type of transfer we proceed to assign the amount as well as the asset parameter.

        + +
        if option == 'Cancel Transfer':
        +    print('Transaction cancelled')
        +    exit()
        +else:
        +    if option == 'STEEM':
        +        #get STEEM transfer amount
        +        amount = input('Enter amount of STEEM to transfer to ' + recipient + ': ')
        +        asset = 'STEEM'
        +    else:
        +        #get SBD transfer amount
        +        amount = input('Enter amount of SBD to transfer to ' + recipient + ': ')
        +        asset = 'SBD'
        +
        + +

        6. Transfer commit

        + +

        Once all the parameters have been assigned we can proceed with the actual commit to the blockchain.

        + +
        #parameters: to, amount, asset, memo='', account
        +client.transfer(recipient, float(amount), asset, '', username)
        +print('\n' + amount + ' ' + asset + ' has been transferred to ' + recipient)
        +
        + +

        The memo parameter can be left empty as in the above example. A simple confirmation is printed on the UI. +As an added confirmation we check the balance of the user again and display it on the UI. This is not required at all but it serves as a more definitive confirmation that the transfer has been completed correctly.

        + +
        #get remaining account balance for STEEM and SBD
        +userinfo = client.get_account(username)
        +total_steem = userinfo['balance']
        +total_sbd = userinfo['sbd_balance']
        +
        +print('\n' + 'REMAINING ACCOUNT BALANCE:' + '\n' + total_steem + '\n' + total_sbd + '\n')
        +
        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/21_transfer_STEEM_and_SBD
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/using_keys_securely.html b/docs/tutorials-python/using_keys_securely.html new file mode 100644 index 00000000..9dbde1fe --- /dev/null +++ b/docs/tutorials-python/using_keys_securely.html @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + +PY: Using Keys Securely | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Using Keys Securely + + +

        + +

        Learn how Steem-Python library handles transaction signing with user’s key and how to securely manage your private keys.

        +
        + + +

        Full, runnable src of Using Keys Securely can be downloaded as part of the PY tutorials repository. +

        + +

        Intro

        + +

        Steem python library has 2 ways to handle your keys. One is from source code, another one is through command line interface called steempy. steempy cli is installed by default when you install steem-python library on your machine.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import
        2. +
        3. Key usage example - Example showing how to import keys
        4. +
        + +

        1. App setup

        + +

        In this tutorial we are only using steem package - steem-python library.

        + +
          # initialize Steem class
        +  from steem import Steem
        +
        +  # defining private keys inside source code is not secure way but possible
        +  s = Steem(keys=['<private_posting_key>', '<private_active_key>'])
        +
        + +

        Last line from above snippet shows how to define private keys for account that’s going to transact using script.

        + +

        2. Key usage example

        + +

        After defining private keys inside Steem class, we can quickly sign any transaction and broadcast it to the network.

        + +
          # above will allow accessing Commit methods such as
        +  # demo account sending 0.001 STEEM to demo1 account
        +
        +  s.commit.transfer('demo','0.001','STEEM','memo text','demo1')
        +
        + +

        Above method works but it is not secure way of handling your keys because you have entered your keys within source code that you might leak accidentally. To avoid that, we can use CLI - command line interface steempy.

        + +

        You can type following to learn more about steempy commands:

        + +
          steempy -h
        +
        + +

        steempy lets you leverage your BIP38 encrypted wallet to perform various actions on your accounts.

        + +

        The first time you use steempy, you will be prompted to enter a password. This password will be used to encrypt the steempy wallet, which contains your private keys.

        + +

        You can import your Steem username with following command:

        + +

        steempy importaccount username

        + +

        Next you can import individual private keys:

        + +

        steempy addkey <private_key>

        + +

        That’s it, now that your keys are securely stored on your local machine, you can easily sign transaction from any of your Python scripts by using defined keys.

        + +
          # if private keys are not defined
        +  # accessing Wallet methods are also possible and secure way
        +  s.wallet.get_active_key_for_account('demo')
        +
        + +

        Above line fetches private key for user demo from local machine and signs transaction.

        + +

        steempy also allows you to sign and broadcast transactions from terminal. For example:

        + +

        steempy transfer --account <account_name> <recipient_name> 1 STEEM memo

        + +

        would sign and broadcast transfer operation,

        + +

        steempy upvote --account <account_name> link

        + +

        would sing and broadcast vote operation, etc.

        + +

        That’s it!

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/001_using_keys_securely
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see output in terminal/command prompt screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/vote_on_content.html b/docs/tutorials-python/vote_on_content.html new file mode 100644 index 00000000..f573ccab --- /dev/null +++ b/docs/tutorials-python/vote_on_content.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + +PY: Vote On Content | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Vote On Content + + +

        + +

        How to vote on a post/comment using Python.

        +
        + + +

        Full, runnable src of Vote On Content can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we will explain and show you how to to check if a user has voted on specified content and also how to submit a vote on the Steem blockchain using the commit class found within the steem-python library.

        + +

        Intro

        + +

        Voting is a way of promoting good content via an upvote or reporting misuse, spam or other unfit content by downvoting. The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the vote method found within the commit class in the the library. Before we vote on content we first check whether the user has already voted. This is not strictly necessary as a voting operation overrides the previous vote value. We use the get_active_votes function to check for this. This function only requires two parameters, the author and the permlink for the comment/post that the query is for. This returns a list of the current voters for that comment. The vote function has 3 parameters:

        + +
          +
        1. identifier - This is a combination of the author and permink of the post/comment that the vote will be on
        2. +
        3. weight - This value determines whether the vote is an upvote (+100.0) or a downvote (-100.0) but this value cannot be 0
        4. +
        5. username - The name of the account that is executing the vote
        6. +
        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Check vote status - Vote status of post/comment
        6. +
        7. Commit vote - Commit vote to the blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to the testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We also require the private posting key of the user that wishes to vote on the selected content so the action can be committed to the blockchain. This is why we have to specify this along with the testnet node. The values are supplied via the terminal/console before we initialise the steem class. We have supplied a test account, cdemo to use with this tutorial but any account set up on the testnet can be used.

        + +
        #capture user information
        +username = input('Please enter your username: ')
        +postingkey = input('Please enter your private posting key: ')
        +
        +#connect node and private posting key, demo account name: cdemo, posting key: 5JEZ1EiUjFKfsKP32b15Y7jybjvHQPhnvCYZ9BW62H1LDUnMvHz
        +s = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[postingkey])
        +
        + +

        3. Check vote status

        + +

        In order to give the user an educated choice we first check whether they have already voted on the given post/comment. The author and permlink for the post is supplied via the console/terminal. +If you need to find something to vote on, you can try (https://condenser.steem.vc/) YMMV.

        + +
        #capture variables
        +author = input('Author of post/comment that you wish to vote for: ')
        +permlink = input('Permlink of the post/comment you wish to vote for: ')
        +
        + +

        The vote status check is done with a simple query to the blockchain.

        + +
        #check vote status
        +result = s.get_active_votes(author, permlink)
        +
        + +

        This query returns a list of the current voters on the specified post/comment. The result is checked against the username to determine what the current status is.

        + +
        if result:
        +	for vote in result :
        +		if vote['voter'] == username:
        +			title = "This post/comment has already been voted for"
        +			break
        +		else:
        +			title = "No vote for this post/comment has been submitted"
        +else:
        +	title = "No vote for this post/comment has been submitted"
        +
        + +

        4. Commit vote

        + +

        The result from the previous step is used to give the user a choice in what the next step in the operation should be.

        + +
        #option to continue
        +options = ['Add/Change vote', 'Cancel voting process']
        +option, index = pick(options, title)
        +
        + +

        The user is given a choice to either continue with the vote or cancel the operation. If the user elects to continue, the vote function is executed. The weight of the vote is input from the UI and the identifier parameter is created by combining the author and permlink values.

        + +

        It’s important to note that the http client in steem-python will retry IF it sends an appbase query and detects a older, non-appbase error

        +
        #voting commit
        +if option == 'Add/Change vote':
        +	weight = input('\n'+'Please advise weight of vote between -100.0 and 100 (not zero): ')
        +	identifier = ('@'+author+'/'+permlink)
        +	try:
        +		print('Sending vote. ...')
        +		s.commit.vote(identifier, float(weight), username)
        +		print('\n'+'Vote sent.')
        +	except (RPCErrorRecoverable, RPCError) as err: 
        +		print('\n'+'Exception encountered. Unable to vote')
        +
        +else:
        +	print('Voting has been cancelled')
        +
        + +

        When the function is executed the selected vote weight overrides any value previously recorded on the blockchain.

        + +

        A simple confirmation of the chosen action is printed on the screen.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/17_vote_on_content
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-python/witness_listing_and_voting.html b/docs/tutorials-python/witness_listing_and_voting.html new file mode 100644 index 00000000..f8e9d83e --- /dev/null +++ b/docs/tutorials-python/witness_listing_and_voting.html @@ -0,0 +1,481 @@ + + + + + + + + + + + + + + + + + + +PY: Witness Listing And Voting | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + PY: Witness Listing And Voting + + +

        + +

        How to vote for or remove a vote for a witness user using Python.

        +
        + + +

        Full, runnable src of Witness Listing And Voting can be downloaded as part of the PY tutorials repository. +

        + +

        In this tutorial we show you how to create a list of active witnesses from the Steem blockchain and then vote or unvote for a witness using the commit class found within the steem-python library.

        + +

        Intro

        + +

        The Steem python library has a built-in function to transmit transactions to the blockchain. We are using the approve_witness and disapprove_witness method found within the commit class in the library. We also use the get_active_witnesses function to query the blockchain for a list of available witnesses. Before we vote, we use the get_account function to check for all the witnesses that the user has currently voted for. This is not strictly necessary but adds to the useability of the process. The approve_witness method has 3 parameters:

        + +
          +
        1. witness - The witness to approve
        2. +
        3. account - The source user account for the voting
        4. +
        5. approve - This value is set to True when approving a witness
        6. +
        + +

        The disapprove_witness has the same parameters except for _approve_ which is not required.

        + +

        Steps

        + +
          +
        1. App setup - Library install and import. Connection to testnet
        2. +
        3. User information and steem node - Input user information and connection to Steem node
        4. +
        5. Active witness list - Create a list of active as well as already voted for witnesses
        6. +
        7. Vote / Unvote - Input witness name and commite vote/unvote to blockchain
        8. +
        + +

        1. App setup

        + +

        In this tutorial we use 3 packages:

        + +
          +
        • steem - steem-python library and interaction with Blockchain
        • +
        • pick - helps select the query type interactively
        • +
        • pprint - print results in better format
        • +
        + +

        We import the libraries and connect to the testnet.

        + +
        import steembase
        +import steem
        +from pick import pick
        +import pprint
        +
        +steembase.chains.known_chains['STEEM'] = {
        +    'chain_id': '79276aea5d4877d9a25892eaa01b0adf019d3e5cb12a97478df3298ccdd01673',
        +    'prefix': 'STX', 'steem_symbol': 'STEEM', 'sbd_symbol': 'SBD', 'vests_symbol': 'VESTS'
        +}
        +
        + +

        Because this tutorial alters the blockchain we connect to a testnet so we don’t create spam on the production server.

        + +

        2. User information and steem node

        + +

        We require the private active key of the user in order for the transaction to be committed to the blockchain. This is why we are using a testnet. The values are supplied via the terminal/console before we initialise the steem class. We also check if the user name provided is active on the chain. There are some demo accounts available but we encourage you to create your own accounts on this testnet.

        + +
        #capture user information
        +username = input('Enter username: ') #demo account: cdemo
        +wif = input('Enter private ACTIVE key: ') #demo account: 5KaNM84WWSqzwKzY82fXPaUW43idbLnPqf5SfjGxLfw6eV2kAP3
        +
        +#connect node and private active key
        +client = steem.Steem(nodes=['https://testnet.steem.vc'], keys=[wif])
        +
        +#check valid user
        +userinfo = client.get_account(username)
        +if(userinfo is None) :
        +    print('Oops. Looks like user ' + username + ' doesn\'t exist on this chain!')
        +    exit()
        +
        + +

        3. Active witness list

        + +

        We create a list of active witnesses so the user knows which witnesses are available to vote for. We do this by sending a query to the blockchain using the get_active_witnesses function. The result of this query is displayed on the UI.

        + +
        #print list of active witnesses
        +print('ACTIVE WITNESSES')
        +witness_list = client.get_active_witnesses()
        +pprint.pprint(witness_list)
        +
        + +

        We also provide the user with a list of witnesses that has already been voted for by their account. From this the user will know which witnesses can be removed, and which can be added to their set of approved witnesses. We generate this list using the get_account function and display it on the UI.

        + +
        #print list of currently voted for witnesses
        +print('\n' + 'WITNESSES CURRENTLY VOTED FOR')
        +vote_list = userinfo['witness_votes']
        +pprint.pprint(vote_list)
        +
        +input('Press enter to continue')
        +
        + +

        4. Vote / Unvote

        + +

        The user is given the option to VOTE, UNVOTE or CANCEL the process. Depending on the choice the relevant function is executed. Both the VOTE and UNVOTE methods use the same input - the witness being added or removed. The different method executions are shown below.

        + +
        #choice of action
        +title = ('Please choose action')
        +options = ['VOTE', 'UNVOTE', 'CANCEL']
        +option, index = pick(options, title)
        +
        +if (option == 'CANCEL') :
        +    print('\n' + 'operation cancelled')
        +    exit()
        +
        + +

        VOTE :

        + +
        if (option == 'VOTE') :
        +    # vote process
        +    witness_vote = input('Please enter the witness name you wish to vote for: ')
        +    if witness_vote not in witness_list :
        +        print('\n' + witness_vote + ' does not appear on the available witness list')
        +        exit()
        +    if witness_vote in vote_list :
        +        print('\n' + witness_vote + ' cannot be voted for more than once')
        +        exit()
        +    client.approve_witness(witness=witness_vote, account=username, approve=True)
        +    print('\n' + witness_vote + ' has been successfully voted for')
        +
        + +

        UNVOTE :

        + +
        else :
        +    # unvote process
        +    witness_unvote = input('Please enter the witness name you wish to remove the vote from: ')
        +    if witness_unvote not in vote_list :
        +        print('\n' + witness_unvote + ' is not in your voted for list')
        +        exit()
        +    client.disapprove_witness(witness=witness_unvote, account=username)
        +    print('\n' + witness_unvote + ' has been removed from your voted for list')
        +
        + +

        A confirmation of the transaction to the blockchain is displayed on the UI.

        + +

        We encourage users to play around with different values and data types to fully understand how this process works. You can also check the balances and transaction history on the testnet portal.

        + +

        To Run the tutorial

        + +
          +
        1. review dev requirements
        2. +
        3. clone this repo
        4. +
        5. cd tutorials/22_witness_listing_and_voting
        6. +
        7. pip install -r requirements.txt
        8. +
        9. python index.py
        10. +
        11. After a few moments, you should see a prompt for input in terminal screen.
        12. +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/estimate_upvote.html b/docs/tutorials-recipes/estimate_upvote.html new file mode 100644 index 00000000..edf95a27 --- /dev/null +++ b/docs/tutorials-recipes/estimate_upvote.html @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + +Estimate the value of an upvote | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Estimate the value of an upvote + + +

        + +

        Calculate the approximate value of an upvote on Steem

        +
        + + +

        By the end of this recipe you should know how to estimate value of each vote on Steem.

        + +

        This recipe will take you through the process of fetching necessary data and formulating estimation.

        + +

        Intro

        + +

        Calculating value of each vote depends on multiple factors. Reward fund, recent claims, account’s total vests, rate of the sbd, voting power and weight of the vote. It is quite useful information for users to see and estimate. All of the data is possible to get via available APIs.

        + +

        Steps

        + +
          +
        1. Get Reward Fund Current reward fund information is crucial part of estimation
        2. +
        3. Get Account Steem power and voting power is another important info
        4. +
        5. Feed history To get price rate reported by witnesses
        6. +
        7. Final calculation Formulate all information we have
        8. +
        + +

        1. Get Reward Fund

        + +

        Getting Reward Fund information is simply calling get_reward_fund('post') api call, it will give us reward_balance and recent_claims.

        + +

        The response we’re working with will look like:

        + +
        {
        +	"id":0,
        +	"name":"post",
        +	"reward_balance":"741222.051 STEEM",
        +	"recent_claims":"457419472820935017",
        +	"last_update":"2018-05-23T12:08:36",
        +	"content_constant":"2000000000000",
        +	"percent_curation_rewards":2500,
        +	"percent_content_rewards":10000,
        +	"author_reward_curve":"linear",
        +	"curation_reward_curve":"square_root"
        +}
        +
        + +

        2. Get Account

        + +

        Next we will need total vests held by account, get_accounts api call returns account data, which will hold vesting_shares, received_vesting_shares, delegated_vesting_shares. It also returns current voting_power information.

        + +

        The response example will look like:

        + +
        [
        +  {
        +    "id": 9660,
        +    "name": "steemitblog",
        +    "owner": {
        +      "weight_threshold": 1,
        +      "account_auths": [
        +        [
        +          "ned",
        +          1
        +        ]
        +      ],
        +      "key_auths": [
        +        [
        +          "STM65wH1LZ7BfSHcK69SShnqCAH5xdoSZpGkUjmzHJ5GCuxEK9V5G",
        +          1
        +        ]
        +      ]
        +    },
        +    "active": {
        +      "weight_threshold": 1,
        +      "account_auths": [],
        +      "key_auths": [
        +        [
        +          "STM65wH1LZ7BfSHcK69SShnqCAH5xdoSZpGkUjmzHJ5GCuxEK9V5G",
        +          1
        +        ]
        +      ]
        +    },
        +    "posting": {
        +      "weight_threshold": 1,
        +      "account_auths": [
        +        [
        +          "ned",
        +          1
        +        ]
        +      ],
        +      "key_auths": [
        +        [
        +          "STM4yfYEjUoey4PLrKhnKFo1XKQZtZ77fWLnbGTr2mAUaSt2Sx9W4",
        +          1
        +        ],
        +        [
        +          "STM5FeHFtL8J453DUi98LKwkqXBH5iwxf9xCqYs6QwPibPru3RNq3",
        +          1
        +        ],
        +        [
        +          "STM5VwLXkNQf17sQ2XuxScdxruwBy1jak2mDxCjmyfYMNhm1WzPzN",
        +          1
        +        ],
        +        [
        +          "STM5ke2kzgwBmysSqCNM6zRABi8SNpaJEtnFXuTtRcU3Uvf47481z",
        +          1
        +        ]
        +      ]
        +    },
        +    "memo_key": "STM5FeHFtL8J453DUi98LKwkqXBH5iwxf9xCqYs6QwPibPru3RNq3",
        +    "json_metadata": "",
        +    "proxy": "",
        +    "last_owner_update": "2017-03-17T18:19:18",
        +    "last_account_update": "2017-03-17T18:19:18",
        +    "created": "2016-05-24T18:54:24",
        +    "mined": false,
        +    "recovery_account": "steem",
        +    "last_account_recovery": "2016-07-19T19:48:54",
        +    "reset_account": "null",
        +    "comment_count": 0,
        +    "lifetime_vote_count": 0,
        +    "post_count": 154,
        +    "can_vote": true,
        +    "voting_power": 9800,
        +    "last_vote_time": "2018-05-22T20:10:45",
        +    "balance": "810.371 STEEM",
        +    "savings_balance": "0.000 STEEM",
        +    "sbd_balance": "4613.426 SBD",
        +    "sbd_seconds": "10828300402329",
        +    "sbd_seconds_last_update": "2018-05-22T22:34:24",
        +    "sbd_last_interest_payment": "2018-04-25T18:26:15",
        +    "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": "79.490 SBD",
        +    "reward_steem_balance": "0.000 STEEM",
        +    "reward_vesting_balance": "608341.169185 VESTS",
        +    "reward_vesting_steem": "293.101 STEEM",
        +    "vesting_shares": "93540695.469156 VESTS",
        +    "delegated_vesting_shares": "0.000000 VESTS",
        +    "received_vesting_shares": "0.000000 VESTS",
        +    "vesting_withdraw_rate": "0.000000 VESTS",
        +    "next_vesting_withdrawal": "1969-12-31T23:59:59",
        +    "withdrawn": 0,
        +    "to_withdraw": 0,
        +    "withdraw_routes": 0,
        +    "curation_rewards": 10288,
        +    "posting_rewards": 38917298,
        +    "proxied_vsf_votes": [
        +      0,
        +      0,
        +      0,
        +      0
        +    ],
        +    "witnesses_voted_for": 0,
        +    "last_post": "2018-05-22T18:59:33",
        +    "last_root_post": "2018-05-22T18:59:33",
        +    "average_bandwidth": "34722906781",
        +    "lifetime_bandwidth": "656153000000",
        +    "last_bandwidth_update": "2018-05-22T20:10:45",
        +    "average_market_bandwidth": 1170000000,
        +    "lifetime_market_bandwidth": 1170000000,
        +    "last_market_bandwidth_update": "2016-07-27T15:10:09",
        +    "vesting_balance": "0.000 STEEM",
        +    "reputation": "146151592482665",
        +    "transfer_history": [],
        +    "market_history": [],
        +    "post_history": [],
        +    "vote_history": [],
        +    "other_history": [],
        +    "witness_votes": [],
        +    "tags_usage": [],
        +    "guest_bloggers": []
        +  }
        +]
        +
        + +

        3. Feed history

        + +

        Last thing we will need is rate of the get_current_median_history_price, returns median price rate bucket with base element.

        + +

        The response example will look like:

        + +
        {
        +  "base": "3.029 SBD",
        +  "quote": "1.000 STEEM"
        +}
        +
        + +

        4. Final calculation

        + +

        After getting all these variables, all we have to do is to calculate estimation

        + +
        total_vests = vesting_shares + received_vesting_shares - delegated_vesting_shares
        +final_vest = total_vests * 1e6
        +power = (voting_power * weight / 10000) / 50
        +rshares = power * final_vest / 10000
        +estimate = rshares / recent_claims * reward_balance * sbd_median_price
        +
        + +

        That’s all there is to it.

        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/forum-market-bandwidth.html b/docs/tutorials-recipes/forum-market-bandwidth.html new file mode 100644 index 00000000..90c7d068 --- /dev/null +++ b/docs/tutorials-recipes/forum-market-bandwidth.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + +Forum/Market Bandwidth | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Forum/Market Bandwidth + + +

        + +

        How to interpret raw bandwidth data.

        +
        + + +

        Intro

        + +

        + Please note, Bandwidth has been replaced by Resource Credits. This document is outdated and will remain in place to give historical context prior to HF20. Also see: RC Bandwidth System, 0.20.2 Release Notes, Developer Guide: Resource Credit System +

        + +

        We’re going over the various API calls needed to determine the remaining bandwidth available to a particular account. As mentioned in the STEEM Whitepaper:

        + +
        +

        Bandwidth used by an individual user should be measured over a suitably long period of time to allow that +user to time-shift their usage. Users tend to login, do many things at once, then logout. This means that +their bandwidth over a short period of time may appear much higher than if viewed over a longer period of +time. If the time window is stretched too far, then the reserve ratio will not adjust fast enough to respond +to short-term surges; conversely, if the window is too short then clustering usage will have too big of an +impact on normal users.

        +
        + +

        Bandwidth is specific to each account and depends on account activity.

        + +

        Sections

        + +
          +
        1. Getting Account Bandwidth
        2. +
        3. Dynamic Global Properties
        4. +
        5. Account STEEM Power
        6. +
        7. Calculate
        8. +
        + +

        Getting Account Bandwidth

        + +
        curl -s --data '{
        +   "jsonrpc":"2.0",
        +   "method":"condenser_api.get_account_bandwidth",
        +   "params":[
        +      "cheetah",
        +      "forum"
        +   ],
        +   "id":1
        +}' https://api.steemit.com
        +
        + +
        {
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "id":20846,
        +      "account":"cheetah",
        +      "type":"forum",
        +      "average_bandwidth":"7525646416619",
        +      "lifetime_bandwidth":"386010589000000",
        +      "last_bandwidth_update":"2018-07-18T16:37:54"
        +   },
        +   "id":1
        +}
        +
        + +

        In this example, we got forum (blogging) average bandwidth of 7,525,646,416,619 with a lifetime bandwidth of 386,010,589,000,000.

        + +

        Note, average_bandwidth is expressed as an integer with six decimal places represented. Divide by 1,000,000 in order to get the actual bytes of bandwidth, in this case: 7,525,646 bytes.

        + +

        Dynamic Global Properties

        + +

        To do the calculation, we need max_virtual_bandwidth and total_vesting_shares from the global properties, e.g.:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}' https://api.steemit.com
        +
        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "head_block_number":24264289,
        +      "head_block_id":"01723e6156ad44ac7bf3028a53a7ac642084cb39",
        +      "time":"2018-07-17T20:25:27",
        +      "current_witness":"followbtcnews",
        +      "total_pow":514415,
        +      "num_pow_witnesses":172,
        +      "virtual_supply":"283443693.176 STEEM",
        +      "current_supply":"271786073.683 STEEM",
        +      "confidential_supply":"0.000 STEEM",
        +      "current_sbd_supply":"15504633.926 SBD",
        +      "confidential_sbd_supply":"0.000 SBD",
        +      "total_vesting_fund_steem":"193007548.472 STEEM",
        +      "total_vesting_shares":"391468555319.000697 VESTS",
        +      "total_reward_fund_steem":"0.000 STEEM",
        +      "total_reward_shares2":"0",
        +      "pending_rewarded_vesting_shares":"382967391.274340 VESTS",
        +      "pending_rewarded_vesting_steem":"187173.234 STEEM",
        +      "sbd_interest_rate":0,
        +      "sbd_print_rate":2966,
        +      "maximum_block_size":65536,
        +      "current_aslot":24341309,
        +      "recent_slots_filled":"340282366920938463463374607431768211455",
        +      "participation_count":128,
        +      "last_irreversible_block_num":24264271,
        +      "vote_power_reserve_rate":10,
        +      "average_block_size":13436,
        +      "current_reserve_ratio":200000000,
        +      "max_virtual_bandwidth":"264241152000000000000"
        +   }
        +}
        +
        + +

        Account STEEM Power

        + +

        We also need to know how much the account has in STEEM Power from vesting_shares and received_vesting_shares:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_accounts", "params":[["cheetah"]], "id":1}' https://api.steemit.com
        +
        + +
        {
        +   "jsonrpc":"2.0",
        +   "result":[
        +      {
        +         "id":25796,
        +         "name":"cheetah",
        +         "owner":{
        +            "weight_threshold":1,
        +            "account_auths":[],
        +            "key_auths":[["STM7yFmwPSKUP7FCV7Ut9Aev5cwfDzJZixcreS1U3ha36XG47ZpqT", 1]]
        +         },
        +         "active":{
        +            "weight_threshold":1,
        +            "account_auths":[],
        +            "key_auths":[["STM7yFmwPSKUP7FCV7Ut9Aev5cwfDzJZixcreS1U3ha36XG47ZpqT", 1]]
        +         },
        +         "posting":{
        +            "weight_threshold":1,
        +            "account_auths":[["anyx", 100]],
        +            "key_auths":[["STM5bicRFWhpxnwBymo2HHJv6mFLiaP6AwVVsFEnnVjVcqbvqzvFt", 100], ["STM7yFmwPSKUP7FCV7Ut9Aev5cwfDzJZixcreS1U3ha36XG47ZpqT", 100], ["STM8Jn23vNmBzVuDAgQeZzzR17LmruENmmZmv1ra53tbsBgYbJFwk", 100]]
        +         },
        +         "memo_key":"STM7yFmwPSKUP7FCV7Ut9Aev5cwfDzJZixcreS1U3ha36XG47ZpqT",
        +         "json_metadata":"{\"profile\":{\"profile_image\":\"https:\/\/c1.staticflickr.com\/6\/5739\/22389343016_25d10c52a3_b.jpg\",\"about\":\"I am a robot that automatically finds similar content. Check the website linked to on my blog to learn more about me!\",\"website\":\"http:\/\/steemit.com\/steemit\/@cheetah\/faq-about-cheetah\"}}",
        +         "proxy":"",
        +         "last_owner_update":"1970-01-01T00:00:00",
        +         "last_account_update":"2017-06-13T00:14:00",
        +         "created":"2016-07-17T08:47:18",
        +         "mined":true,
        +         "recovery_account":"steem",
        +         "last_account_recovery":"1970-01-01T00:00:00",
        +         "reset_account":"null",
        +         "comment_count":0,
        +         "lifetime_vote_count":0,
        +         "post_count":517808,
        +         "can_vote":true,
        +         "voting_power":1249,
        +         "last_vote_time":"2018-07-18T16:39:21",
        +         "balance":"118.463 STEEM",
        +         "savings_balance":"0.000 STEEM",
        +         "sbd_balance":"67.717 SBD",
        +         "sbd_seconds":"127094582318",
        +         "sbd_seconds_last_update":"2018-07-18T14:13:15",
        +         "sbd_last_interest_payment":"2018-06-20T12:01:15",
        +         "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.005 SBD",
        +         "reward_steem_balance":"0.009 STEEM",
        +         "reward_vesting_balance":"26.366463 VESTS",
        +         "reward_vesting_steem":"0.013 STEEM",
        +         "vesting_shares":"4770940.577823 VESTS",
        +         "delegated_vesting_shares":"0.000000 VESTS",
        +         "received_vesting_shares":"16020356.484882 VESTS",
        +         "vesting_withdraw_rate":"347124.891306 VESTS",
        +         "next_vesting_withdrawal":"2018-07-21T02:27:09",
        +         "withdrawn":"1388499565224",
        +         "to_withdraw":"4512623586985",
        +         "withdraw_routes":1,
        +         "curation_rewards":170083,
        +         "posting_rewards":37433355,
        +         "proxied_vsf_votes":["50341599736964", "20169963876698", 0, 0],
        +         "witnesses_voted_for":23,
        +         "last_post":"2018-07-18T16:39:24",
        +         "last_root_post":"2018-07-18T07:00:45",
        +         "average_bandwidth":"7525467544963",
        +         "lifetime_bandwidth":"386011530000000",
        +         "last_bandwidth_update":"2018-07-18T16:39:24",
        +         "average_market_bandwidth":2406616155,
        +         "lifetime_market_bandwidth":"224370000000",
        +         "last_market_bandwidth_update":"2018-07-12T04:57:36",
        +         "vesting_balance":"0.000 STEEM",
        +         "reputation":"305786119478594",
        +         "transfer_history":[],
        +         "market_history":[],
        +         "post_history":[],
        +         "vote_history":[],
        +         "other_history":[],
        +         "witness_votes":[
        +            "anyx",
        +            "arcange",
        +            "ats-witness",
        +            "ausbitbank",
        +            "bitcoiner",
        +            "blockchained",
        +            "chitty",
        +            "drakos",
        +            "followbtcnews",
        +            "fubar-bdhr",
        +            "guiltyparties",
        +            "liondani",
        +            "lukestokes.mhth",
        +            "neoxian",
        +            "netuoso",
        +            "noisy.witness",
        +            "patrice",
        +            "pfunk",
        +            "pjau",
        +            "teamsteem",
        +            "thecryptodrive",
        +            "themarkymark",
        +            "timcliff"
        +         ],
        +         "tags_usage":[],
        +         "guest_bloggers":[]
        +      }
        +   ],
        +   "id":1
        +}
        +
        + +

        Calculate

        + +

        Now, we can derive bandwidth_allocated:

        + +

        bandwidth_allocated = max_virtual_bandwidth * (vesting_shares + received_vesting_shares) / total_vesting_shares

        + +

        bandwidth_allocated = bandwidth_allocated / 1000000

        + +

        In our example, bandwidth_allocated = 14034118993.

        + +

        Now that we have both bandwidth_allocated and average_bandwidth, we can determine the percentages.

        + +

        First, we need average_bandwidth on the same scale as bandwidth_allocated:

        + +

        average_bandwidth = average_bandwidth / 1000000

        + +

        Then we can get the percentages:

        + +

        bandwidth_used = 100 * average_bandwidth / bandwidth_allocated

        + +

        bandwidth_remaining = 100 - (100 * average_bandwidth / bandwidth_allocated)

        + +

        We can see that cheetah has used 0.053 % bandwidth and has 99.946 % remaining as of last_bandwidth_update.

        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/jussi-multiplexer.html b/docs/tutorials-recipes/jussi-multiplexer.html new file mode 100644 index 00000000..47a20532 --- /dev/null +++ b/docs/tutorials-recipes/jussi-multiplexer.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + +Using jussi as a Multiplexer | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Using jussi as a Multiplexer + + +

        + +

        Optimize your local applications with jussi

        +
        + + +

        By the end of this recipe you should know how to install jussi on your local subnet to take advantage of its features.

        + +

        This recipe will take you through the process of setting up jussi for a small infrastructure like a home network.

        + +

        Intro

        + +

        What is a Multiplexer? In this context, a multiplexer an appliance that accepts API requests from multiple applications running on the same subnet and passes them to an upstream node. This means, for example, if you have two applications that request the same block from API, your local jussi instance will make a single upstream request for the block and return it to both applications.

        + +

        Deploying jussi on your own local subnet will help improve efficiency because your local applications won’t require SSL and jussi can take care of gzipping requests that go out over the Internet.

        + +
        + Network Diagram +
        + +

        Steps

        + +
          +
        1. Setting Up Docker In order to run jussi, docker is recommended
        2. +
        3. Install jussi Clone jussi from the repository and build
        4. +
        5. Configure Your Apps Point all of your applications to this node
        6. +
        + +

        1. Setting Up Docker

        + +

        Although it’s possible to set up jussi to run natively without virtualization, docker is recommended. Setting up docker depends on your operating system:

        + + + +

        2. Install jussi

        + +
        git clone https://github.com/steemit/jussi.git
        +cd jussi
        +
        + +

        Edit the file DEV_config.json and change all:

        + +

        https://steemd.steemitdev.com

        + +

        … to …

        + +

        https://api.steemit.com

        + +

        Also consider adding the retries element to your DEV_config.json.

        + +

        Then build and run:

        + +
        docker build -t="$USER/jussi:$(git rev-parse --abbrev-ref HEAD)" .
        +docker run -itp 9000:8080 "$USER/jussi:$(git rev-parse --abbrev-ref HEAD)"
        +
        + +

        3. Configure Your Apps

        + +

        Now, you can use your new jussi node as if it’s a full node running locally. For example:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_block", "params":[8675309], "id":1}' http://localhost:9000
        +
        + +

        In this case, http://localhost:9000 will act like a full node. In reality, it’s passing all of its request to its upstream, https://api.steemit.com.

        + +

        Once you’ve implemented your own jussi node in this manner, you should notice an improvement in bandwidth utilization. If you’re internet provider implements packet shaping strategies, this will have a positive impact because you are no longer streaming the entire blockchain once for each application.

        + +

        Troubleshooting / Updating

        + +

        Error: invalid argument "/jussi:master" for t=/jussi:master: invalid reference format

        + +

        Solution:

        + +

        You’re probably trying to run on a raspberry pi. Just replace $USER in the command with the current user.

        + +
        + +

        If you would like to update jussi to the latest version, here’s a quick way:

        + +
        git stash && git pull && git stash pop
        +
        + +

        If there are git errors due to structural changes to DEV_config.json, just start over from step 2 and reclone jussi to a fresh location. Otherwise, you should be able to rebuild and run.

        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/plugin_and_api_list.html b/docs/tutorials-recipes/plugin_and_api_list.html new file mode 100644 index 00000000..5a6ef29f --- /dev/null +++ b/docs/tutorials-recipes/plugin_and_api_list.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + + + + + + +Enable SteemD Node APIs | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Enable SteemD Node APIs + + +

        + +

        Run a SteemD Node with your preferred APIs

        +
        + + +

        This is a list of the plugins, and their associated dependencies, required to enable specific apis.

        + +

        When setting up the config file steemd will run the chain, p2p, and webserver plugins regardless of other dependencies

        + +

        API’s with their respective plugin dependencies

        + +

        account_by_key_API

        + + +

        account_history_API

        + + +

        block_api

        + + +

        chain_api

        + + +

        condenser_api

        + + +

        database_api

        + + +

        debug_node_api

        + + +

        follow_api

        + + +

        market_history_api

        + + +

        network_broadcast_api

        + + +

        rc_api

        + + +

        reputation_api

        + + +

        tags_api

        + + +

        test_api

        + + +

        witness_api

        + + +

        Available plugins with any other plugin dependencies listed

        + +

        account_by_key_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Used to lookup account information based on a key
        • +
        + +

        additional account_by_key plugin:

        +
          +
        • account_by_key_objects
        • +
        + +

        account_history_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Used to lookup account history information
        • +
        + +

        account_history_rocksdb_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/account_history_rocksdb/account_history_rocksdb_objects.hpp>
        • +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • More efficient way of storing and reading information from the database
        • +
        + +

        additional account_history_rocksdb plugin:

        +
          +
        • account_history_rocksdb_objects
        • +
        + +

        block_data_export_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • create export file containing block data
        • +
        + +

        additional block_data_export plugin:

        +
          +
        • exportable_block_data
        • +
        + +

        block_log_info_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • create a block log file with block number, size and hash +additional block_log_info plugin:
        • +
        • block_log_info_objects
        • +
        + +

        chain_plugin

        + +

        dependency plugins

        +
          +
        • none
        • +
        + +

        definition

        +
          +
        • Connection to the blockchain
        • +
        + +

        debug_node_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp> +definition
        • +
        • The goal of the debug_node plugin is to start with the live chain, then easily simulate future hypothetical actions. The plugin simulates changes to chain state. For example, you can edit an account’s balances and signing keys to enable performing (simulated) actions with that account.
        • +
        • This plugin allows all sorts of creative “what-if” experiments with the chain.
        • +
        • https://github.com/steemit/steem/blob/master/doc/debug_node_plugin.md
        • +
        + +

        follow_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/follow/follow_operations.hpp>
        • +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Used to lookup information related to reputation and account follow operations
        • +
        + +

        additional follow plugins:

        +
          +
        • follow_objects
        • +
        • follow_operations
        • +
        • inc_performance
        • +
        + +

        json_rpc_plugin

        + +

        dependency plugins

        +
          +
        • none
        • +
        + +

        definition

        +
          +
        • This plugin holds bindings for all APIs and their methods and can dispatch JSONRPC requests to the appropriate API.
        • +
        • For a plugin to use the API Register, it needs to specify the register as a dependency.
        • +
        • Then, during initializtion, register itself using add_api.
        • +
        + +

        additional json_rpc plugin: + utility

        + +

        market_history_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Used to lookup market history information. Can return the market and trade history of the internal STEEM:SBD market. The order book, recent trades and the market volume is made available through this plugin.
        • +
        + +

        p2p_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • allowes peer-to-peer communication
        • +
        + +

        additional p2p plugin:

        +
          +
        • p2p_default_seeds
        • +
        + +

        rc_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Managing of resources - curation rewards, vesting shares, etc.
        • +
        + +

        additional rc plugins:

        +
          +
        • rc_curve +
            +
          • <steem/plugins/rc/rc_utility.hpp>
          • +
          +
        • +
        • rc_export_object +
            +
          • <steem/plugins/block_data_export/exportable_block_data.hpp>
          • +
          • <steem/plugins/rc/resource_count.hpp>
          • +
          +
        • +
        • rc_objects +
            +
          • <steem/plugins/rc/rc_utility.hpp>
          • +
          • <steem/plugins/rc/resource_count.hpp>
          • +
          +
        • +
        • rc_utility
        • +
        + +

        reputation_plugin

        + +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • manage user steemit user reputation (relevant to voting on content)
        • +
        + +

        additional reputation plugin:

        +
          +
        • reputation_objects
        • +
        + +

        smt_test_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        + +

        additional smt_test plugin:

        +
          +
        • smt_test_objects
        • +
        + +

        stats_export_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        • <steem/plugins/block_data_export/block_data_export_plugin.hpp>
        • +
        + +

        definition

        + +

        statsd_plugin

        +

        dependency plugins

        +
          +
        • none
        • +
        + +

        definition

        +
          +
        • statistical information logging
        • +
        + +

        additional statsd plugin:

        +
          +
        • utility +
            +
          • <steem/plugins/statsd/statsd_plugin.hpp>
          • +
          +
        • +
        + +

        tags_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • Used to lookup information about tags, posts, and discussions as well as votes.
        • +
        + +

        webserver_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/json_rpc/json_rpc_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • webserver user interface
        • +
        + +

        witness_plugin

        +

        dependency plugins

        +
          +
        • <steem/plugins/chain/chain_plugin.hpp>
        • +
        • <steem/plugins/p2p/p2p_plugin.hpp>
        • +
        • <steem/plugins/rc/rc_plugin.hpp>
        • +
        + +

        definition

        +
          +
        • The witness plugin contains all of the bandwidth logic. Can access the available bandwidth of an account and current reserve ratio.
        • +
        + +

        additional witness plugins:

        +
          +
        • witness_objects
        • +
        • witness_export_objects
        • +
        • <steem/plugins/block_data_export/exportable_block_data.hpp>
        • +
        • <steem/plugins/witness/witness_objects.hpp
        • +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/understanding-configuration-values.html b/docs/tutorials-recipes/understanding-configuration-values.html new file mode 100644 index 00000000..c52b3bd6 --- /dev/null +++ b/docs/tutorials-recipes/understanding-configuration-values.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + + + + + + +Understanding Configuration Values | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Understanding Configuration Values + + +

        + +

        Low level blockchain constants

        +
        + + +

        Intro

        + +

        These values underpin the behavior of the entire blockchain. In a sense, each witness votes for these configuration values every time they sign a block. Unlike many of the Dynamic Global Properties, these values never change at runtime (e.g., as a witness, in order to change them, you typically must shut down your node, make the change, recompile, and run).

        + +

        See: config.hpp

        + +

        Usually, these configuration values are universally adhered to, but there are situations where these values can and should be altered, like in the case of deploying a new blockchain (typically a testnet). Some of the values that do not affect consensus, like STEEM_SOFT_MAX_COMMENT_DEPTH, are allowed to change to some extent.

        + +

        Sections

        + + + +

        IS_TEST_NET

        + +

        Indicates if this node is running on testnet. See: Steem Testnet

        + +

        STEEM_ENABLE_SMT

        + +

        Indicates if Smart Media Tokens have been enabled (future hardfork).

        + +

        STEEM_INITIAL_VOTE_POWER_RATE

        + +

        The rate used prior to HF19. The number of votes an account may cast per day before voting power is impacted (originally 40 votes per day).

        + +

        STEEM_REDUCED_VOTE_POWER_RATE

        + +

        The rate used since HF19. The number of votes an account may cast per day before voting power is impacted (10 votes per day).

        + +

        STEEM_ADDRESS_PREFIX

        + +

        Address prefix used on mainnet is STM and on testnet is TST. See: Steem Testnet

        + +

        STEEM_BLOCK_INTERVAL

        + +

        Block interval in seconds is 3. This is the target for block production. This constant is also used as a component for determining valid peer inventory, bandwidth calculations, and block production gaps.

        + +

        STEEM_CASHOUT_WINDOW_SECONDS

        + +

        This value was simply set to 7 days, since HF17.

        + +

        Prior to this, other very complicated machinations were tried like multiple payouts and an initial 24 hours (prior to HF12) and even initial 12 hours (in HF12) all with time extensions depending on how much of an upvote the content got.

        + +

        Note, on testnet, this is typically much shorter: 1 hour. See: Steem Testnet

        + +

        STEEM_CHAIN_ID

        + +

        The chain ID to connect to, which is used to seed signing and prevent transaction crosstalk between two chains, typically mainnet and testnet. See: Steem Testnet

        + +

        STEEM_CHAIN_ID_NAME

        + +

        Tyically used to automatically get a unique chain id for a testnet. See: Steem Testnet

        + +

        STEEM_CREATE_ACCOUNT_DELEGATION_RATIO

        + +

        This ratio is set to 5 and is used to determine the cost of an account created with delegation.

        + +

        As an example, imagine the account creation fee is currently 3.000 STEEM. Instead of creating the account using pure STEEM, there is an option to use delegation so that the blockchain would reduce the creation fee to 0.100 STEEM. Going this route would require a delegation of 15.000 STEEM, that can be revoked at any time, but will stay in limbo for 30 days after the creation date (STEEM_CREATE_ACCOUNT_DELEGATION_TIME).

        + +

        This minimum STEEM ensures that those accounts can transact if the delegation is removed.

        + +

        STEEM_CREATE_ACCOUNT_DELEGATION_TIME

        + +

        There is a minimum delegation period (30 days) and a minimum fee in STEEM even when delegating for account creation (derived with STEEM_CREATE_ACCOUNT_DELEGATION_RATIO). The minimum period enforces a rate limit on account creation.

        + +

        Note that delegation can be revoked before 30 days have elapsed from the creation date, but stays in limbo.

        + +

        STEEM_FEED_HISTORY_WINDOW

        + +

        Price feed history window, which is 3.5 days since HF16.

        + +

        STEEM_GENESIS_TIME

        + +

        Scheduled time that the blockchain waited until the first block was produced. It is represented as the unix epoch of 1458835200, which is Thu Mar 24 16:00:00 UTC 2016. About five seconds later, the first block was produced. See: https://steemd.com/b/1

        + +

        STEEM_HARDFORK_REQUIRED_WITNESSES

        + +

        The minimum number of Delegated Proof of Stake witnesses required for hardfork. This guarantees 75% participation on all subsequent rounds.

        + +

        By default it is set to 17, but when running a testnet, we can change it to 1 so that only one node instance would be sufficient and the network will be still functional and fast. See: Steem Testnet

        + +

        STEEM_INFLATION_NARROWING_PERIOD

        + +

        Inflation narrows 0.01% every 250k blocks, since HF16. At block 7,000,000, there was a 9.5% instantaneous inflation rate, decreasing to 0.95% at this rate of 0.01% every 250k blocks. This narrowing will take approximately 20.5 years and will complete on block 220,750,000.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        YearSupplyInflationNew Supply YearSupplyInflationNew Supply
        2016250,000,0009.50%23,750,000 2031646,511,3863.19%20,613,886
        2017273,750,0009.08%24,854,398 2032667,125,2722.77%18,464,106
        2018298,604,3988.66%25,854,554 2033685,589,3782.35%16,090,399
        2019324,458,9528.24%26,727,942 2034701,679,7771.93%13,515,587
        2020351,186,8947.82%27,452,027 2035715,195,3641.51%10,766,608
        2021378,638,9217.40%28,004,740 2036725,961,9731.08%7,874,074
        2022406,643,6616.98%28,364,989 2037733,836,0470.95%6,971,442
        2023435,008,6506.55%28,513,181 2038740,807,4890.95%7,037,671
        2024463,521,8326.13%28,431,762 2039747,845,1600.95%7,104,529
        2025491,953,5935.71%28,105,742 2040754,949,6890.95%7,172,022
        2026520,059,3355.29%27,523,204 2041762,121,7110.95%7,240,156
        2027547,582,5394.87%26,675,768 2042769,361,8680.95%7,308,938
        2028574,258,3084.45%25,558,997 2043776,670,8050.95%7,378,373
        2029599,817,3044.03%24,172,733 2044784,049,1780.95%7,448,467
        2030623,990,0383.61%22,521,348 2045791,497,6450.95%7,519,228
        + +

        STEEM_MAX_ACCOUNT_NAME_LENGTH

        + +

        Names must comply with the following grammar (RFC 1035), i.e.: a valid name consists of a dot-separated sequence of one or more labels consisting of the following rules:

        + +
          +
        • Each label is three characters or more
        • +
        • Each label begins with a letter
        • +
        • Each label ends with a letter or digit
        • +
        • Each label contains only letters, digits or hyphens
        • +
        + +

        In addition we require the following:

        + +
          +
        • All letters are lowercase
        • +
        • Length is between (inclusive) STEEM_MIN_ACCOUNT_NAME_LENGTH (3 characters) and STEEM_MAX_ACCOUNT_NAME_LENGTH (16 characters)
        • +
        + +

        STEEM_MAX_ACCOUNT_WITNESS_VOTES

        + +

        Each account may cast up to 30 witness votes.

        + +

        STEEM_MAX_WITNESSES

        + +

        This value is set to 21, which means there are 21 witnesses cycling to produce blocks.

        + +

        Every round of block production begins with the shuffling of 21 witnesses: the top 20 witnesses (by vote), plus one randomly-selected standby witness. Each is given a turn to produce a single block at a fixed rate of one block every 3 seconds. If a witness does not produce a block in their time slot, then that time slot is skipped, and the next witness produces the next block.

        + + + +

        A permlink is a unique string identifier for a post/comment, linked to the author of the post/comment. It must not exceed 256 characters.

        + +

        STEEM_MAX_WITNESS_URL_LENGTH

        + +

        Witnesses may provide a URL in their witness proposal. It must not exceed 2,048 characters.

        + +

        STEEM_MIN_REPLY_INTERVAL

        + +

        Prior to HF20, comments (replies) could only be broadcasted once every 20 seconds, per account.

        + +

        STEEM_MIN_REPLY_INTERVAL_HF20

        + +

        In HF20, comments (replies) can be broadcasted once every 3 seconds, per account (one comment per account per block). See: #2019

        + +

        STEEM_MIN_ROOT_COMMENT_INTERVAL

        + +

        Posts (root comments) can only be broadcasted once every 5 minutes, per account.

        + +

        STEEM_MIN_PAYOUT_SBD

        + +

        Rewards of less than 0.020 SBD are considered “dust” and will not receive payout.

        + +

        STEEM_NULL_ACCOUNT

        + +

        This defines the null account used by the blockchain as the canonical account designated to burn assets.

        + +

        The blockchain checks all asset types transferred to this account, thus, even reward balances and VESTS are burned. See: operation_time_tests.cpp

        + +

        STEEM_REVERSE_AUCTION_WINDOW_SECONDS

        + +

        Prior to HF6, there was no reverse auction logic. From HF6 to HF19, the reverse auction window is 30 minutes.

        + +

        In HF20, the reverse action is being reduced to 15 minutes. See: #1874, #1878

        + +

        STEEM_SOFT_MAX_COMMENT_DEPTH

        + +

        A comment is nested at a maximum depth of 255. As a soft limit, it is enforced by the witness_plugin. See: witness_plugin.cpp

        + +

        Prior to HF17, the maximum comment depth was 6. See: #767

        + +

        STEEM_SAVINGS_WITHDRAW_TIME

        + +

        This value sets the timelock of 3 days for funds being withdrawn from savings. Funds can be transferred into savings instantly, but require 72 hours (3 days) to withdraw from savings. This will guarantee there is at least 1 business day during which you can contact your recovery agent.

        + +

        STEEM_UPVOTE_LOCKOUT_HF17

        + +

        Accounts may not increase payout within last 12 hours before payout, since HF17.

        + +

        STEEM_VESTING_WITHDRAW_INTERVALS

        + +

        Sets the power-down rate, which is fulfilled once a week over 13 weeks.

        + +

        Prior to HF16, this value was 104 weeks.

        + +

        Not Covered

        + +

        Fields not covered in this recipe are:

        + +
          +
        • SBD_SYMBOL
        • +
        • STEEM_100_PERCENT
        • +
        • STEEM_1_PERCENT
        • +
        • STEEM_ACCOUNT_RECOVERY_REQUEST_EXPIRATION_PERIOD
        • +
        • STEEM_ACTIVE_CHALLENGE_COOLDOWN
        • +
        • STEEM_ACTIVE_CHALLENGE_FEE
        • +
        • STEEM_APR_PERCENT_MULTIPLY_PER_BLOCK
        • +
        • STEEM_APR_PERCENT_MULTIPLY_PER_HOUR
        • +
        • STEEM_APR_PERCENT_MULTIPLY_PER_ROUND
        • +
        • STEEM_APR_PERCENT_SHIFT_PER_BLOCK
        • +
        • STEEM_APR_PERCENT_SHIFT_PER_HOUR
        • +
        • STEEM_APR_PERCENT_SHIFT_PER_ROUND
        • +
        • STEEM_BANDWIDTH_AVERAGE_WINDOW_SECONDS
        • +
        • STEEM_BANDWIDTH_PRECISION
        • +
        • STEEM_BLOCKCHAIN_PRECISION
        • +
        • STEEM_BLOCKCHAIN_PRECISION_DIGITS
        • +
        • STEEM_BLOCKCHAIN_HARDFORK_VERSION
        • +
        • STEEM_BLOCKCHAIN_VERSION
        • +
        • STEEM_BLOCKS_PER_DAY
        • +
        • STEEM_BLOCKS_PER_HOUR
        • +
        • STEEM_BLOCKS_PER_YEAR
        • +
        • STEEM_CASHOUT_WINDOW_SECONDS_PRE_HF12
        • +
        • STEEM_CASHOUT_WINDOW_SECONDS_PRE_HF17
        • +
        • STEEM_COMMENT_REWARD_FUND_NAME
        • +
        • STEEM_CONTENT_APR_PERCENT
        • +
        • STEEM_CONTENT_CONSTANT_HF0
        • +
        • STEEM_CONTENT_REWARD_PERCENT
        • +
        • STEEM_CONVERSION_DELAY
        • +
        • STEEM_CONVERSION_DELAY_PRE_HF_16
        • +
        • STEEM_CREATE_ACCOUNT_WITH_STEEM_MODIFIER
        • +
        • STEEM_CURATE_APR_PERCENT
        • +
        • STEEM_DEFAULT_SBD_INTEREST_RATE
        • +
        • STEEM_EQUIHASH_K
        • +
        • STEEM_EQUIHASH_N
        • +
        • STEEM_FEED_HISTORY_WINDOW_PRE_HF_16
        • +
        • STEEM_FEED_INTERVAL_BLOCKS
        • +
        • STEEM_INFLATION_RATE_START_PERCENT
        • +
        • STEEM_INFLATION_RATE_STOP_PERCENT
        • +
        • STEEM_INIT_MINER_NAME
        • +
        • STEEM_INIT_PUBLIC_KEY_STR
        • +
        • STEEM_INIT_SUPPLY
        • +
        • STEEM_INIT_TIME
        • +
        • STEEM_IRREVERSIBLE_THRESHOLD
        • +
        • STEEM_LIQUIDITY_APR_PERCENT
        • +
        • STEEM_LIQUIDITY_REWARD_BLOCKS
        • +
        • STEEM_LIQUIDITY_REWARD_PERIOD_SEC
        • +
        • STEEM_LIQUIDITY_TIMEOUT_SEC
        • +
        • STEEM_MAX_ASSET_WHITELIST_AUTHORITIES
        • +
        • STEEM_MAX_AUTHORITY_MEMBERSHIP
        • +
        • STEEM_MAX_BLOCK_SIZE
        • +
        • STEEM_SOFT_MAX_BLOCK_SIZE
        • +
        • STEEM_MAX_CASHOUT_WINDOW_SECONDS
        • +
        • STEEM_MAX_COMMENT_DEPTH
        • +
        • STEEM_MAX_COMMENT_DEPTH_PRE_HF17
        • +
        • STEEM_MAX_FEED_AGE_SECONDS
        • +
        • STEEM_MAX_INSTANCE_ID
        • +
        • STEEM_MAX_MEMO_SIZE
        • +
        • STEEM_MAX_MINER_WITNESSES_HF0
        • +
        • STEEM_MAX_MINER_WITNESSES_HF17
        • +
        • STEEM_MAX_PROXY_RECURSION_DEPTH
        • +
        • STEEM_MAX_RATION_DECAY_RATE
        • +
        • STEEM_MAX_RESERVE_RATIO
        • +
        • STEEM_MAX_RUNNER_WITNESSES_HF0
        • +
        • STEEM_MAX_RUNNER_WITNESSES_HF17
        • +
        • STEEM_MAX_SATOSHIS
        • +
        • STEEM_MAX_SHARE_SUPPLY
        • +
        • STEEM_MAX_SIG_CHECK_DEPTH
        • +
        • STEEM_MAX_TIME_UNTIL_EXPIRATION
        • +
        • STEEM_MAX_TRANSACTION_SIZE
        • +
        • STEEM_MAX_UNDO_HISTORY
        • +
        • STEEM_MAX_URL_LENGTH
        • +
        • STEEM_MAX_VOTE_CHANGES
        • +
        • STEEM_MAX_VOTED_WITNESSES_HF0
        • +
        • STEEM_MAX_VOTED_WITNESSES_HF17
        • +
        • STEEM_MAX_WITHDRAW_ROUTES
        • +
        • STEEM_MIN_ACCOUNT_CREATION_FEE
        • +
        • STEEM_MIN_ACCOUNT_NAME_LENGTH
        • +
        • STEEM_MIN_BLOCK_SIZE_LIMIT
        • +
        • STEEM_MIN_BLOCK_SIZE
        • +
        • STEEM_MIN_CONTENT_REWARD
        • +
        • STEEM_MIN_CURATE_REWARD
        • +
        • STEEM_MIN_PERMLINK_LENGTH
        • +
        • STEEM_MIN_VOTE_INTERVAL_SEC
        • +
        • STEEM_MINER_ACCOUNT
        • +
        • STEEM_MINER_PAY_PERCENT
        • +
        • STEEM_MIN_FEEDS
        • +
        • STEEM_MINING_REWARD
        • +
        • STEEM_MINING_TIME
        • +
        • STEEM_MIN_LIQUIDITY_REWARD
        • +
        • STEEM_MIN_LIQUIDITY_REWARD_PERIOD_SEC
        • +
        • STEEM_MIN_POW_REWARD
        • +
        • STEEM_MIN_PRODUCER_REWARD
        • +
        • STEEM_MIN_TRANSACTION_EXPIRATION_LIMIT
        • +
        • STEEM_MIN_TRANSACTION_SIZE_LIMIT
        • +
        • STEEM_MIN_UNDO_HISTORY
        • +
        • STEEM_NUM_INIT_MINERS
        • +
        • STEEM_OWNER_AUTH_HISTORY_TRACKING_START_BLOCK_NUM
        • +
        • STEEM_OWNER_AUTH_RECOVERY_PERIOD
        • +
        • STEEM_OWNER_CHALLENGE_COOLDOWN
        • +
        • STEEM_OWNER_CHALLENGE_FEE
        • +
        • STEEM_OWNER_UPDATE_LIMIT
        • +
        • STEEM_POST_AVERAGE_WINDOW
        • +
        • STEEM_POST_REWARD_FUND_NAME
        • +
        • STEEM_POST_WEIGHT_CONSTANT
        • +
        • STEEM_POW_APR_PERCENT
        • +
        • STEEM_PRODUCER_APR_PERCENT
        • +
        • STEEM_PROXY_TO_SELF_ACCOUNT
        • +
        • STEEM_SBD_INTEREST_COMPOUND_INTERVAL_SEC
        • +
        • STEEM_SECONDS_PER_YEAR
        • +
        • STEEM_RECENT_RSHARES_DECAY_TIME_HF19
        • +
        • STEEM_RECENT_RSHARES_DECAY_TIME_HF17
        • +
        • STEEM_ROOT_POST_PARENT
        • +
        • STEEM_SAVINGS_WITHDRAW_REQUEST_LIMIT
        • +
        • STEEM_SBD_START_PERCENT
        • +
        • STEEM_SBD_STOP_PERCENT
        • +
        • STEEM_SECOND_CASHOUT_WINDOW
        • +
        • STEEM_START_MINER_VOTING_BLOCK
        • +
        • STEEM_START_VESTING_BLOCK
        • +
        • STEEM_TEMP_ACCOUNT
        • +
        • STEEM_UPVOTE_LOCKOUT_HF7
        • +
        • STEEM_VESTING_FUND_PERCENT
        • +
        • STEEM_VESTING_WITHDRAW_INTERVALS_PRE_HF_16
        • +
        • STEEM_VESTING_WITHDRAW_INTERVAL_SECONDS
        • +
        • STEEM_VOTE_DUST_THRESHOLD
        • +
        • STEEM_VOTE_REGENERATION_SECONDS
        • +
        • STEEM_SYMBOL
        • +
        • VESTS_SYMBOL
        • +
        • STEEM_VIRTUAL_SCHEDULE_LAP_LENGTH
        • +
        • STEEM_VIRTUAL_SCHEDULE_LAP_LENGTH2
        • +
        • STEEM_MAX_LIMIT_ORDER_EXPIRATION
        • +
        • STEEM_DELEGATION_RETURN_PERIOD_HF0
        • +
        • STEEM_DELEGATION_RETURN_PERIOD_HF20
        • +
        + +

        Example Method Call

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_config", "params":[], "id":1}' https://api.steemit.com
        +
        + +

        Example Output

        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "IS_TEST_NET":false,
        +      "STEEM_ENABLE_SMT":false,
        +      "SBD_SYMBOL":null,
        +      "STEEM_INITIAL_VOTE_POWER_RATE":40,
        +      "STEEM_REDUCED_VOTE_POWER_RATE":10,
        +      "STEEM_100_PERCENT":10000,
        +      "STEEM_1_PERCENT":100,
        +      "STEEM_ACCOUNT_RECOVERY_REQUEST_EXPIRATION_PERIOD":"86400000000",
        +      "STEEM_ACTIVE_CHALLENGE_COOLDOWN":"86400000000",
        +      "STEEM_ACTIVE_CHALLENGE_FEE":{"amount":"2000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_ADDRESS_PREFIX":"STM",
        +      "STEEM_APR_PERCENT_MULTIPLY_PER_BLOCK":"102035135585887",
        +      "STEEM_APR_PERCENT_MULTIPLY_PER_HOUR":"119577151364285",
        +      "STEEM_APR_PERCENT_MULTIPLY_PER_ROUND":"133921203762304",
        +      "STEEM_APR_PERCENT_SHIFT_PER_BLOCK":87,
        +      "STEEM_APR_PERCENT_SHIFT_PER_HOUR":77,
        +      "STEEM_APR_PERCENT_SHIFT_PER_ROUND":83,
        +      "STEEM_BANDWIDTH_AVERAGE_WINDOW_SECONDS":604800,
        +      "STEEM_BANDWIDTH_PRECISION":1000000,
        +      "STEEM_BLOCKCHAIN_PRECISION":1000,
        +      "STEEM_BLOCKCHAIN_PRECISION_DIGITS":3,
        +      "STEEM_BLOCKCHAIN_HARDFORK_VERSION":"0.19.0",
        +      "STEEM_BLOCKCHAIN_VERSION":"0.19.10",
        +      "STEEM_BLOCK_INTERVAL":3,
        +      "STEEM_BLOCKS_PER_DAY":28800,
        +      "STEEM_BLOCKS_PER_HOUR":1200,
        +      "STEEM_BLOCKS_PER_YEAR":10512000,
        +      "STEEM_CASHOUT_WINDOW_SECONDS":604800,
        +      "STEEM_CASHOUT_WINDOW_SECONDS_PRE_HF12":86400,
        +      "STEEM_CASHOUT_WINDOW_SECONDS_PRE_HF17":43200,
        +      "STEEM_CHAIN_ID":"0000000000000000000000000000000000000000000000000000000000000000",
        +      "STEEM_CHAIN_ID_NAME":"",
        +      "STEEM_COMMENT_REWARD_FUND_NAME":"comment",
        +      "STEEM_CONTENT_APR_PERCENT":3875,
        +      "STEEM_CONTENT_CONSTANT_HF0":"2000000000000",
        +      "STEEM_CONTENT_REWARD_PERCENT":7500,
        +      "STEEM_CONVERSION_DELAY":"302400000000",
        +      "STEEM_CONVERSION_DELAY_PRE_HF_16":"604800000000",
        +      "STEEM_CREATE_ACCOUNT_DELEGATION_RATIO":5,
        +      "STEEM_CREATE_ACCOUNT_DELEGATION_TIME":"2592000000000",
        +      "STEEM_CREATE_ACCOUNT_WITH_STEEM_MODIFIER":30,
        +      "STEEM_CURATE_APR_PERCENT":3875,
        +      "STEEM_DEFAULT_SBD_INTEREST_RATE":1000,
        +      "STEEM_EQUIHASH_K":6,
        +      "STEEM_EQUIHASH_N":140,
        +      "STEEM_FEED_HISTORY_WINDOW":84,
        +      "STEEM_FEED_HISTORY_WINDOW_PRE_HF_16":168,
        +      "STEEM_FEED_INTERVAL_BLOCKS":1200,
        +      "STEEM_GENESIS_TIME":"2016-03-24T16:00:00",
        +      "STEEM_HARDFORK_REQUIRED_WITNESSES":17,
        +      "STEEM_INFLATION_NARROWING_PERIOD":250000,
        +      "STEEM_INFLATION_RATE_START_PERCENT":978,
        +      "STEEM_INFLATION_RATE_STOP_PERCENT":95,
        +      "STEEM_INIT_MINER_NAME":"initminer",
        +      "STEEM_INIT_PUBLIC_KEY_STR":"STM8GC13uCZbP44HzMLV6zPZGwVQ8Nt4Kji8PapsPiNq1BK153XTX",
        +      "STEEM_INIT_SUPPLY":0,
        +      "STEEM_INIT_TIME":"1970-01-01T00:00:00",
        +      "STEEM_IRREVERSIBLE_THRESHOLD":7500,
        +      "STEEM_LIQUIDITY_APR_PERCENT":750,
        +      "STEEM_LIQUIDITY_REWARD_BLOCKS":1200,
        +      "STEEM_LIQUIDITY_REWARD_PERIOD_SEC":3600,
        +      "STEEM_LIQUIDITY_TIMEOUT_SEC":"604800000000",
        +      "STEEM_MAX_ACCOUNT_NAME_LENGTH":16,
        +      "STEEM_MAX_ACCOUNT_WITNESS_VOTES":30,
        +      "STEEM_MAX_ASSET_WHITELIST_AUTHORITIES":10,
        +      "STEEM_MAX_AUTHORITY_MEMBERSHIP":10,
        +      "STEEM_MAX_BLOCK_SIZE":393216000,
        +      "STEEM_SOFT_MAX_BLOCK_SIZE":2097152,
        +      "STEEM_MAX_CASHOUT_WINDOW_SECONDS":1209600,
        +      "STEEM_MAX_COMMENT_DEPTH":65535,
        +      "STEEM_MAX_COMMENT_DEPTH_PRE_HF17":6,
        +      "STEEM_MAX_FEED_AGE_SECONDS":604800,
        +      "STEEM_MAX_INSTANCE_ID":"281474976710655",
        +      "STEEM_MAX_MEMO_SIZE":2048,
        +      "STEEM_MAX_WITNESSES":21,
        +      "STEEM_MAX_MINER_WITNESSES_HF0":1,
        +      "STEEM_MAX_MINER_WITNESSES_HF17":0,
        +      "STEEM_MAX_PERMLINK_LENGTH":256,
        +      "STEEM_MAX_PROXY_RECURSION_DEPTH":4,
        +      "STEEM_MAX_RATION_DECAY_RATE":1000000,
        +      "STEEM_MAX_RESERVE_RATIO":20000,
        +      "STEEM_MAX_RUNNER_WITNESSES_HF0":1,
        +      "STEEM_MAX_RUNNER_WITNESSES_HF17":1,
        +      "STEEM_MAX_SATOSHIS":"4611686018427387903",
        +      "STEEM_MAX_SHARE_SUPPLY":"1000000000000000",
        +      "STEEM_MAX_SIG_CHECK_DEPTH":2,
        +      "STEEM_MAX_TIME_UNTIL_EXPIRATION":3600,
        +      "STEEM_MAX_TRANSACTION_SIZE":65536,
        +      "STEEM_MAX_UNDO_HISTORY":10000,
        +      "STEEM_MAX_URL_LENGTH":127,
        +      "STEEM_MAX_VOTE_CHANGES":5,
        +      "STEEM_MAX_VOTED_WITNESSES_HF0":19,
        +      "STEEM_MAX_VOTED_WITNESSES_HF17":20,
        +      "STEEM_MAX_WITHDRAW_ROUTES":10,
        +      "STEEM_MAX_WITNESS_URL_LENGTH":2048,
        +      "STEEM_MIN_ACCOUNT_CREATION_FEE":1,
        +      "STEEM_MIN_ACCOUNT_NAME_LENGTH":3,
        +      "STEEM_MIN_BLOCK_SIZE_LIMIT":65536,
        +      "STEEM_MIN_BLOCK_SIZE":115,
        +      "STEEM_MIN_CONTENT_REWARD":{"amount":"1000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_MIN_CURATE_REWARD":{"amount":"1000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_MIN_PERMLINK_LENGTH":0,
        +      "STEEM_MIN_REPLY_INTERVAL":20000000,
        +      "STEEM_MIN_REPLY_INTERVAL_HF20":3000000,
        +      "STEEM_MIN_ROOT_COMMENT_INTERVAL":300000000,
        +      "STEEM_MIN_VOTE_INTERVAL_SEC":3,
        +      "STEEM_MINER_ACCOUNT":"miners",
        +      "STEEM_MINER_PAY_PERCENT":100,
        +      "STEEM_MIN_FEEDS":7,
        +      "STEEM_MINING_REWARD":{"amount":"1000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_MINING_TIME":"2016-03-24T17:00:00",
        +      "STEEM_MIN_LIQUIDITY_REWARD":{"amount":"1200000", "precision":3, "nai":"@@000000021" },
        +      "STEEM_MIN_LIQUIDITY_REWARD_PERIOD_SEC":60000000,
        +      "STEEM_MIN_PAYOUT_SBD":{"amount":"20", "precision":3, "nai":"@@000000013"},
        +      "STEEM_MIN_POW_REWARD":{"amount":"1000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_MIN_PRODUCER_REWARD":{"amount":"1000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_MIN_TRANSACTION_EXPIRATION_LIMIT":15,
        +      "STEEM_MIN_TRANSACTION_SIZE_LIMIT":1024,
        +      "STEEM_MIN_UNDO_HISTORY":10,
        +      "STEEM_NULL_ACCOUNT":"null",
        +      "STEEM_NUM_INIT_MINERS":1,
        +      "STEEM_OWNER_AUTH_HISTORY_TRACKING_START_BLOCK_NUM":3186477,
        +      "STEEM_OWNER_AUTH_RECOVERY_PERIOD":"2592000000000",
        +      "STEEM_OWNER_CHALLENGE_COOLDOWN":"86400000000",
        +      "STEEM_OWNER_CHALLENGE_FEE":{"amount":"30000", "precision":3, "nai":"@@000000021"},
        +      "STEEM_OWNER_UPDATE_LIMIT":3600000000,
        +      "STEEM_POST_AVERAGE_WINDOW":86400,
        +      "STEEM_POST_REWARD_FUND_NAME":"post",
        +      "STEEM_POST_WEIGHT_CONSTANT":1600000000,
        +      "STEEM_POW_APR_PERCENT":750,
        +      "STEEM_PRODUCER_APR_PERCENT":750,
        +      "STEEM_PROXY_TO_SELF_ACCOUNT":"",
        +      "STEEM_SBD_INTEREST_COMPOUND_INTERVAL_SEC":2592000,
        +      "STEEM_SECONDS_PER_YEAR":31536000,
        +      "STEEM_RECENT_RSHARES_DECAY_TIME_HF19":"1296000000000",
        +      "STEEM_RECENT_RSHARES_DECAY_TIME_HF17":"2592000000000",
        +      "STEEM_REVERSE_AUCTION_WINDOW_SECONDS":1800,
        +      "STEEM_ROOT_POST_PARENT":"",
        +      "STEEM_SAVINGS_WITHDRAW_REQUEST_LIMIT":100,
        +      "STEEM_SAVINGS_WITHDRAW_TIME":"259200000000",
        +      "STEEM_SBD_START_PERCENT":200,
        +      "STEEM_SBD_STOP_PERCENT":500,
        +      "STEEM_SECOND_CASHOUT_WINDOW":2592000,
        +      "STEEM_SOFT_MAX_COMMENT_DEPTH":255,
        +      "STEEM_START_MINER_VOTING_BLOCK":864000,
        +      "STEEM_START_VESTING_BLOCK":201600,
        +      "STEEM_TEMP_ACCOUNT":"temp",
        +      "STEEM_UPVOTE_LOCKOUT_HF7":60000000,
        +      "STEEM_UPVOTE_LOCKOUT_HF17":"43200000000",
        +      "STEEM_VESTING_FUND_PERCENT":1500,
        +      "STEEM_VESTING_WITHDRAW_INTERVALS":13,
        +      "STEEM_VESTING_WITHDRAW_INTERVALS_PRE_HF_16":104,
        +      "STEEM_VESTING_WITHDRAW_INTERVAL_SECONDS":604800,
        +      "STEEM_VOTE_DUST_THRESHOLD":50000000,
        +      "STEEM_VOTE_REGENERATION_SECONDS":432000,
        +      "STEEM_SYMBOL":null,
        +      "VESTS_SYMBOL":null,
        +      "STEEM_VIRTUAL_SCHEDULE_LAP_LENGTH":"18446744073709551615",
        +      "STEEM_VIRTUAL_SCHEDULE_LAP_LENGTH2":"340282366920938463463374607431768211455",
        +      "STEEM_MAX_LIMIT_ORDER_EXPIRATION":2419200,
        +      "STEEM_DELEGATION_RETURN_PERIOD_HF0":604800,
        +      "STEEM_DELEGATION_RETURN_PERIOD_HF20":864000
        +   }
        +}
        +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/understanding-dynamic-global-properties.html b/docs/tutorials-recipes/understanding-dynamic-global-properties.html new file mode 100644 index 00000000..66c6ed86 --- /dev/null +++ b/docs/tutorials-recipes/understanding-dynamic-global-properties.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + +Understanding Dynamic Global Properties | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Understanding Dynamic Global Properties + + +

        + +

        Maintains global state information

        +
        + + +

        Intro

        + +

        Dynamic Global Properties represents a set of values that are calculated during normal chain operations and reflect the current values of global blockchain properties.

        + +

        The API returns an object containing information that changes every block interval such as the head block number, the total vesting fund, etc.

        + +

        Sections

        + + + +

        head_block_number

        + +

        Block height at the head of the blockchain. This represents the latest block produced by witnesses.

        + +
          +
        • example: 24155032
        • +
        + +

        head_block_id

        + +

        Used to implement TaPoS (Transaction as Proof of Stake). The first 4 bytes (8 hex digits) of the block ID represents the block number. E.g., 01709398 in hex is 24155032 in decimal.

        + + + +

        time

        + +

        Point in time (UTC) that the block was included in the chain.

        + +

        Used to synchronize events like Hard Fork activation.

        + +

        When attempting to calculate the validity of a transaction we need to lookup a past block and check its block hash and the time it occurred so we can calculate whether the current transaction is valid and at what time it should expire.

        + +

        For new transactions, expirations originate from this time.

        + +
          +
        • example: 2018-07-14T01:19:51
        • +
        + +

        current_witness

        + +

        Account name of the current witness.

        + +
          +
        • example: blocktrades
        • +
        + +

        total_powDeprecated

        + +

        The total POW accumulated, aka the sum of num_pow_witness at the time new POW is added.

        + +
          +
        • example: 514415
        • +
        + +

        num_pow_witnessesDeprecated

        + +

        The current count of how many pending POW witnesses there are, determines the difficulty of doing pow.

        + +
          +
        • example: 172
        • +
        + +

        virtual_supply

        + +

        The virtual supply is the supply of all STEEM + all SBD if all SBD were converted to STEEM at the current median price.

        + +
          +
        • example: 283290592.652 STEEM
        • +
        + +

        current_supply

        + +

        STEEM currently in existence.

        + +
          +
        • example: 271546371.129 STEEM
        • +
        + +

        confidential_supply

        + +

        Total asset held in confidential balances.

        + +
          +
        • example: 0.000 STEEM
        • +
        + +

        current_sbd_supply

        + +

        SBD currently in existence.

        + +
          +
        • example: 15478883.968 SBD
        • +
        + +

        confidential_sbd_supply

        + +

        Total asset held in confidential balances.

        + +
          +
        • example: 0.000 SBD
        • +
        + +

        total_vesting_fund_steem Deprecated

        + +

        Now deprecated way to get STEEM that is invested in STEEM POWER (powered up).

        + +

        Use condenser_api.get_reward_fund instead.

        + +
          +
        • example: 192713261.007 STEEM
        • +
        + +

        total_vesting_shares

        + +

        VESTS that are invested in STEEM POWER (powered up).

        + +
          +
        • example: 390950506702.452773 VESTS
        • +
        + +

        total_reward_fund_steem

        + +

        STEEM available in the reward pool.

        + +
          +
        • example: 0.000 STEEM
        • +
        + +

        total_reward_shares2 Deprecated

        + +

        Now deprecated way to get the number of shares in the pool.

        + +

        Use condenser_api.get_reward_fund instead.

        + +
          +
        • example: 0
        • +
        + +

        sbd_interest_rate

        + +

        This property defines the interest rate that SBD deposits receive.

        + +
          +
        • example: 0
        • +
        + +

        maximum_block_size

        + +

        Maximum block size is decided by the set of active witnesses which change every round. Each witness posts what they think the maximum size should be as part of their witness properties, the median size is chosen to be the maximum block size for the round.

        + +

        Note: the minimum value for maximum_block_size is defined by the protocol to prevent the network from getting stuck by witnesses attempting to set this too low.

        + +
          +
        • example: 65536
        • +
        + +

        current_aslot

        + +

        The current absolute slot number. Equal to the total number of slots since genesis. Also equal to the total number of missed slots plus head_block_number.

        + +
          +
        • example: 24231997
        • +
        + +

        recent_slots_filled

        + +

        Used to compute witness participation.

        + +
          +
        • example: 340282366920938463463374607431768211455
        • +
        + +

        last_irreversible_block_num

        + +

        The latest block number that has been confirmed by two thirds of all block producers and is thus irreversible.

        + +
          +
        • example: 24155017
        • +
        + +

        vote_power_reserve_rate

        + +

        The number of votes regenerated per day. Any user voting slower than this rate will be “wasting” voting power through spillover; any user voting faster than this rate will have their votes reduced.

        + +
          +
        • example: 10
        • +
        + +

        average_block_size Removed

        + +

        Removed in 0.20.6, see: #3029

        + +

        Average block size is updated every block to be: average_block_size = (99 * average_block_size + new_block_size) / 100. This property is used to update the current_reserve_ratio to maintain approximately * 50% or less utilization of network capacity.

        + +
          +
        • example: 9309
        • +
        + +

        current_reserve_ratio Removed

        + +

        Removed in 0.20.6, see: #3029

        + +

        Any time average_block_size <= 50% maximum_block_size this value grows by 1 until it reaches STEEM_MAX_RESERVE_RATIO. Any time average_block_size is greater than 50% it falls by 1%. Upward adjustments happen once per round, downward adjustments happen every block.

        + +
          +
        • example: 200000000
        • +
        + +

        max_virtual_bandwidth Removed

        + +

        Removed in 0.20.6, see: #3029

        + +

        The maximum bandwidth the blockchain can support is max_bandwidth = maximum_block_size * STEEM_BANDWIDTH_AVERAGE_WINDOW_SECONDS / STEEM_BLOCK_INTERVAL; The maximum virtual bandwidth is: max_bandwidth * current_reserve_ratio

        + +
          +
        • example: 264241152000000000000
        • +
        + +

        Not Covered

        + +

        Fields not covered in this recipe are:

        + +
          +
        • confidential_supply
        • +
        • confidential_sbd_supply
        • +
        • pending_rewarded_vesting_shares
        • +
        • pending_rewarded_vesting_steem
        • +
        • sbd_print_rate
        • +
        • participation_count
        • +
        + +

        Example Method Call

        + +

        To retrieve the current results for condenser_api.get_dynamic_global_properties, we can retrieve the current state information using curl:

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}' https://api.steemit.com
        +
        + +

        Example Output

        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "head_block_number":24238248,
        +      "head_block_id":"0171d8a833dc369abd034b0c67d8725f96df9e5b",
        +      "time":"2018-07-16T22:41:24",
        +      "current_witness":"xeldal",
        +      "total_pow":514415,
        +      "num_pow_witnesses":172,
        +      "virtual_supply":"283434761.199 STEEM",
        +      "current_supply":"271729171.190 STEEM",
        +      "confidential_supply":"0.000 STEEM",
        +      "current_sbd_supply":"15498201.173 SBD",
        +      "confidential_sbd_supply":"0.000 SBD",
        +      "total_vesting_fund_steem":"192913644.627 STEEM",
        +      "total_vesting_shares":"391296886352.617261 VESTS",
        +      "total_reward_fund_steem":"0.000 STEEM",
        +      "total_reward_shares2":"0",
        +      "pending_rewarded_vesting_shares":"379159224.860656 VESTS",
        +      "pending_rewarded_vesting_steem":"185294.019 STEEM",
        +      "sbd_interest_rate":0,
        +      "sbd_print_rate":2933,
        +      "maximum_block_size":65536,
        +      "current_aslot":24315228,
        +      "recent_slots_filled":"340282366920938463463374607431768211400",
        +      "participation_count":128,
        +      "last_irreversible_block_num":24238230,
        +      "vote_power_reserve_rate":10
        +   }
        +}
        +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/vest-to-steem.html b/docs/tutorials-recipes/vest-to-steem.html new file mode 100644 index 00000000..65404280 --- /dev/null +++ b/docs/tutorials-recipes/vest-to-steem.html @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + +Converting VESTS to STEEM | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Converting VESTS to STEEM + + +

        + +

        How to convert VESTS to STEEM or STEEM POWER

        +
        + + +

        Intro

        + +

        Steem’s has base unit is VESTS and usually user doesn’t know about this unit because everything is dynamically calucated and presented in STEEM form for convenience of the user. In this recipe we will talk about how converting is working behind the scenes on all Steem apps. Dynamic Global Properties are used in this recipe to fetch the current values of global blockchain properties.

        + +

        Steps

        + +
          +
        1. Get Dynamic Global Properties Fetch current values of global blockchain properties
        2. +
        3. Formulate VESTS_TO_STEEM Formulate function that will convert given VESTS to STEEM.
        4. +
        + +

        1. Get Dynamic Global Properties

        + +

        Following method can be used to fetch global values

        + +
        curl -s --data '{"jsonrpc":"2.0", "method":"condenser_api.get_dynamic_global_properties", "params":[], "id":1}' https://api.steemit.com
        +
        + +
        Example Output
        + +
        {
        +   "id":1,
        +   "jsonrpc":"2.0",
        +   "result":{
        +      "head_block_number":24238248,
        +      "head_block_id":"0171d8a833dc369abd034b0c67d8725f96df9e5b",
        +      "time":"2018-07-16T22:41:24",
        +      "current_witness":"xeldal",
        +      "total_pow":514415,
        +      "num_pow_witnesses":172,
        +      "virtual_supply":"283434761.199 STEEM",
        +      "current_supply":"271729171.190 STEEM",
        +      "confidential_supply":"0.000 STEEM",
        +      "current_sbd_supply":"15498201.173 SBD",
        +      "confidential_sbd_supply":"0.000 SBD",
        +      "total_vesting_fund_steem":"192913644.627 STEEM",
        +      "total_vesting_shares":"391296886352.617261 VESTS",
        +      "total_reward_fund_steem":"0.000 STEEM",
        +      "total_reward_shares2":"0",
        +      "pending_rewarded_vesting_shares":"379159224.860656 VESTS",
        +      "pending_rewarded_vesting_steem":"185294.019 STEEM",
        +      "sbd_interest_rate":0,
        +      "sbd_print_rate":2933,
        +      "maximum_block_size":65536,
        +      "current_aslot":24315228,
        +      "recent_slots_filled":"340282366920938463463374607431768211400",
        +      "participation_count":128,
        +      "last_irreversible_block_num":24238230,
        +      "vote_power_reserve_rate":10,
        +      "average_block_size":10950,
        +      "current_reserve_ratio":200000000,
        +      "max_virtual_bandwidth":"264241152000000000000"
        +   }
        +}
        +
        + +

        2. Formulate VESTS_TO_STEEM

        + +

        From above results we have everything we need to calculate STEEM from given VESTS value.

        + +

        Let’s say we have been given availableVESTS variable, value in VESTS and we want to convert that to STEEM. By using values from above returned object our formula would be as follows:

        + +
        vestSteem = ( result.total_vesting_fund_steem x availableVESTS ) / result.total_vesting_shares
        +
        + +

        That’s it!

        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions.html b/docs/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions.html new file mode 100644 index 00000000..f9ebfb43 --- /dev/null +++ b/docs/tutorials-recipes/virtual-operations-when-streaming-blockchain-transactions.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + +Streaming blockchain transactions | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + Streaming blockchain transactions + + +

        + +

        Including virtual operations when streaming blockchain transactions

        +
        + + +

        This recipe will take you through the process of streaming blockchain transactions, both from head_block_num and last_irreversible_block_num, and explain the presence/absence of virtual operations in the streamed transactions.

        + +

        Intro

        + +

        There are two points from which Steem blockchain transactions can be streamed to give a “live” view of what’s happening on the blockchain. The first is from the head block which is the most recent block created on the chain (every 3 seconds when a new block is created). The second, is from the last irreversible block which is the newest block that has been confirmed by a sufficient number of block producers so that it can no longer be invalidated. This is not a live view but it is normally not far behind the head block number.

        + +

        There is already a javascript tutorial on the devportal describing how to stream blockchain transactions. This recipe will go into further detail on operations on each block and more specifically the virtual operations that are executed with every new block. We will also assume that you have already run through the basic tutorials on the Steem blockchain and will focus more on the specific functions and outputs pertinent to this topic.

        + +

        Steps

        + +
          +
        1. Blocks, transactions and operations
        2. +
        3. Virtual operation streaming
        4. +
        + +

        1. Blocks, transactions and operations

        + +

        In order to stream a block and get the information as will be shown below we use the blockchain api in the dsteem library. The below method has an option parameter mode that defaults to irreversible but can be set to latest which would then return the head block. This means that both types of blocks can be streamed.

        + +
        stream = client.blockchain.getBlockStream();
        +    stream
        +        .on('data', function(block) {
        +            console.log(block);
        +            ...
        +            ...
        +
        + +

        Below is an example of what a block looks like:

        + +
        {
        +  "block_id":"017fa2a9b142cd8d3607b7e7421412402bf97957",
        +  "extensions":[],
        +  "previous":"017fa2a867978140e7553bbfd65396a5a8136d53",
        +  "signing_key":"STM5gBt5xvdb5vhmXjBqfzQ7vwr4hFF5rjmYmZnSbzdb9eWmk9or5",
        +  "timestamp":"2018-08-17T08:31:48",
        +  "transaction_ids": [],
        +  "transaction_merkle_root":"4f0d61928ce9595aec6558fb53f1af1b8de06d78",
        +  "transactions": [],
        +  "witness":"smooth.witness",
        +  "witness_signature":"204e00e747ce75b24fc26b5d18f12992197c61de0bf27c830416761bd25648238239c5eb26a5e392d474e27c601842e2ccf105ffb47f5a5712727412a18f106dbb"
        +}
        +
        + +

        Each block contains transactions:

        + +
        {
        +  "block_num": 25141929,
        +  "expiration": "2018-08-17T08:41:42",
        +  "extensions": [],
        +  "operations": [],
        +  "ref_block_num": 41616,
        +  "ref_block_prefix": 3838737669,
        +  "signatures": ["1f261ccf59131dcd10334a40b8b76bd2e80b05eee1c8deaedb…ebb7e4a4d6e22f7823940248f1488978d4ec8ecbd8abbd88e"],
        +  "transaction_id": "a972aef3388908f8a4b4a8d889fb89c83d2b8eb3",
        +  "transaction_num": 0
        +}
        +
        + +

        And each transaction contains operations:

        + +
        [
        +  "vote", 
        +  {
        +    "author":"skmedia",
        +    "permlink":"buynearn-new-mlm-plan-launched-4th-june-2018-new-mlm-plan-2018-10inr-4-buynearn-online",
        +    "voter":"nazann",
        +    "weight":4700  
        +  }
        +]
        +
        + +

        2. Virtual operation streaming

        + +

        Virtual operations (curation rewards, etc) are derived from blockchain activity, but aren’t actually stored as operations themselves. They happen based on consensus from the blockchain based on other user initiated operations. These virtual operations are NOT available on the head block, so a 100% live feed of this information would not be possible. In order then to follow these operations you would have to stream the last_irreversible_block. To get a feed of virtual operations, each of the block transactions needs to be investigated for the type of the operations.

        + +

        steem-python provides a very simple method to stream virtual or any other operations directly:

        + +
        from steem import Steem
        +from steem.blockchain import Blockchain
        +import pprint
        +s = Steem()
        +b = Blockchain(s)
        +
        +for op in b.stream('author_reward'):
        +    pprint.pprint(op)
        +    # break
        +
        + +

        With result:

        + +
        {
        +  "_id": "11cb40b9283c8a89ed5d8c348cbc68d76a9d8bd3",
        +  "author": "hopehash",
        +  "block_num": 25145619,
        +  "permlink": "hopehash-btc-1-057",
        +  "sbd_payout": "0.000 SBD",
        +  "steem_payout": "2.341 STEEM",
        +  "timestamp": "2018-08-17T17:11:36.18",
        +  "trx_id": "0000000000000000000000000000000000000000",
        +  "type": "author_reward",
        +  "vesting_payout": "4740.455508 VESTS"
        +}
        +
        + +

        From the above example all operations of type “author_reward” will be printed on the console/terminal. You can change the type to which ever operation you want to stream or remove the parameter and stream all operations. The same logic can be followed when using steem-js by isolating the operations of each transaction and looking for the required operation type. Below example is again a modification of the tutorial initially referenced.

        + +
        stream = client.blockchain.getBlockStream();
        +    stream
        +        .on('data', function(block) {
        +            let x = 0
        +            while (x < block.transactions.length) {
        +                if (block.transactions[x].operations[0][0] = 'author_reward') {
        +                    console.log(block.transactions[x].operations[0]);
        +                }
        +                x += 1
        +            }
        +        });
        +
        + +

        That’s all there is to it.

        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/blog_feed.html b/docs/tutorials-ruby/blog_feed.html new file mode 100644 index 00000000..b4d6432f --- /dev/null +++ b/docs/tutorials-ruby/blog_feed.html @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + +RB: Blog Feed | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Blog Feed + + +

        + +

        This example will output blog details to the terminal for the author specified, limited to five results.

        +
        + + +

        Full, runnable src of Blog Feed can be downloaded as part of the RB tutorials repository. +

        + +

        Script

        + +

        The script parses the creation date, assuming Zulu timezone (AKA UTC).

        + +

        The output will be the latest five posts/reblogs for the account specified. If the author is the same as the account specified, it is assumed to be a post by this account. Otherwise, it is assumed to be a reblog.

        + +

        It also counts the words in the content body by splitting the text into an array of strings, delimited by whitespace.

        + +

        Finally, it creates the canonical URL by combining parent_permlink, author, and permlink.

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/01_blog_feed
        +bundle install
        +ruby blog_feed.rb steemitblog
        +
        + +

        Example Output

        + +
        2018-03-24 17:30:36 UTC
        +  Post: Happy 2nd Birthday Steem Blockchain
        +  By: steemitblog
        +  Words: 301
        +  https://steemit.com/steem/@steemitblog/happy-2nd-birthday-steem-blockchain
        +2018-03-07 20:56:36 UTC
        +  Post: Join Team Steemit at TokenFest!
        +  By: steemitblog
        +  Words: 104
        +  https://steemit.com/steemit/@steemitblog/join-team-steemit-at-tokenfest
        +2018-02-27 20:18:36 UTC
        +  Post: Smart Media Token Development
        +  By: steemitblog
        +  Words: 699
        +  https://steemit.com/smt/@steemitblog/smart-media-token-development
        +2018-02-25 20:55:24 UTC
        +  Reblog: I filmed this video of @ned @pkattera and @sneak talking about the SMTs and the future of Steemit
        +  By: ruwan
        +  Words: 89
        +  https://steemit.com/steemit/@ruwan/i-filmed-this-video-of-ned-pkattera-and-sneak-talking-about-the-smts-and-the-future-of-steemit
        +2018-02-22 17:41:00 UTC
        +  Post: STEEM 및 SBD가 GOPAX에 상장되었습니다
        +  By: steemitblog
        +  Words: 317
        +  https://steemit.com/gopax/@steemitblog/steem-sbd-gopa
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/edit_content_patching.html b/docs/tutorials-ruby/edit_content_patching.html new file mode 100644 index 00000000..96d35715 --- /dev/null +++ b/docs/tutorials-ruby/edit_content_patching.html @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + +RB: Edit Content Patching | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Edit Content Patching + + +

        + +
        +
        + + +

        Full, runnable src of Edit Content Patching can be downloaded as part of the RB tutorials repository. +

        + +

        title: How to edit a Post +position: 5 +exclude: true +layout: main-script +description: Patching changes to a post on Steem. +main_script: tutorials-ruby/edit_content_patching.rb +main_type: ruby +main_script_anchor: Script +—

        + +

        Intro

        + +

        This tutorial will show a technique for efficiently editing a post by only broadcasting changes to the post body.

        + +

        Script

        + +

        This script will take an existing post and append a new line by broadcasting a comment operation containing a diff instruction. This instruction will tell the blockchain to append new content to the end of the body of the original comment.

        + +

        Because this is a live example, we set broadcast to false so that it only runs if you modify the example and set broadcast to true.

        + +

        As stated earlier, you will need to change broadcast to true. You can also set other values to test this script on other post:

        + +
          +
        • wif - The posting key of the author.
        • +
        • author - Name of the account that wrote the post we’re modifying.
        • +
        • title - Title of the post.
        • +
        • permlink - Leave this if the permlink is derived from the title or set it to the original permlink if you want to modify the title independently from the permlink.
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/12_edit_content_patching
        +bundle install
        +ruby edit_content_patching.rb
        +
        + +

        Example Output

        + +
        Changes:
        +@@ -26,8 +26,26 @@
        +  edited)
        ++%0AAppended content.
        +{
        +  "jsonrpc": "2.0",
        +  "result": {
        +    "id": "f327acc1c51d907a9ba9bfac70e6fc9e99ab2865",
        +    "block_num": 23035803,
        +    "trx_num": 0,
        +    "expired": false
        +  },
        +  "id": 1
        +}
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/follow_another_user.html b/docs/tutorials-ruby/follow_another_user.html new file mode 100644 index 00000000..60e91abc --- /dev/null +++ b/docs/tutorials-ruby/follow_another_user.html @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + +RB: Follow Another User | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Follow Another User + + +

        + +

        How to follow/unfollow another user.

        +
        + + +

        Full, runnable src of Follow Another User can be downloaded as part of the RB tutorials repository. +

        + +

        This tutorial will take you through the process of following/muting/unfollowing/ummuting an author and checking the follow status of an author.

        + +

        Sections

        + +
          +
        1. Follow
        2. +
        3. Check Follow
        4. +
        5. To Run - Running the example.
        6. +
        + +

        Follow

        + +

        In the first example script, we can modify the initial configuration then run:

        + +
        ruby follow.rb
        +
        + +

        Follows (and mutes) are expressed by custom_json with id=follow (mutes also use id=follow).

        + +

        Example custom_json operation:

        + +
        {
        +  "id": "follow",
        +  "required_auths": [],
        +  "required_posting_auths": ["social"],
        +  "json": "[\"follow\",{\"follower\":\"social\",\"following\":\"alice\",\"what\":[\"blog\"]}]"
        +}
        +
        + +

        To broadcast this operation, use the posting wif and matching account name in required_posting_auths. There are three variables required in the json field of the above operation:

        + +
          +
        1. follower - The specific account that will select the author to follow/unfollow.
        2. +
        3. following - The account/author that the account would like to follow.
        4. +
        5. what - The type of follow operation. This variable can have one of three values: blog to follow an author, ignore to mute, and an empty string to unfollow/unmute.
        6. +
        + +

        Check Follow

        + +

        In the second example script:

        + +
        ruby check_follow.rb
        +
        + +

        The API method we’re using here is condenser.get_following. We pass the name of the account we’re checking. If the account follows more than 1,000 other accounts, we execute condenser.get_following multiple times and pass the last followed account we know about to get the next 1,000 (passing the latest follows.last each time).

        + +

        We also specify blog to tell the API method that we’re looking for followed, not muted (to locate muted accounts, use ignore instead of blog).

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/18_follow_another_user
        +bundle install
        +ruby follow.rb
        +
        + +

        Example Output

        + +
        {
        +  "jsonrpc": "2.0",
        +  "result": {
        +    "id": "025688e27999d3aa514f1f0b77c9f8d8dae31d72",
        +    "block_num": 26349355,
        +    "trx_num": 3,
        +    "expired": false
        +  },
        +  "id": 3
        +}
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_account_comments.html b/docs/tutorials-ruby/get_account_comments.html new file mode 100644 index 00000000..83fd32ca --- /dev/null +++ b/docs/tutorials-ruby/get_account_comments.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + +RB: Get Account Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_account_replies.html b/docs/tutorials-ruby/get_account_replies.html new file mode 100644 index 00000000..a8433a43 --- /dev/null +++ b/docs/tutorials-ruby/get_account_replies.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + +RB: Get Account Replies | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_post_comments.html b/docs/tutorials-ruby/get_post_comments.html new file mode 100644 index 00000000..7174d865 --- /dev/null +++ b/docs/tutorials-ruby/get_post_comments.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + +RB: Get Post Comments | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Get Post Comments + + +

        + +

        This example will output the reply details and totals for the post/comment passed as an argument to the script.

        +
        + + +

        Full, runnable src of Get Post Comments can be downloaded as part of the RB tutorials repository. +

        + +

        Script

        + +

        First, we ask the blockchain for the replies on a post or comment. Then, we grab the authors of those replies and list them, followed by the total comments count.

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/07_get_post_comments
        +bundle install
        +ruby comments_list.rb https://steemit.com/steem/@steemitblog/dev-portal-update-new-steem-developer-resources
        +
        + +

        Example Output

        + +
        Replies by:
        +	shahabshah
        +	mumin007
        +	bigblueleadsled
        +	reseller
        +	latikasha
        +	dannywill
        +	steemitag
        +	sequentialvibe
        +	xplosive
        +	whatsup
        +	evolved08gsr
        +	steevc
        +	mightymicke
        +	marc0o
        +	akintunde
        +	oliverlai
        +	zufrizal
        +	bitcointravel
        +	vsf
        +	badribireuen
        +Total replies: 20
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_post_details.html b/docs/tutorials-ruby/get_post_details.html new file mode 100644 index 00000000..a5e1b308 --- /dev/null +++ b/docs/tutorials-ruby/get_post_details.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + +RB: Get Post Details | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Get Post Details + + +

        + +

        Understand and use the most common fields of the requested content.

        +
        + + +

        Full, runnable src of Get Post Details can be downloaded as part of the RB tutorials repository. +

        + +

        Intro

        + +

        This tutorial fetches the contents of a single post and explains all data related to that post.

        + +

        We will also describe the most commonly used fields from the response object.

        + +

        Sections

        + +
          +
        1. Making the api call - Use steem-rb to a specific post +
            +
          1. Example api call - make the call in code
          2. +
          3. Example api call using script - using our tutorial script
          4. +
          5. Example Output - output from a successful call
          6. +
          +
        2. +
        3. Post Fields - General use of the method to determine … +
            +
          1. parent_author - if the content is a root post or reply
          2. +
          3. last_update and created - if the content has been modified
          4. +
          5. cashout_time - if the content has reached payout
          6. +
          7. beneficiaries - reward routes other accounts
          8. +
          9. active_votes - all votes applied
          10. +
          11. json_metadata - things like tags and app
          12. +
          +
        4. +
        5. Script - Delving into the example script.
        6. +
        7. To Run - Running the example.
        8. +
        + +

        Making the api call

        + +

        To request a specific post we use the get_content method:

        + +
        api = Radiator::Api.new
        +
        +api.get_content(author, permlink) do |content|
        +  # .
        +  # ... your code here
        +  # .
        +end
        +
        + +

        Example api call

        +

        If we want to get the post “announcing-the-steem-developer-portal” by user @steemitdev

        +
        api.get_content("steemitdev", "announcing-the-steem-developer-portal") do |content| ...
        +
        + +

        Example api call using script

        +

        And to do the same with our tutorial script

        +
        ruby get_post_details.rb https://steemit.com/steemdev/@steemitdev/announcing-the-steem-developer-portal
        +
        + +

        Example Output

        + +

        From the example we get the following output from our script

        + +
        Post by steemitdev
        +	title: Announcing the Steem Developer Portal!
        +	permlink: announcing-the-steem-developer-portal
        +	category: steemdev
        +	body_length: 2342 (381 words)
        +	posted at: 2017-10-30T16:34:27, updated at: 2017-10-30T16:34:27, active at: 2018-04-11T10:34:00
        +	children: 66
        +	net_rshares: 0
        +	vote_rshares: 0
        +	payout:
        +		max_accepted_payout: 0.000 SBD
        +		percent_steem_dollars: 100.00 %
        +		payout at: 2017-11-06T16:34:27 (235.2 days ago)
        +		author_rewards: 0.000 SBD
        +		curator_payout_value: 0.000 SBD
        +		total_payout_value: 0.000 SBD
        +	promoted: 0.000 SBD
        +	total_vote_weight: 0
        +	reward_weight: 100.00 %
        +	net_votes: 181, upvotes: 234, downvotes: 1, unvotes: 0, total: 235, top voter: thejohalfiles
        +	allow_replies: true
        +	allow_votes: true
        +	allow_curation_rewards: true
        +	author_reputation: 14487360227924
        +	tags: steemdev, steem, dev
        +	app: steemit/0.1
        +
        + +

        Post fields

        + +

        Most console applications that use the get_content method are probably looking for the body field. But there are many other fields to look at. Let’s break them down by use:

        + +

        parent_author

        + +

        In our script (get_post_details.rb), we use the ruby statement:

        + +
        content.parent_author.empty?
        +
        + +

        With the above idiom, your application can determine if the content is a root post or reply. If it’s empty, then you’re working with a root post, otherwise, it’s a reply.

        + +

        Once you know you’re dealing with a reply, other fields can be useful for additional details. For instance, root_author, root_permlink, and root_title can be used to figure out what the original post details are, even if the reply is deeply nested.

        + +

        last_update and created

        + +

        In our script, we use the ruby statement:

        + +
        content.last_update == content.created
        +
        + +

        With the above idiom, your application can determine if the content has been modified since it was originally posted. If they are the same, then there has been no modification.

        + +

        cashout_time

        + +

        In our script, we use the ruby statement:

        + +
        (cashout = Time.parse(content.cashout_time + 'Z') - Time.now.utc) > 0
        +
        + +

        With the above idiom, you can use cashout_time to determine if the content has reached payout. If cashout_time is in the future, the content has not been paid yet. You can determine the possible future payout by inspecting pending_payout_value.

        + +

        You will note that we must parse the string found in content.cashout_time by appending Z (Zulu Time, aka UTC) in order for Time.parse to get the right timezone.

        + +

        Even before payout, you can determine what the max_accepted_payout is. Most often, this is set to one of two values by the author:

        + +
          +
        • 1000000.000 SBD - Accepted Payout
        • +
        • 0.000 SBD - Declined Payout
        • +
        + +

        In addition to max_accepted_payout, the author may specify how much of the author reward should be in STEEM Power or liquid rewards. The most common settings are:

        + +
          +
        • 10000 - Maximum Liquid Reward
        • +
        • 0 - STEEM Power Only
        • +
        + +

        Once the payout time has arrived, it’s possible to determine the split between author and curation by inspecting at author_rewards and curator_payout_value.

        + +

        beneficiaries

        + +

        In our script, we use the ruby statement:

        + +
        content.beneficiaries.any?
        +
        + +

        Some content will have a beneficiaries array. This is used to determine reward routes any account, up to eight. Payouts are in STEEM Power and are expressed as a reward percentage of the author reward.

        + +

        To display a list of who the beneficiaries are, use the following ruby code, as seen in the example:

        + +
        content.beneficiaries.each do |beneficiary|
        +  puts "\t\t#{beneficiary.account}: #{'%.2f %' % (beneficiary.weight / 100.0)}"
        +end
        +
        + +

        Note, if you just want an array of beneficiary account names, this will work in a pinch:

        + +
        accounts = content.beneficiaries.map do |beneficiary|
        +  beneficiary.account
        +end
        +
        + +

        active_votes

        + +

        In our script, we use the ruby statements:

        + +
        votes = content.active_votes
        +upvotes = votes.select { |v| v.percent > 0 }.size
        +downvotes = votes.select { |v| v.percent < 0 }.size
        +unvotes = votes.select { |v| v.percent == 0 }.size
        +top_voter = votes.sort_by { |v| v.rshares.to_i }.last.voter
        +
        + +

        The above idiom splits all vote types and identifies the top voter. This is because the active_votes field is an array that shows all votes applied to the content, including upvotes, downvotes, and unvotes (where a vote previously cast is revoked).

        + +

        json_metadata

        + +

        In our script, we use the ruby statements:

        + +
        metadata = JSON[content.json_metadata || '{}'] rescue {}
        +tags = metadata['tags'] || []
        +app = metadata['app']
        +
        + +

        As you can see from the above example, json_metadata starts out as a string of JSON that can be parsed to determine things like tags and app. Other data may be present, depending on the application that created the content.

        + +

        Note, we’re using rescue in case the json_metadata string contains invalid JSON because there is no validation performed on this field by the blockchain when content is broadcasted.

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +

        *<content-url>

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/05_get_post_details
        +bundle install
        +ruby get_post_details.rb <content-url>
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_posts.html b/docs/tutorials-ruby/get_posts.html new file mode 100644 index 00000000..95d01dd5 --- /dev/null +++ b/docs/tutorials-ruby/get_posts.html @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + +RB: Get Posts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Get Posts + + +

        + +

        This example will output posts depending on which category is provided as the arguments.

        +
        + + +

        Full, runnable src of Get Posts can be downloaded as part of the RB tutorials repository. +

        + +

        Script

        + +

        Create a filed called get_posts_by_category.rb.

        + +

        This script will pick a method to call based on the arguments passed. The expected categories are:

        + +
          +
        • trending
        • +
        • hot
        • +
        • active
        • +
        • created
        • +
        • votes
        • +
        • promoted
        • +
        • children
        • +
        + +

        We will base the name of the API method to execute on the provided argument. Once we know which method to execute, we can build the query options. The defaults for this script is limit: 10 and tag: ''.

        + +

        For each post we retrieve, we are going to build up a summary to display the interesting fields. In this case, we’re interested in:

        + +
          +
        • Creation Timestamp
        • +
        • Title
        • +
        • Author
        • +
        • Net Votes
        • +
        • Number of replies
        • +
        • If it’s promoted
        • +
        • Number of words in the body
        • +
        • Canonical URL
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/04_get_posts
        +bundle install
        +ruby get_posts_by_category.rb trending 1 steem
        +
        + +

        Example Output

        + +
        2018-05-24 06:38:33 UTC
        +  Post: New Phone App For Steemit - Wow!
        +  By: happymoneyman
        +  Votes: 1087
        +  Replies: 332
        +  Promoted: 0.001 SBD
        +  Words: 190
        +  https://steemit.com/steemit/@happymoneyman/new-phone-app-for-steemit-wow
        +
        + +

        Error Handling

        + +

        We’re checking the result for error in case the remote node has an issue to raise. Normally, it will be nil, but if it’s populated, output error.message and exit.

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/get_voters_list_on_post.html b/docs/tutorials-ruby/get_voters_list_on_post.html new file mode 100644 index 00000000..2753f6ef --- /dev/null +++ b/docs/tutorials-ruby/get_voters_list_on_post.html @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + +RB: Get Voters List On Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Get Voters List On Post + + +

        + +

        This example will output the active vote totals for the post/comment passed as an argument to the script.

        +
        + + +

        Full, runnable src of Get Voters List On Post can be downloaded as part of the RB tutorials repository. +

        + +

        Script

        + +

        First, we ask the blockchain for the active votes on a post or comment. Then, we count the upvotes, downvotes, and unvotes (which are votes that have been removed after being cast in a previous transaction).

        + +

        Then, we sort the votes by rshares to find the top voter.

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/06_get_voters_list_on_post
        +bundle install
        +ruby voter_list.rb https://steemit.com/steemdev/@steemitdev/announcing-the-steem-developer-portal
        +
        + +

        Example Output

        + +
        Upvotes: 231
        +Downvotes: 1
        +Unvotes: 0
        +Total: 232
        +Top Voter: thejohalfiles
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/getting_started.html b/docs/tutorials-ruby/getting_started.html new file mode 100644 index 00000000..ffc44adc --- /dev/null +++ b/docs/tutorials-ruby/getting_started.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + +RB: Getting Started | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Getting Started + + +

        + +

        To access the Steem blockchain using Ruby, install the Radiator gem: https://github.com/inertia186/radiator. Full documentation on Radiator api methods are hosted on rubydoc.info.

        +
        + + +

        Full, runnable src of Getting Started can be downloaded as part of the RB tutorials repository. +

        + +

        Setup

        + +

        The following is a minimal Gemfile for running .rb files in these examples.

        + +

        Add gem 'radiator' to your Gemfile. Then install the gem:

        + +
        bundle install
        +
        + +

        It is also possible to install radiator directly with gem:

        + +
        gem install radiator
        +
        + +

        Then, to execute a script without a Gemfile, add to the top of your .rb files:

        + +
        require 'radiator'
        +
        + +

        Then, use the ruby command with radiator specified:

        + +
        ruby -r radiator myscript.rb
        +
        + +

        Examples

        + +

        The tutorials on this site are available within this site’s repository. To get a copy, clone this repository, change directory to devportal/_includes/tutorials-ruby and do a bundle install to install the required local gems.

        + +

        From there, you can see all of the .rb files referenced on this site.

        + +
        git clone https://github.com/steemit/devportal.git
        +cd devportal/_includes/tutorials-ruby/
        +bundle install
        +
        + +

        Typical-Usage

        + +

        Most methods can be accessed by creating an instance of Radiator::Api. It is also possible to specify a different node by passing a url option.

        + +

        Radiator also internally supports failover by specifying the failover_urls option.

        + +

        To use the defaults:

        + +
        api = Radiator::Api.new
        +
        + +

        To override the url option:

        + +
        api = Radiator::Api.new(url: 'https://rpc.steemliberator.com')
        +
        + +

        To override both url and failover_urls options:

        + +
        options = {
        +  url: 'https://rpc.steemliberator.com',
        +  failover_urls: [
        +    'https://gtg.steem.house:8090',
        +    'https://steemd.minnowsupportproject.org',
        +    'https://steemd.privex.io',
        +  ]
        +}
        +api = Radiator::Api.new(options)
        +
        + +

        Next Step

        + +

        If you’d like to dive right into the first tutorial, have a look at: Blog Feed

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/reblogging_post.html b/docs/tutorials-ruby/reblogging_post.html new file mode 100644 index 00000000..f78aa791 --- /dev/null +++ b/docs/tutorials-ruby/reblogging_post.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + + +RB: Reblogging Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Reblogging Post + + +

        + +

        To reblog (‘resteem’) a post, we can use a custom json operation that is handled by the follow plugin.

        +
        + + +

        Full, runnable src of Reblogging Post can be downloaded as part of the RB tutorials repository. +

        + +

        For this operation, we will use custom_json and a properly formed id and payload so that follow_plugin will pick up the reblog data and display the selected post in the feed of the account doing the reblog.

        + +

        Sections

        + +
          +
        1. Making the api call - broadcasting the operation +
            +
          1. Example api call - make the call in code
          2. +
          3. Example api call using script - using our tutorial script
          4. +
          5. Example Output - output from a successful call
          6. +
          7. Example Error - error output from a unsuccessful call
          8. +
          +
        2. +
        3. Custom JSON Fields - understanding the result
        4. +
        5. To Run - Running the example.
        6. +
        + +

        Making the api call

        + +

        To broadcast the operation, we can use a Radiator::Transaction instance:

        + +
        tx = Radiator::Transaction.new
        +
        +
        +tx.process(true)
        +
        + +

        Passing true to Radiator::Transaction#process will broadcast the operations queued in the operations array of the transaction.

        + +

        Example api call

        + +

        If we want to reblog, we need to form the json properly, for example:

        + +
        data = [
        +  :reblog, {
        +    account: reblogger,
        +    author: author,
        +    permlink: permlink
        +  }
        +]
        +
        +tx.operations << {
        +  type: :custom_json,
        +  id: 'follow',
        +  required_auths: [],
        +  required_posting_auths: [reblogger],
        +  json: data.to_json
        +}
        +
        + +

        Example api call using script

        + +

        And to do the same with our tutorial script:

        + +
        ruby reblogging_post.rb https://steemit.com/@inertia/kinda-spooky
        +
        + +

        Example Output

        + +

        From the example we get the following output from our script:

        + +
        {
        +  "jsonrpc": "2.0",
        +  "result": {
        +    "id": "0aa41e06b2612315d32cadeb671eb1201f266dd7",
        +    "block_num": 24063620,
        +    "trx_num": 19,
        +    "expired": false
        +  },
        +  "id": 3
        +}
        +
        + +

        The response we get after broadcasting the transaction gives us the transaction id (0aa41e0...), block number (24063620), and the transaction number of that block (19).

        + +

        Example Error

        + +

        If a post has already been reblogged by the account, we will get back an error:

        + +
        {
        +  "jsonrpc": "2.0",
        +  "error": {
        +    "code": -32000,
        +    "message": "Assert Exception:blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
        +    "data": {
        +      "code": 10,
        +      "name": "assert_exception",
        +      "message": "Assert Exception",
        +      "stack": [
        +        {
        +          "context": {
        +            "level": "error",
        +            "file": "follow_evaluators.cpp",
        +            "line": 143,
        +            "method": "do_apply",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "blog_itr == blog_comment_idx.end(): Account has already reblogged this post",
        +          "data": {
        +          }
        +        },
        +        {
        +          "context": {
        +            "level": "warn",
        +            "file": "follow_evaluators.cpp",
        +            "line": 216,
        +            "method": "do_apply",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "",
        +          "data": {
        +            "o": {
        +              "account": "social",
        +              "author": "inertia",
        +              "permlink": "kinda-spooky"
        +            }
        +          }
        +        },
        +        {
        +          "context": {
        +            "level": "warn",
        +            "file": "generic_custom_operation_interpreter.hpp",
        +            "line": 195,
        +            "method": "apply",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "",
        +          "data": {
        +            "outer_o": {
        +              "required_auths": [
        +
        +              ],
        +              "required_posting_auths": [
        +                "social"
        +              ],
        +              "id": "follow",
        +              "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
        +            }
        +          }
        +        },
        +        {
        +          "context": {
        +            "level": "warn",
        +            "file": "database.cpp",
        +            "line": 3221,
        +            "method": "_apply_transaction",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "",
        +          "data": {
        +            "op": {
        +              "type": "custom_json_operation",
        +              "value": {
        +                "required_auths": [
        +
        +                ],
        +                "required_posting_auths": [
        +                  "social"
        +                ],
        +                "id": "follow",
        +                "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
        +              }
        +            }
        +          }
        +        },
        +        {
        +          "context": {
        +            "level": "warn",
        +            "file": "database.cpp",
        +            "line": 3227,
        +            "method": "_apply_transaction",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "",
        +          "data": {
        +            "trx": {
        +              "ref_block_num": 12404,
        +              "ref_block_prefix": 1445149887,
        +              "expiration": "2018-07-10T21:43:09",
        +              "operations": [
        +                {
        +                  "type": "custom_json_operation",
        +                  "value": {
        +                    "required_auths": [
        +
        +                    ],
        +                    "required_posting_auths": [
        +                      "social"
        +                    ],
        +                    "id": "follow",
        +                    "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
        +                  }
        +                }
        +              ],
        +              "extensions": [
        +
        +              ],
        +              "signatures": [
        +                "1c063e22868f107dbafaa0452d86cfe19894f2f7fc3ea46b5c73dc7906edcd88244548f001c1d128aa07f862819e80e2f46b6cd74c6769d1d48ef4ad1f147b4dab"
        +              ]
        +            }
        +          }
        +        },
        +        {
        +          "context": {
        +            "level": "warn",
        +            "file": "database.cpp",
        +            "line": 788,
        +            "method": "push_transaction",
        +            "hostname": "",
        +            "timestamp": "2018-07-10T21:33:11"
        +          },
        +          "format": "",
        +          "data": {
        +            "trx": {
        +              "ref_block_num": 12404,
        +              "ref_block_prefix": 1445149887,
        +              "expiration": "2018-07-10T21:43:09",
        +              "operations": [
        +                {
        +                  "type": "custom_json_operation",
        +                  "value": {
        +                    "required_auths": [
        +
        +                    ],
        +                    "required_posting_auths": [
        +                      "social"
        +                    ],
        +                    "id": "follow",
        +                    "json": "[\"reblog\",{\"account\":\"social\",\"author\":\"inertia\",\"permlink\":\"kinda-spooky\"}]"
        +                  }
        +                }
        +              ],
        +              "extensions": [
        +
        +              ],
        +              "signatures": [
        +                "1c063e22868f107dbafaa0452d86cfe19894f2f7fc3ea46b5c73dc7906edcd88244548f001c1d128aa07f862819e80e2f46b6cd74c6769d1d48ef4ad1f147b4dab"
        +              ]
        +            }
        +          }
        +        }
        +      ]
        +    }
        +  },
        +  "id": 3
        +}
        +
        + +

        This indicates that the operation was not included in the blockchain because it was already reblogged in the past.

        + +

        Custom JSON Fields

        + +

        Broadcasting a custom_json operation will require the following fields:

        + +
          +
        • id - set to follow to indicate that this operation is handled by the follow_plugin
        • +
        • required_auths - leave this as an empty JSON Array, we only need the posting authority
        • +
        • required_posting_auths - JSON Array containing the account name with the posting authority
        • +
        • json - the actual payload of the operation, containing a JSON Array: +
            +
          • First element - reblog
          • +
          • Second element - JSON Object containing: +
              +
            • account - account that is doing the reblog op
            • +
            • author - author of the post being reblogged
            • +
            • permlink - permlink of the post being reblogged
            • +
            +
          • +
          +
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
          +
        • <url>
        • +
        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/14_reblogging_post
        +bundle install
        +ruby reblogging_post.rb <url>
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/search_accounts.html b/docs/tutorials-ruby/search_accounts.html new file mode 100644 index 00000000..651214a0 --- /dev/null +++ b/docs/tutorials-ruby/search_accounts.html @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + +RB: Search Accounts | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Search Accounts + + +

        + +

        Performing a search on account by names starting with a given input.

        +
        + + +

        Full, runnable src of Search Accounts can be downloaded as part of the RB tutorials repository. +

        + +

        This tutorial will return account names matching the input given, up to a specified limit.

        + +

        Sections

        + +
          +
        1. Making the api call - performing the lookup +
            +
          1. Example api call - make the call in code
          2. +
          3. Example api call using script - using our tutorial script
          4. +
          5. Example Output - output from a successful call
          6. +
          +
        2. +
        3. To Run - Running the example.
        4. +
        + +

        Making the api call

        + +

        To request the a list of accounts starting with a particular lookup pattern, we can use the lookup_accounts method:

        + +
        api = Radiator::Api.new
        +
        +api.lookup_accounts(lower_bound_name, limit) do |accounts|
        +  puts accounts.join(' ')
        +end
        +
        + +

        Notice, the above example can request up to 1000 accounts as an array.

        + +

        Example api call

        + +

        If we want to get the accounts starting with “alice” …

        + +
        api.lookup_accounts("alice", 10) do |content| ...
        +
        + +

        Example api call using script

        + +

        And to do the same with our tutorial script, which has its own default limit of 10:

        + +
        ruby search_accounts.rb alice
        +
        + +

        Example Output

        + +

        From the example we get the following output from our script:

        + +
        alice alice-22 alice-is alice-labardo alice-mikhaylova alice-n-chains alice-radster alice-sandra alice-thuigh alice-way
        +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
          +
        • <lower-bound-name>
        • +
        • [limit] (optional)
        • +
        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/15_search_accounts
        +bundle install
        +ruby search_accounts.rb <lower-bound-name> [limit]
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/search_tags.html b/docs/tutorials-ruby/search_tags.html new file mode 100644 index 00000000..2111aa1e --- /dev/null +++ b/docs/tutorials-ruby/search_tags.html @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + +RB: Search Tags | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Search Tags + + +

        + +

        Performing a search for tags.

        +
        + + +

        Full, runnable src of Search Tags can be downloaded as part of the RB tutorials repository. +

        + +

        This tutorial will return tags sorted by trending, up to a specified limit.

        + +

        Sections

        + +
          +
        1. Making the api call - performing the lookup +
            +
          1. Example api call - make the call in code
          2. +
          3. Example api call using script - using our tutorial script
          4. +
          5. Example Output - output from a successful call
          6. +
          7. Tag Fields - details of fields returned
          8. +
          +
        2. +
        3. To Run - Running the example.
        4. +
        + +

        Making the api call

        + +

        To request the a list of tags, we can use the get_trending_tags method:

        + +
        api = Radiator::Api.new
        +
        +api.get_trending_tags(nil, 100) do |tags|
        +  puts tags
        +end
        +
        + +

        Notice, the above example can request up to 100 tags as an array.

        + +

        Example api call

        + +

        If we want to get 10 tags starting from the tag named “music” …

        + +
        api.get_trending_tags("music", 10) do |content| ...
        +
        + +

        Example api call using script

        + +

        And to do the same with our tutorial script, which has its own default limit of 10. Internally, the api method only allows at most 100 results, so this tutorial will paginate the results to go beyond 100:

        + +
        ruby search_tags.rb
        +
        + +

        Example Output

        + +

        From the example we get the following output from our script:

        + +
        tag: <empty>, total_payouts: 57513246.041 SBD, net_votes: 47471936, top_posts: 4523493, comments: 27287924, trending: 100430269400
        +tag: life, total_payouts: 12563434.550 SBD, net_votes: 10898489, top_posts: 1193059, comments: 1164873, trending: 7440962326
        +tag: photography, total_payouts: 7529111.644 SBD, net_votes: 8578110, top_posts: 819008, comments: 1498469, trending: 7311205387
        +tag: kr, total_payouts: 2953387.067 SBD, net_votes: 749380, top_posts: 79842, comments: 2138776, trending: 7009078414
        +tag: steemit, total_payouts: 8531217.920 SBD, net_votes: 5393375, top_posts: 580400, comments: 1156174, trending: 5471456871
        +tag: art, total_payouts: 4017591.434 SBD, net_votes: 3577651, top_posts: 330597, comments: 716566, trending: 3302526197
        +tag: bitcoin, total_payouts: 3556944.650 SBD, net_votes: 2885034, top_posts: 416088, comments: 625529, trending: 3284115413
        +tag: introduceyourself, total_payouts: 1863437.063 SBD, net_votes: 725570, top_posts: 24891, comments: 986875, trending: 3185017448
        +tag: spanish, total_payouts: 1221282.258 SBD, net_votes: 2683931, top_posts: 154983, comments: 827033, trending: 3103643123
        +tag: travel, total_payouts: 3976626.578 SBD, net_votes: 2505962, top_posts: 229401, comments: 622754, trending: 2687292306
        +
        + +

        Tag fields

        + +

        Tags in the results of get_trending_tags returns the following fields:

        + +
          +
        • name - Name of the tag or empty.
        • +
        • total_payouts - Rewards paid in this tag.
        • +
        • net_votes - Net votes in this tag.
        • +
        • top_posts - Top votes in this tag.
        • +
        • comments - Number of comments in this tag.
        • +
        • trending - Total trending.
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
          +
        • [limit] (optional)
        • +
        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/16_search_tags
        +bundle install
        +ruby search_tags.rb [limit]
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/stream_blockchain_transactions.html b/docs/tutorials-ruby/stream_blockchain_transactions.html new file mode 100644 index 00000000..507d7cc2 --- /dev/null +++ b/docs/tutorials-ruby/stream_blockchain_transactions.html @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + +RB: Stream Blockchain Transactions | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Stream Blockchain Transactions + + +

        + +

        How to stream transactions and operations from Steem blockchain.

        +
        + + +

        Full, runnable src of Stream Blockchain Transactions can be downloaded as part of the RB tutorials repository. +

        + +

        To respond to live activity on the blockchain, a common approach is to make a request for the current block number, access all of the information in that block, and repeat. Many API clients have dedicated tools for simplifying this process. In Radiator, this tool is part of the Radiator::Stream class. In addition, Radiator will allow you to specify exactly what type of operation you’re interested in.

        + +

        Sections

        + +
          +
        1. Streaming Transactions
        2. +
        3. Streaming Operations
        4. +
        5. To Run - Running the example.
        6. +
        + +

        Streaming Transactions

        + +

        In the example script, we can stream transactions with the following arguments:

        + +
        ruby stream_blockchain_transactions.rb head transactions
        +
        + +

        This will instruct the script to follow transactions at head block_num instead of irreversible.

        + +

        See: head_block_number vs. last_irreversible_block_num

        + +

        This is done by using the following ruby:

        + +
        stream.transactions(*args) do |trx|
        +  puts JSON.pretty_generate trx
        +end
        +
        + +

        The args variable contains the start (block_num to start from) and mode (head or irreversible).

        + +

        Streaming Operations

        + +

        In the example script, we can also pass the following arguments:

        + +
        ruby stream_blockchain_transactions.rb head ops comment
        +
        + +

        This will instruct the script to follow the blockchain at head block_num instead of irreversible. It will stream operations, with the type of comment.

        + +

        The script will allow multiple operation types:

        + +
        ruby stream_blockchain_transactions.rb head ops comment vote
        +
        + +

        Virtual operations are also allowed, but make sure to pass irreversible instead of head:

        + +
        ruby stream_blockchain_transactions.rb irreversible ops producer_reward author_reward
        +
        + +

        Or, if you pass no operation types, the script will stream all types:

        + +
        ruby stream_blockchain_transactions.rb head ops
        +
        + +

        This is done by using the following ruby:

        + +
        stream.operations(type, *args) do |op|
        +  puts op.to_json
        +end
        +
        + +

        The type variable can be nil or the type of ops we’re looking for whereas args contains the start (block_num to start from) and mode (head or irreversible).

        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/13_stream_blockchain_transactions
        +bundle install
        +ruby stream_blockchain_transactions.rb
        +
        + +

        Example Output

        + +
        {"voter":"piggypet","author":"tanama","permlink":"daily-2018-9-12","weight":10000}
        +{"voter":"votes4minnows","author":"askquestion","permlink":"latest-bitcoin-price-and-news-update-13-09-2018","weight":250}
        +{"voter":"vncedora2018","author":"adncabrera","permlink":"nicomedescuentalacadadelreytanospoema-98jxnjsjzu","weight":10000}
        +{"voter":"baimatjeh81","author":"albertvhons","permlink":"promoting-steemit-post-via-proof-of-participation-pop","weight":10000}
        +{"voter":"steemulator","author":"bonanza-kreep","permlink":"communicate-and-travel-with-alfa-enzo-new-social-network","weight":10000}
        +{"voter":"kernigeetrueset","author":"haejin","permlink":"vitamin-shoppe-vsi-analysis","weight":10000}
        +{"voter":"borrowedearth","author":"rijalmahyud","permlink":"this-is-my-job","weight":10000}
        +{"voter":"renatdag","author":"algarion","permlink":"cards-3-1536663927","weight":10000}
        +{"voter":"elieserurabno","author":"cathyhaack","permlink":"my-introduction-hello-word-of-steemit","weight":10000}
        +{"voter":"jmotip","author":"glennolua","permlink":"btc-chart-review-sept-12-20-00-pst","weight":10000}
        +{"voter":"bishalacharya","author":"barber78","permlink":"beautiful-cloudformations","weight":10000}
        +{"voter":"ivan174","author":"securixio","permlink":"cloud-mining-is-no-longer-profitable","weight":10000}
        +{"voter":"admiralbot","author":"homsys","permlink":"rare-photo-picture-698-105","weight":-10000}
        +
        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/submit_comment_reply.html b/docs/tutorials-ruby/submit_comment_reply.html new file mode 100644 index 00000000..35566777 --- /dev/null +++ b/docs/tutorials-ruby/submit_comment_reply.html @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + +RB: Submit Comment Reply | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Submit Comment Reply + + +

        + +

        By the end of this tutorial you should know how to prepare comments for Steem and then submit using Radiator.

        +
        + + +

        Full, runnable src of Submit Comment Reply can be downloaded as part of the RB tutorials repository. +

        + +

        Intro

        + +

        This example will broadcast a reply to the blockchain using the values provided. To create a post in ruby, we will use a Radiator::Transaction containing a comment operation, which is how all content is stored internally.

        + +

        A reply is differentiated from a post by whether or not a parent_author exists. When there is no parent_author, then it’s a post, otherwise it’s a comment (like in this example).

        + +

        Script

        + +

        You should change wif to the posting key that matches your author. This script will pass along the values as a comment operation:

        + +
          +
        • author - Account name of the author currently replying.
        • +
        • permlink - Value unique to the author
        • +
        • parent_author - The name of the author of the being replied to, in the case of a reply like this example.
        • +
        • parent_permlink - The permlink of the content being replied to, in the case of a reply like this example.
        • +
        • title - Typically empty.
        • +
        • body - The actual content of the post.
        • +
        • json_metadata - JSON containing the parent_permlink of the root post as a tags array.
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/11_submit_comment_reply
        +bundle install
        +ruby submit_comment_reply.rb
        +
        + +

        Example Output

        + +
        {
        +  "jsonrpc": "2.0",
        +  "result": {
        +    "id": "3fef14cac921e9baa7b31e43245e5380f3fb4332",
        +    "block_num": 23355115,
        +    "trx_num": 13,
        +    "expired": false
        +  },
        +  "id": 3
        +}
        +
        + +

        The response we get after broadcasting the transaction gives us the transaction id (3fef14c...), block number (22867626), and the transaction number of that block (13).

        + +

        Error Handling

        + +

        We’re checking the result for error in case the remote node has an issue to raise. Normally, it will be nil, but if it’s populated, output error.message and exit.

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials-ruby/submit_post.html b/docs/tutorials-ruby/submit_post.html new file mode 100644 index 00000000..4fb02348 --- /dev/null +++ b/docs/tutorials-ruby/submit_post.html @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + +RB: Submit Post | Steem Developer + + + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        +

        + + RB: Submit Post + + +

        + +

        This example will broadcast a new post to the blockchain using the values provided. To create a post in ruby, we will use a Radiator::Transaction containing a comment operation, which is how all content is stored internally.

        +
        + + +

        Full, runnable src of Submit Post can be downloaded as part of the RB tutorials repository. +

        + +

        A post is differentiated from a comment by whether or not a parent_author exists. When there is no parent_author, then it’s a post, otherwise it’s a comment.

        + +

        Script

        + +

        You should change wif to the posting key that matches your author. This script will pass along the values as a comment operation:

        + +
          +
        • author - Account name of the author currently posting.
        • +
        • permlink - Value unique to the author
        • +
        • parent_author - An empty string, in the case of a root post like this example.
        • +
        • parent_permlink - The first tag, in the case of a root post like this example.
        • +
        • title - Human readable title.
        • +
        • body - The actual content of the post.
        • +
        • json_metadata - JSON containing all of the tags.
        • +
        + +

        To Run

        + +

        First, set up your workstation using the steps provided in Getting Started. Then you can create and execute the script (or clone from this repository):

        + +
        git clone git@github.com:steemit/devportal-tutorials-rb.git
        +cd devportal-tutorials-rb/tutorials/10_submit_post
        +bundle install
        +ruby submit_a_new_post.rb
        +
        + +

        Example Output

        + +
        {
        +  "jsonrpc": "2.0",
        +  "result": {
        +    "id": "768f7f64cee94413da0017ef79f592bb4da86baf",
        +    "block_num": 22867626,
        +    "trx_num": 43,
        +    "expired": false
        +  },
        +  "id": 1
        +}
        +
        + +

        The response we get after broadcasting the transaction gives us the transaction id (768f7f6...), block number (22867626), and the transaction number of that block (43).

        + +

        Error Handling

        + +

        We’re checking the result for error in case the remote node has an issue to raise. Normally, it will be nil, but if it’s populated, output error.message and exit.

        + +
        + +
        + +
        + + + + + + + + diff --git a/docs/tutorials/index.html b/docs/tutorials/index.html new file mode 100644 index 00000000..eb73dc91 --- /dev/null +++ b/docs/tutorials/index.html @@ -0,0 +1,891 @@ + + + + + + + + + + + + + + + + + + +Tutorials | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal - Tutorials

        + + + +
        + +
        +
        +

        Read, play, and learn Steem.

        + + + + + + +

        Javascript

        +
          + + +
        • + JS: Getting Started +

          Prepare your development environment to use Javascript with the Steem blockchain.

          +
          +
        • + +
        • + JS: Blog Feed +

          By the end of this tutorial you should know how to fetch most recent five posts from particular user on Steem.

          +
          +
        • + +
        • + JS: Steemconnect +

          Understand the basics of using Steemconnect with your Steem application.

          +
          +
        • + +
        • + JS: Client Signing +

          By the end of this tutorial you would know how to sign, verify broadcast transactions locally on Steem.

          +
          +
        • + +
        • + JS: Get Posts +

          Query for the most recent posts having a specific tag, using a Steem filter

          +
          +
        • + +
        • + JS: Get Post Details +

          By the end of this tutorial you would know how to get post details and use them appropriately.

          +
          +
        • + +
        • + JS: Get Voters List On Post +

          By the end of this tutorial you would know how to get voters list on any content.

          +
          +
        • + +
        • + JS: Get Post Comments +

          By the end of this tutorial you would know how to get comments made by others on any post.

          +
          +
        • + +
        • + JS: Get Account Replies +

          By the end of this tutorial you would know how to get replies made on particular account’s content.

          +
          +
        • + +
        • + JS: Get Account Comments +

          By the end of this tutorial you should know how to retrieve account comments from the steem blockchain

          +
          +
        • + +
        • + JS: Submit Post +

          By the end of this tutorial you should know how to prepare comments for Steem and then submit using the broadcast.comment function.

          +
          +
        • + +
        • + JS: Submit Comment Reply +

          By the end of this tutorial you should know how to post a simple comment to Steem.

          +
          +
        • + +
        • + JS: Edit Content Patching +

          By the end of this tutorial you should know how to patch post edits to Steem.

          +
          +
        • + +
        • + JS: Stream Blockchain Transactions +

          By the end of this tutorial you should know how to stream transactions and blocks from Steem blockchain.

          +
          +
        • + +
        • + JS: Reblogging Post +

          By the end of this tutorial you should know how to reblog (resteem) a blog from steem

          +
          +
        • + +
        • + JS: Search Accounts +

          By the end of this tutorial you should know how to call a list of user names from the steem blockchain

          +
          +
        • + +
        • + JS: Search Tags +

          By the end of this tutorial you should know how to run a search for trending tags

          +
          +
        • + +
        • + JS: Vote On Content +

          Create a weighted up or down vote on a comment/post.

          +
          +
        • + +
        • + JS: Follow A User +

          Follow and unfollow a user / author.

          +
          +
        • + +
        • + JS: Get Follower And Following List +

          Get the followers of a user/author & the authors that user is following.

          +
          +
        • + +
        • + JS: Account Reputation +

          Learn how to interpret account reputation.

          +
          +
        • + +
        • + JS: Transfer Steem And Sbd +

          Transfer both STEEM and SBD from one account to another.

          +
          +
        • + +
        • + JS: Witness Listing And Voting +

          Create a list of available witnesses as well as vote for and remove your vote for a witness.

          +
          +
        • + +
        • + JS: Claim Rewards +

          Learn how to claim rewards from unclaimed reward balance using Steemconnect as well as client signing method.

          +
          +
        • + +
        • + JS: Power Up Steem +

          Power up an account’s Steem using either Steemconnect or a client-side signing.

          +
          +
        • + +
        • + JS: Power Down +

          Perform a power down on all or part of an account’s VESTS using either Steemconnect or client-side signing.

          +
          +
        • + +
        • + JS: Create Account +

          Create Steem account using Steemconnect as well as with client-side signing.

          +
          +
        • + +
        • + JS: Delegate Power +

          Delegate power to other users using Steemconnect or Client-side signing.

          +
          +
        • + +
        • + JS: Set Withdraw Route +

          Set routes to an account’s power downs or withdraws.

          +
          +
        • + +
        • + JS: Get Delegations By User +

          View the vesting delegations made by a user as well as the delegations that are expiring.

          +
          +
        • + +
        • + JS: Grant Posting Permission +

          How to grant and revoke posting permission to another user.

          +
          +
        • + +
        • + JS: Grant Active Permission +

          How to grant and revoke active permission to another user.

          +
          +
        • + +
        • + JS: Convert Sbd To Steem +

          How to convert SBD to STEEM for a specified account.

          +
          +
        • + +
        • + JS: Get State Replacement Api +

          This is a list of replacement API calls for each of the different routes available from the getState function.

          +
          +
        • + +
        + + + + + +

        Python

        +
          + + +
        • + PY: Getting Started +

          The official Steem library for Python is steem-python. It comes with a BIP38 encrypted wallet and a practical CLI utility called steempy.

          +
          +
        • + +
        • + PY: Using Keys Securely +

          Learn how Steem-Python library handles transaction signing with user’s key and how to securely manage your private keys.

          +
          +
        • + +
        • + PY: Get Posts +

          Tutorial pulls a list of the posts from the blockchain with selected filter and tag then displays output.

          +
          +
        • + +
        • + PY: Get Post Details +

          Get post details from list of posts from the blockchain with created filter and tag then display selected post details.

          +
          +
        • + +
        • + PY: Get Voters List On Post +

          Voters list and detail of each vote on selected content.

          +
          +
        • + +
        • + PY: Get Post Comments +

          Fetch comments made on each content or post using Python.

          +
          +
        • + +
        • + PY: Get Account Replies +

          List of replies received by account to its content, post, comment.

          +
          +
        • + +
        • + PY: Get Account Comments +

          Fetch list of comments made by account on posts or comments.

          +
          +
        • + +
        • + PY: Submit Post +

          How to submit post on Steem blockchain using Python.

          +
          +
        • + +
        • + PY: Submit Comment Reply +

          How to submit a comment on a post to the Steem blockchain.

          +
          +
        • + +
        • + PY: Edit Content Patching +

          How to edit post content with diff_match_patch using Python.

          +
          +
        • + +
        • + PY: Stream Blockchain Transactions +

          How to stream transactions on the live Steem blockchain

          +
          +
        • + +
        • + PY: Reblogging Post +

          We will show how to reblog or resteem post using Python, with username and posting private key.

          +
          +
        • + +
        • + PY: Search Accounts +

          How to pull a list of the active user accounts or trending tags from the blockchain using Python.

          +
          +
        • + +
        • + PY: Search Tags +

          How to pull a list of the trending tags from the blockchain using Python.

          +
          +
        • + +
        • + PY: Vote On Content +

          How to vote on a post/comment using Python.

          +
          +
        • + +
        • + PY: Follow A User +

          How to follow or unfollow an author using Python.

          +
          +
        • + +
        • + PY: Get Follower And Following List +

          Tutorial pulls a list of the followers or authors being followed from the blockchain then displays the result.

          +
          +
        • + +
        • + PY: Account Reputation +

          Would you like to know how to interpret account reputation to more human readable format, then this tutorial is for you.

          +
          +
        • + +
        • + PY: Transfer Steem And Sbd +

          How to transfer STEEM and SBD to another account using Python.

          +
          +
        • + +
        • + PY: Witness Listing And Voting +

          How to vote for or remove a vote for a witness user using Python.

          +
          +
        • + +
        • + PY: Claim Rewards +

          How to claim rewards using Python.

          +
          +
        • + +
        • + PY: Power Up Steem +

          How to power up your STEEM to STEEM POWER using Python.

          +
          +
        • + +
        • + PY: Power Down +

          How to power down (withdraw) your vesting shares using Python.

          +
          +
        • + +
        • + PY: Delegate Power +

          How to delegate or remove delegation of STEEM POWER to another user using Python.

          +
          +
        • + +
        • + PY: Get Delegations By User +

          How to get a list of active or expiring vesting delegations using Python.

          +
          +
        • + +
        • + PY: Grant Posting Permission +

          How to give another user posting permission on your account using Python.

          +
          +
        • + +
        • + PY: Grant Active Permission +

          How to give another user active permission on your account using Python.

          +
          +
        • + +
        • + PY: Password Key Change +

          How to change your accounts password and keys

          +
          +
        • + +
        + + + + + +

        Ruby

        +
          + + +
        • + RB: Getting Started +

          To access the Steem blockchain using Ruby, install the Radiator gem: https://github.com/inertia186/radiator. Full documentation on Radiator api methods are hosted on rubydoc.info.

          +
          +
        • + +
        • + RB: Blog Feed +

          This example will output blog details to the terminal for the author specified, limited to five results.

          +
          +
        • + +
        • + RB: Get Posts +

          This example will output posts depending on which category is provided as the arguments.

          +
          +
        • + +
        • + RB: Get Post Details +

          Understand and use the most common fields of the requested content.

          +
          +
        • + +
        • + RB: Get Voters List On Post +

          This example will output the active vote totals for the post/comment passed as an argument to the script.

          +
          +
        • + +
        • + RB: Get Post Comments +

          This example will output the reply details and totals for the post/comment passed as an argument to the script.

          +
          +
        • + +
        • + RB: Get Account Replies +

          Fetching the replies written to a particular account.

          +
          +
        • + +
        • + RB: Get Account Comments +

          Fetching the comments written by a particular account.

          +
          +
        • + +
        • + RB: Submit Post +

          This example will broadcast a new post to the blockchain using the values provided. To create a post in ruby, we will use a Radiator::Transaction containing a comment operation, which is how all content is stored internally.

          +
          +
        • + +
        • + RB: Submit Comment Reply +

          By the end of this tutorial you should know how to prepare comments for Steem and then submit using Radiator.

          +
          +
        • + +
        • + RB: Edit Content Patching +
          +
          +
        • + +
        • + RB: Stream Blockchain Transactions +

          How to stream transactions and operations from Steem blockchain.

          +
          +
        • + +
        • + RB: Reblogging Post +

          To reblog (‘resteem’) a post, we can use a custom json operation that is handled by the follow plugin.

          +
          +
        • + +
        • + RB: Search Accounts +

          Performing a search on account by names starting with a given input.

          +
          +
        • + +
        • + RB: Search Tags +

          Performing a search for tags.

          +
          +
        • + +
        • + RB: Follow Another User +

          How to follow/unfollow another user.

          +
          +
        • + +
        + + + + + +

        Recipes

        + + + + +
        +
        + +
        + + + + + + + + diff --git a/docs/unused/accounts.md b/docs/unused/accounts.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/authority_and_validation.md b/docs/unused/authority_and_validation.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/blocks_and_transactions.md b/docs/unused/blocks_and_transactions.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/community.html b/docs/unused/community.html new file mode 100644 index 00000000..09193fe3 --- /dev/null +++ b/docs/unused/community.html @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + +Community | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Steemdata

        + +

        Mongo database for accessing steem data.

        + +
        Host: mongo0.steemdata.com
        +Port: 27017
        +
        +Database: Steem
        +Username: steemit
        +Password: steemit
        +
        + +

        Official site: steemdata

        + +

        SteemSQL

        + +

        Microsoft SQL database for accessing steem data

        + +

        Official site: steemsql

        + +
        + + + + + + + + diff --git a/docs/unused/database_api.html b/docs/unused/database_api.html new file mode 100644 index 00000000..199078a6 --- /dev/null +++ b/docs/unused/database_api.html @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + +Database API | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Subscription examples

        + +
        steem.api.setSubscribeCallback(callback, clearFilter, function(err, result) {
        +  console.log(err, result);
        +});
        +
        + +
        steem.api.setPendingTransactionCallback(cb, function(err, result) {
        +  console.log(err, result);
        +});
        +
        + +
        steem.api.setBlockAppliedCallback(cb, function(err, result) {
        +  console.log(err, result);
        +});
        +
        + +
        steem.api.cancelAllSubscriptions(function(err, result) {
        +  console.log(err, result);
        +});
        +
        + +
        + + + + + + + + diff --git a/docs/unused/docker.html b/docs/unused/docker.html new file mode 100644 index 00000000..35a182ed --- /dev/null +++ b/docs/unused/docker.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + +Docker | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Just want to get up and running quickly? Try deploying a pre-built dockerized container. Both common binary types are included.

        + +

        Just want to get up and running quickly? Try deploying a pre-built +dockerized container. Both common binary types are included.

        + +

        Dockerized p2p Node

        + +

        To run a p2p node (ca. 2GB of memory is required at the moment):

        + +
        docker run \
        +    -d -p 2001:2001 -p 8090:8090 --name steemd-default \
        +    steemit/steem
        +
        +docker logs -f steemd-default  # follow along
        +
        + +

        Dockerized Full Node

        + +

        To run a node with all the data (e.g. for supporting a content website) +that uses ca. 14GB of memory and growing:

        + +
        docker run \
        +    --env USE_WAY_TOO_MUCH_RAM=1 \
        +    -d -p 2001:2001 -p 8090:8090 --name steemd-full \
        +    steemit/steem
        +
        +docker logs -f steemd-full
        +
        + +

        Seed Nodes

        + +

        A list of some seed nodes to get you started can be found in +doc/seednodes.txt.

        + +

        This same file is baked into the docker images and can be overridden by +setting STEEMD_SEED_NODES in the container environment at docker run +time to a whitespace delimited list of seed nodes (with port).

        + +
        + + + + + + + + diff --git a/docs/unused/globals.md b/docs/unused/globals.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/keys.md b/docs/unused/keys.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/market.md b/docs/unused/market.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/unused/steemd.html b/docs/unused/steemd.html new file mode 100644 index 00000000..891557f5 --- /dev/null +++ b/docs/unused/steemd.html @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + +Steemd | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        + + +
        + + + + + + + + diff --git a/docs/unused/tags.html b/docs/unused/tags.html new file mode 100644 index 00000000..a523d672 --- /dev/null +++ b/docs/unused/tags.html @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + +Tags | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +

        Tags examples

        + +
        steem.api.setSubscribeCallback(callback, clearFilter, function(err, result) {
        +  console.log(err, result);
        +});
        +
        + +
        + + + + + + + + diff --git a/docs/unused/tutorials.html b/docs/unused/tutorials.html new file mode 100644 index 00000000..3222f747 --- /dev/null +++ b/docs/unused/tutorials.html @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + +Tutorials | Steem Developer + + + + + + + + + + + + + + + +
        +

        + + Steem Developer logo +

        + + +
        + + +
        + + + + + + + + + + + +
        +
        +
        +

        Steem Developer Portal

        + + + +
        +
        steem-py examples
        +

        Install steem-py:

        + +
        $ sudo apt-get install libffi-dev libssl-dev python-dev python3-pip
        +$ pip3 install steem
        +
        + +
        Auto Reply Bot
        +

        The most easy auto-reply bot can be coded with just a few lines of code:

        + +
        Block Stream
        +

        This module allows to stream blocks and individual operations from the blockchain and run bots with a minimum of code. +This example code shows all comments starting at block 1893850.

        + +
        Operation Stream
        +

        Example for operation Stream:

        + +
        Decentralized Exchange
        +

        Example for decentralized exchange:

        + +
        from steem import Steem
        +import os
        +import json
        +steem = Steem(wif="<posting-key-for-default-author>")
        +for c in steem.stream_comments():
        +if "Anything you want" in c["body"]:
        +    print(c.reply(".. anything you want"))
        +
        + +
        from steem.blockchain import Blockchain
        +from pprint import pprint
        +
        +for a in blockchain.blocks()
        +    pprint(a)
        +
        + +
        from steem.blockchain import Blockchain
        +from pprint import pprint
        +
        +for a in blockchain.ops()
        +    pprint(a)
        +
        + +
        from pprint import pprint
        +from steem import Steem
        +from steem.dex import Dex
        +
        +steem = Steem()
        +dex = Dex(steem)
        +pprint(dex.buy(10, "SBD", 100))
        +pprint(dex.sell(10, "SBD", 100))
        +pprint(dex.cancel("24432422"))
        +pprint(dex.returnTicker())
        +pprint(dex.return24Volume())
        +pprint(dex.returnOrderBook(2))
        +pprint(dex.ws.get_order_book(10, api="market_history"))
        +pprint(dex.returnTradeHistory())
        +pprint(dex.returnMarketHistoryBuckets())
        +pprint(dex.returnMarketHistory(300))
        +pprint(dex.get_lowest_ask())
        +pprint(dex.get_higest_bid())
        +pprint(dex.transfer(10, "SBD", "fabian", "foobar"))
        +
        + + +
        + + + + + + + + -- GitLab