diff --git a/example/create_badge_through_governance_design.md b/example/create_badge_through_governance_design.md index 9f24588..13987b2 100644 --- a/example/create_badge_through_governance_design.md +++ b/example/create_badge_through_governance_design.md @@ -11,7 +11,7 @@ Example session using cleos with can test net * Endpoint network: Use one of the following: -http://network-endpoint:8888 +https://history.stagenet.canfoundation.io * Contract name: cryptobadge2 @@ -27,7 +27,13 @@ navigate to contracts/crypto.badge and run those commands to complie and deploy ````bash eosio-cpp -abigen -I include -contract cryptobadge -R ricardian -o cryptobadge.wasm src/cryptobadge.cpp -cleos -u http://network-endpoint:8888 set contract cryptobadge5 . cryptobadge.wasm cryptobadge.abi -p cryptobadge5 +cleos -u https://history.stagenet.canfoundation.io set contract cryptobadge5 . cryptobadge.wasm cryptobadge.abi -p cryptobadge5 + +cleos -u https://history.stagenet.canfoundation.io push action cryptobadge5 setconfig '["ram.can", "governance"]' -p cryptobadge5 + +# set contract account permission +cleos -u https://history.stagenet.canfoundation.io set account permission governance23 active '{"threshold": 1,"keys": [{"key": "EOS7syfoU8p7aD4pxjVZ8Y3rtj1sKYp2aaLTDCAJKuk8fYecouJMy","weight": 1}],"accounts": [{"permission":{"actor":"governance23","permission":"eosio.code"},"weight":1}]}' owner -p governance23 + ```` ##### pre-process information data @@ -93,11 +99,11 @@ Json hash256: https://emn178.github.io/online-tools/sha256.html ````bash -$ cleos -u http://network-endpoint:8888 push action cryptobadge5 regissuer '[badgeissuer1, 74e202709e5e36075b72f23e6b7c253d998685014571ba10e362cc634ffdac18]' -p badgeissuer1 +$ cleos -u https://history.stagenet.canfoundation.io push action cryptobadge5 regissuer '[badgeissuer1, 74e202709e5e36075b72f23e6b7c253d998685014571ba10e362cc634ffdac18]' -p badgeissuer1 -$ cleos -u http://network-endpoint:8888 push action cryptobadge5 updateissuer '[badgeissuer1, 74e202709e5e36075b72f23e6b7c253d998685014571ba10e362cc634ffdac18]' -p badgeissuer1 +$ cleos -u https://history.stagenet.canfoundation.io push action cryptobadge5 updateissuer '[badgeissuer1, 74e202709e5e36075b72f23e6b7c253d998685014571ba10e362cc634ffdac18]' -p badgeissuer1 -$ cleos -u http://network-endpoint:8888 get table cryptobadge5 cryptobadge5 issuers +$ cleos -u https://history.stagenet.canfoundation.io get table cryptobadge5 cryptobadge5 v1.issuers { "rows": [{ "issuer": "badgeissuer1", @@ -113,10 +119,10 @@ $ cleos -u http://network-endpoint:8888 get table cryptobadge5 cryptobadge5 issu ```bash // transfer token to create new community account, memo is the name of community account -cleos -u http://network-endpoint:8888 transfer creator.can governance23 "20.0000 CAT" "community145" -p creator.can +cleos -u https://history.stagenet.canfoundation.io transfer creator.can governance23 "20.0000 CAT" "community145" -p creator.can // update community infomation -cleos -u http://network-endpoint:8888 push action governance23 create '[creator.can, community145, "Test", [], "test-v.com", "Testing vo", 1]' -p creator.can +cleos -u https://history.stagenet.canfoundation.io push action governance23 create '[creator.can, community145, "Test", [], "test-v.com", "Testing vo", 1]' -p creator.can ``` @@ -163,9 +169,9 @@ cleos -u http://18.182.95.163:8888 get table governance23 community145 codes 2. create proposal for transaction create badge use eosio.msig contract: ```bash -cleos -u http://network-endpoint:8888 multisig propose newbadge1111 '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' cryptobadge5 createbadge '{"issuer":"community145", "badge_id":1, "version":100, "name":"CryptoBadge", "image_url":"http://cryptobadge.app/image.img", "path":"cryptobadge", "description":"cryptobadge application", "criteria":"cryptobadge criteria"}' cryptobadge5 12 +cleos -u https://history.stagenet.canfoundation.io multisig propose newbadge1111 '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' cryptobadge5 createbadge '{"issuer":"community145", "badge_id":1, "version":100, "name":"CryptoBadge", "image_url":"http://cryptobadge.app/image.img", "path":"cryptobadge", "description":"cryptobadge application", "criteria":"cryptobadge criteria"}' cryptobadge5 12 -cleos -u http://network-endpoint:8888 multisig review cryptobadge5 newbadge1111 +cleos -u https://history.stagenet.canfoundation.io multisig review cryptobadge5 newbadge1111 { "proposer": "badge", "proposal_name": "newbadge1111", @@ -211,7 +217,7 @@ cleos -u http://network-endpoint:8888 multisig review cryptobadge5 newbadge1111 3. use cryptobadge smart contract account to sign this proposal: ```bash -cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approvals2 -U newbadge1111 -L newbadge1111 +cleos -u https://history.stagenet.canfoundation.io get table eosio.msig cryptobadge5 approvals2 -U newbadge1111 -L newbadge1111 { "rows": [{ "version": 1, @@ -236,9 +242,9 @@ cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approval "more": false } -cleos -u http://network-endpoint:8888 multisig approve cryptobadge5 newbadge1111 '{"actor": "cryptobadge5", "permission": "active"}' -p cryptobadge5 +cleos -u https://history.stagenet.canfoundation.io multisig approve cryptobadge5 newbadge1111 '{"actor": "cryptobadge5", "permission": "active"}' -p cryptobadge5 -cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approvals2 -U newbadge1111 -L newbadge1111 +cleos -u https://history.stagenet.canfoundation.io get table eosio.msig cryptobadge5 approvals2 -U newbadge1111 -L newbadge1111 { "rows": [{ "version": 1, @@ -275,7 +281,7 @@ cleos -u http://18.182.95.163:8888 convert pack_action_data governance23 createb cleos -u http://18.182.95.163:8888 push action governance23 execcode '[community145, creator.can, badge, createbadge, "5048f0d94d2d25451042088a2573b89a"]' -p creator.can // verify in state data -cleos -u http://network-endpoint:8888 get table cryptobadge5 community145 cbadges +cleos -u https://history.stagenet.canfoundation.io get table cryptobadge5 community145 cbadges { "rows": [{ "badge_id": 1, @@ -293,9 +299,9 @@ Do the same flow with create badge 1. create proposal for transaction create certification (issue badge) use eosio.msig contract: ```bash -cleos -u http://network-endpoint:8888 multisig propose newcert1111 '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' cryptobadge5 issuebadge '{"issuer":"community145", "owner":"community145", "badge_id":1, "badge_revision":100, "cert_id": 1, "encrypted_data":"abc123abcqweqweqr", "require_claim":0}' cryptobadge5 12 +cleos -u https://history.stagenet.canfoundation.io multisig propose newcert1111 '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' '[{"actor": "cryptobadge5", "permission": "active"},{"actor": "community145", "permission": "active"}]' cryptobadge5 issuebadge '{"issuer":"community145", "owner":"community145", "badge_id":1, "badge_revision":100, "cert_id": 1, "encrypted_data":"abc123abcqweqweqr", "require_claim":0}' cryptobadge5 12 -cleos -u http://network-endpoint:8888 multisig review cryptobadge5 newcert1111 +cleos -u https://history.stagenet.canfoundation.io multisig review cryptobadge5 newcert1111 { "proposer": "cryptobadge5", "proposal_name": "newcert1111", @@ -340,7 +346,7 @@ cleos -u http://network-endpoint:8888 multisig review cryptobadge5 newcert1111 3. use cryptobadge smart contract account to sign this proposal: ```bash -cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approvals2 -U newcert1111 -L newcert1111 +cleos -u https://history.stagenet.canfoundation.io get table eosio.msig cryptobadge5 approvals2 -U newcert1111 -L newcert1111 { "rows": [{ "version": 1, @@ -365,9 +371,9 @@ cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approval "more": false } -cleos -u http://network-endpoint:8888 multisig approve cryptobadge5 newcert1111 '{"actor": "cryptobadge5", "permission": "active"}' -p cryptobadge5 +cleos -u https://history.stagenet.canfoundation.io multisig approve cryptobadge5 newcert1111 '{"actor": "cryptobadge5", "permission": "active"}' -p cryptobadge5 -cleos -u http://network-endpoint:8888 get table eosio.msig cryptobadge5 approvals2 -U newcert1111 -L newcert1111 +cleos -u https://history.stagenet.canfoundation.io get table eosio.msig cryptobadge5 approvals2 -U newcert1111 -L newcert1111 { "rows": [{ "version": 1, @@ -404,7 +410,7 @@ cleos -u http://18.182.95.163:8888 convert pack_action_data governance23 issueba cleos -u http://18.182.95.163:8888 push action governance23 execcode '[community145, creator.can, badge, issuebadge, "5048f0d94d2d2545004208215f85b89a"]' -p creator.can // verify in state data -cleos -u http://network-endpoint:8888 get table cryptobadge5 community145 ccerts +cleos -u https://history.stagenet.canfoundation.io get table cryptobadge5 community145 ccerts { "rows": [{ "badge_id": 1, @@ -420,7 +426,7 @@ base on `require_claim` parameter use corresponding command to verify certificat ```bash // require_claim is false -cleos -u http://network-endpoint:8888 get table cryptobadge5 community145 ccerts +cleos -u https://history.stagenet.canfoundation.io get table cryptobadge5 community145 ccerts { "rows": [{ "id": 1, @@ -434,6 +440,6 @@ cleos -u http://network-endpoint:8888 get table cryptobadge5 community145 ccerts } // require_claim is true -cleos -u http://network-endpoint:8888 get table cryptobadge5 cryptobadge5 offers +cleos -u https://history.stagenet.canfoundation.io get table cryptobadge5 cryptobadge5 offers ``` diff --git a/include/cryptobadge.hpp b/include/cryptobadge.hpp index 79f0de5..5a1614b 100644 --- a/include/cryptobadge.hpp +++ b/include/cryptobadge.hpp @@ -19,7 +19,7 @@ class[[eosio::contract]] cryptobadge : public contract public: //using contract::contract; - cryptobadge(name receiver, name code, datastream ds) : contract(receiver, code, ds) {} + cryptobadge(name receiver, name code, datastream ds) : contract(receiver, code, ds),_global(_self, _self.value) {} /* * New issuer registration. issuer is required to create new badge. Markets *may* choose to use information here @@ -104,57 +104,37 @@ class[[eosio::contract]] cryptobadge : public contract * claimer - account claiming the badge; * cert_ids - array of cert_id's to claim; */ - ACTION claimcert(name claimer, std::vector & cert_ids); - - /* - * Cancel and remove offer. Available for the certification owner. - * - * issuer - current certification issuer account; - * cert_ids - array of cert_id's to cancel from offer; - */ - ACTION canceloffer(name issuer, std::vector & cert_ids); - - /* - * Remove certification {{cert_id}}. This action is only available for the certification owner. After executing, the - * certification will disappear forever, and RAM used for certification will be released. - * - * owner - current certification owner account; - * cert_ids - array of cert_id's to remove; - * memo - memo for remove action; - */ - ACTION removecert(name owner, std::vector & cert_ids, string memo); + ACTION claimbadge(name claimer, name issuer, uint64_t cert_ids); /* * Empty action. Used by create action to log cert_id so that third party explorers can * easily get new certification ids and other information. */ - ACTION createlog(name issuer, name owner, checksum256 & idata, uint64_t cert_id, bool require_claim); + ACTION issuelog(name issuer, name owner, uint64_t cert_id, const checksum256 & issued_tx_id); + /* * Set global config for badge contract * */ - ACTION setconfig(name governance_contract_name); + ACTION setconfig(name ram_payer_account, name governance_design); private: enum CertificationState { CERTIFIED = 0, EXPIRED, - REVOKED + REVOKED }; - uint64_t getid(uint64_t gindex); - - template - void sendEvent(name issuer, name rampayer, name seaction, const std::tuple &tup); + checksum256 gettrxid(); /* * issuers table. Can be used by badge markets, badge explorers, or wallets for correct badge * data presentation. * Scope: self */ - TABLE cissuer + TABLE v1_issuer { name issuer; checksum256 data; @@ -164,13 +144,13 @@ class[[eosio::contract]] cryptobadge : public contract return issuer.value; } }; - typedef multi_index<"v1.issuers"_n, cissuer> issuers; + typedef multi_index<"v1.issuers"_n, v1_issuer> v1_issuers; /* * Badges table which stores information about simple badges. * Scope: badge owner */ - TABLE cbadge + TABLE v1_badge { uint64_t badge_id; name issuer; @@ -180,15 +160,15 @@ class[[eosio::contract]] cryptobadge : public contract uint64_t by_issuer() const { return issuer.value; } }; - typedef eosio::multi_index<"v1.badges"_n, cbadge, - eosio::indexed_by<"issuer"_n, eosio::const_mem_fun>> - cbadges; + typedef eosio::multi_index<"v1.badges"_n, v1_badge, + eosio::indexed_by<"issuer"_n, eosio::const_mem_fun>> + v1_badges; /* * Certification table which stores information about certifications. * Scope: certification owner */ - TABLE ccert + TABLE v1_cert { uint64_t id; uint64_t badge_id; @@ -211,86 +191,81 @@ class[[eosio::contract]] cryptobadge : public contract } }; - typedef eosio::multi_index<"v1.certs"_n, ccert, - eosio::indexed_by<"badgeid"_n, eosio::const_mem_fun>, - eosio::indexed_by<"owner"_n, eosio::const_mem_fun>> - ccerts; + typedef eosio::multi_index<"v1.certs"_n, v1_cert, + eosio::indexed_by<"badgeid"_n, eosio::const_mem_fun>, + eosio::indexed_by<"owner"_n, eosio::const_mem_fun>> + v1_certs; /* * Certification table which stores information about certifications. * Scope: certification owner */ - TABLE ccertinfo + TABLE v1_issuing_cert { - uint64_t cert_id; - string cert_content; + uint64_t id; + uint64_t badge_id; + uint64_t badge_revision; + name owner; + uint64_t state; + uint64_t expire_at; + checksum256 issued_tx_id; auto primary_key() const { - return cert_id; + return id; + } + uint64_t by_badge_id() const + { + return badge_id; + } + uint64_t by_owner() const + { + return owner.value; } }; - typedef eosio::multi_index<"v1.certinfo"_n, ccertinfo> ccertinfos; - + typedef eosio::multi_index<"v1.issuing"_n, v1_issuing_cert, + eosio::indexed_by<"badgeid"_n, eosio::const_mem_fun>, + eosio::indexed_by<"owner"_n, eosio::const_mem_fun>> + v1_issuing_certs; + /* - * Offers table keeps records of open offers of certifications (ie. certifications waiting to be claimed by their - * intendend recipients. - * - * Scope: self + * Certification table which stores information about certifications. + * Scope: certification owner */ - TABLE coffer + TABLE v1_certinfo { uint64_t cert_id; - name owner; - name offered_to; - time_point date; + string cert_content; auto primary_key() const { return cert_id; } - uint64_t by_owner() const - { - return owner.value; - } - uint64_t by_offered_to() const - { - return offered_to.value; - } }; - typedef eosio::multi_index<"v1.offers"_n, coffer, - eosio::indexed_by<"owner"_n, eosio::const_mem_fun>, - eosio::indexed_by<"offeredto"_n, eosio::const_mem_fun>> - offers; + typedef eosio::multi_index<"v1.certinfos"_n, v1_certinfo> v1_certinfos; /* * global singelton table, used for cert_id building * Scope: self */ - TABLE global + TABLE v1_global { - global() {} - uint64_t defer_id = 10000000000000; - uint64_t cert_id = 100000; - uint64_t badge_id = 0; - name governance_contract_name = "governance"_n; + v1_global() {} + name ram_payer_account = "ram.can"_n; + name governance_design = "governance"_n; - EOSLIB_SERIALIZE(global, (defer_id)(cert_id)(badge_id)(governance_contract_name)) + EOSLIB_SERIALIZE(v1_global, (ram_payer_account)(governance_design)) }; - typedef eosio::singleton<"v1.global"_n, global> conf; - typedef eosio::multi_index<"v1.global"_n, global> fconf; - global _cstate; + typedef eosio::singleton<"v1.global"_n, v1_global> v1_global_table; + typedef eosio::multi_index<"v1.global"_n, v1_global> fv1_global_table; + // v1_global _cstate; - enum gindex : uint8_t - { - DEFER = 0, - CERT = 1, - BADGE = 2, - }; + v1_global_table _global; + //refer govenance design TABLE communityf diff --git a/ricardian/cryptobadge.contracts.md b/ricardian/cryptobadge.contracts.md index f90a540..73e4f1e 100644 --- a/ricardian/cryptobadge.contracts.md +++ b/ricardian/cryptobadge.contracts.md @@ -1,7 +1,7 @@

regissuer

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Register Issuer summary: 'Register {{nowrap issuer}} as a issuer of cryptobadge' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -12,7 +12,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

updateissuer

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Update Issuer summary: 'Update infomation of issuer {{nowrap issuer}}' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -23,7 +23,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

createbadge

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Create Badge summary: 'Issuer {{nowrap issuer}} create new badge' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -35,7 +35,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

updatebadge

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Update Badge summary: 'Update badge with id {{badge_id}} of issuer {{nowrap issuer}}' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -46,7 +46,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

issuebadge

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Create certification summary: 'Create new certification' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -54,10 +54,10 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg# {{issuer}} agrees to create new certification with badge id {{badge_id}} for owner {{owner}} with the enrypted data {{idata}} and require claim option {{require_claim}}. -

claimcert

+

claimbadge

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Claim Certifications summary: 'User claim certifications with specified ids' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -68,7 +68,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

canceloffer

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Cancel and remove offer summary: 'Cancel and remove offer' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -79,7 +79,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

removecert

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Remove certifications summary: 'Remove certifications' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -90,7 +90,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

attach

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Attach Certification Detail summary: 'Attach certification detail' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -101,7 +101,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

detach

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Detach Certification Detail summary: 'Detach certification detail' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -112,7 +112,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

createlog

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Create log summary: 'Create log' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -123,7 +123,7 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

revokecert

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Revoke Certification summary: 'Revoke Certification' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f @@ -134,24 +134,32 @@ icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#

expirecert

--- -spec_version: "0.1.0" +spec_version: "2.0.0" title: Update Certification state to expire summary: 'Update Certification state to expire' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f --- -{{updater}} update certification with ID {{cert_id}} of {{owner}} to expired. +{{contract onwer}} config system envirement.

setconfig

--- -spec_version: "0.1.0" -title: Update Certification state to expire -summary: 'Update Certification state to expire' +spec_version: "2.0.0" +title: Config system envirement +summary: 'Set/update system envirement' icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f --- -set configuration for badge contract. +{{issuer}} log event about issued transaction_id to {{owner}}. + +

issuelog

+--- +spec_version: "2.0.0" +title: Log event when owner claim the badge +summary: 'Log event when owner claim the badge' +icon: https://ddnb1wizcm1i5.cloudfront.net/fd91d4bdbcfbb8fc528b0cc8d7b11fa5.svg#a4148806780c5b0a2ed0e1e44a36b1947dd932f653184964d9e44e5dae084a9f +--- diff --git a/src/cryptobadge.cpp b/src/cryptobadge.cpp index 16f25f5..3fef98d 100644 --- a/src/cryptobadge.cpp +++ b/src/cryptobadge.cpp @@ -1,19 +1,25 @@ #include "../include/cryptobadge.hpp" -const uint64_t BADGE_SCHEMA_V1 = 1000; +const name non_can_account = ""_n; ACTION cryptobadge::regissuer( name issuer, checksum256& data) { require_auth( issuer ); - require_recipient( issuer ); - - issuers _issuer(_self, _self.value); + require_auth( _self ); + + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; + + v1_issuers _issuer(_self, _self.value); auto itr = _issuer.find( issuer.value ); check (itr == _issuer.end(), "issuer already registered"); - _issuer.emplace( issuer, [&]( auto& s ) { + _issuer.emplace( ram_payer, [&]( auto& s ) { s.issuer = issuer; s.data = data; }); @@ -21,14 +27,20 @@ ACTION cryptobadge::regissuer( name issuer, checksum256& data) { ACTION cryptobadge::updateissuer( name issuer, checksum256& data) { require_auth( issuer ); - require_recipient( issuer ); + require_auth( _self ); + + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; - issuers _issuer(_self, _self.value); + v1_issuers _issuer(_self, _self.value); auto itr = _issuer.find( issuer.value ); check ( itr != _issuer.end(), "issuer not registered" ); - _issuer.modify( itr, issuer, [&]( auto& s ) { + _issuer.modify( itr, ram_payer, [&]( auto& s ) { s.data = data; }); } @@ -37,24 +49,28 @@ ACTION cryptobadge::createbadge(name issuer, uint64_t badge_id, string name, str require_auth( issuer ); require_auth( _self ); - conf config(_self, _self.value); - _cstate = config.exists() ? config.get() : global{}; - const eosio::name governance_contract_name = _cstate.governance_contract_name; + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; + + v1_issuers _issuer(_self, _self.value); + community_table _community(g_state.governance_design, g_state.governance_design.value); - // TODO check if issuer is community account - issuers _issuer(_self, _self.value); - community_table _community(governance_contract_name, governance_contract_name.value); auto issuer_itr = _issuer.find( issuer.value ); if(issuer_itr == _issuer.end()){ auto community_itr = _community.find( issuer.value ); check ( community_itr != _community.end(), "issuer does not exist" ); } - cbadges _badges( _self, issuer.value ); + // TODO check if issuer is community account + + v1_badges _badges( _self, issuer.value ); auto badge_itr = _badges.find(badge_id); check ( badge_itr == _badges.end(), "badge_id already exist" ); - _badges.emplace( issuer, [&]( auto& s ) { + _badges.emplace( ram_payer, [&]( auto& s ) { s.badge_id = badge_id; s.issuer = issuer; }); @@ -65,13 +81,19 @@ ACTION cryptobadge::updatebadge( name issuer, uint64_t badge_id, string name, st require_auth( issuer ); require_auth( _self ); - cbadges _badges( _self, issuer.value ); + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; + + v1_badges _badges( _self, issuer.value ); auto itr = _badges.find( badge_id ); check (itr != _badges.end(), "badge does not exist"); check (itr->issuer == issuer, "badge does not belong to issuer"); - _badges.modify( itr, issuer, [&]( auto& s ) { + _badges.modify( itr, ram_payer, [&]( auto& s ) { s.version = itr->version + 1; }); } @@ -81,88 +103,97 @@ ACTION cryptobadge::issuebadge( name issuer, name owner, uint64_t badge_id, uint require_auth( issuer ); require_auth( _self ); - conf config(_self, _self.value); - _cstate = config.exists() ? config.get() : global{}; - const name governance_contract_name = _cstate.governance_contract_name; + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; - check( is_account( owner ), "owner account does not exist"); + v1_issuers _issuer(_self, _self.value); + community_table _community(g_state.governance_design, g_state.governance_design.value); - issuers _issuer(_self, _self.value); - community_table _community(governance_contract_name, governance_contract_name.value); auto issuer_itr = _issuer.find( issuer.value ); if(issuer_itr == _issuer.end()) { auto community_itr = _community.find( issuer.value ); check ( community_itr != _community.end(), "issuer does not exist" ); } - - require_recipient( owner ); - cbadges _badges( _self, issuer.value ); + v1_badges _badges( _self, issuer.value ); auto badge_itr = _badges.find( badge_id ); check (badge_itr != _badges.end(), "badge does not exist"); + check ((is_account( owner ) && require_claim == 0) || (owner == non_can_account && require_claim == 1), "require_claim only for non CAN account."); - name certOwner = owner; + if(require_claim){ + // Non CAN account + v1_issuing_certs _issuing_certs(_self, issuer.value); + auto issuing_cert_itr = _issuing_certs.find(cert_id); + check (issuing_cert_itr == _issuing_certs.end(), "cert already exist"); + + _issuing_certs.emplace( ram_payer, [&]( auto& row ) { + row.id = cert_id; + row.badge_id = badge_id; + row.badge_revision = badge_revision; + row.owner = owner; + row.state = CertificationState::CERTIFIED; + row.expire_at = expire_at; + row.issued_tx_id = gettrxid(); + + }); + }else{ + // CAN account + require_recipient( owner ); - check (!(issuer.value == owner.value && require_claim == 1), "require_claim only issuer == owner."); - - if (require_claim) { - certOwner = issuer; - //add info to offers table - offers _offert(_self, _self.value); - auto offer_itr = _offert.find(cert_id); - check (offer_itr == _offert.end(), "offer already exist"); - - _offert.emplace( issuer, [&]( auto& s ) { - s.cert_id = cert_id; - s.offered_to = owner; - s.owner = issuer; - s.date = current_time_point(); + v1_certs _certs(_self, owner.value); + auto cert_itr = _certs.find(cert_id); + check (cert_itr == _certs.end(), "cert already exist"); + + _certs.emplace( ram_payer, [&]( auto& s ) { + s.id = cert_id; + s.badge_id = badge_id; + s.badge_revision = badge_revision; + s.owner = owner; + s.state = CertificationState::CERTIFIED; + s.expire_at = expire_at; }); } - ccerts _certs(_self, certOwner.value); - auto cert_itr = _certs.find(cert_id); - check (cert_itr == _certs.end(), "cert already exist"); - - _certs.emplace( issuer, [&]( auto& s ) { - s.id = cert_id; - s.badge_id = badge_id; - s.badge_revision = badge_revision; - s.owner = owner; - s.state = CertificationState::CERTIFIED; - s.expire_at = expire_at; - }); - } ACTION cryptobadge::expirecert( name updater, uint64_t cert_id, name owner ) { require_auth(updater); - ccerts _certs(_self, owner.value); + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; + + auto ram_payer = updater; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; + + v1_certs _certs(_self, owner.value); auto cert_itr = _certs.find(cert_id); check (cert_itr != _certs.end(), "cert does not exist"); - check (cert_itr->expire_at, "Certificate can not be expired"); + check (cert_itr->expire_at, "Certificate can not be expired"); check (cert_itr->expire_at < current_time_point().sec_since_epoch(), "Certificate has not been expired"); check (cert_itr->state == CertificationState::CERTIFIED, "Certificate has been revoked or expired"); - _certs.modify( cert_itr, updater, [&]( auto& s ) { + _certs.modify( cert_itr, ram_payer, [&]( auto& s ) { s.state = CertificationState::EXPIRED; }); } ACTION cryptobadge::revokecert( name issuer, uint64_t cert_id, name owner, string reason ) { require_auth(issuer); + require_auth( _self ); - ccerts _certs(_self, owner.value); + v1_certs _certs(_self, owner.value); auto cert_itr = _certs.find(cert_id); check (cert_itr != _certs.end(), "cert does not exist"); - cbadges _badges( _self, issuer.value ); + v1_badges _badges( _self, issuer.value ); auto itr = _badges.find( cert_itr->badge_id ); check (itr != _badges.end(), "certificate's issuer is invalid"); check (itr->issuer == issuer, "badge does not belong to issuer"); @@ -172,134 +203,99 @@ ACTION cryptobadge::revokecert( name issuer, uint64_t cert_id, name owner, strin }); } - -ACTION cryptobadge::createlog( name issuer, name owner, checksum256& idata, uint64_t cert_id, bool require_claim) { +ACTION cryptobadge::issuelog( name issuer, name owner, uint64_t cert_id, const checksum256 & issued_tx_id) { require_auth(get_self()); + require_recipient( owner ); } -ACTION cryptobadge::claimcert( name claimer, std::vector& cert_ids) { +ACTION cryptobadge::claimbadge( name claimer, name issuer, uint64_t cert_id) { + require_auth( _self ); require_auth( claimer ); - require_recipient( claimer ); - - offers offert(_self, _self.value); - ccerts certs_t(_self, claimer.value); - - std::map< name, std::map< uint64_t, name > > uniqissuer; - for( size_t i = 0; i < cert_ids.size(); ++i ) { - - auto itrc = offert.find( cert_ids[i] ); - - check(itrc != offert.end(), "Cannot find at least one of the certs you're attempting to claim."); - check(claimer == itrc->offered_to, "At least one of the certs has not been offerred to you."); - - ccerts certs_f( _self, itrc->owner.value ); - auto itr = certs_f.find( cert_ids[i] ); - check(itr != certs_f.end(), "Cannot find at least one of the certs you're attempting to claim."); - - check(itrc->owner.value == itr->owner.value, "Owner was changed for at least one of the items!?"); - - certs_t.emplace( claimer, [&]( auto& s ) { - s.id = itr->id; - s.badge_id = itr->badge_id; - s.badge_revision = itr->badge_revision; - s.owner = claimer; - s.state = itr->state; - s.expire_at = itr->expire_at; - }); - certs_f.erase(itr); - offert.erase(itrc); + auto g_state = _global.exists() ? _global.get() : v1_global{}; + auto ram_payer_system = g_state.ram_payer_account; - } -} + v1_issuing_certs _issuing_certs(_self, issuer.value); + auto issuing_cert_itr = _issuing_certs.find( cert_id ); + check(issuing_cert_itr != _issuing_certs.end(), "Cannot find the certs you're attempting to claim."); -ACTION cryptobadge::canceloffer( name issuer, std::vector& cert_ids){ + v1_badges _badges( _self, issuer.value ); + auto badge_itr = _badges.find( issuing_cert_itr->badge_id ); - require_auth( issuer ); - - offers offert(_self, _self.value); + check (badge_itr != _badges.end(), "badge of certification index does not exist"); - for( size_t i = 0; i < cert_ids.size(); ++i ) { - auto itr = offert.find( cert_ids[i] ); + auto ram_payer = claimer; + if(has_auth(issuer)) ram_payer = issuer; + if(has_auth(ram_payer_system)) ram_payer = ram_payer_system; - check ( itr != offert.end(), "The offer for at least one of the certs was not found." ); - check (issuer.value == itr->owner.value, "You're not the owner of at least one of the certs whose offers you're attempting to cancel."); + v1_certs _certs(_self, claimer.value); - offert.erase(itr); - } -} - - -ACTION cryptobadge::removecert( name owner, std::vector& cert_ids, string memo ) { - - require_auth( owner ); + auto itr = _certs.find( cert_id ); + check(itr == _certs.end(), "the certs you're attempting to claim already exist."); + _certs.emplace( ram_payer, [&]( auto& row ) { + row.id = issuing_cert_itr->id; + row.badge_id = issuing_cert_itr->badge_id; + row.badge_revision = issuing_cert_itr->badge_revision; + row.owner = issuing_cert_itr->owner; + row.state = issuing_cert_itr->state; + row.expire_at = issuing_cert_itr->expire_at; + }); + eosio::action( + permission_level{_self, "active"_n}, + get_self(), "issuelog"_n, + std::make_tuple(issuer, claimer, cert_id, issuing_cert_itr->issued_tx_id)) + .send(); - ccerts certs_f( _self, owner.value ); - offers offert(_self, _self.value); - - std::map< name, std::vector > uniqissuer; - - for( size_t i = 0; i < cert_ids.size(); ++i ) { - - auto itr = certs_f.find( cert_ids[i] ); - check(itr != certs_f.end(), "At least one of the certs was not found."); - - check(owner.value == itr->owner.value, "At least one of the certs you're attempting to burn is not yours."); - - auto itrc = offert.find( cert_ids[i] ); - check ( itrc == offert.end(), "At least one of the certs has an open offer and cannot be burned." ); - - certs_f.erase(itr); - - } - + _issuing_certs.erase(issuing_cert_itr); } -ACTION cryptobadge::setconfig(name governance_contract_name) { +ACTION cryptobadge::setconfig(name ram_payer_account, name governance_design) { require_auth( _self ); - conf config(_self, _self.value); - _cstate = config.get_or_create(_self ); + if (!_global.exists()) + { + v1_global default_config; + default_config.ram_payer_account = "ram.can"_n; + default_config.governance_design = "governance"_n; + _global.get_or_create(_self, default_config); + } + auto g_config = _global.get(); + g_config.ram_payer_account = ram_payer_account; + g_config.governance_design = governance_design; + _global.set(g_config, _self); - _cstate.governance_contract_name = governance_contract_name; - - config.set(_cstate, _self); -} - -/* -* Increment, save and return id for a new certification. -*/ -uint64_t cryptobadge::getid(uint64_t gindex){ - - conf config(_self, _self.value); - _cstate = config.get(); - - uint64_t resid; - if (gindex == DEFER) { - _cstate.defer_id++; - resid = _cstate.defer_id; - } else if(gindex == CERT) { - _cstate.cert_id++; - resid = _cstate.cert_id; - } else if(gindex == BADGE){ - _cstate.badge_id++; - resid = _cstate.badge_id; - } - - config.set(_cstate, _self); - return resid; } -template -void cryptobadge::sendEvent(name issuer, name rampayer, name seaction, const std::tuple &adata) { - - transaction sevent{}; - sevent.actions.emplace_back( permission_level{_self, "active"_n}, issuer, seaction, adata); - sevent.delay_sec = 0; - sevent.send(getid(DEFER), rampayer); +checksum256 cryptobadge::gettrxid() { + size_t size = transaction_size(); + char buf[size]; + size_t read = read_transaction( buf, size ); + check( size == read, "read_transaction failed"); + return sha256( buf, read ); } -EOSIO_DISPATCH( cryptobadge, (regissuer)(updateissuer)(createbadge)(updatebadge)(issuebadge)(createlog)(removecert)(canceloffer)(claimcert)(revokecert)(expirecert)(setconfig)) +#define EOSIO_ABI_CUSTOM(TYPE, MEMBERS) \ + extern "C" \ + { \ + void apply(uint64_t receiver, uint64_t code, uint64_t action) \ + { \ + auto self = receiver; \ + if (code == self || code == "eosio.token"_n.value || action == "onerror"_n.value) \ + { \ + if (action == "transfer"_n.value) \ + { \ + check(code == "eosio.token"_n.value, "Must transfer Token"); \ + } \ + switch (action) \ + { \ + EOSIO_DISPATCH_HELPER(TYPE, MEMBERS) \ + } \ + /* does not allow destructor of thiscontract to run: eosio_exit(0); */ \ + } \ + } \ + } + +EOSIO_ABI_CUSTOM( cryptobadge, (setconfig)(regissuer)(updateissuer)(createbadge)(updatebadge)(issuebadge)(issuelog)(claimbadge)(revokecert)(expirecert))