SteemAX 1.2 ~ New Features: Ratio Slider & Instant Invites



SteemAX helps minnow content-creators and whale curators

by automating an exchange of upvotes between their quality blog posts, allowing both a 1 to 1 as well as disproportional exchanges that grant bigger curations, better support than a bid bot, and the long-term support they both deserve.

SteemAX 1.2 Has Several New Features

While some of the pages for SteemAX wait to get a face-lift (which they sorely need) a couple of new features have been added as well as the fixing of some critical bugs.

Optimized Exchanges

The exchange process has now been optimized, which now runs much faster and is much less consuming on node resources. Instead of fetching an account's information for each exchange (silly, I know), the information for each account's most recent post and vote history for that post are stored in a dictionary during runtime. Because SteemAX ensures that it does not broadcast a vote if a vote has already been cast, by storing the vote history SteemAX can search to see if a post has already been voted on much more quickly.

To do this the verify_post method was modified to check the dictionary named self.post_list for a record: if the record doesn't exist, fetch it, use it, then add it; if it does just use it.

    def verify_post(self, account1, account2):
        """ Gets only the most recent post, gets the 
        timestamp and finds the age of the post in days.
        Is the post too old? Did account2 
        vote on the post already?
        from_memory = False
        if account1 in self.post_list:
            identifier = self.post_list[account1]["id"]
            from_memory = True
            identifier = self.steem.recent_post(account1, 0, 1)
            self.post_list[account1] = {"id":identifier,"votes":None}
        if identifier is False or identifier is None:
            self.msg.message("No post for " + account1)
            return False
            permlink = self.steem.util.permlink(identifier)
            if from_memory:
                votes = self.post_list[account1]["votes"]
                votes = self.steem.vote_history(permlink[1], account1)
                self.post_list[account1]["votes"] = votes
            if votes is not None and len(votes) > 0:
                for v in votes:
                    if v['voter'] == account2:
                        self.msg.message(account2 +
                                    " has already voted on " + permlink[1])
                        return False
        return permlink[1]


Instantly Send Invites

The SteemAX website only allows a user to create an invite. To send the invite the user must enter the memo id and steemax command into the memo field and send $0.001 SBD or more to @steem-ax. SteemAX was designed this way because:

  • The only polite way to send a message to another Steemian on the blockchain is via the memo field when sending funds.
  • Requiring a monetary send deters spammers from using SteemAX to gain exchanges for spam accounts.
  • SteemAX only has permission to vote on behalf of your account, and never has permission to transfer funds.

However, although this is good for security and courtesy, it's not necessarily a good user experience. To make it easier for the user, a button was added to the exchange information box (seen on that allows the memo id and command to be sent directly from SteemAX using Steem Connect. This new button can be seen when the user clicks either "Accept", "Cancel" and after a new barter has been created using the "Barter" button. Not only does this make it easier for the user to send their invite, but it also ensures the correct command is being sent to the correct account (@steem-ax).


The link to Steem Connect must include the correct SteemAX command, which depends on what is in the memo id reveal box at the time. Javascript was used to append the appropriate values together into the Steem Connect hot signing URL.

function sendSbdToSteemax(account, id) {

    // Filter input
    regex = new RegExp('[^A-Za-z0-9\\:\\.]', 'g');

    // Get the memoid and command from the reveal box
    var memoid = document.getElementById("memoid"+id).value.replace(regex, '');

    // Create the hot signing url
    var url = ""

    // go there
    window.location = (url);


Ratio Slider

Another crucial design feature was added enabling SteemAX users to adjust the ratio between upvotes in a much more visual and intuitive way. Instead of just entering ratio values until the optimal ratio has been achieved, the user can now move an HTML slider left or right to find the right ratio, whether high or low.


To implement this was a little bit tricky because the HTML5 range input isn't entirely browser-friendly and does not seem to work on most mobile browsers. To get around this an event listener was added to the range input which seems to work on most browsers. The OnRangeChange() function is called once when the page loads to append the listener function to the range input. When the myListener callback function is triggered by the slider's movement it updates the ratio input box which is in turned looked at when updating the upvote values. Because the slider must adjust numbers both above 1 and below 1 (0.1 etc.), a scale of 1 to 200 was used, converting values above 100 (101 to 200) to a scale of 1 to 100 (X – 100) and converting values below 100 (1 to 100) to a scale of 0.01 to 1 (X / 100). These functions are used on both the invite creation form as well as the barter pop-up box on so the currentbarterid is used to determine which reveal box has been clicked on the page.

function onRangeChange(rangeInputElmt, listener, id) {
    // We create an event listener for both input and change in order
    // to be cross browser and mobile friendly.
    // inputEvtHasNeverFired ensures only one of the two is used.
    var inputEvtHasNeverFired = true;
    var rangeValue = {current: undefined, mostRecent: undefined};
    rangeInputElmt.addEventListener("input", function(evt) {
        inputEvtHasNeverFired = false;
        rangeValue.current =;
        if (rangeValue.current !== rangeValue.mostRecent) {listener(evt);}
        rangeValue.mostRecent = rangeValue.current;
    rangeInputElmt.addEventListener("change", function(evt) {
        if (inputEvtHasNeverFired) {listener(evt);}
var myListener = function(myEvt) {
    // The listener callback function adjusts the sliders value then
    // inserts it into the ratio box for further calculating.
    var ratio = 1;
    if ( > 100) { ratio = - 100; }
    else if ( === 100) { ratio = 1; }
    else if ( < 100) { ratio = / 100; }
    if (currentbarterid > 0) {
        document.getElementById("ratio"+currentbarterid).value = ratio;
    document.getElementById("ratio").value = ratio;


Resolved Issues

The following issues were discovered and documented on github, then resolved and documented with the following commits.

Technology Stack

SteemAX is written to use Python 3.5 and MySQL. The web interface for and has been written in HTML, CSS and Javascript.


In the future more contributors will be brought into the fold
via Task Requests to help improve the functionality of the site and most especially the look and feel. After all, projects always benefit from the synergistic action of teamwork.


Please contact Mike (Mike-A) on Discord

GitHub Account


Thank you learnelectronics! You've just received an upvote of 55% by @ArtTurtle!

@ArtTurtle Wants To Upvote Your Art & Music!

The quickest and easiest way to start receiving an upvote for each and every single one of your art and music posts is by delegating 20 SP or more to @ArtTurtle using this delegate button. It's fully automatic and once your delegation has hit the blockchain @ArtTurtle will begin upvoting your art and music content within 45 minutes.

Don't want to give up your SP? You can also get @ArtTurtle's upvotes by signing up for free to! For more detailed information about @ArtTurtle and how it works be sure to check out this recent article by @Artopium titled @ArtTurtle Will Upvote Each & Every One of Your Art/Music Posts

Hi @learnelectronics!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your post is eligible for our upvote, thanks to our collaboration with @utopian-io!
Feel free to join our @steem-ua Discord server

Hey, @learnelectronics!

Thanks for contributing on Utopian.
We’re already looking forward to your next contribution!

Get higher incentives and support!
Simply set as a 5% (or higher) payout beneficiary on your contribution post (via SteemPlus or Steeditor).

Want to chat? Join us on Discord

Vote for Utopian Witness!

Coin Marketplace

STEEM 0.22
TRX 0.06
JST 0.025
BTC 20125.06
ETH 1346.05
USDT 1.00
SBD 2.51