TypeScript Métodos para Bloqueio NFT ERC-1155

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-1155 estendido.

Um token bloqueado não pode ser queimado 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 gerenciador 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, minter 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 único usuário 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 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. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string(), yup.string(), yup.string())
public async addTokenSysRole(orgId: string, userId: string, role: string) {
  await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.addTokenSysRoleMember", "TOKEN");
  const userAccountId = this.Ctx.ERC1155Account.generateAccountId(orgId, userId);
  return await this.Ctx.ERC1155Token.addTokenSysRoleMember(role, userAccountId);
}
Parâmetros:
  • orgId: string – O ID do prestador de serviço 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.
  • role: string – O nome da atribuição TokenSys a ser fornecida ao 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
Esse método retorna um valor Booliano para indicar se um usuário tem uma atribuição TokenSys especificada. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string(), yup.string(), yup.string())
public async isInTokenSysRole(orgId: string, userId: string, role: string) {
  await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.isInTokenSysRole", "TOKEN", {orgId: orgId, userId: userId });
  const userAccountId = this.Ctx.ERC1155Account.generateAccountId(orgId, userId);
  return await this.Ctx.ERC1155Token.isInTokenSysRole(role, userAccountId);
}
Parâmetros:
  • orgId: string – O ID do prestador de serviço 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.
  • role: string – O nome da atribuição TokenSys a ser verificada.
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. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string(), yup.string(), yup.string())
public async removeTokenSysRole(orgId: string, userId: string, role: string) {
  await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.removeTokenSysRoleMember", "TOKEN");
  const userAccountId = this.Ctx.ERC1155Account.generateAccountId(orgId, userId);
  return await this.Ctx.ERC1155Token.removeTokenSysRoleMember(role, userAccountId);
}
Parâmetros:
  • orgId: string – O ID do prestador de serviço 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.
  • role: string – O nome da atribuição TokenSys a ser removida.
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. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string())
public async transferTokenSysRole(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, role: string) {
    await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.transferTokenSysRole", "TOKEN");
    const fromUserAccountId = await this.Ctx.ERC1155Account.generateAccountId(fromOrgId, fromUserId);
    const toUserAccountId = await this.Ctx.ERC1155Account.generateAccountId(toOrgId, toUserId);
    return await this.Ctx.ERC1155Token.transferTokenSysRole(role, fromUserAccountId, toUserAccountId);
}
Parâmetros:
  • 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 do usuário ou o ID do e-mail do qual o usuário transferirá a atribuição TokenSys.
  • 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.
  • role: string – O nome da atribuição TokenSys a 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
Esse método retorna uma lista de todos os IDs de conta para uma atribuição TokenSys especificada. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string())
public async getAccountsByTokenSysRole(role: string) {
  await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.getAccountsByTokenSysRole", "TOKEN");
  return await this.Ctx.ERC1155Token.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
Esse método retorna informações do usuário para todos os usuários com uma atribuição TokenSys especificada. Este método pode ser chamado somente por um Token Admin do chaincode.
@Validator(yup.string())
public async getUsersByTokenSysRole(role: string) {
  await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.getUsersByTokenSysRole", "TOKEN");
  return await this.Ctx.ERC1155Token.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 vault. Esse método só pode ser chamado pelo proprietário do token.
@Validator(yup.string())
public async lockNFT(orgId: string, userId: string, tokenId: string) {
  return await this.Ctx.ERC1155Token.lockNFT(orgId, userId, tokenId);
}
Parâmetros:
  • orgId: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • userId: string – O nome do usuário ou o ID do e-mail do usuário (opcional).
  • tokenID: string – O ID do token a ser bloqueado.
Retorna:
  • Com êxito, uma representação JSON do objeto de token.
Exemplo de valor de retorno:
{
   "assetType":"otoken",
   "tokenId":"token1",
   "tokenName":"artcollection",
   "tokenStandard":"erc1155+",
   "tokenType":"nonfungible",
   "tokenUnit":"whole",
   "behaviors":[
      "indivisible",
      "mintable",
      "transferable",
      "burnable",
      "lockable",
      "roles"
   ],
   "roles":{
      "minter_role_name":"minter"
   },
   "mintable":{
      "max_mint_quantity":20000
   },
   "quantity":1,
   "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
   "creationDate":"2023-10-20T09:16: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.ERC1155Auth.checkAuthorization("ERC1155TOKEN.isNFTLocked", "TOKEN", { tokenId });
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC1155Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  const isNFTLocked = await this.Ctx.ERC1155Token.isNFTLocked(tokenId);
  return {isNFTLocked};
}
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 vault (o usuário com a atribuição TokenSys vault) ou um Token Admin do chaincode.
@GetMethod()
@Validator()
public async getAllLockedNFTs() {
  try {
    await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.getAllLockedNFTs", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC1155Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  return this.Ctx.ERC1155Token.getAllLockedNFTs();
}
Parâmetros:
  • Nenhum(a)
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",
         "tokenStandard":"erc1155+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "mintable",
            "transferable",
            "burnable",
            "lockable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "quantity":1,
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T09:16: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 um Token Admin do chaincode.
@GetMethod()
@Validator(yup.string(), yup.string())
public async getLockedNFTsByOrg(orgId: string, userId?: string) {
  try {
    await this.Ctx.ERC1155Auth.checkAuthorization("ERC1155TOKEN.getLockedNFTsByOrg", "TOKEN");
  } catch(err) {
    const isCallerTokenSysRoleHolder = await this.Ctx.ERC1155Token.isCallerTokenSysRoleHolder(TOKEN_SYS_ROLE_TYPE.VAULT);
    if(!isCallerTokenSysRoleHolder)
      throw err;
  }
  return await this.Ctx.ERC1155Token.getLockedNFTsByOrg(orgId, userId);
}
Parâmetros:
  • orgId: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • userId: string – O nome do usuário ou o ID do 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",
         "tokenStandard":"erc1155+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "mintable",
            "transferable",
            "burnable",
            "lockable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "quantity":1,
         "createdBy":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "creationDate":"2023-10-20T09:16:29.000Z",
         "owner":"oaccount~208e3345ac84b4849f0d2648b2f2f018019886a1230f99304ebff1b6a7733463",
         "isBurned":false,
         "isLocked":true,
         "tokenUri":"token1.example.com",
         "price":120,
         "on_sale_flag":false
      }
   }
]