2.2: Deploy, Issue and Transfer Tokens

Step 1: Obtain Contract Source

Navigate to your contracts directory.

cd CONTRACTS_DIR

Pull the source

git clone https://github.com/ArisenIO/arisen.contracts

This repository contains several contracts, but it's the arisen.token contract that is important for this section. Navigate to the arisen.contracts/contracts/arisen.token directory.

cd arisen.contracts/contracts/arisen.token

Step 2: Create Account for Contract

Before we can deploy the token contract we must create an account to deploy it to, we'll use the arisen development key for this account.

📘

You need to unlock your wallet prior to the next step

arisecli create account arisen arisen.token RSN6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

Step 3: Compile the Contract

arisen-cpp -I include -o arisen.token.wasm src/arisen.token.cpp --abigen

Step 4: Deploy the Token Contract

arisecli set contract arisen.token CONTRACTS_DIR/arisen.contracts/contracts/arisen.token --abi arisen.token.abi -p [email protected]
Reading WASM from ...arisen.contracts/contracts/arisen.token/arisen.token.wasm...
Publishing contract...
executed transaction: a68299112725b9f2233d56e58b5392f3b37d2a4564bdf99172152c21c7dc323f  6984 bytes  6978 us
#         arisen <= arisen::setcode               {"account":"arisen.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001a0011b60000060017e006002...
#         arisen <= arisen::setabi                {"account":"arisen.token","abi":"0e656f73696f3a3a6162692f312e310008076163636f756e7400010762616c616e63...
warning: transaction executed locally, but may not be confirmed by the network yet

Step 5: Create the Token

To create a new token, call create action with the correct parameters. This action accepts 1 argument, it consists of:

  • An issuer that is an arisen account. In this case, it's alice. This issuer will be the one with the authority to call issue and/or perform other actions such as closing accounts or retiring tokens.

  • An asset type composed of two pieces of data, a floating-point number sets the maximum supply and a symbol in capitalized alpha characters which represents the asset. For example, "1.0000 RIX".

Below is a concise way to call this method, using positional arguments:

arisecli push action arisen.token create '[ "alice", "1000000000.0000 RIX"]' -p [email protected]

The command above created a new token RIX with a precision of 4 decimals and a maximum supply of 1000000000.0000 RIX It also designates alice as the issuer. To create this token, the contract requires the permission of the arisen.token account. For this reason, -p [email protected] was passed to authorize this action.

An alternate approach uses named arguments:

arisecli push action arisen.token create '{"issuer":"alice", "maximum_supply":"1000000000.0000 RIX"}' -p [email protected]

Execute the command above:

executed transaction: 10cfe1f7e522ed743dec39d83285963333f19d15c5d7f0c120b7db652689a997  120 bytes  1864 us
#   arisen.token <= arisen.token::create          {"issuer":"alice","maximum_supply":"1000000000.0000 RIX"}
warning: transaction executed locally, but may not be confirmed by the network yet ]

Step 6: Issue Tokens

The issuer alice can now issue new tokens. As mentioned earlier only the issuer can do so, therefore, -p [email protected] must be provided to authorize the issue action.

arisecli push action arisen.token issue '[ "alice", "100.0000 RIX", "memo" ]' -p [email protected]
executed transaction: d1466bb28eb63a9328d92ddddc660461a16c405dffc500ce4a75a10aa173347a  128 bytes  205 us
#   arisen.token <= arisen.token::issue           {"to":"alice","quantity":"100.0000 RIX","memo":"memo"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

This time the output contains several actions: one issue action and three transfer actions. While the only action signed was issue, the issue action performed an inline transfer and the inline transfer notified the sender and receiver accounts. The output indicates all the action handlers that were called, the order they were called in, and whether any output was generated by the action.

Technically, the arisen.token contract could have skipped the inline transfer and opted to just modify the balances directly. However, in this case the arisen.token contract is following a token convention that requires that all account balances be derivable by the sum of the transfer actions that reference them. It also requires that the sender and receiver of funds be notified so they can automate handling deposits and withdrawals.

To inspect the transaction, try using the -d -j options, which indicate "don't broadcast" and "return the transaction as json", which you may find useful during development.

arisecli push action eosio.token issue '["alice", "100.0000 RIX", "memo"]' -p [email protected] -d -j

Step 7: Transfer Tokens

Now that account alice has been issued tokens, transfer some of them to account bob.

arisecli push action arisen.token transfer '[ "alice", "bob", "25.0000 RIX", "m" ]' -p [email protected]
executed transaction: 800835f28659d405748f4ac0ec9e327335eae579a0d8e8ef6330e78c9ee1b67c  128 bytes  1073 us
#   arisen.token <= arisen.token::transfer        {"from":"alice","to":"bob","quantity":"25.0000 RIX","memo":"m"}
#         alice <= arisen.token::transfer        {"from":"alice","to":"bob","quantity":"25.0000 RIX","memo":"m"}
#           bob <= arisen.token::transfer        {"from":"alice","to":"bob","quantity":"25.0000 RIX","memo":"m"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

Now check if bob received the tokens using arisencli get currency balance

arisecli get currency balance arisen.token bob RIX
25.0000 RIX

Check alice's balance. Notice that tokens were deducted from the account.

arisencli get currency balance arisen.token alice RIX
75.0000 RIX

Excellent! Everything adds up.

What's Next?

  • Understanding ABI Files: Introduction to Application Binary Files (ABI) and how the ABI file correlates to the arisen.token contract.