{"id":19564383,"url":"https://github.com/quillhash/dnfts","last_synced_at":"2026-03-04T13:02:51.540Z","repository":{"id":118894485,"uuid":"193840851","full_name":"Quillhash/dNFTs","owner":"Quillhash","description":"Distributed ownership of NFT assets on EOS ","archived":false,"fork":false,"pushed_at":"2019-07-29T16:46:27.000Z","size":80,"stargazers_count":20,"open_issues_count":0,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-02-26T09:24:18.996Z","etag":null,"topics":["digitalassets","dnft","dnfts","eos","eos-blockchain","eos-contracts","eosio","eosio-blockchain","nft","ownership"],"latest_commit_sha":null,"homepage":"https://dnft.quillhash.com","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Quillhash.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-26T06:13:37.000Z","updated_at":"2025-02-21T16:00:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"ec842a67-6f61-4e7b-8084-92ae6f566315","html_url":"https://github.com/Quillhash/dNFTs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Quillhash/dNFTs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quillhash%2FdNFTs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quillhash%2FdNFTs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quillhash%2FdNFTs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quillhash%2FdNFTs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Quillhash","download_url":"https://codeload.github.com/Quillhash/dNFTs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Quillhash%2FdNFTs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30081080,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T12:28:08.313Z","status":"ssl_error","status_checked_at":"2026-03-04T12:27:28.210Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["digitalassets","dnft","dnfts","eos","eos-blockchain","eos-contracts","eosio","eosio-blockchain","nft","ownership"],"created_at":"2024-11-11T05:21:49.707Z","updated_at":"2026-03-04T13:02:51.505Z","avatar_url":"https://github.com/Quillhash.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# dNFTs\n\ndNFTs is an open source free standard that provides distributed ownership of non fungible assets on EOS blockchain. It offers utility to various industries that require ownership in the form of distributed rights and shares(in percentage).\nIts use cases involve multimedia industries (videos, music, e-books, photography etc.) wherein many shareholders can exist. It allows creator as well as investor to sell their ownership on EOS platform by listing or bidding for it. Also, it would motivate the public participation in such valuable assets that are existent in real-world.\n\n\n**Telegram**: https://t.me/dnfts_eos   \n**Medium** : https://medium.com/quillhash/partial-ownership-on-eos-773aea600e3  \n**Website**: https://www.quillhash.com/products/distributed-non-fungible-tokens          \n**Jungle account**: [dnftversion1](https://jungle.bloks.io/account/dnftversion1)              \n\n\n### Architecture\n\u003cimg src=\"https://github.com/Quillhash/dNFTs/blob/master/architecture.png\" \u003e\n\n### RAM usage\nThe RAM usage is used for every creation and listing of the digital asset. It also depends on how much data is stored in the mdata fields. If considered empty, each digital asset may take upto 0.4 - 0.5 kB RAM.\nExcept the create action, for all other actions RAM payer may be configured to the contract.\n\n---------------------------  \n\n### Rationale\n0. `setconfig`action is called by contract account specifying the version that helps external contracts parse actions and tables \n1. Contract account adds the validators account for categories like `videos`, `music`, `ebooks`, `photography` etc. `addvalidator` action is called.\n2. Anyone can create the NFT under the category by calling `create` action. The creator needs to send mail to both validators with original JSON file, listing their creation \u0026 the legal binding agreement (if needed for some high valued NFT in real world). \n3. 2 validators validate the creation after taking fees offered. Validators validate using `validate` action.\n4. After validated creation of NFT by both, NFT creator can issue ownership of NFTs to different accounts. Issuing NFT can be done by calling action `issue`.\n5. All current owners of NFT can list for sale of their ownership at fixed rate (using `listsale` action) or choose the bidding mechanism (using `startbid` action).\n6. Investors can buy the ownership using eosio.token **```transfer```** action by sending EOS to the contract with the memo as:\n**```sale_id,to```**\n7. Sale listing or bidding may be closed by seller before expiration. Bidding is realised as unsuccessful if that happens. For the successful bidding, highest bidder receives the ownership shares. Actions for them are `closesale` and `closebid`.\n8. For all the accounts with zero ownership may be deleted by anyone if the ram payer is configured as contract. Action `close` can be called to do so.\n9. `burn` action needs to be called by creator in case of non-validation to release RAM or when anyone wants to burn their ownership shares.\n10. In case any validator is found suspicious, `delvalidator` action is called by contract account. Validator account no longer can validate any further NFTs.\n\n\n##### Note: To ensure the authenticity of NFT, mail mechanism is kept. Keeping blockchain fundamentals as permissionless, any EOS account can invest and do all operations normally.\n\n---------------------------  \n\n### Contract Actions:\n\n#### setconfig\n\n```\nACTION setconfig(string version)\n```\n\nTo maintain version of the contract for external marketplaces, wallets etc. \n\n#### create\n\n```\nACTION create (name issuer,\n               name category,\n               name token_name,\n               bool burnable, \n               string base_uri,\n               uint8_t span,\n               checksum256 origin_hash,\n               uint64_t validator_id)\n ```\n\nTo create a new NFT under some category like ```Harrypotter``` for ```ebook``` category. The validator_id is chosen manually from validators table as per the trust score.\n\n\n#### issue\n\n```\nACTION issue (name to, \n              name category,\n              name token_name,\n              asset quantity,\n              string memo)\n```     \n\nIt is callable by issuer; to issue to their true ownership holders as per their percentage. Quantity needs to be in PER only.\n\n\n#### addvalidator \n\n```\nACTION addvalidator (name validator,\n                     string email,\n                     name category)\n```\n\nIt is callable by _self; to add trusted validator to the blockchain. Validator validates the NFT creation of the category authorised to.\n\n\n#### delvalidator\n\n```\nACTION delvalidator (name owner)\n```\n\nIt is callable by _self; to remove validator. Account cannot validate any category thereafter.\n\n\n#### validate\n\n```\nACTION validate (name validator,\n                 name category,\n                 name token_name)\n```\n\nIt is callable by validator (chosen) after validating the NFT creation and for existence of that digital asset in real world.\n\n\n#### startbid\n\n```\nACTION startbid (name seller,\n                 name category,\n                 name token_name,\n                 asset percent_share,\n                 asset base_price,\n                 time_point_sec expiration)\n```\n\nIt is callable by validated NFT holder to sell their rights in the form of bidding.\n\n#### closebid\n\n```\nACTION closebid (name seller,\n                 uint64_t sale_id);\n\n```\n\nIt is callable by seller who listed for bidding to cancel the bidding before expiration time. No rights are sold in this case. If however, the action is called after expiration time (anyone can call), the rights listed for bidding are transferred to the highest bidder. The RAM is released in both the cases.\n\n\n#### burn\n\n```\nACTION burn (name owner, \n             uint64_t dnft_id, \n             asset quantity)\n```\nIt is callable only by token owner; to burn quantity PERs of  their ownership on particular token. \n\n\n#### buyshare\n\n```\nACTION buyshare(name from,\n                name to, \n                asset quantity, \n                string memo)\n```\nIt is called when a user sends EOS from eosio.token to this smart contract account with a memo of \"sale_id,to_account\". The sale ids are unique and no sale `listings` and `biddings` sale_ids can be same.\n\n\n#### listsale\n\n```\nACTION listsale (name seller,\n                 name category,\n                 name token_name,\n                 asset percent_share,\n                 asset per_percent_amt,\n                 time_point_sec expiration)\n```\nIt is callable only by owner; creates a sale listing in the token contract valid for 1 week, transfers ownership to token contract\n\n\n#### closesale\n\n```\nACTION closesale (name seller, \n                  uint64_t sale_id)\n```\nIt is callable by seller if listing hasn't expired, or by anyone if the listing is expired.\n\n\n### Data Structures\n\n#### tokenconfigs\n```\nTABLE tokenconfigs {\n        name standard;\n        string version;\n};\n```\nScope is _self.\n\n#### categories\n```\nTABLE categories {\n        name category;\n        vector\u003cuint64_t\u003e validator_ids;\n        uint64_t primary_key() const { return category.value; }\n};\n```\nScope is _self.\n\n#### uids\n```\nTABLE uids{\n    uint64_t dnft_id;\n    uint64_t validator_id;\n};\n\n```\nSingleton table that stores latest dnft_id and validator_id.\n\n#### accounts\n```\nTABLE accounts {\n        uint64_t dnft_id;\n        asset amount;\n        uint64_t primary_key() const { return dnft_id; }\n};\n```\nScope is owner of the NFT.\n\n#### dnft\n```\nTABLE dnft {\n    name owner;\n    uint64_t primary_key() const { return owner.value; }\n};\n```\nScope is dnft_id (category name -\u003e token name)\n\n#### dnftstats\n```\nTABLE dnftstats {\n            bool burnable;\n            name issuer;\n            name token_name;\n            uint64_t dnft_id;\n            asset current_supply;\n            asset issued_supply;\n            string base_uri;\n            checksum256 origin_hash;\n            uint8_t span;\n            bool validated;\n            map\u003cuint64_t, bool\u003e validated_by;\n            uint64_t primary_key() const { return token_name.value; }\n            uint64_t is_verified() const { return validated; }\n        };\n```        \nScope is category,and token_name is unique, has information of all the NFTs in the category. Validated and unvalidated NFT creations can be separated through secondary index.\n\n#### lists\n```\nTABLE lists {\n            uint64_t sale_id;\n            name token_name;\n            name category;\n            name seller;\n            asset per_percent_amt;\n            asset percent_share;\n            time_point_sec expiration;\n            uint64_t primary_key() const { return sale_id; }\n            uint64_t get_seller() const { return seller.value; }\n        };\n```\nScope is _self. All the information of sale listings are here.\n\n#### bids\n```\nTABLE bids {\n            uint64_t sale_id;\n            name token_name;\n            name category;\n            name seller;\n            asset percent_share;\n            asset base_price;\n            asset current_bid;\n            name current_bidder;\n            time_point_sec expiration;\n            uint64_t primary_key() const { return sale_id; }\n            uint64_t get_seller() const { return seller.value; }\n         }; \n```\nScope is _self. All the information of bidding listings are here.\n\n#### validators\n```\nTABLE validators {\n            uint64_t validator_id;\n            name validator;\n            string email;\n            vector\u003cname\u003e categories;\n            bool active;\n            uint64_t primary_key() const { return validator.value; }\n        };\n\n```\nScope is _self. The list of all the trusted validators accounts with their unique emails are here. \n\n---------------------------  \n\n\n## Standards for digital assets and NFTs  \nIf your use case is different, the following standards may be helpful:  \n* https://github.com/CryptoLions/SimpleAssets   \n* https://github.com/MythicalGames/dgoods   \n* https://github.com/unicoeos/eosio.nft   \n\n## Credits\n* [Quillhash](https://www.quillhash.com/)\n* [cc32d9|EOS Amsterdam](https://github.com/cc32d9/cc32d9_ideas_for_EOS/blob/master/Object_Token.md)\n* [Zeptagram](https://zeptagram.com/) \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquillhash%2Fdnfts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquillhash%2Fdnfts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquillhash%2Fdnfts/lists"}