From e57c104ec278b04f25842ce880314c9a4b831f95 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Dec 2021 11:09:34 +0000 Subject: [PATCH] 1.6.2 --- README.md | 4 + build/SimpleAssets/SimpleAssets.abi | 239 +++++-------------------- build/SimpleAssets/SimpleAssets.wasm | Bin 240229 -> 221032 bytes include/SimpleAssets.hpp | 125 +++---------- ricardian/SimpleAssets.contracts.md | 135 ++------------ ricardian/SimpleAssets.contracts.md.in | 137 +++----------- src/SimpleAssets.cpp | 90 ++-------- 7 files changed, 131 insertions(+), 599 deletions(-) diff --git a/README.md b/README.md index bc4040d..ee12a67 100644 --- a/README.md +++ b/README.md @@ -674,6 +674,10 @@ to be the main image. ----------------- # Change Logs +## Change Log v1.6.2 +- deprecated sae* actions + brunlog +- createflog and offerflog added + ## Change Log v1.6.1 - support for token-back NFT contract - Changed map structure type to vector in `saeclaim` and `saechautor` log actions diff --git a/build/SimpleAssets/SimpleAssets.abi b/build/SimpleAssets/SimpleAssets.abi index b7b4dac..37b421b 100644 --- a/build/SimpleAssets/SimpleAssets.abi +++ b/build/SimpleAssets/SimpleAssets.abi @@ -167,24 +167,6 @@ } ] }, - { - "name": "burnlog", - "base": "", - "fields": [ - { - "name": "owner", - "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, { "name": "burnntt", "base": "", @@ -203,24 +185,6 @@ } ] }, - { - "name": "burnnttlog", - "base": "", - "fields": [ - { - "name": "owner", - "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, { "name": "canceloffer", "base": "", @@ -387,6 +351,32 @@ } ] }, + { + "name": "createflog", + "base": "", + "fields": [ + { + "name": "newID", + "type": "uint64" + }, + { + "name": "author", + "type": "name" + }, + { + "name": "maximum_supply", + "type": "asset" + }, + { + "name": "authorctrl", + "type": "bool" + }, + { + "name": "data", + "type": "string" + } + ] + }, { "name": "createlog", "base": "", @@ -766,68 +756,28 @@ ] }, { - "name": "openf", + "name": "offerflog", "base": "", "fields": [ { - "name": "owner", - "type": "name" - }, - { - "name": "author", - "type": "name" - }, - { - "name": "symbol", - "type": "symbol" - }, - { - "name": "ram_payer", - "type": "name" - } - ] - }, - { - "name": "saeburn", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" + "name": "newID", + "type": "uint64" }, { "name": "owner", "type": "name" }, { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" - } - ] - }, - { - "name": "saechauthor", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "newauthor", + "name": "newowner", "type": "name" }, { - "name": "owner", + "name": "author", "type": "name" }, { - "name": "assetids", - "type": "tuple_uint64_name[]" + "name": "quantity", + "type": "asset" }, { "name": "memo", @@ -836,80 +786,24 @@ ] }, { - "name": "saeclaim", - "base": "", - "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "claimer", - "type": "name" - }, - { - "name": "assetids", - "type": "tuple_uint64_name[]" - } - ] - }, - { - "name": "saecreate", + "name": "openf", "base": "", "fields": [ - { - "name": "author", - "type": "name" - }, - { - "name": "category", - "type": "name" - }, { "name": "owner", "type": "name" }, - { - "name": "idata", - "type": "string" - }, - { - "name": "mdata", - "type": "string" - }, - { - "name": "assetid", - "type": "uint64" - }, - { - "name": "requireclaim", - "type": "bool" - } - ] - }, - { - "name": "saetransfer", - "base": "", - "fields": [ { "name": "author", "type": "name" }, { - "name": "from", - "type": "name" + "name": "symbol", + "type": "symbol" }, { - "name": "to", + "name": "ram_payer", "type": "name" - }, - { - "name": "assetids", - "type": "uint64[]" - }, - { - "name": "memo", - "type": "string" } ] }, @@ -1235,20 +1129,6 @@ } ] }, - { - "name": "tuple_uint64_name", - "base": "", - "fields": [ - { - "name": "field_0", - "type": "uint64" - }, - { - "name": "field_1", - "type": "name" - } - ] - }, { "name": "undelegate", "base": "", @@ -1372,21 +1252,11 @@ "type": "burnflog", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnflog (internal)\nsummary: burnflog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" }, - { - "name": "burnlog", - "type": "burnlog", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnlog (internal)\nsummary: burnlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" - }, { "name": "burnntt", "type": "burnntt", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Burn non transferable asset\nsummary: Burn non transferable asset\nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---\n\nThis action is only available for the asset owner. After executing, the asset will disappear forever, and RAM used for asset will be released.\n\nInput parameters:\n`owner` - current asset owner account;\n`assetids` - array of assetid's to burn;\n`memo` - memo for burn action;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, - { - "name": "burnnttlog", - "type": "burnnttlog", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: burnnttlog (internal)\nsummary: burnnttlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---" - }, { "name": "canceloffer", "type": "canceloffer", @@ -1432,6 +1302,11 @@ "type": "createf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Creates fungible token\nsummary: Creates fungible token\nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nCreates fungible token with specified maximum supply; You can not change anything after creation.\n\nInput parameters:\n`author` - fungible token author;\n`maximum_supply` - maximum token supply, example \"10000000.0000 GOLD\", \"10000000 SEED\", \"100000000.00 WOOD\". Precision is also important here;\n`authorctrl` - if true(1) allow token author (and not just owner) to burnf and transferf. Cannot be changed after creation!\n`data` - stringify json (recommend including keys `img` and `name` for better displaying by markets)\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, + { + "name": "createflog", + "type": "createflog", + "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: createlog (internal)\nsummary: createlog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" + }, { "name": "createlog", "type": "createlog", @@ -1507,36 +1382,16 @@ "type": "offerf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Offer fungible tokens to claim\nsummary: Offer fungible tokens for another EOS user to claim\nicon: https://cryptolions.io/assets/images/sa-icons-256/offerf.png#a34462918e536372610a523225e5221cd2685eff3c329499ded7298907f8524b\n---\n\nThis is an alternative to the transfer action. Offer can be used by a FT owner to transfer the FTs without using their RAM. After an offer is made, the account specified in new owner is able to make a claim, and take control of the asset using their RAM. FTs will be removed from the owner's balance while the offer is open\n\nInput parameters:\n`owner` - original owner of the FTs\n`newowner` - account which will be able to claim the offer\n`author` - account of fungible token author;\t\n`quantity` - amount to transfer, example \"1.00 WOOD\";\n`memo` - offer's comment;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, + { + "name": "offerflog", + "type": "offerflog", + "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: offerflog (internal)\nsummary: offerflog (internal) \nicon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30\n---\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" + }, { "name": "openf", "type": "openf", "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Opens accounts table for fungible token\nsummary: Opens accounts table for specified fungible token\nicon: https://cryptolions.io/assets/images/sa-icons-256/attach.png#0b039adbbe1011a494959963917df4765dbae378004e00911464f865e58ef452\n---\n\nInput parameters:\n`owner` - account who woud like to close table with fungible token;\n`author` - account of fungible token author;\n`symbol` - token symbol, example \"WOOD\", \"ROCK\", \"GOLD\";\n`ram_payer` - account who will pay for ram used for table creation;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" }, - { - "name": "saeburn", - "type": "saeburn", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84\n---\n\nThis action is called during burn in deferred transaction \n\nInput parameters:\n`author` - asset's author;\n`owner` - current asset owner account;\n`assetids` - array of assetid's to burn;\n`memo` - memo for burn action;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saechauthor", - "type": "saechauthor", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/regauthor.png#c6a539be8e7dfd1a4c466ba9cabfd13571cd77d5c988c652d2e8f87096f3548e\n---\t\n\nInput parameters:\n`author` - asset's author, who will able to change author name asset's;\n`newauthor` - asset's new author name;\n`owner` - assets owner;\n`assetids` - array of assetid's\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saeclaim", - "type": "saeclaim", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d\n---\n\nInput parameters:\n`author` - asset's author, who will able to updated asset's mdata;\n`claimer` - account claiming the asset;\n`assetids` - array of assetid's to claim;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saecreate", - "type": "saecreate", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/create.png#db2bc53cef5dbbce5247543a91234373ec4bd1baf743301a0d92a35b053eeb70\n---\t\n\nInput parameters:\n`author` - asset's author, who will able to updated asset's mdata;\n`category` - assets category;\n`owner` - assets owner;\n`idata` - stringified json with immutable assets data\n`mdata` - stringified json with mutable assets data, can be changed only by author\n`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but \n\t\t\t\t but AUTHOR'S memory will be used until the asset is transferred again). If enabled,\n\t\t\t\t author will remain the owner, but an offer will be created for the account specified in \n\t\t\t\t the owner field to claim the asset using the account's RAM.\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, - { - "name": "saetransfer", - "type": "saetransfer", - "ricardian_contract": "---\nspec_version: 0.0.2\ntitle: Internal action used for creating log\nsummary: Internal action used for creating log\nicon: https://cryptolions.io/assets/images/sa-icons-256/transfer.png#23227a4901414db5cd0973d1cc5df13f9b82375b21c6315fd3402cb4acd50cbf\n---\n\nThis action is called during transfer in deferred transaction \n\nInput parameters:\n`author` - asset's author;\n`from` - account who sends the asset;\n`to` - account of receiver;\n`assetids` - array of assetid's to transfer;\n`memo` - transfers comment;\n\nTERM\nThis Contract expires at the conclusion of code execution.\nby CryptoLions [ https://cryptolions.io ]" - }, { "name": "setarampayer", "type": "setarampayer", diff --git a/build/SimpleAssets/SimpleAssets.wasm b/build/SimpleAssets/SimpleAssets.wasm index 15c0ee6600cdee2bfbe75f8443fcae620b4f2cac..994f00d9969f21926e748eb599db7e4f4f6a249a 100755 GIT binary patch delta 42776 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 G|NjFUec?U; delta 57238 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 diff --git a/include/SimpleAssets.hpp b/include/SimpleAssets.hpp index 0b0bdb7..e9fdec3 100644 --- a/include/SimpleAssets.hpp +++ b/include/SimpleAssets.hpp @@ -1,7 +1,7 @@ /* * @file * @author (C) 2021 by CryptoLions [ https://CryptoLions.io ] - * @version 1.6.0 + * @version 1.6.2 * * @section LICENSE * @@ -188,53 +188,56 @@ CONTRACT SimpleAssets : public contract{ using createlog_action = action_wrapper< "createlog"_n, &SimpleAssets::createlog >; /* - * Create a new log entry for burn action. + * Create a new log entry for burnflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param owner is current asset owner. - * @param assetids is array of asset id's to burn. - * @param memo is burn comment. + * @param from is account that burns the token. + * @param author is account of fungible token author. + * @param quantity is amount to burn, example "1.00 WOOD". + * @param memo is memo for burnf action. * @return no return value. */ - ACTION burnlog( name owner, vector& assetids, string memo ); - using burnlog_action = action_wrapper< "burnlog"_n, &SimpleAssets::burnlog >; + ACTION burnflog( name from, name author, asset quantity, string memo ); + using burnflog_action = action_wrapper< "burnflog"_n, &SimpleAssets::burnflog >; /* - * Create a new log entry for burnnttlog action. + * Create a new log entry for createflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param owner is current asset owner. - * @param assetids is array of asset id's to burnnttlog. - * @param memo is burnnttlog comment. + * @param author is the fungible token author. + * @param maximum_supply is created symbol and quantity of fungible tokens. Example "1.00 WOOD". + * @param authorctrl is new owner of fungible token. + * @param owner is the owner who offer fungible token. * @return no return value. */ - ACTION burnnttlog( name owner, vector& assetids, string memo ); - using burnnttlog_action = action_wrapper< "burnnttlog"_n, &SimpleAssets::burnnttlog >; + ACTION createflog(uint64_t newID, name author, asset maximum_supply, bool authorctrl, string data); + using createflog_action = action_wrapper< "createflog"_n, &SimpleAssets::createflog >; /* - * Create a new log entry for burnflog action. + * Create a new log entry for offerflog action. * * This action is doeing nothing, and it can only be called by SimpleAsset contract. It creates an entry * in transaction trace, so that that third party explorers can retrieve burn asset IDs and other * information. * - * @param from is account that burns the token. - * @param author is account of fungible token author. - * @param quantity is amount to burn, example "1.00 WOOD". - * @param memo is memo for burnf action. + * @param newID is id of offer fungible token. + * @param author is the fungible token author. + * @param quantity is offered quantity of fungible tokens. + * @param newowner is new owner of fungible token. + * @param owner is the owner who offer fungible token. * @return no return value. */ - ACTION burnflog( name from, name author, asset quantity, string memo ); - using burnflog_action = action_wrapper< "burnflog"_n, &SimpleAssets::burnflog >; + ACTION offerflog(uint64_t newID, name owner, name newowner, name author, asset quantity, string memo); + using offerflog_action = action_wrapper< "offerflog"_n, &SimpleAssets::offerflog >; /* * Claim asset. @@ -729,88 +732,6 @@ CONTRACT SimpleAssets : public contract{ ACTION mdremove( uint64_t id ); using mdremove_action = action_wrapper< "mdremove"_n, &SimpleAssets::mdremove >; - /* - * Action for notification after transfering one or more assets. - * - * This action will notify author with help of require_recepient - * after transfers one or more assets. - * - * @param author is author of the asset. - * @param from is account who sends the asset. - * @param to is account of receiver. - * @param assetids is array of assetid's to transfer. - * @param memo is transfers comment. - * @return no return value. - */ - ACTION saetransfer( name author, name from, name to, vector& assetids, string memo ); - using saetransfer_action = action_wrapper< "saetransfer"_n, &SimpleAssets::saetransfer >; - - /* - * Action for notification after burning asset. - * - * This action will notify author with help of require_recepient - * after burn one or more assets. - * - * @param author is author of the asset. - * @param owner is current asset owner account. - * @param assetids is array of asset id's to burn. - * @param memo is memo for burn action. - * @return no return value. - */ - ACTION saeburn( name author, name owner, vector& assetids, string memo ); - using saeburn_action = action_wrapper< "saeburn"_n, &SimpleAssets::saeburn >; - - /* - * Action for notification after changing author of asset. - * - * This action will notify author with help of require_recepient - * after chaning of one or more assets author. - * - * @param author is author of the asset. - * @param newauthor is new author of the asset. - * @param owner is current asset owner account. - * @param assetids is array of asset id's to change author. - * @param memo is memo for change author action. - * @return no return value. - */ - ACTION saechauthor( name author, name newauthor, name owner, vector< tuple >& assetids, string memo ); - using saechauthor_action = action_wrapper< "saechauthor"_n, &SimpleAssets::saechauthor >; - - /* - * Action for notification after creating a new asset. - * - * This action will notify author with help of require_recepient - * after creating a new asset. - * - * @param author is the asset's author. This account is allowed to update the asset's mdata. - * @param category is asset category. - * @param owner is asset owner. - * @param idata is stringified JSON or sha256 string with immutable asset data. - * @param mdata is stringified JSON or sha256 string with mutable asset data. It can be changed only by author. - * @param assetid is new asset id. - * @param requireclaim is true or false. If set to "false", the newly created asset will be transferred to the - * owner (but author's RAM will be used until the asset is transferred again). If set to - * "true", the author will remain to be the owner, but an offer will be created for the - * account specified in the owner field to claim the asset using the owner's RAM. - * @return no return value. - */ - ACTION saecreate( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ); - using saecreate_action = action_wrapper< "saecreate"_n, &SimpleAssets::saecreate >; - - /* - * Action for notification after claiming the assets. - * - * This action will notify author with help of require_recepient - * after claiming the assets. - * - * @param claimer is account claiming the asset. - * @param assetids is array of asset id's to claim. - * @return no return value. - */ - - ACTION saeclaim(name author, name claimer, vector< tuple >& assetids); - using saeclaim_action = action_wrapper< "saeclaim"_n, &SimpleAssets::saeclaim >; - /* * Action for setting a ram payer for author and category. * diff --git a/ricardian/SimpleAssets.contracts.md b/ricardian/SimpleAssets.contracts.md index 7a173de..017cb89 100644 --- a/ricardian/SimpleAssets.contracts.md +++ b/ricardian/SimpleAssets.contracts.md @@ -576,15 +576,6 @@ summary: createlog (internal) icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -

burnlog

- ---- -spec_version: 0.0.2 -title: burnlog (internal) -summary: burnlog (internal) -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 ---- -

burnflog

--- @@ -594,15 +585,6 @@ summary: burnflog (internal) icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 --- -

burnnttlog

- ---- -spec_version: 0.0.2 -title: burnnttlog (internal) -summary: burnnttlog (internal) -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 ---- -

createntt

--- @@ -758,141 +740,62 @@ TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saetransfer

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/transfer.png#23227a4901414db5cd0973d1cc5df13f9b82375b21c6315fd3402cb4acd50cbf ---- - -This action is called during transfer in deferred transaction - -Input parameters: -`author` - asset's author; -`from` - account who sends the asset; -`to` - account of receiver; -`assetids` - array of assetid's to transfer; -`memo` - transfers comment; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saeburn

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/burn.png#76954820d84563187e968b461a706ab089a9c00f5332df96a4e5bb2e69ed5e84 ---- - -This action is called during burn in deferred transaction - -Input parameters: -`author` - asset's author; -`owner` - current asset owner account; -`assetids` - array of assetid's to burn; -`memo` - memo for burn action; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saechauthor

+

setarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/regauthor.png#c6a539be8e7dfd1a4c466ba9cabfd13571cd77d5c988c652d2e8f87096f3548e ---- - -Input parameters: -`author` - asset's author, who will able to change author name asset's; -`newauthor` - asset's new author name; -`owner` - assets owner; -`assetids` - array of assetid's - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saecreate

- +title: Action for setting a ram payer for author and category. +summary: Action for setting a ram payer for author and category. +icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d --- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: https://cryptolions.io/assets/images/sa-icons-256/create.png#db2bc53cef5dbbce5247543a91234373ec4bd1baf743301a0d92a35b053eeb70 ---- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`owner` - assets owner; -`idata` - stringified json with immutable assets data -`mdata` - stringified json with mutable assets data, can be changed only by author -`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but - but AUTHOR'S memory will be used until the asset is transferred again). If enabled, - author will remain the owner, but an offer will be created for the account specified in - the owner field to claim the asset using the account's RAM. +`author` - asset's author, who will able to updated asset's mdata; +`category` - assets category; +`usearam` - flag for on or off author is a ram payer functionaity; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saeclaim

+

delarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log +title: Action for deleting a ram payer record; +summary: Action for deleting a ram payer record; icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d --- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`claimer` - account claiming the asset; -`assetids` - array of assetid's to claim; +`id` - is id of a ram payer record; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

setarampayer

+

createflog

--- spec_version: 0.0.2 -title: Action for setting a ram payer for author and category. -summary: Action for setting a ram payer for author and category. -icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d +title: createlog (internal) +summary: createlog (internal) +icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`usearam` - flag for on or off author is a ram payer functionaity; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

delarampayer

+

offerflog

--- spec_version: 0.0.2 -title: Action for deleting a ram payer record; -summary: Action for deleting a ram payer record; -icon: https://cryptolions.io/assets/images/sa-icons-256/claim.png#8c3fdf140ea14a3cb9762a0f6ec0f0d73f8c2eeeec3ea2f109f394a9f35f472d +title: offerflog (internal) +summary: offerflog (internal) +icon: https://cryptolions.io/assets/images/sa-icons-256/claimf.png#80086207646470fa9cbaf4638ba0dedec96ea0e84d5059b567adc9e4b8543c30 --- -Input parameters: -`id` - is id of a ram payer record; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] - diff --git a/ricardian/SimpleAssets.contracts.md.in b/ricardian/SimpleAssets.contracts.md.in index 6e74a71..63a9b10 100644 --- a/ricardian/SimpleAssets.contracts.md.in +++ b/ricardian/SimpleAssets.contracts.md.in @@ -576,15 +576,6 @@ summary: createlog (internal) icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -

burnlog

- ---- -spec_version: 0.0.2 -title: burnlog (internal) -summary: burnlog (internal) -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ ---- -

burnflog

--- @@ -594,15 +585,6 @@ summary: burnflog (internal) icon: @ICON_BASE_URL@/@BURN_ICON_URI@ --- -

burnnttlog

- ---- -spec_version: 0.0.2 -title: burnnttlog (internal) -summary: burnnttlog (internal) -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ ---- -

createntt

--- @@ -758,141 +740,62 @@ TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saetransfer

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@TRANSFER_ICON_URI@ ---- - -This action is called during transfer in deferred transaction - -Input parameters: -`author` - asset's author; -`from` - account who sends the asset; -`to` - account of receiver; -`assetids` - array of assetid's to transfer; -`memo` - transfers comment; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saeburn

- ---- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@BURN_ICON_URI@ ---- - -This action is called during burn in deferred transaction - -Input parameters: -`author` - asset's author; -`owner` - current asset owner account; -`assetids` - array of assetid's to burn; -`memo` - memo for burn action; - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saechauthor

+

setarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@REGAUTHOR_ICON_URI@ ---- - -Input parameters: -`author` - asset's author, who will able to change author name asset's; -`newauthor` - asset's new author name; -`owner` - assets owner; -`assetids` - array of assetid's - -TERM -This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - -

saecreate

- +title: Action for setting a ram payer for author and category. +summary: Action for setting a ram payer for author and category. +icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ --- -spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log -icon: @ICON_BASE_URL@/@CREATE_ICON_URI@ ---- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`owner` - assets owner; -`idata` - stringified json with immutable assets data -`mdata` - stringified json with mutable assets data, can be changed only by author -`requireclaim` - true or false. If disabled, upon creation, the asset will be transfered to owner (but - but AUTHOR'S memory will be used until the asset is transferred again). If enabled, - author will remain the owner, but an offer will be created for the account specified in - the owner field to claim the asset using the account's RAM. +`author` - asset's author, who will able to updated asset's mdata; +`category` - assets category; +`usearam` - flag for on or off author is a ram payer functionaity; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

saeclaim

+

delarampayer

--- spec_version: 0.0.2 -title: Internal action used for creating log -summary: Internal action used for creating log +title: Action for deleting a ram payer record; +summary: Action for deleting a ram payer record; icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ --- Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`claimer` - account claiming the asset; -`assetids` - array of assetid's to claim; +`id` - is id of a ram payer record; TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

setarampayer

+

createflog

--- spec_version: 0.0.2 -title: Action for setting a ram payer for author and category. -summary: Action for setting a ram payer for author and category. -icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ +title: createlog (internal) +summary: createlog (internal) +icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -Input parameters: -`author` - asset's author, who will able to updated asset's mdata; -`category` - assets category; -`usearam` - flag for on or off author is a ram payer functionaity; - TERM This Contract expires at the conclusion of code execution. by CryptoLions [ https://cryptolions.io ] -

delarampayer

+

offerflog

--- spec_version: 0.0.2 -title: Action for deleting a ram payer record; -summary: Action for deleting a ram payer record; -icon: @ICON_BASE_URL@/@CLAIM_ICON_URI@ +title: offerflog (internal) +summary: offerflog (internal) +icon: @ICON_BASE_URL@/@CLAIMF_ICON_URI@ --- -Input parameters: -`id` - is id of a ram payer record; - TERM This Contract expires at the conclusion of code execution. -by CryptoLions [ https://cryptolions.io ] - +by CryptoLions [ https://cryptolions.io ] \ No newline at end of file diff --git a/src/SimpleAssets.cpp b/src/SimpleAssets.cpp index d302a27..b8038bf 100644 --- a/src/SimpleAssets.cpp +++ b/src/SimpleAssets.cpp @@ -17,8 +17,6 @@ ACTION SimpleAssets::changeauthor( name author, name newauthor, name owner, vect sassets assets_f( _self, owner.value ); - map< name, vector< tuple > > uniqauthor; - for ( auto i = 0; i < assetids.size(); ++i ) { const auto itr = assets_f.require_find( assetids[i], string("asset id: " + to_string(assetids[i]) +" was not found").c_str() ); @@ -41,21 +39,9 @@ ACTION SimpleAssets::changeauthor( name author, name newauthor, name owner, vect assets_f.modify( itr, author, [&]( auto& a ) { a.author = newauthor; }); - - uniqauthor[itr->author].emplace_back(make_tuple(assetids[i] , itr->owner)); - } - - // Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, author, "saechauthor"_n, make_tuple( author, newauthor, owner, uniqauthor[keyauthor], memo ) ); } } -ACTION SimpleAssets::saechauthor( name author, name newauthor, name owner, vector< tuple >& assetids, string memo ) { - require_recipient( author ); -} - ACTION SimpleAssets::authorreg( name author, string dappinfo, string fieldtypes, string priorityimg ) { require_auth( author ); @@ -126,14 +112,9 @@ ACTION SimpleAssets::create( name author, name category, name owner, string idat }); //Events - sendEvent( _self, author, "saecreate"_n, make_tuple( author, category, owner, idata, mdata, newID, requireclaim ) ); SEND_INLINE_ACTION( *this, createlog, { {_self, "active"_n} }, { author, category, owner, idata, mdata, newID, requireclaim } ); } -ACTION SimpleAssets::saecreate( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ) { - require_recipient( author ); -} - ACTION SimpleAssets::createlog( name author, name category, name owner, string idata, string mdata, uint64_t assetid, bool requireclaim ) { require_auth( get_self() ); @@ -194,15 +175,6 @@ ACTION SimpleAssets::claim( name claimer, vector& assetids ) { if (empty_scope) { assets_t.erase(assets_t.find(IMPOSSIBLE_ID)); } - - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, claimer, "saeclaim"_n, make_tuple( keyauthor, claimer, uniqauthor[keyauthor] ) ); - } -} - -ACTION SimpleAssets::saeclaim(name author, name claimer, vector< tuple >& assetids) { - require_recipient(author); } void SimpleAssets::check_empty_vector( vector& vector_ids, string vector_name ) { @@ -291,12 +263,6 @@ ACTION SimpleAssets::transfer( name from, name to, vector& assetids, s if ( empty_scope ) { assets_t.erase( assets_t.find( IMPOSSIBLE_ID ) ); } - - //Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent( _self, authorized_account, "saetransfer"_n, make_tuple( keyauthor, from, to, uniqauthor[keyauthor], memo ) ); - } } name SimpleAssets::get_payer( name author, name category, uint64_t id ) @@ -315,10 +281,6 @@ name SimpleAssets::get_payer( name author, name category, uint64_t id ) return result; } -ACTION SimpleAssets::saetransfer(name author, name from, name to, vector& assetids, string memo) { - require_recipient(author); -} - ACTION SimpleAssets::update( name author, name owner, uint64_t assetid, string mdata ) { require_auth( author ); @@ -410,32 +372,12 @@ ACTION SimpleAssets::burn( name owner, vector& assetids, string memo ) uniqauthor[itr->author].push_back( assetids[i] ); assets_f.erase(itr); } - - //Send Event as deferred - for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - name keyauthor = move( uniqauthorIt->first ); - sendEvent(_self, owner, "saeburn"_n, make_tuple( keyauthor, owner, uniqauthor[keyauthor], memo ) ); - } - - SEND_INLINE_ACTION(*this, burnlog, { {_self, "active"_n} }, { owner, assetids, memo }); -} - -ACTION SimpleAssets::saeburn(name author, name owner, vector& assetids, string memo) { - require_recipient(author); } ACTION SimpleAssets::burnflog( name from, name author, asset quantity, string memo ) { require_auth(get_self()); } -ACTION SimpleAssets::burnnttlog(name owner, vector& assetids, string memo) { - require_auth(get_self()); -} - -ACTION SimpleAssets::burnlog( name owner, vector& assetids, string memo ) { - require_auth(get_self()); -} - ACTION SimpleAssets::delegate( name owner, name to, vector& assetids, uint64_t period, bool redelegate, string memo ) { check( owner != to, "cannot delegate to yourself" ); @@ -620,14 +562,22 @@ ACTION SimpleAssets::createf( name author, asset maximum_supply, bool authorctrl stats statstable( _self, author.value ); check( statstable.find( sym.code().raw() ) == statstable.end(), "token with symbol already exists" ); + const auto newID = getid(asset_id); + statstable.emplace( author, [&]( auto& s ) { s.supply.symbol = maximum_supply.symbol; s.max_supply = maximum_supply; s.issuer = author; - s.id = getid( asset_id ); + s.id = newID; s.authorctrl = authorctrl; s.data = data; }); + + SEND_INLINE_ACTION(*this, createflog, { {_self, "active"_n} }, { newID, author, maximum_supply, authorctrl, data }); +} + +ACTION SimpleAssets::createflog(uint64_t newID, name author, asset maximum_supply, bool authorctrl, string data) { + require_auth(get_self()); } ACTION SimpleAssets::updatef( name author, symbol sym, string data ) { @@ -732,8 +682,10 @@ ACTION SimpleAssets::offerf( name owner, name newowner, name author, asset quant } } + const auto newID = getid(offer_id); + offerft.emplace( owner, [&]( auto& s ) { - s.id = getid( offer_id ); + s.id = newID; s.author = author; s.quantity = quantity; s.offeredto = newowner; @@ -741,6 +693,12 @@ ACTION SimpleAssets::offerf( name owner, name newowner, name author, asset quant s.cdate = current_time_point().sec_since_epoch(); }); sub_balancef( owner, author, quantity ); + + SEND_INLINE_ACTION(*this, offerflog, { {_self, "active"_n} }, { newID, owner, newowner, author, quantity, memo }); +} + +ACTION SimpleAssets::offerflog(uint64_t newID, name owner, name newowner, name author, asset quantity, string memo) { + require_auth(get_self()); } ACTION SimpleAssets::cancelofferf( name owner, vector& ftofferids ) { @@ -1053,11 +1011,6 @@ ACTION SimpleAssets::claimntt( name claimer, vector& assetids ) { assets_owner.erase( itr ); nttoffert.erase( itrc ); } - - //for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - // name keyauthor = move( uniqauthorIt->first ); - // sendEvent( keyauthor, claimer, "saeclaim"_n, make_tuple( claimer, uniqauthor[keyauthor] ) ); - //} } ACTION SimpleAssets::burnntt( name owner, vector& assetids, string memo ) { @@ -1080,13 +1033,6 @@ ACTION SimpleAssets::burnntt( name owner, vector& assetids, string mem assets_ntt.erase( itr_asset ); } - - //Send Event as deferred - //for ( auto uniqauthorIt = uniqauthor.begin(); uniqauthorIt != uniqauthor.end(); ++uniqauthorIt ) { - // name keyauthor = move( uniqauthorIt->first ); - // sendEvent( keyauthor, owner, "saeburn"_n, make_tuple( owner, uniqauthor[keyauthor], memo ) ); - //} - SEND_INLINE_ACTION(*this, burnnttlog, { {_self, "active"_n} }, { owner, assetids, memo }); } ACTION SimpleAssets::mdadd( name author, string data ) {