Implementar un contrato NFT

Importar biblioteca FA2:

import smartpy as sp
FA2 = sp.io.import_script_from_url("https://smartpy.io/templates/fa2_lib.py")

Compilation target:

sp.add_compilation_target(
    "fa2_nft_tokens",
    ExampleFa2Nft(
        metadata = sp.utils.metadata_of_url("http://example.com")
    )
)

Probar:

@sp.add_test(name="FA2 NFT tokens")
def test():
    sc = sp.test_scenario()
    sc.table_of_contents()
    sc.h2("FA2")
    example_fa2_nft = ExampleFa2Nft(
        metadata = sp.utils.metadata_of_url("https://example.com")
    )
    sc += example_fa2_nft

Ahora es posible ejecutar y compilar el contrato.

Personalización

Mixins

La biblioteca FA2 proporciona clases pequeñas de las que puede heredar por separado para agregar características adicionales.

class ExampleFa2Nft(
    FA2.Admin,
    FA2.ChangeMetadata,
    FA2.WithdrawMutez,
    FA2.OnchainviewBalanceOf,
    FA2.Fa2Nft
):

Init

Algunos mixins necesitan inicializarse:

class ExampleFa2Nft(FA2.Admin, FA2.Fa2Nft):
    def __init__(self, admin, metadata):
        FA2.Fa2Nft.__init__(self, metadata)
        FA2.Admin.__init__(self, admin)

Almacenamiento

class ExampleFa2Nft(FA2.Admin, FA2.Fa2Nft):
    def __init__(self, admin, metadata):
        FA2.Fa2Nft.__init__(self, metadata)
        FA2.Admin.__init__(self, admin)
        self.update_initial_storage(
            closed = False,
        )

Entrypoint

Dentro de la clase es posible agregar nuevos puntos de entrada o reimplementar los proporcionados por la biblioteca.

 @sp.entry_point
    def mint(self, to_, metadata):
        sp.verify(sp.sender == self.data.administrator, "FA2_NOT_ADMIN")
        token_id = sp.compute(self.data.next_token_id)
        self.data.token_metadata[token_id] = sp.record(
            token_id=token_id, token_info=metadata
        )
        self.data.ledger[token_id] = to_
        self.data.next_token_id += 1

Se puede encontrar más ejemplos de puntos de entrada en Template Minimal.

Contract metadata

Contiene descripciones generales del contrato y las vistas fuera de la cadena.

Esto puede estar en un archivo JSON almacenado en IPFS:

sp.add_compilation_target(
    "Fa2Nft_tokens",
    ExampleFa2Nft(
        metadata = sp.utils.metadata_of_url("http://example.com")
    )
)

O en el contrato propio:

sp.add_compilation_target(
    "Fa2Nft_tokens",
    ExampleFa2Nft(
        metadata_base = {
            "version": "1.0.0",
            "description" : "This implements FA2 (TZIP-012) using SmartPy.",
            "interfaces": ["TZIP-012", "TZIP-016"],
            "authors": ["SmartPy <https://smartpy.io/#contact>"],
            "homepage": "https://smartpy.io/ide?template=FA2.py",
            "source": {
                "tools": ["SmartPy"],
                "location": "https://gitlab.com/SmartPy/smartpy/-/raw/master/python/templates/FA2.py"
            },
            "permissions": {
                "receiver": "owner-no-hook",
                "sender": "owner-no-hook"
            }
        }
    )
)

Enlaces de referencia

Last updated