TypeScript Métodos para Bloqueio de NFT ERC-721

O Blockchain App Builder gera automaticamente métodos que você pode usar para bloquear tokens não fungíveis que usam o padrão ERC-721 estendido.

Um token bloqueado não pode ser gravado ou transferido para outros usuários. Todas as outras propriedades, como o estado, o proprietário e o histórico do token, são preservadas. Você pode usar a funcionalidade de bloqueio NFT ao transferir um token para outra rede blockchain, como Ethereum ou Polygon.

Antes de bloquear NFTs, você deve designar a atribuição de gerente de vault a um usuário. O gerenciador de vault é um tipo especial de atribuição, uma atribuição TokenSys. As funções TokenSys são diferentes das funções baseadas em ativos, como gravador, minter e notário, e das funções administrativas, como Token Admin e Org Admin. No momento, o Blockchain App Builder suporta a atribuição vault TokenSys. O usuário único que tem a atribuição vault para um chaincode é o gerenciador de vault do chaincode e pode gerenciar NFTs bloqueados.

O fluxo típico para usar a funcionalidade de bloqueio de NFT segue estas etapas.
  • Crie um token não fungível que tenha o comportamento bloqueável.
  • Use o método addTokenSysRole para fornecer a atribuição vault a um usuário, o gerenciador de vaults.
  • Chame o método lockNFT para bloquear um token não fungível, especificado pelo ID do token.

TokenSys Métodos de Gerenciamento de Atribuições

addTokenSysRole
Esse método adiciona uma atribuição TokenSys a um usuário especificado. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys a ser fornecida ao usuário.
  • orgId: string - O ID do provedor de serviços de associação (MSP) do usuário na organização atual.
  • userId: string - O nome de usuário ou o ID de e-mail do usuário.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
    "msg": "Successfully added role 'vault' to Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
isInTokenSysRole
Esse método retorna um valor booliano para indicar se um usuário tem uma função TokenSys especificada. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys a ser verificada.
  • orgId: string - O ID do provedor de serviços de associação (MSP) do usuário na organização atual.
  • userId: string - O nome de usuário ou o ID de e-mail do usuário.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
    "result": true,
    "msg": "Account Id oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1) has vault role"
}
removeTokenSysRole
Esse método remove uma atribuição TokenSys de um usuário especificado. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys a ser removida.
  • orgId: string - O ID do provedor de serviços de associação (MSP) do usuário na organização atual.
  • userId: string - O nome de usuário ou o ID de e-mail do usuário.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
    "msg": "Successfully removed role 'vault' from Account Id: oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba (Org-Id: Org1MSP, User-Id: user1)"
}
transferTokenSysRole
Esse método transfere uma atribuição TokenSys de um usuário para outro usuário. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys a ser transferida.
  • fromOrgId: string - O ID do provedor de serviços de associação (MSP) do usuário do qual a atribuição TokenSys será transferida.
  • fromUserId: string - O nome de usuário ou o ID de e-mail do usuário do qual a atribuição TokenSys será transferida.
  • toOrgId: string - O ID do provedor de serviços de associação (MSP) do usuário para o qual a atribuição TokenSys será transferida.
  • toUserId: string - O nome de usuário ou o ID de e-mail do usuário para o qual a atribuição TokenSys será transferida.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo 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
Esse método retorna uma lista de todos os IDs de conta para uma atribuição TokenSys especificada. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
getUsersByTokenSysRole
Esse método retorna informações do usuário para todos os usuários com uma atribuição TokenSys especificada. Este método só pode ser chamado por um Token Admin do chaincode.
@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 - O nome da atribuição TokenSys.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
 "users":[
      {
         "accountId":"oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba",
         "orgId":"Org1MSP",
         "userId":"user1"
      }
   ]
}

Métodos de Bloqueio NFT

lockNFT
Este método bloqueia um token não fungível especificado. Para bloquear um token, deve haver um usuário com a atribuição TokenSys vault, que atua como o gerenciador de vault. Esse método só pode ser chamado pelo proprietário do token.
@Validator(yup.string())
public async lockNFT(tokenId: string) {
    return await this.Ctx.ERC721Token.lockNFT(tokenId);
}
Parâmetros:
  • tokenID: string - O ID do token a ser bloqueado.
Retorna:
  • Em caso de sucesso, uma representação JSON do objeto de token.
Exemplo 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 retorna um valor booliano para indicar se um token especificado está bloqueado. Esse método só pode ser chamado pelo proprietário do token, pelo gerenciador de vault (o usuário com a atribuição TokenSys vault) ou por um Token Admin do chaincode.
@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 - O ID do token.
Retorna:
  • Em caso de sucesso, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
   "isNFTLocked":true
}
getAllLockedNFTs
Este método retorna uma lista de todos os tokens não fungíveis bloqueados. Esse método só pode ser chamado pelo gerenciador de vault (o usuário com a atribuição TokenSys vault) ou por um Token Admin do chaincode.
@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:
  • Nenhuma
Retorna:
  • Em caso de sucesso, um array dos objetos de token não fungíveis bloqueados.
Exemplo 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 retorna uma lista de todos os tokens não fungíveis bloqueados para uma organização especificada e, opcionalmente, um usuário especificado. Esse método só pode ser chamado pelo gerenciador de vault (o usuário com a atribuição TokenSys vault) ou por um Token Admin do chaincode.
@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 - O ID do provedor de serviços de associação (MSP) do usuário na organização atual.
  • userId: string - O nome de usuário ou o ID de e-mail do usuário (opcional).
Retorna:
  • Em caso de sucesso, um array dos objetos de token não fungíveis bloqueados.
Exemplo 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
      }
   }
]