SteemJs/dSteem Code Editor | Steem Playground

This page loads Steem-Js () and dSteem (v0.8.6). The log() can be used to print to the page console. You can also press F12 for your browser console i.e. console.log() etc. Use Ctrl + [ or ] to indent your JS code.

URL Parameter s code, eg.: ?s=//steemjs%0Alog("Hello,%20SteemJs!")

// Press Ctrl + Enter to Evaluate
// Press Alt + Backspace to Clear Console

log(`Using Steem Node ${steem.api.options.url}`);

steem.api.getAccounts(['justyy', 'ety001'], function(err, result) {
  if (!err) {
   for (let i = 0; i < result.length; ++ i) {
      let reputation = result[i].reputation;
      let formatted_rep = steem.formatter.reputation(reputation);
      log(result[i].name + "'s Reputation is " + formatted_rep);
    }
  } else {
   log("Steem API Error: ", err);
  }
}); 

/*
  Example of using dSteem
*/
let username = "test";
let password = "password";
log(dsteem.PrivateKey.fromLogin(username, password, 'owner').createPublic());


// ============================================================================
// Mini SteemJS Test Suite (using real steem object)
// ============================================================================

// steem object must already exist globally
// log() must exist — or define fallback:
if (typeof log === "undefined") {
    global.log = (...args) => console.log(...args);
}

// Promise wrapper for steem.api
function steemCall(method, params) {
    return new Promise((resolve, reject) => {
        steem.api[method](...params, (err, result) => {
            if (err) reject(err);
            else resolve(result);
        });
    });
}

// Promise wrapper for generic RPC calls
function steemRpcCall(method, params) {
    return new Promise((resolve, reject) => {
        steem.api.call(method, params, (err, result) => {
            if (err) reject(err);
            else resolve(result);
        });
    });
}


// Test registry
const tests = [];

function addTest(name, fn) {
    tests.push({ name, fn });
}


// ============================================================================
// 1. Basic positive API tests
// ============================================================================

addTest("steem.api.getAccounts", async () => {
    const accounts = await steemCall("getAccounts", [["justyy"]]);
    if (accounts && accounts[0] && accounts[0].name === "justyy") return;
    throw new Error("Account not returned");
});

addTest("steem.formatter.reputation", async () => {
    const rep = steem.formatter.reputation("352352352352");
    if (typeof rep === "number") return;
    throw new Error("Formatter did not return number");
});

addTest("steem.api.getDynamicGlobalProperties", async () => {
    const props = await steemCall("getDynamicGlobalProperties", []);
    if (props && props.head_block_number) return;
    throw new Error("Missing head_block_number");
});

addTest("steem.api.getChainProperties", async () => {
    await steemCall("getChainProperties", []);
});

addTest("steem.api.getConfig", async () => {
    await steemCall("getConfig", []);
});

addTest("steem.api.getRewardFund", async () => {
    const fund = await steemCall("getRewardFund", ["post"]);
    if (fund && fund.reward_balance) return;
    throw new Error("Reward fund missing");
});

addTest("steem.api.getCurrentMedianHistoryPrice", async () => {
    const price = await steemCall("getCurrentMedianHistoryPrice", []);
    if (price && price.base) return;
    throw new Error("Missing price");
});

addTest("steem.api.getAccountHistory", async () => {
    const hist = await steemCall("getAccountHistory", ["justyy", -1, 1]);
    if (Array.isArray(hist)) return;
    throw new Error("History not an array");
});

addTest("steem.api.getDiscussionsByCreated", async () => {
    const posts = await steemCall("getDiscussionsByCreated", [{ tag: "steem", limit: 1 }]);
    if (Array.isArray(posts)) return;
    throw new Error("Posts not array");
});

addTest("steem.api.getTrendingTags", async () => {
    const tags = await steemCall("getTrendingTags", ["steem", 1]);
    if (Array.isArray(tags)) return;
    throw new Error("Tags not array");
});

addTest("steem.api.getBlock", async () => {
    const data = await steemCall("getBlock", [102496700]);
    if (data.previous === "061bf9bb3389a026b4e07f3b28aaa24d87c639e1") return;
    throw new Error("getBlock return error");
});

steem.api.getDynamicGlobalProperties((err, result) => {
  if (err) {
    console.error(err);
    return;
  }

  const latestBlock = result.head_block_number;
  log('Latest block height:', latestBlock);
  addTest(`steem.api.getBlock (latest block height ${latestBlock})`, async () => {
    const data = await steemCall("getBlock", [latestBlock]);
    log(data);
    if (data.previous && data.witness && data.timestamp && data.witness_signature) return;
    throw new Error(`getBlock (latest block height: ${latestBlock}) return error`);
    })  
});

// ============================================================================
// 2. Negative tests
// ============================================================================

addTest("Negative invalid method name", async () => {
    try {
        await steemRpcCall("NON_EXISTENT_METHOD", {});
    } catch {
        return; // PASS
    }
    throw new Error("Invalid method unexpectedly succeeded");
});

addTest("Negative invalid history range", async () => {
    try {
        await steemCall("getAccountHistory", ["justyy", 999999999, -5]);
    } catch {
        return; // PASS
    }
    throw new Error("Invalid history range unexpectedly succeeded");
});


// ============================================================================
// Test Runner
// ============================================================================

async function runTests() {
    log("Starting SteemJS test suite...");

    for (const t of tests) {
        try {
            await t.fn();
            log(`✅Test passed: ${t.name}`);
        } catch (err) {
            log(`❌Test failed: ${t.name} (${err.message || err})`);
        }
    }
    
    log("Finished.")
}

runTests();

$('#nodes'):

View Other Steem Tools and APIs | Vote @justyy a Witness or Set @justyy as Proxy

URL parameter: ?nocache

Created and Maintained by @justyy. All rights Reserved ©, 2026. 中文: SteemJs 测试工具