Skip to content

Instantly share code, notes, and snippets.

@ponyjackal
Created April 7, 2023 01:24
Show Gist options
  • Save ponyjackal/32da5b11066a06ffdb1d626c04cfa914 to your computer and use it in GitHub Desktop.
Save ponyjackal/32da5b11066a06ffdb1d626c04cfa914 to your computer and use it in GitHub Desktop.
SmartPy NFT FA2 Contract with reveal feature
import smartpy as sp
FA2 = sp.io.import_script_from_url("https://smartpy.io/templates/fa2_lib.py")
class MyProject(
FA2.Admin,
FA2.BurnNft,
FA2.ChangeMetadata,
FA2.WithdrawMutez,
FA2.MintNft,
FA2.OnchainviewBalanceOf,
FA2.Fa2Nft):
def __init__(self, admin, metadata, token_metadata = {}, ledger = {}, policy = FA2.OwnerOrOperatorTransfer(), metadata_base = None):
FA2.Fa2Nft.__init__(self, metadata, token_metadata = token_metadata, ledger = ledger, policy = policy, metadata_base = metadata_base)
FA2.Admin.__init__(self, admin)
self.update_initial_storage(
last_token_id_revealed = 0)
@sp.private_lambda(with_storage=None, with_operations=False, wrap_call=False)
def nat_stringify(self,from_nat):
sp.set_type(from_nat,sp.TNat)
digits = sp.map(l={x : str(x) for x in range(0, 10)}, tkey = sp.TNat, tvalue=sp.TString)
my_nat = sp.local('my_nat', from_nat)
my_string = sp.local("my_string", [])
sp.if my_nat.value == 0:
my_string.value.push("0")
sp.while 0 < my_nat.value:
my_string.value.push(digits[my_nat.value % 10])
my_nat.value //= 10
sp.result(sp.concat(my_string.value))
def called_by_owner(self):
sp.if self.data.administrator != sp.sender:
sp.failwith("FA2_NOT_OWNER")
@sp.entry_point
def reveal(self, params):
sp.set_type(params.revealed_folder_hash, sp.TString)
self.called_by_owner()
with sp.for_("token_id", sp.range(self.data.last_token_id_revealed,self.data.last_token_id,step=1)) as token_id:
token_id = params.token_id
token_id_stringify = self.nat_stringify(token_id)
token_info = "ipfs://"+params.revealed_folder_hash+"/"+token_id_stringify+".json"
self.data.token_metadata[token_id].token_info[""] = sp.pack(token_info)
self.data.last_token_id_revealed = self.data.last_token_id
sp.add_compilation_target(
"My Project Name",
MyProject(
admin=sp.address("tz1LgP5DCcgBZ6AaHQw5iwDynCi21G9MKXxy"),
metadata = sp.utils.metadata_of_url("ipfs://hash")
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment