EOS smart contract - From helloworld to hellomoney
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
吃了吗?新人吗?《steemit指南》拿一份吧,以免迷路; 另外一定要去 @team-cn 的新手村看看,超级热闹的大家庭。如果不想再收到我的留言,请回复“取消”。