Contract con_mergen_nfts_v2


Contract Code


  
1 # Unique NFTs with examples for other devs
2 I = importlib
3 random.seed()
4 import currency
5
6
7 collection_name = Variable()
8 collection_owner = Variable()
9 collection_nfts = Hash(default_value=0)
10 collection_balances = Hash(default_value=0)
11 collection_balances_approvals = Hash(default_value=0)
12
13 last_mint_id = Variable()
14
15 NFT_DESCRIPTION = "A MERGEN NFT which is either a result of combining, slashing or minting using the contract"
16 NFT_DEFAULT_IMG = "https://nftstorage.link/ipfs/bafybeid2msdduqifbcvhrteumzmwtwtsll534rl35o2auiroe45z4vzvke/file"
17
18 @construct
19 def seed():
20 collection_name.set("MERGEN")
21 collection_owner.set(ctx.caller)
22 last_mint_id.set(0)
23
24 @export
25 def transfer(name: str, amount:int, to: str):
26 assert amount > 0, "You cannot transfer negative amounts"
27 assert name != "", "Please specify the name of the NFT you want to transfer"
28 assert collection_balances[ctx.caller, name] >= amount, "You dont have enough NFTs to send"
29 collection_balances[ctx.caller, name] -= amount
30 collection_balances[to, name] += amount # Adds amount to receiver
31
32 @export
33 def approve(amount: int, name: str, to: str):
34 assert amount > 0, "Cannot approve negative amounts"
35 collection_balances_approvals[ctx.caller, to, name] += amount
36
37 @export
38 def transfer_from(name:str, amount:int, to: str, main_account: str):
39 assert amount > 0, "Cannot send negative balances!"
40 assert collection_balances_approvals[main_account, to, name] >= amount, "Not enough NFTs approved to send! You have {} and are trying to spend {}".format(collection_balances_approvals[main_account, to, name], amount)
41 assert collection_balances[main_account, name] >= amount, "Not enough NFTs to send!"
42 collection_balances_approvals[main_account, to, name] -= amount
43 collection_balances[main_account, name] -= amount
44 collection_balances[to, name] += amount
45
46 @export
47 def mint_nft():
48 # Minting 1 NFTs creates a starter with a random value from 0, 100 for 5 TAU base price.
49 currency.transfer_from(amount=5, to=collection_owner.get(), main_account=ctx.caller)
50
51 new_id = last_mint_id.get() + 1
52 name = f"MERGEN #{new_id}"
53 last_mint_id.set(new_id)
54
55 metadata = {
56 "value": random.randint(1, 100)
57 }
58
59 collection_nfts[name] = {"description": NFT_DESCRIPTION, "ipfs_image_url": NFT_DEFAULT_IMG, "metadata": metadata, "amount": 1}
60 collection_balances[ctx.caller, name] = 1
61
62 @export
63 def combine_nft(nft_name_1: str, nft_name_2:str):
64 # Combing 2 NFTs creates 1 NFT with it's values combined
65 assert collection_balances[ctx.caller, nft_name_1] >= 1, "Not enough NFTs to send!"
66 assert collection_balances[ctx.caller, nft_name_2] >= 1, "Not enough NFTs to send!"
67 collection_balances[ctx.caller, nft_name_1] -= 1
68 collection_balances[ctx.caller, nft_name_2] -= 1
69
70 transfer_from(name=nft_name_1, amount=1, to="BURN", main_account=ctx.caller)
71 transfer_from(name=nft_name_2, amount=1, to="BURN", main_account=ctx.caller)
72
73 first_nft_metadata = collection_nfts[nft_name_1]["metadata"]
74 second_nft_metadata = collection_nfts[nft_name_2]["metadata"]
75
76 for key in second_nft_metadata:
77 second_nft_metadata[key] = second_nft_metadata[key] + first_nft_metadata[key]
78
79 result_nft_metadata = {**a, **b}
80
81 new_id = last_mint_id.get() + 1
82 name = f"MERGEN #{new_id}"
83 last_mint_id.set(new_id)
84
85 collection_nfts[name] = {"description": NFT_DESCRIPTION, "ipfs_image_url": NFT_DEFAULT_IMG, "metadata": result_nft_metadata, "amount": 1}
86 collection_balances[ctx.caller, name] = 1
87
88 @export
89 def slash_nft(nft_name: str):
90 # Slashing 1 NFT creates 2 NFTs with each having half it's value
91 assert collection_balances[ctx.caller, nft_name] >= 1, "Not enough NFTs to send!"
92 collection_balances[ctx.caller, nft_name] -= 1
93
94
95 nft_metadata = collection_nfts[nft_name]["metadata"]
96 new_nft_metadata = {}
97
98 for key in new_nft_metadata:
99 new_nft_metadata[key] = nft_metadata[key] / 2
100
101 new_id = last_mint_id.get() + 1
102 name = f"MERGEN #{new_id}"
103 last_mint_id.set(new_id)
104
105 collection_nfts[name] = {"description": NFT_DESCRIPTION, "ipfs_image_url": NFT_DEFAULT_IMG, "metadata": new_nft_metadata, "amount": 1}
106 collection_balances[ctx.caller, name] = 1
107
108 new_id = last_mint_id.get() + 1
109 name = f"MERGEN #{new_id}"
110 last_mint_id.set(new_id)
111
112 collection_nfts[name] = {"description": NFT_DESCRIPTION, "ipfs_image_url": NFT_DEFAULT_IMG, "metadata": new_nft_metadata, "amount": 1}
113 collection_balances[ctx.caller, name] = 1

Byte Code

e30000000000000000000000000600000040000000730401000065005a0165026a0383000100640064016c045a0465056402640364048d025a0665056402640564048d025a07650864006402640664078d035a09650864006402640864078d035a0a650864006402640964078d035a0b65056402640a64048d025a0c640b5a0d640c5a0e640d640e84005a0f651064028301651165126511640f9c0364106411840483015a1365106402830165126511651164129c0364136414840483015a14651064028301651165126511651164159c0464166417840483015a1565106402830164186419840083015a1665106402830165116511641a9c02641b641c840483015a176510640283016511641d9c01641e641f840483015a18640153002920e9000000004eda12636f6e5f6d657267656e5f6e6674735f7632da0f636f6c6c656374696f6e5f6e616d652902da08636f6e7472616374da046e616d65da10636f6c6c656374696f6e5f6f776e6572da0f636f6c6c656374696f6e5f6e6674732903da0d64656661756c745f76616c756572040000007205000000da13636f6c6c656374696f6e5f62616c616e636573da1d636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73da0c6c6173745f6d696e745f69647a5a41204d455247454e204e465420776869636820697320656974686572206120726573756c74206f6620636f6d62696e696e672c20736c617368696e67206f72206d696e74696e67207573696e672074686520636f6e74726163747a5d68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f6261667962656964326d7364647571696662637668727465756d7a6d77747774736c6c353334726c33356f32617569726f6534357a34767a766b652f66696c65630000000000000000000000000200000043000000732400000074006a0164018301010074026a0174036a048301010074056a016402830101006400530029034eda064d455247454e72010000002906da115f5f636f6c6c656374696f6e5f6e616d65da03736574da125f5f636f6c6c656374696f6e5f6f776e6572da03637478da0663616c6c6572da0e5f5f6c6173745f6d696e745f6964a90072130000007213000000da00da045f5f5f5f17000000730600000000010a010c01721500000029037205000000da06616d6f756e74da02746f63030000000000000003000000040000004300000073680000007c0164016b04731074006402830182017c0064036b0373207400640483018201740174026a037c00660219007c016b05733a7400640583018201740174026a037c006602050019007c01380003003c0074017c027c006602050019007c01370003003c006400530029064e72010000007a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e747372140000007a37506c65617365207370656369667920746865206e616d65206f6620746865204e465420796f752077616e7420746f207472616e736665727a21596f7520646f6e74206861766520656e6f756768204e46547320746f2073656e642904da0e417373657274696f6e4572726f72da155f5f636f6c6c656374696f6e5f62616c616e636573721000000072110000002903720500000072160000007217000000721300000072130000007214000000da087472616e736665721d000000730c0000000002100110010c010e011601721a0000002903721600000072050000007217000000630300000000000000030000000400000043000000732c0000007c0064016b0473107400640283018201740174026a037c027c016603050019007c00370003003c006400530029034e72010000007a1f43616e6e6f7420617070726f7665206e6567617469766520616d6f756e747329047218000000da1f5f5f636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73721000000072110000002903721600000072050000007217000000721300000072130000007214000000da07617070726f766527000000730400000000021001721c0000002904720500000072160000007217000000da0c6d61696e5f6163636f756e7463040000000000000004000000060000004300000073960000007c0164016b047310740064028301820174017c037c027c00660319007c016b05733c740064036a0274017c037c027c00660319007c0183028301820174037c037c00660219007c016b057354740064048301820174017c037c027c006603050019007c01380003003c0074037c037c006602050019007c01380003003c0074037c027c006602050019007c01370003003c006400530029054e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a484e6f7420656e6f756768204e46547320617070726f76656420746f2073656e642120596f752068617665207b7d20616e642061726520747279696e6720746f207370656e64207b7d7a184e6f7420656e6f756768204e46547320746f2073656e642129047218000000721b000000da06666f726d617472190000002904720500000072160000007217000000721d000000721300000072130000007214000000da0d7472616e736665725f66726f6d2d0000007312000000000210010c010c0114010a010e0116011401721f000000630000000000000000030000000500000043000000736a00000074006a01640174026a03830074046a0564028d03010074066a038300640317007d0064047c009b009d027d0174066a077c0083010100640574086a0964036406830269017d02740a740b7c02640364079c04740c7c013c006403740d74046a057c0166023c006400530029084ee905000000290372160000007217000000721d000000e9010000007a084d455247454e2023da0576616c7565e9640000002904da0b6465736372697074696f6eda0e697066735f696d6167655f75726cda086d657461646174617216000000290eda0863757272656e6379721f000000720f000000da03676574721000000072110000007212000000720e000000da0672616e646f6dda0772616e64696e74da0f4e46545f4445534352495054494f4eda0f4e46545f44454641554c545f494d47da115f5f636f6c6c656374696f6e5f6e66747372190000002903da066e65775f696472050000007226000000721300000072130000007214000000da086d696e745f6e66743a000000731200000000020c010a010c010a010a01100102011001722f0000002902da0a6e66745f6e616d655f31da0a6e66745f6e616d655f32630200000000000000080000000600000043000000730a010000740074016a027c006602190064016b05731a7403640283018201740074016a027c016602190064016b0573347403640283018201740074016a027c006602050019006401380003003c00740074016a027c016602050019006401380003003c0074047c006401640374016a0264048d04010074047c016401640374016a0264048d04010074057c001900640519007d0274057c011900640519007d0378207c0344005d187d047c037c0419007c027c04190017007c037c043c0071a257007406740796027d0574086a098300640117007d0664067c069b009d027d0774086a0a7c0683010100740b740c7c05640164079c0474057c073c006401740074016a027c0766023c006400530029084e72210000007a184e6f7420656e6f756768204e46547320746f2073656e6421da044255524e2904720500000072160000007217000000721d00000072260000007a084d455247454e202329047224000000722500000072260000007216000000290d7219000000721000000072110000007218000000721f000000722d000000da0161da016272120000007228000000720e000000722b000000722c000000290872300000007231000000da1266697273745f6e66745f6d65746164617461da137365636f6e645f6e66745f6d65746164617461da036b6579da13726573756c745f6e66745f6d65746164617461722e0000007205000000721300000072130000007214000000da0b636f6d62696e655f6e667447000000732a00000000020c010e010c010e0116011601120212020c010c010a010601120108010c010a010a01020104010c0172390000002901da086e66745f6e616d6563010000000000000006000000050000004300000073e2000000740074016a027c006602190064016b05731a7403640283018201740074016a027c006602050019006401380003003c0074047c001900640319007d0169007d02781c7c0244005d147d037c017c03190064041b007c027c033c007146570074056a068300640117007d0464057c049b009d027d0574056a077c0483010100740874097c02640164069c0474047c053c006401740074016a027c0566023c0074056a068300640117007d0464057c049b009d027d0574056a077c0483010100740874097c02640164069c0474047c053c006401740074016a027c0566023c006400530029074e72210000007a184e6f7420656e6f756768204e46547320746f2073656e64217226000000e9020000007a084d455247454e202329047224000000722500000072260000007216000000290a7219000000721000000072110000007218000000722d00000072120000007228000000720e000000722b000000722c0000002906723a000000da0c6e66745f6d65746164617461da106e65775f6e66745f6d657461646174617237000000722e0000007205000000721300000072130000007214000000da09736c6173685f6e667462000000732a00000000020c010e0116010c0104010a0114010c010a010a01020104010c010e010c010a010a01020104010c01723e0000002919da09696d706f72746c6962da01497229000000da04736565647227000000da085661726961626c65720d000000720f000000da0448617368722d0000007219000000721b0000007212000000722b000000722c0000007215000000da085f5f6578706f7274da03737472da03696e74721a000000721c000000721f000000722f0000007239000000723e0000007213000000721300000072130000007214000000da083c6d6f64756c653e0100000073360000000401080108010401080104010801060108010601080104010a010c0204030404080606011409060114050601160c100d0601121a0601