TypeScript Métodos para el Bloqueo de NFT ERC-721

Blockchain App Builder genera automáticamente métodos que puede utilizar para bloquear tokens no fungibles que utilizan el estándar ERC-721 ampliado.

Un token bloqueado no se puede quemar ni transferir a otros usuarios. Todas las demás propiedades, como el estado, el propietario y el historial del token, se conservan. Puede utilizar la funcionalidad de bloqueo de NFT al transferir un token a otra red de blockchain, como Ethereum o Polygon.

Para poder bloquear NFT, debe asignar el rol de gestor de almacén a un usuario. El gestor de almacenes es un tipo especial de rol, un rol TokenSys. Los roles de TokenSys son diferentes de los roles basados en activos, como quemador, minter y notario, y de los roles administrativos, como Token Admin y Org Admin. Actualmente, Blockchain App Builder soporta el rol vault TokenSys. El único usuario que tiene el rol vault para un código de cadena es el gestor de almacén del código de cadena y puede gestionar NFT bloqueados.

El flujo típico para utilizar la funcionalidad de bloqueo de NFT sigue estos pasos.
  • Cree un token no fungible que tenga el comportamiento de bloqueo.
  • Utilice el método addTokenSysRole para asignar el rol vault a un usuario, el gestor de almacenes.
  • Llame al método lockNFT para bloquear un token no fungible, especificado por el ID de token.

TokenSys Métodos de gestión de roles

addTokenSysRole
Este método agrega un rol TokenSys a un usuario especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
@Validator(yup.string(), yup.string(), yup.string())
public async addTokenSysRole(role: string, orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.addTokenSysRoleMember", "TOKEN");
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.addRoleMember', 'TOKEN');
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.addTokenSysRoleMember(role, accountId);
}
Parámetros:
  • role: string: nombre del rol TokenSys que se va a proporcionar al usuario.
  • orgId: string: ID del proveedor de servicios de miembros (MSP) del usuario en la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
isInTokenSysRole
Este método devuelve un valor booleano para indicar si un usuario tiene un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string())
public async isInTokenSysRole(orgId: string, userId: string, role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.isInTokenSysRole", "TOKEN", {orgId: orgId, userId: userId });
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.isInTokenSysRole(role, accountId);
}
Parámetros:
  • role: string: nombre del rol TokenSys que se va a comprobar.
  • orgId: string: ID del proveedor de servicios de miembros (MSP) del usuario en la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
removeTokenSysRole
Este método elimina un rol TokenSys de un usuario especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
@Validator(yup.string(), yup.string(), yup.string())
public async removeTokenSysRole(role: string, orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.removeTokenSysRoleMember", "TOKEN");
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    return await this.Ctx.ERC721Token.removeTokenSysRoleMember(role, accountId);
}
Parámetros:
  • role: string: nombre del rol TokenSys que se va a eliminar.
  • orgId: string: ID del proveedor de servicios de miembros (MSP) del usuario en la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
transferTokenSysRole
Este método transfiere un rol TokenSys de un usuario a otro usuario. Este método solo puede ser llamado por un Token Admin del código de cadena.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string())
public async transferTokenSysRole(role: string, fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.transferTokenSysRole", "TOKEN");
    const fromAccountId = await this.Ctx.ERC721Account.generateAccountId(fromOrgId, fromUserId);
    const toAccountId = await this.Ctx.ERC721Account.generateAccountId(toOrgId, toUserId);
    return await this.Ctx.ERC721Token.transferTokenSysRole(role, fromAccountId, toAccountId);
}
Parámetros:
  • role: string: nombre del rol TokenSys que se va a transferir.
  • fromOrgId: string: ID del proveedor de servicios de miembros (MSP) del usuario desde el que transferir el rol TokenSys.
  • fromUserId: string: nombre de usuario o ID de correo electrónico del usuario desde el que transferir el rol TokenSys.
  • toOrgId: string: ID del proveedor de servicios de miembros (MSP) del usuario al que transferir el rol TokenSys.
  • toUserId: string: nombre de usuario o ID de correo electrónico del usuario al que transferir el rol TokenSys.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
    "msg": "Successfully transfered role 'vault' from Account Id: ouaccount~f4e311528f03fffa7810753d643f66289ff6c9080fcf839902f28a1d3aff1789 (Org-Id: Org1MSP, User-Id: user1) to Account Id: ouaccount~ae5be2ae8f98d6d32f5d02b43877d987114e7937c7bacbc30390dcce09996a19 (Org-Id: Org1MSP, User-Id: user2)"
}
getAccountsByTokenSysRole
Este método devuelve una lista de todos los ID de cuenta para un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
@GetMethod()
@Validator(yup.string())
public async getAccountsByTokenSysRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getAccountsByTokenSysRole", "TOKEN");
    return await this.Ctx.ERC721Token.getAccountsByTokenSysRole(role);
}
Parámetros:
  • role: string: nombre del rol TokenSys.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
getUsersByTokenSysRole
Este método devuelve información de usuario para todos los usuarios con un rol TokenSys especificado. Este método solo puede ser llamado por un Token Admin del código de cadena.
@GetMethod()
@Validator(yup.string())
public async getUsersByTokenSysRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getUsersByTokenSysRole", "TOKEN");
    return await this.Ctx.ERC721Token.getUsersByTokenSysRole(role);
}
Parámetros:
  • role: string: nombre del rol TokenSys.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
 "users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

Métodos de bloqueo de NFT

lockNFT
Este método bloquea un token no fungible especificado. Para bloquear un token, debe haber un usuario con el rol TokenSys vault, que actúe como gestor de almacén. Este método solo puede ser llamado por el propietario del token.
@Validator(yup.string())
public async lockNFT(tokenId: string) {
    return await this.Ctx.ERC721Token.lockNFT(tokenId);
}
Parámetros:
  • tokenID: string: ID del token que se va a bloquear.
Devuelve:
  • Cuando se realiza correctamente, una representación JSON del objeto de token.
Ejemplo de valor de retorno:
{
   "assetType":"otoken",
   "tokenId":"token1",
   "tokenName":"artcollection",
   "symbol":"ART",
   "tokenStandard":"erc721+",
   "tokenType":"nonfungible",
   "tokenUnit":"whole",
   "behaviors":[
      "indivisible",
      "singleton",
      "mintable",
      "transferable",
      "lockable",
      "burnable",
      "roles"
   ],
   "roles":{
      "minter_role_name":"minter"
   },
   "mintable":{
      "max_mint_quantity":20000
   },
   "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "creationDate":"2023-10-20T10:26:29.000Z",
   "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "isBurned":false,
   "isLocked":true,
   "tokenUri":"token1.example.com",
   "price":120,
   "on_sale_flag":false
}
isNFTLocked
Este método devuelve un valor booleano para indicar si un token especificado está bloqueado. Este método solo puede ser llamado por el propietario del token, el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadenas.
@GetMethod()
@Validator(yup.string())
public async isNFTLocked(tokenId: string) {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.isNFTLocked", "TOKEN", { tokenId });
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  const isLocked = await this.Ctx.ERC721Token.isNFTLocked(tokenId);
  return {isLocked: isLocked}
}
Parámetros:
  • tokenID: string: ID del token.
Devuelve:
  • Cuando se realiza correctamente, un mensaje que contiene detalles relevantes de la operación.
Ejemplo de valor de retorno:
{
   "isNFTLocked":true
}
getAllLockedNFTs
Este método devuelve una lista de todos los tokens no fungibles bloqueados. Este método solo puede ser llamado por el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadenas.
@GetMethod()
@Validator()
public async getAllLockedNFTs() {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getAllLockedNFTs", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
 return this.Ctx.ERC721Token.getAllLockedNFTs();
}
Parámetros:
  • ninguno
Devuelve:
  • En caso de éxito, una matriz de los objetos de token no fungibles bloqueados.
Ejemplo de valor de retorno:
[
   {
      "key":"token1",
      "valueJson":{
         "assetType":"otoken",
         "tokenId":"token1",
         "tokenName":"artcollection",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T10:26:29.000Z",
         "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "isBurned":false,
         "isLocked":true,
         "tokenUri":"token1.example.com",
         "price":120,
         "on_sale_flag":false
      }
   }
]
getAllLockedNFTsByOrg
Este método devuelve una lista de todos los tokens no fungibles bloqueados para una organización especificada y, opcionalmente, un usuario especificado. Este método solo puede ser llamado por el gestor de almacenes (el usuario con el rol TokenSys vault) o un Token Admin del código de cadenas.
@GetMethod()
@Validator(yup.string(), yup.string())
public async getLockedNFTsByOrg(orgId: string, userId?: string) {
  try {
    await this.Ctx.ERC721Auth.checkAuthorization("ERC721TOKEN.getLockedNFTsByOrg", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC721Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  return await this.Ctx.ERC721Token.getLockedNFTsByOrg(orgId, userId);
}
Parámetros:
  • orgId: string: ID del proveedor de servicios de miembros (MSP) del usuario en la organización actual.
  • userId: string: nombre de usuario o ID de correo electrónico del usuario (opcional).
Devuelve:
  • En caso de éxito, una matriz de los objetos de token no fungibles bloqueados.
Ejemplo de valor de retorno:
[
   {
      "key":"token1",
      "valueJson":{
         "assetType":"otoken",
         "tokenId":"token1",
         "tokenName":"artcollection",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T10:26:29.000Z",
         "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "isBurned":false,
         "isLocked":true,
         "tokenUri":"token1.examplecom",
         "price":120,
         "on_sale_flag":false
      }
   }
]