当前位置: 首页 > 文档资料 > EOS 开发者指南 >

EOS 智能合约模板

优质
小牛编辑
116浏览
2023-12-01

自动生成 abi 文件 函数:添加注释 //@abi action ,最新版本可以不写 需要EOSIO_ABI中添加对应函数(必须)。

结构体:需要 //@abi table name type(必须)

1.1 int类型相关说明

生成 abi 可以支持的 int 类型

uint64_t uint32_t uint16_t uint8_t

int64_t int32_t int16_t int8_t

eosio::print 输出只支持以下 int 类型

uint64_t uint32_t int64_t int32_t

1.2 函数书写和合约调用

下面介绍一下,合约中支持哪些类型和怎么传参数的。

1.2.1 account_name 类型

继承类自己定义的,还有其他类型,这里不一一列举了

函数,这里eosio::name 暂时用不了了,可能是最近改动过了,但是我没找到相关log

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

合约调用

cleos push action user hi '[user]' -p user 
executed transaction: 9b904829cb37416b283148c0579e8081403feca2306a39ab40470f163bfd0d08 232 bytes 102400 cycles
# user <= user::hi {"user":"user"}
>> hi, 15426359243929812992

1.2.2 std::string 类型

// @abi action
void abiprint(std::string str) {
eosio::print("abiprint, ",str.c_str() );
}

合约调用

cleos push action user abiprint '["OuterTS"]' -p user
executed transaction: f6cf3d91c4aba8c71b096557615fcfce24a000a361503abc27d0201b6646f28d 232 bytes 102400 cycles
# user <= user::abiprint {"str":"OuterTS"}
>> abiprint, OuterTS

1.2.3 int相关类型

这里声明一下,带有返回参数的,不能生成abi文件

// @abi action
void abiadd (uint64_t num1, uint64_t num2) {
eosio::print( "add:, ", add(num1 , num2) ); 
}

uint64_t add (uint64_t num1, uint64_t num2){
return num1 + num2; 
} 

void mulnum( uint64_t num1,uint32_t num2,uint16_t num3,uint8_t num4,
int64_t num5,int32_t num6,int16_t num7,int8_t num8) {
eosio::print("eosio::print dont support others");
eosio::print("num1:",num1," num2:",num2,"\n");
eosio::print("num5:",num5," num6:","\n");

}

合约调用

cleos push action user abiadd '[9527,9527]' -p user
executed transaction: 65e9c964929bcc4851fba6dbcbf5bdfef57dc55170b19a091c9c9699a14cce47 240 bytes 102400 cycles
# user <= user::abiadd {"num1":9527,"num2":9527}
>> add:, 19054



cleos push action user mulnum '[9527,9527,9527,9527,9527,9527,9527,9527]' -p user
executed transaction: d068edbd729346e8e58038997c850875de7ec13517de7a301e4336217b9b0b2d 256 bytes 102400 cycles
# user <= user::mulnum {"num1":9527,"num2":9527,"num3":9527,"num4":55,"num5":9527,"num6":9527,"num7":9527,"num8":55}
>> eosio::print dont support othersnum1:9527 num2:9527

1.2.4 vector类型和多种类型传参

// @abi action
void mulargs(int64_t num, std::string str,std::vector<uint64_t> iarr) {
eosio::print("num:",num,"\n");
eosio::print("str:",str.c_str(),"\n");
for (int i = 0; i < iarr.size(); ++i)
{
eosio::print(iarr[i]);
}

}

合约调用

cleos push action user mulargs '[9527,"OuterST",[9,5,2,7]]' -p user
executed transaction: a84344447e58bbe3fe6b27a7cebe750bde802ed8d57904db2965e03c1c0840de 272 bytes 104448 cycles
# user <= user::mulargs {"num":9527,"str":"OuterST","iarr":[9,5,2,7]}
>> num:9527

2. cpp源码和abi文件

2.1 生成abi文件

feng@feng-B250-HD3P:~/work/eos/build/contracts/hellocopy$ eosiocpp -g hellocopy.abi hellocopy.cpp

2.2 生成wast文件

feng@feng-B250-HD3P:~/work/eos/build/contracts/hellocopy$ eosiocpp -o hellocopy.wast hellocopy.cpp

2.3 部署合约

合约更新的时候,需要重新生成abi文件和wast文件。

每次部署合约需要保证code的变化:所以部署A合约的时候,再一次部署A合约会失败。

要想更新A合约,需要先部署B合约,再一次部署A合约。

feng@feng-B250-HD3P:~/work/eos/build$ cleos set contract user contracts/hellocopy/

2.4 cpp文件

EOSIO_ABI (func,(a)(b)(c)) a,b,c的顺序要对应



#include <vector>
#include <eosiolib/print.hpp>

#include <eosiolib/contract.hpp>
#include <eosio.system/eosio.system.hpp>

// using eos_currency = eosiosystem::contract<N(eosio)>::currency;
// using eosio::key256;
// using eosio::indexed_by;
// using eosio::const_mem_fun;
// using eosio::asset;


class hellocopy : public eosio::contract { 
    public: 
        hellocopy(account_name self)
        :eosio::contract(self)
        {}
        // @abi action 
        void hi(account_name user ) { 
            require_auth( user );
            eosio::print( "hi, ", user); 
            //eosio::print( "hi, ", eosio::name(user)); 
        } 

        // @abi action
        void abiprint(std::string str) {
            eosio::print("abiprint, ",str.c_str() );
        }
        // @abi action
        void abinum (uint64_t num) {
            eosio::print( "abinum: ",num );     
        }

        // @abi action
        void abiadd (uint64_t num1, uint64_t num2) {
            eosio::print( "add:, ", add(num1 , num2) );     
        }

        uint64_t add (uint64_t num1, uint64_t num2){
            return num1 + num2;     
        } 

        void mulnum( uint64_t num1,uint32_t num2,uint16_t num3,uint8_t num4,
                int64_t num5,int32_t num6,int16_t num7,int8_t num8) {
            eosio::print("eosio::print dont support others");
            eosio::print("num1:",num1," num2:",num2,"\n");
            eosio::print("num5:",num5," num6:","\n");

        }

        // @abi action
        void mulargs(int64_t num, std::string str,std::vector<uint64_t> iarr) {
            eosio::print("num:",num,"\n");
            eosio::print("str:",str.c_str(),"\n");
            for (int i = 0; i < iarr.size(); ++i)
            {
                eosio::print(iarr[i]);
            }

        }


        //@abi table test i64
        struct test
        {
            std::string str;
        };
}; 

EOSIO_ABI( hellocopy, (hi)(abiprint)(abinum)(abiadd)(mulnum)(mulargs))

2.5 abi文件

{
  "____comment": "This file was generated by eosio-abigen. DO NOT EDIT - 2018-04-18T10:08:36",
  "types": [],
  "structs": [{
      "name": "test",
      "base": "",
      "fields": [{
          "name": "str",
          "type": "string"
        }
      ]
    },{
      "name": "hi",
      "base": "",
      "fields": [{
          "name": "user",
          "type": "account_name"
        }
      ]
    },{
      "name": "abiprint",
      "base": "",
      "fields": [{
          "name": "str",
          "type": "string"
        }
      ]
    },{
      "name": "abinum",
      "base": "",
      "fields": [{
          "name": "num",
          "type": "uint64"
        }
      ]
    },{
      "name": "abiadd",
      "base": "",
      "fields": [{
          "name": "num1",
          "type": "uint64"
        },{
          "name": "num2",
          "type": "uint64"
        }
      ]
    },{
      "name": "mulnum",
      "base": "",
      "fields": [{
          "name": "num1",
          "type": "uint64"
        },{
          "name": "num2",
          "type": "uint32"
        },{
          "name": "num3",
          "type": "uint16"
        },{
          "name": "num4",
          "type": "uint8"
        },{
          "name": "num5",
          "type": "int64"
        },{
          "name": "num6",
          "type": "int32"
        },{
          "name": "num7",
          "type": "int16"
        },{
          "name": "num8",
          "type": "int8"
        }
      ]
    },{
      "name": "mulargs",
      "base": "",
      "fields": [{
          "name": "num",
          "type": "int64"
        },{
          "name": "str",
          "type": "string"
        },{
          "name": "iarr",
          "type": "uint64[]"
        }
      ]
    }
  ],
  "actions": [{
      "name": "hi",
      "type": "hi",
      "ricardian_contract": ""
    },{
      "name": "abiprint",
      "type": "abiprint",
      "ricardian_contract": ""
    },{
      "name": "abinum",
      "type": "abinum",
      "ricardian_contract": ""
    },{
      "name": "abiadd",
      "type": "abiadd",
      "ricardian_contract": ""
    },{
      "name": "mulnum",
      "type": "mulnum",
      "ricardian_contract": ""
    },{
      "name": "mulargs",
      "type": "mulargs",
      "ricardian_contract": ""
    }
  ],
  "tables": [{
      "name": "test",
      "index_type": "i64",
      "key_names": [
        "str"
      ],
      "key_types": [
        "string"
      ],
      "type": "test"
    }
  ],
  "ricardian_clauses": []
}

测试前的准备工作

cleos wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5J52mvxVqEk86LS4Qgm7Y3DjYNiEkk4AubdrDbJsQ7JsYxJUR5q"

cleos create key
Private key: 5KkzGioGeYGcvRGEyXgeESU2HjW7yvbQpWcv4F7tnZN73UDwsSG
Public key: EOS69QCKy2zWQge28nxyLHMPHooXHMMoqMfEWSdB87tfmWNFDpbqM

cleos wallet import 5KkzGioGeYGcvRGEyXgeESU2HjW7yvbQpWcv4F7tnZN73UDwsSG
imported private key for: EOS69QCKy2zWQge28nxyLHMPHooXHMMoqMfEWSdB87tfmWNFDpbqM

cleos create account eosio user EOS69QCKy2zWQge28nxyLHMPHooXHMMoqMfEWSdB87tfmWNFDpbqM EOS69QCKy2zWQge28nxyLHMPHooXHMMoqMfEWSdB87tfmWNFDpbqM
executed transaction: f4568d203bb872345ba8c79ec6de996214e1f08e5b34521552947c497d4a20f6 352 bytes 102400 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"user","owner":{"threshold":1,"keys":[{"key":"EOS69QCKy2zWQge28nxyLHMPHooX...

cleos set contract user contracts/hello -p user
Reading WAST/WASM from contracts/hello/hello.wast...
Assembling WASM...
Publishing contract...
executed transaction: 3aad99fd4416caf8aa51af0db06ef0bbe88ccc2f6c4d28384f1979c7922022b1 1656 bytes 2200576 cycles
# eosio <= eosio::setcode {"account":"user","vmtype":0,"vmversion":0,"code":"0061736d01000000012e0960027f7f0060027e7e0060017f0...
# eosio <= eosio::setabi {"account":"user","abi":{"types":[],"structs":[{"name":"tpublickey","base":"","fields":[{"name":"key...

测试未通过的模板


// field fields
// signed_transaction
// type_def action_def table_def abi_def types

测试合约,下面就不介绍了,直接上代码。

void tpublickey (public_key key) {
eosio::print("tpubckey:\n");
}

cleos push action user tpublickey '["EOS6JTKqeXTYmbyYURFJg2HmAbVzc4sPpP7LxhubmGn8SD3p9WibQ"]' -p user
executed transaction: 962b6ed1ff3c8238de353fe1849ab1cd2351b58ba547592eef52938312a05b35 256 bytes 102400 cycles
# user <= user::tpublickey {"key":"EOS6JTKqeXTYmbyYURFJg2HmAbVzc4sPpP7LxhubmGn8SD3p9WibQ"}
>> tpubckey:
// @abi action
void tpkarr (std::vector<public_key> keyarr) {
eosio::print("tpkarr:\n");
}

cleos push action user tpkarr '[["EOS6JTKqeXTYmbyYURFJg2HmAbVzc4sPpP7LxhubmGn8SD3p9WibQ"]]' -p user
executed transaction: 00ff309598802ee9768f69b5781a552262fc9919bd3121e44ad98c72e38f7d3a 256 bytes 103424 cycles
# user <= user::tpkarr {"keyarr":["EOS6JTKqeXTYmbyYURFJg2HmAbVzc4sPpP7LxhubmGn8SD3p9WibQ"]}
>> tpkarr:
// @abi action
void tasset (asset arg) {
eosio::print("tasset:",arg,"\n");
}


cleos push action user tasset '["100.0000 EOS"]' -p user
executed transaction: bacccdaa7a10a856d8fb8ee21f9d2020c54dd28ff83af2235da2e420aecb5ee4 240 bytes 102400 cycles
# user <= user::tasset {"arg":"100.0000 EOS"}
>> tasset:100.0000 EOS
// @abi action
void tstring (std::string str) {
eosio::print("tstring:",str.c_str(),"\n"); 
}

cleos push action user tstring '["OuterSt 9527"]' -p user
executed transaction: 6ac9a4ed6114a6d9244faf40f7c7195de2f91b913f6c48ca1cc6ca6f78a79742 240 bytes 105472 cycles
# user <= user::tstring {"str":"OuterSt 9527"}
>> tstring:OuterSt 9527
// // @abi action
void tstringarr (std::vector<std::string> args) {
eosio::print("tstringarr:\n"); 
for (auto &arg:args)
{
eosio::print(arg.c_str(),"\n");
}
}

cleos push action user tstringarr '[["OuterSt 9527","9527 OuterST"]]' -p user
executed transaction: 9e1406a19f8f89b483e49e71257decbac4c0d4002167466b7b2c130c8bc6bb4f 248 bytes 112640 cycles
# user <= user::tstringarr {"args":["OuterSt 9527","9527 OuterST"]}
>> tstringarr:
// @abi action
void tsignature(signature arg){
//eosio::print("tsignature:",arg,"\n");

}

cleos push action user tsignature '["EOSJzdpi5RCzHLGsQbpGhndXBzcFs8vT5LHAtWLMxPzBdwRHSmJkcCdVu6oqPUQn1hbGUdErHvxtdSTS1YA73BThQFwT77X1U"]' -p user
executed transaction: 4c2086311b56d4ac4ad11975b0f11a180609c9a8de7c91d3bdd1def756a65aa9 288 bytes 102400 cycles
# user <= user::tsignature {"arg":"EOSJzdpi5RCzHLGsQbpGhndXBzcFs8vT5LHAtWLMxPzBdwRHSmJkcCdVu6oqPUQn1hbGUdErHvxtdSTS1YA73BThQFwT...

// @abi action
void tsgarr(std::vector<signature> args) {
// eosio::print("tsgarr:",args,"\n");
// for (auto &arg:args)
// {
// eosio::print(arg,"\n");
// }
}

cleos push action user tsgarr '[["EOSJzdpi5RCzHLGsQbpGhndXBzcFs8vT5LHAtWLMxPzBdwRHSmJkcCdVu6oqPUQn1hbGUdErHvxtdSTS1YA73BThQFwT77X1U","EOSJzdpi5RCzHLGsQbpGhndXBzcFs8vT5LHAtWLMxPzBdwRHSmJkcCdVu6oqPUQn1hbGUdErHvxtdSTS1YA73BThQFwT77X1U"]]' -p user
executed transaction: 6e42e1699eaaf91f575ccef9e58e6aea4697e8ff59aeb1d9f655bd47b0adf909 360 bytes 104448 cycles
# user <= user::tsgarr {"args":["EOSJzdpi5RCzHLGsQbpGhndXBzcFs8vT5LHAtWLMxPzBdwRHSmJkcCdVu6oqPUQn1hbGUdErHvxtdSTS1YA73BThQF...
// @abi action
void tchecksum(checksum256 arg){
//eosio::print("tchecksum:",arg,"\n");
}

cleos push action user tchecksum '["ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"]' -p userexecuted transaction: 63b7dc53738c655bcb980db743ea533695462840288070dabf25bba131ced877 256 bytes 102400 cycles
# user <= user::tchecksum {"arg":"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"}
// @abi action
void tfixedstr32(fixed_string32 arg) {
//eosio::print("tfixedstring32:",arg,"\n");
}

cleos push action user tfixedstr32 '["1234567890abcdef1234567890abcdef"]' -p user
executed transaction: bdb03cd8965d284fe47aa31a66386f93082c0014bc59cf801ad1eaf042513c45 256 bytes 102400 cycles
# user <= user::tfixedstr32 {"arg":"1234567890abcdef1234567890abcdef"}
//fixedstring16
//@abi action
void tfixedstring(fixed_string16 arg) {
//eosio::print("tfixedstring16:",arg,"\n");
}

cleos push action user tfixedstring '["1234567890abcdef"]' -p user
executed transaction: b9ecd59ad75028d8c74e201e5404ee437b2639f020cf2823fc7fdaf40aa1100e 240 bytes 102400 cycles
# user <= user::tfixedstring {"arg":"1234567890abcdef"}
// @abi action
void tbytes (bytes arg) {
// eosio::print("tbytes:",arg,"\n");
}

cleos push action user tbytes '["010203"]' -p user
executed transaction: 205550d29b2785d40b5b52f0f74f25fa480ae2b6f8176b0a1ff472770422e5cb 232 bytes 103424 cycles
# user <= user::tbytes {"arg":"010203"}
// @abi action
void tname(name arg) {
eosio::print("tname:",arg,"\n");
}

cleos push action user tname '["user"]' -p user
executed transaction: 7d6f7db9427281a275235f988f572efd8bd26ec9a113b6101b89ac5dfc1040a2 232 bytes 102400 cycles
# user <= user::tname {"arg":"user"}
>> tname:user
// @abi action
void taccountname(account_name arg) {
eosio::print("taccountname:",arg,"\n");
}

cleos push action user taccountname '["user"]' -p user
executed transaction: 0861837a5fdb9fdce2ffa19db2912ef03c54220a710f532f0a35545b91900e47 232 bytes 102400 cycles
# user <= user::taccountname {"arg":"user"}
>> taccountname:15426359243929812992
// @abi action
void tpermname(permission_name arg) {
eosio::print("tpermname:",arg,"\n");
}

cleos push action user tpermname '["active"]' -p user
executed transaction: a1d046d5b882a851f171048d8054791ee1151007575a1488e867561c49af3ec5 232 bytes 102400 cycles
# user <= user::tpermname {"arg":"active"}
>> tpermname:3617214756542218240

// @abi action
void tactionname(action_name arg){
eosio::print("tactionname:",arg,"\n"); 
}

cleos push action user tactionname '["active"]' -p user
executed transaction: 14c98043bff1225c98eaaa81ddfeb41fa4d05e6cc2a88fa8416dc00f37f20310 232 bytes 102400 cycles
# user <= user::tactionname {"arg":"active"}
>> tactionname:3617214756542218240
// @abi action
void tscopename(scope_name arg) {
eosio::print("tscopename:",arg,"\n"); 
}

cleos push action user tscopename '["scope"]' -p user
executed transaction: a63d0acc81397129dec2bef6f2f643930a4328d9961ad53415752edd3722b8a1 232 bytes 102400 cycles
# user <= user::tscopename {"arg":"scope"}
>> tscopename:13990807175891517440
// @abi action
void tpermlvl(permission_level arg) {
//eosio::print("tpermlvl:",arg,"\n"); 
}

cleos push action user tpermlvl '[{"account":"acc1", "name":"actionname1", "authorization":[{"actor":"acc1","permission":"permname1"}], "data":"445566"},]' -p user
executed transaction: 7c0c5d052d199f881d7aabce2bd817b1bb22ac5e5d6c30353c679124e389908b 240 bytes 102400 cycles
# user <= user::tpermlvl {"arg":{"actor":"","permission":""}}

// @abi action
void taction(action arg) {
//eosio::print("taction:",arg,"\n"); 
}

cleos push action user taction '[{"account":"acc1", "name":"actionname1", "authorization":[{"actor":"acc1","permission":"permname1"}], "data":"445566"}]' -p user
executed transaction: 2c5906b2b2ee005c3b782441f4be6102940b02d84f80ff7c5d464fa85e812071 264 bytes 105472 cycles
# user <= user::taction {"arg":{"account":"acc1","name":"actionname1","authorization":[{"actor":"acc1","permission":"permnam...
// @abi action
void tpermlvlwgt(eosiosystem::permission_level_weight arg){
//eosio::print("taction:",arg,"\n"); 
}

cleos push action user tpermlvlwgt '[{"permission":{"actor":"acc1","permission":"permname1"},"weight":"1"}]' -p user
executed transaction: b06342593cfca38d7367eebca0a63bc7c4919b132de2fa0713feb422d3c1e4cb 240 bytes 102400 cycles
# user <= user::tpermlvlwgt {"arg":{"permission":{"actor":"acc1","permission":"permname1"},"weight":1}}
// @abi action
void ttransaction(transaction arg) {

}

cleos push action user ttransaction '[{"ref_block_num":"1","ref_block_prefix":"2","expiration":"2021-12-20T15:30","region": "1","context_free_actions":[{"account":"contextfree1", "name":"cfactionname1", "authorization":[{"actor":"cfacc1","permission":"cfpermname1"}], "data":"778899"}],"actions":[{"account":"accountname1", "name":"actionname1", "authorization":[{"actor":"acc1","permission":"permname1"}], "data":"445566"}],"net_usage_words":15,"kcpu_usage":43,"delay_sec":0}]' -p user
Error 3030000: transaction validation exception
Ensure that your transaction satisfy the contract's constraint!
Error Details:
condition: assertion failed: read
// @abi action
void tkeyweight(key_weight arg) {

}

cleos push action user tkeyweight '[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "weight":"100"}]' -p user
executed transaction: 5f377f0c85335ce017e034ed5362636238badeda146b1f8a9d6c7d44d2e35430 264 bytes 102400 cycles
# user <= user::tkeyweight {"arg":{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","weight":100}}

// @abi action
void tauthority(authority arg) {

}

cleos push action user tauthority '[{"threshold":"10","keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "weight":100},{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "weight":200}],"accounts":[{"permission":{"actor":"acc1","permission":"permname1"},"weight":"1"},{"permission":{"actor":"acc2","permission":"permname2"},"weight":"2"}]}]' -p user
executed transaction: 75182d443993274585e8f23368ba8d963d60fd15b1afd30aa64a28ee57ec2ffb 336 bytes 105472 cycles
# user <= user::tauthority {"arg":{"threshold":10,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","weigh...

cpp文件

#include <utility>
#include <vector>
#include <string>
#include <eosiolib/eosio.hpp>
#include <eosiolib/asset.hpp>
#include <eosiolib/contract.hpp>
#include <eosiolib/crypto.h>
#include <eosiolib/transaction.hpp>

using eosio::permission_level;

#include <eosio.system/native.hpp>


using eosio::key256;
using eosio::indexed_by;
using eosio::const_mem_fun;
using eosio::asset;
using eosio::bytes;
using eosio::action;
using eosio::print;
using eosio::name;
using eosio::transaction;
using eosiosystem::key_weight;
using eosiosystem::authority;



class hello : public eosio::contract { 
    public:
         hello(account_name self)
        :eosio::contract(self)
        {}

        // @abi action
        void tpublickey (public_key key) {
            eosio::print("tpubckey:\n");
        }

        // @abi action
         void tpkarr (std::vector<public_key> keyarr) {
            eosio::print("tpkarr:\n");
        }

        // @abi action
        void tasset (asset arg) {
            eosio::print("tasset:",arg,"\n");
        }

        // @abi action
        void tassetarr(std::vector<asset> args) {
            eosio::print("tassetarr:\n");    
            for (auto &arg :args)
            {
                eosio::print(arg,"\n");
            }
        }

        // @abi action
        void tstring (std::string str) {
            eosio::print("tstring:",str.c_str(),"\n");    
        }

        // // @abi action
        void tstringarr (std::vector<std::string> args) {
            eosio::print("tstringarr:\n");    
            for (auto &arg:args)
            {
                eosio::print(arg.c_str(),"\n");
            }
        }

        // @abi action
        void tsignature(signature arg){
            //eosio::print("tsignature:",arg,"\n");

        }

        // @abi action
        void tsgarr(std::vector<signature> args) {
            // eosio::print("tsgarr:",args,"\n");
            // for (auto &arg:args)
            // {
            //     eosio::print(arg,"\n");
            // }
        }

        // @abi action
        void tchecksum(checksum256 arg){
            //eosio::print("tchecksum:",arg,"\n");
        }

        // @abi action
        void tchecksumarr(std::vector<checksum256> args) {
            eosio::print("tchecksumarr:\n");    
        }

        //error
        // @abi action
        void tfieldname (field_name arg) {
            //eosio::print("tfieldname:",arg,"\n");
        }

        // @abi action
        void tfixedstr32(fixed_string32 arg) {
            //eosio::print("tfixedstring32:",arg,"\n");
        }

        //fixedstring16
        //@abi action
        void tfixedstring(fixed_string16 arg) {
            //eosio::print("tfixedstring16:",arg,"\n");
        }

        // @abi action
        void ttypename(type_name arg) {
            //eosio::print("ttypename:",arg,"\n");
        }

        // @abi action
        void tbytes (bytes arg) {
            // eosio::print("tbytes:",arg,"\n");
        }

        // @abi action
        void tname(name arg) {
            eosio::print("tname:",arg,"\n");
        }

        // @abi action
        void taccountname(account_name arg) {
            eosio::print("taccountname:",arg,"\n");
        }

        // @abi action
        void tpermname(permission_name arg) {
            eosio::print("tpermname:",arg,"\n");
        }

        // @abi action
        void tactionname(action_name arg){
            eosio::print("tactionname:",arg,"\n");    
        }

        // @abi action
        void tscopename(scope_name arg) {
            eosio::print("tscopename:",arg,"\n");    
        }

        // @abi action
        void tpermlvl(permission_level arg) {
            //eosio::print("tpermlvl:",arg,"\n");    
        }

        // @abi action
        void taction(action arg) {
            //eosio::print("taction:",arg,"\n");    
        }

        // @abi action
        void tpermlvlwgt(eosiosystem::permission_level_weight arg){
            //eosio::print("taction:",arg,"\n");    
        }

        // @abi action
        void ttransaction(transaction arg) {

        }

        // @abi action
        void tkeyweight(key_weight arg) {

        }

        // @abi action
        void tauthority(authority arg) {

        }

        //
        // field fields
        // signed_transaction
        // type_def action_def table_def abi_def  types  

};

EOSIO_ABI( hello, (tpublickey)(tpkarr)(tasset)(tassetarr)(tstring) (tstringarr)(tsignature)(tsgarr)(tchecksum)(tchecksumarr)(tfieldname)(tfixedstr32)(tfixedstring)(ttypename)(tbytes)(tname)(taccountname)(tpermname)(tactionname)(tscopename)(tpermlvl)(taction)(tpermlvlwgt)(ttransaction)(tkeyweight)(tauthority)
    )