EOS smart contract - From helloworld to hellomoney

in development •  6 years ago  (edited)

EOS smart contract - From helloworld to hellomoney

Today, we're going to show you how to transfer token inside the EOS smart contract.

Create source code

Create helloworld contract

$ eosiocpp -n helloworld
created helloworld from skeleton

Here is the source code of helloworld.cpp

#include <eosiolib/eosio.hpp>

using namespace eosio;

class hello : public eosio::contract {
  public:
      using contract::contract;

      /// @abi action 
      void hi( account_name user ) {
         print( "Hello, ", name{user} );
      }
};

EOSIO_ABI( hello, (hi) )

Add header file

#include <eosiolib/asset.hpp>

Add amount to hi() function

void hi( account_name to, const asset& quantity ) {

Add some security check

        require_auth( _self );
        eosio_assert( quantity.is_valid(), "invalid token" );
        eosio_assert( quantity.amount > 0, "must be positive quantity" );

        require_recipient( _self );
        require_recipient( to );

Add in contract transaction

        action(
            permission_level{ _self, N(active) },
            N(eosio.token), N(transfer),
            std::make_tuple(_self, to, quantity, std::string("hello money"))
        ).send();

Then hi() function become

    /// @abi action hi
    void hi( account_name to, const asset& quantity ) {
        require_auth( _self );
        eosio_assert( quantity.is_valid(), "invalid token" );
        eosio_assert( quantity.amount > 0, "must be positive quantity" );

        require_recipient( _self );
        require_recipient( to );

        action(
            permission_level{ _self, N(active) },
            N(eosio.token), N(transfer),
            std::make_tuple(_self, to, quantity, std::string("hello money"))
        ).send();
        print( "Hello, here is some money for ", name{to} );
    }

Run it with jungle testnet

Buy ram

cleos -u http://jungle.cryptolions.io:18888 system buyram -k eosonetest2 eosonetest2 1000

Push contract to account

cleos -u http://jungle.cryptolions.io:18888 set contract eosonetest2 ../helloworld -p eosonetest2

Set eosio.code permission

cleos -u http://jungle.cryptolions.io:18888 set account permission eosonetest2 active '{"threshold": 1,"keys": [{"key": "EOS8xxxxxxxxxxxxxxx","weight": 1}],"accounts": [{"permission":{"actor":"eosonetest2","permission":"eosio.code"},"weight":1}]}' owner -p eosonetest2@owner

Test output on testnet

Before

@joel-Lenovo-Y520:helloworld $ cleos -u https://jungle.eosio.cr:443 get currency balance eosio.token eosonetest1 EOS
7970.3411 EOS
@joel-Lenovo-Y520:helloworld $ cleos -u https://jungle.eosio.cr:443 get currency balance eosio.token eosonetest2 EOS
6733.2414 EOS

Send hello money

@joel-Lenovo-Y520:helloworld $ cleos -u http://jungle.cryptolions.io:18888 push action eosonetest2 hi '["eosonetest1", "103.0000 EOS"]' -p eosonetest2
executed transaction: 71fxxxxxxxxxab706f2xxx9c15678d51f7xxx  120 bytes  2483 us
#   eosonetest2 <= eosonetest2::hi              {"to":"eosonetest1","quantity":"103.0000 EOS"}
>> Hello, here is some money for eosonetest1
#   eosonetest1 <= eosonetest2::hi              {"to":"eosonetest1","quantity":"103.0000 EOS"}
#   eosio.token <= eosio.token::transfer        {"from":"eosonetest2","to":"eosonetest1","quantity":"103.0000 EOS","memo":"hello money"}
#   eosonetest2 <= eosio.token::transfer        {"from":"eosonetest2","to":"eosonetest1","quantity":"103.0000 EOS","memo":"hello money"}
#   eosonetest1 <= eosio.token::transfer        {"from":"eosonetest2","to":"eosonetest1","quantity":"103.0000 EOS","memo":"hello money"}
warning: transaction executed locally, but may not be confirmed by the network yet    ] 

After

@joel-Lenovo-Y520:helloworld $ cleos -u https://jungle.eosio.cr:443 get currency balance eosio.token eosonetest1 EOS
8073.3411 EOS
@joel-Lenovo-Y520:helloworld $ cleos -u https://jungle.eosio.cr:443 get currency balance eosio.token eosonetest2 EOS
6630.2414 EOS

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!