
Eosjs
General purpose library for EOSIO blockchains.
Versions
Release notes:
- eosjs@15.0.4 is compatible with eosio v1.0.5 - v1.0.10
- Converted some types in format module from unsigned to signed: UDecimalPad -> DecimalPad for example (15.0.1)
- All
asset
and extended_asset
amounts require exact decimal places (Change 1 SYS
to 1.0000 SYS
) (15.0.0) - Use
config.verbose
instead of config.debug
(14.1.0)
Prior version matrix.
Usage
- Install with:
npm install eosjs
- Html script tag, see releases for the correct version and its matching script integrity hash.
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.jsdelivr.net/npm/eosjs@15.0.4/lib/eos.min.js"
integrity="sha512-KpODfN4HS8hjaWn6oZeUx/UIlIZ8mbS3EnylJ4is1GvSQ9mfuth7RhRCFPn2QQNvFtHAfVgRn4V3ithCWWVeGA=="
crossorigin="anonymous"></script>
<script>
eos = Eos({
httpEndpoint: 'http://ayeaye.cypherglass.com:8888',
chainId: '038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca',
verbose: true
})
</script>
</head>
<body>
See console object: Eos
</body>
</html>
Usage
Ways to instantiate eosjs.
Eos = require('eosjs')
keyProvider: '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'
eos = Eos({keyProvider})
eos = Eos({httpEndpoint, chainId, keyProvider})
eos = Eos({httpEndpoint: null, chainId, keyProvider})
eos = Eos.modules.api({})
EosApi = require('eosjs-api')
eos = EosApi({})
No-arguments prints usage.
eos.getBlock()
USAGE
getBlock - Fetch a block from the blockchain.
PARAMETERS
{
"block_num_or_id": "string"
}
Start a nodeosd process. The docker in this repository provides a setup
that supports the examples in this README.
cd ./docker && ./up.sh
All functions read only or transactional follow this pattern for parameters.
eos.getBlock(1, (error, result) => {})
eos.getBlock(1)
eos.getBlock({block_num_or_id: 1})
eos.getInfo({})
eos.getInfo((error, result) => { console.log(error, result) })
Chain and history API functions are available after creating the eos
object.
API methods and documentation are generated from the chain and history json files.
Until we generate a markdown for these, please convert the names in these
json to camel case functions.
"get_info": ..
is eos.getInfo(..)
Configuration
Eos = require('eosjs')
config = {
chainId: null,
keyProvider: ['PrivateKeys...'],
httpEndpoint: 'http://127.0.0.1:8888',
expireInSeconds: 60,
broadcast: true,
verbose: false,
sign: true
}
eos = Eos(config)
-
chainId hex
- Unique ID for the blockchain you're connecting to. This
is required for valid transaction signing. The chainId is provided via the
get_info API call.
Identifies a chain by its initial genesis block. All transactions signed will
only be valid the blockchain with this chainId. Verify the chainId for
security reasons.
-
keyProvider [array<string>|string|function]
- Provides private keys
used to sign transaction. If multiple private keys are found, the API
get_required_keys
is called to discover which signing keys to use. If a
function is provided, this function is called for each transaction.
-
httpEndpoint string
- http or https location of a nodeosd server
providing a chain API. When using eosjs from a browser remember to configure
the same origin policy in nodeosd or proxy server. For testing, nodeosd
configuration access-control-allow-origin = *
could be used.
Set this value to null for a cold-storage (no network) configuration.
-
expireInSeconds number
- number of seconds before the transaction
will expire. The time is based on the nodeosd's clock. An unexpired
transaction that may have had an error is a liability until the expiration
is reached, this time should be brief.
-
broadcast [boolean=true]
- post the transaction to
the blockchain. Use false to obtain a fully signed transaction.
-
verbose [boolean=false]
- verbose logging such as API activity.
-
debug [boolean=false]
- low level debug logging (serialization).
-
sign [boolean=true]
- sign the transaction with a private key. Leaving
a transaction unsigned avoids the need to provide a private key.
-
mockTransactions (advanced)
mockTransactions: () => null // 'pass', or 'fail'
pass
- do not broadcast, always pretend that the transaction workedfail
- do not broadcast, pretend the transaction failednull|undefined
- broadcast as usual
-
transactionHeaders (advanced) - manually calculate transaction header. This
may be provided so eosjs does not need to make header related API calls to
nodeos. Used in environments like cold-storage. This callback is called for
every transaction. Headers are documented here eosjs-api#headers.
transactionHeaders: (expireInSeconds, callback) => {callback(null/*error*/, headers)}
-
logger - default logging configuration.
logger: {
log: config.verbose ? console.log : null,
error: console.error
}
Turn off all error logging: config.logger = {error: null}
Options
Options may be provided after parameters.
options = {
authorization: 'alice@active',
broadcast: true,
sign: true
}
eos.transfer('alice', 'bob', '1.0000 SYS', '', options)
-
authorization [array<auth>|auth]
- identifies the
signing account and permission typically in a multisig
configuration. Authorization may be a string formatted as
account@permission
or an object<{actor: account, permission}>
.
- If missing default authorizations will be calculated.
- If provided additional authorizations will not be added.
- Performs deterministic sorting by account name
If a default authorization is calculated the action's 1st field must be
an account_name. The account_name in the 1st field gets added as the
active key authorization for the action.
-
broadcast [boolean=true]
- post the transaction to
the blockchain. Use false to obtain a fully signed transaction.
-
sign [boolean=true]
- sign the transaction with a private key. Leaving
a transaction unsigned avoids the need to provide a private key.
Transaction
The transaction function accepts the standard blockchain transaction.
Required transaction header fields will be added unless you are signing without a
network connection (httpEndpoint == null). In that case provide you own headers:
const headers = {
expiration: '2018-06-14T18:16:10'
ref_block_num: 1,
ref_block_prefix: 452435776
}
Create and send (broadcast) a transaction:
eos.transaction(
{
actions: [
{
account: 'eosio.token',
name: 'transfer',
authorization: [{
actor: 'inita',
permission: 'active'
}],
data: {
from: 'inita',
to: 'initb',
quantity: '7.0000 SYS',
memo: ''
}
}
]
}
)
Named action functions
More concise functions are provided for applications that may use actions
more frequently. This avoids having lots of JSON in the code.
eos.transfer()
eos.transfer('inita', 'initb', '1.0000 SYS', '', (error, result) => {})
eos.transfer('inita', 'initb', '1.1000 SYS', '')
eos.transfer('inita', 'initb', '1.2000 SYS', '')
eos.transfer({from: 'inita', to: 'initb', quantity: '1.3000 SYS', memo: ''})
options = {broadcast: true, sign: true}
eos.transfer('inita', 'initb', '1.4000 SYS', '', false)
Read-write API methods and documentation are generated from the eosio
token and
system.
Assets amounts require zero padding. For a better user-experience, if you know
the correct precision you may use DecimalPad to add the padding.
DecimalPad = Eos.modules.format.DecimalPad
userInput = '10.2'
precision = 4
assert.equal('10.2000', DecimalPad(userInput, precision))
For more advanced signing, see keyProvider
and signProvider
in
index.test.js.
Shorthand
Shorthand is available for some types such as Asset and Authority. This syntax
is only for concise functions and does not work when providing entire transaction
objects to eos.transaction
..
For example:
- permission
inita
defaults inita@active
- authority
'EOS6MRy..'
expands {threshold: 1, keys: [{key: 'EOS6MRy..', weight: 1}]}
- authority
inita
expands {threshold: 1, accounts: [{permission: {actor: 'inita', permission: 'active'}, weight: 1}]}
New Account
New accounts will likely require some staked tokens for RAM and bandwidth.
wif = '5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'
pubkey = 'EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV'
eos.transaction(tr => {
tr.newaccount({
creator: 'eosio',
name: 'myaccount',
owner: pubkey,
active: pubkey
})
tr.buyrambytes({
payer: 'eosio',
receiver: 'myaccount',
bytes: 8192
})
tr.delegatebw({
from: 'eosio',
receiver: 'myaccount',
stake_net_quantity: '10.0000 SYS',
stake_cpu_quantity: '10.0000 SYS',
transfer: 0
})
})
Contract
Deploy and call smart contracts.
Compile
If you're loading a wasm file, you do not need binaryen. If you're loading
a wast file you can include and configure the binaryen compiler, this is
used to compile to wasm automatically when calling setcode.
Versions of binaryen may be problematic.
$ npm install binaryen@37.0.0
binaryen = require('binaryen')
eos = Eos({keyProvider, binaryen})
Deploy
wasm = fs.readFileSync(`docker/contracts/eosio.token/eosio.token.wasm`)
abi = fs.readFileSync(`docker/contracts/eosio.token/eosio.token.abi`)
eos.setcode('myaccount', 0, 0, wasm)
eos.setabi('myaccount', JSON.parse(abi))
Fetch a smart contract
eos.contract('myaccount', [options], [callback])
eos.contract('myaccount').then(myaccount => myaccount.myaction(..))
eos.transaction('myaccount', myaccount => { myaccount.myaction(..) })
eos.transaction(['myaccount', 'myaccount2'], ({myaccount, myaccount2}) => {
myaccount.myaction(..)
myaccount2.myaction(..)
})
Offline or cold-storage contract
eos = Eos({httpEndpoint: null})
abi = fs.readFileSync(`docker/contracts/eosio.token/eosio.token.abi`)
eos.fc.abiCache.abi('myaccount', JSON.parse(abi))
eos.contract('myaccount').then(myaccount => myaccount.create())
Offline or cold-storage transaction
expireInSeconds = 60 * 60
eos = Eos()
info = await eos.getInfo({})
chainDate = new Date(info.head_block_time + 'Z')
expiration = new Date(chainDate.getTime() + expireInSeconds * 1000)
expiration = expiration.toISOString().split('.')[0]
block = await eos.getBlock(info.last_irreversible_block_num)
transactionHeaders = {
expiration,
ref_block_num: info.last_irreversible_block_num & 0xFFFF,
ref_block_prefix: block.ref_block_prefix
}
eos = Eos({httpEndpoint: null, chainId, keyProvider, transactionHeaders})
transfer = await eos.transfer('inita', 'initb', '1.0000 SYS', '')
transferTransaction = transfer.transaction
eos = Eos()
processedTransaction = await eos.pushTransaction(transferTransaction)
Custom Token
await eos.transaction('myaccount', myaccount => {
myaccount.create('myaccount', '10000000.000 TOK')
myaccount.issue('myaccount', '10000.000 TOK', 'issue')
})
const balance = await eos.getCurrencyBalance('myaccount', 'myaccount', 'TOK')
console.log('Currency Balance', balance)
Calling Actions
Other ways to use contracts and transactions.
await eos.transaction(eos =>
{
eos.transfer('inita', 'initb', '1.0000 SYS', '')
eos.transfer('inita', 'initc', '1.0000 SYS', '')
}
)
await eos.transaction('myaccount', myaccount => {
myaccount.transfer('myaccount', 'inita', '10.000 TOK@myaccount', '')
})
await eos.transaction(['myaccount', 'eosio.token'], ({myaccount, eosio_token}) => {
myaccount.transfer('inita', 'initb', '1.000 TOK@myaccount', '')
eosio_token.transfer('inita', 'initb', '1.0000 SYS', '')
})
const myaccount = await eos.contract('myaccount')
await myaccount.transfer('myaccount', 'inita', '1.000 TOK', '')
await myaccount.transaction(myaccountTr => {
myaccountTr.transfer('inita', 'initb', '1.000 TOK', '')
myaccountTr.transfer('initb', 'inita', '1.000 TOK', '')
})
Development
From time-to-time the eosjs and nodeos binary format will change between releases
so you may need to start nodeos
with the --skip-transaction-signatures
parameter
to get your transactions to pass.
Note, package.json
has a "main" pointing to ./lib
. The ./lib
folder is for
es2015 code built in a separate step. If you're changing and testing code,
import from ./src
instead.
Eos = require('./src')
config = {verbose: true, debug: false, broadcast: true, forceActionDataHex: true, keyProvider}
eos = Eos(config)
Fcbuffer
The eos
instance can provide serialization:
type = {type: 1, data: '00ff'}
buffer = eos.fc.toBuffer('extensions_type', type)
assert.deepEqual(type, eos.fc.fromBuffer('extensions_type', buffer))
eos.contract('eosio.token', (error, eosio_token) => {
create = {issuer: 'inita', maximum_supply: '1.0000 SYS'}
buffer = eosio_token.fc.toBuffer('create', create)
assert.deepEqual(create, eosio_token.fc.fromBuffer('create', buffer))
})
Use Node v10+ for package-lock.json
.
Related Libraries
These libraries are integrated into eosjs
seamlessly so you probably do not
need to use them directly. They are exported here giving more API access or
in some cases may be used standalone.
var {format, api, ecc, json, Fcbuffer} = Eos.modules
Environment
Node and browser (es2015)