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.

Para poder bloquear NFTs, você deve designar a atribuição de gerente de vault a um usuário. O gerente de vault é um tipo especial de atribuição, uma atribuição TokenSys. As atribuições TokenSys são diferentes das atribuições baseadas em ativos, como gravador, mineiro e notário, e das atribuiçõ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 gerente de vault do chaincode e pode gerenciar NFTs bloqueados.

O fluxo típico para usar a funcionalidade de bloqueio NFT segue estas etapas.
  • Crie um token não fungível que tenha o comportamento bloqueável.
  • Use o método addTokenSysRole para conceder a atribuição vault a um usuário, o gerenciador de vault.
  • 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. Esse 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 ID de e-mail do usuário.
Retorna:
  • Em caso de êxito, 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
Este método retorna um valor Booliano para indicar se um usuário tem uma atribuição TokenSys especificada. Esse 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 ID de e-mail do usuário.
Retorna:
  • Em caso de êxito, 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
Este método remove uma atribuição TokenSys de um usuário especificado. Esse 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 ID de e-mail do usuário.
Retorna:
  • Em caso de êxito, 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. Esse 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 função TokenSys a ser transferida.
  • fromOrgId: string – O ID do provedor de serviços de associação (MSP) do usuário do qual a função TokenSys será transferida.
  • fromUserId: string – O nome de usuário ou o ID de e-mail do usuário do qual a função TokenSys será transferida.
  • toOrgId: string – O ID do provedor de serviços de associação (MSP) do usuário para o qual a função TokenSys será transferida.
  • toUserId: string – O nome de usuário ou ID de e-mail do usuário para o qual a função TokenSys será transferida.
Retorna:
  • Em caso de êxito, 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
Este método retorna uma lista de todos os IDs de conta para uma atribuição TokenSys especificada. Esse 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 êxito, uma mensagem que contém detalhes relevantes da operação.
Exemplo de Valor de Retorno:
{
    "accountIds": [
        "oaccount~bf07f584a94be44781e49d9101bfaf58c6fbbe77a4dfebdb83c874c2caf03eba"
    ]
}
getUsersByTokenSysRole
Este método retorna informações de usuário para todos os usuários com uma atribuição TokenSys especificada. Esse 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 êxito, 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 vaults. Este método pode ser chamado apenas 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:
  • No 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 do 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 êxito, 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 vaults (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:
  • Nenhum(a)
Retorna:
  • No 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 vaults (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 ID de e-mail do usuário (opcional).
Retorna:
  • No 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
      }
   }
]