Métodos Go para 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.
func (t *Controller) AddTokenSysRole(role string, orgId string, userId string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.AddTokenSysRole", "TOKEN", map[string]string{"accountId": accountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.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.
func (t *Controller) IsInTokenSysRole(orgId string, userId string, role string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.IsInTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.ERC721Token.IsInTokenSysRoleMember(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.
func (t *Controller) RemoveTokenSysRole(role string, orgId string, userId string) (interface{}, error) {
    accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.RemoveTokenSysRole", "TOKEN", map[string]string{"accountId": accountId})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.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.
func (t *Controller) TransferTokenSysRole(role string, fromOrgId string, fromUserId string, toOrgId string, toUserId string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.TransferTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    fromAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(fromOrgId, fromUserId)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    toAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(toOrgId, toUserId)
    if err != nil {
        return nil, fmt.Errorf("error in TransferTokenSysRole. Error: %s", err)
    }
    return t.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.
func (t *Controller) GetAccountsByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAccountsByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.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.
func (t *Controller) GetUsersByTokenSysRole(role string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetUsersByTokenSysRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.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.
func (t *Controller) LockNFT(tokenId string) (interface{}, error) {
    return t.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",
   "Behavior":[
      "indivisible",
      "singleton",
      "mintable",
      "transferable",
      "lockable",
      "burnable",
      "roles"
   ],
   "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "CreationDate":"2023-10-20T12:39:50Z",
   "IsBurned":false,
   "IsLocked":true,
   "Mintable":{
      "Max_mint_quantity":20000
   },
   "On_sale_flag":false,
   "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "Price":120,
   "Roles":{
      "minter_role_name":"minter"
   },
   "Symbol":"ART",
   "TokenDesc":"",
   "TokenId":"token1",
   "TokenMetadata":{
      "Description":"",
      "Image":"",
      "Painter_name":"",
      "Painting_name":""
   },
   "TokenName":"artcollection",
   "TokenStandard":"erc721+",
   "TokenType":"nonfungible",
   "TokenUnit":"whole",
   "TokenUri":"token1.example.com"
}
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.
func (t *Controller) IsNFTLocked(tokenId string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.IsNFTLocked", "TOKEN", map[string]string{"tokenId": tokenId})
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.IsCallerTokenSysRoleHolder(constants.Vault)
        if error != nil {
            return nil, error
        }
        if !isCallerTokenSysRoleHolder {
            return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
        }
    }
    return t.Ctx.ERC721Token.IsNFTLocked(tokenId)
}
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.
func (t *Controller) GetAllLockedNFTs() (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAllLockedNFTs", "TOKEN")
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.IsCallerTokenSysRoleHolder(constants.Vault)
        if error != nil {
            return nil, error
        }
        if !isCallerTokenSysRoleHolder {
            return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
        }
    }
    return t.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",
         "Behavior":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:39:50Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Roles":{
            "minter_role_name":"minter"
         },
         "Symbol":"ART",
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc721+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]
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.
func (t *Controller) GetLockedNFTsByOrg(orgId string, userId ...string) (interface{}, error) {
    auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetLockedNFTsByOrg", "TOKEN")
    if err != nil && !auth {
        isCallerTokenSysRoleHolder, error := t.Ctx.ERC721Token.IsCallerTokenSysRoleHolder(constants.Vault)
        if error != nil {
            return nil, error
        }
        if !isCallerTokenSysRoleHolder {
            return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
        }
    }
    return t.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",
         "Behavior":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "lockable",
            "burnable",
            "roles"
         ],
         "CreatedBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "CreationDate":"2023-10-20T12:39:50Z",
         "IsBurned":false,
         "IsLocked":true,
         "Mintable":{
            "Max_mint_quantity":20000
         },
         "On_sale_flag":false,
         "Owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "Price":120,
         "Roles":{
            "minter_role_name":"minter"
         },
         "Symbol":"ART",
         "TokenDesc":"",
         "TokenId":"token1",
         "TokenMetadata":{
            "Description":"",
            "Image":"",
            "Painter_name":"",
            "Painting_name":""
         },
         "TokenName":"artcollection",
         "TokenStandard":"erc721+",
         "TokenType":"nonfungible",
         "TokenUnit":"whole",
         "TokenUri":"token1.example.com"
      }
   }
]