Aprimoramentos do Token Taxonomy Framework

A versão aprimorada do Blockchain App Builder inclui novas funcionalidades relacionadas ao padrão estendido do Token Taxonomy Framework.

Limites de Transação Diária

Você pode restringir o número de transações que uma conta pode concluir diariamente, bem como o número de tokens que podem ser usados. Os parâmetros de entrada max_daily_amount e max_daily_transactions do método createAccount controlam esse comportamento. Esses parâmetros são opcionais.

Você poderá obter um throughput mais alto se não definir os limites de transação diários para uma conta.

createAccount (TypeScript)
@Validator(yup.string(), yup.string(), yup.string(), yup.object().nullable())

public async createAccount(org_id: string, user_id: string, token_type: string, daily_limits: DailyLimits) {
await this.Ctx.Auth.checkAuthorization("ACCOUNT.createAccount", "TOKEN", { org_id });
return await this.Ctx.Account.createAccount(org_id, user_id, token_type, daily_limits);
}
Parâmetros Adicionais:
  • daily_limits: JSON – Um objeto que especifica a quantidade máxima de tokens que podem ser usados em transações diárias (max_daily_amount) e o número máximo de transações que podem ser concluídas diariamente (max_daily_transactions), conforme mostrado no exemplo a seguir.
    {
         "max_daily_amount": 100000
         "max_daily_transactions": 10000
     }
CreateAccount (Go)
func (t *Controller) CreateAccount(org_id string, user_id string, token_type string, daily_limits ...account.AccountDailyLimits) (interface{}, error) {
auth, err := t.Ctx.Auth.CheckAuthorization("Account.CreateAccount", "TOKEN", map[string]string{"org_id": org_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}
return t.Ctx.Account.CreateAccount(org_id, user_id, token_type, daily_limits...)
}
Parâmetros Adicionais:
  • daily_limits: JSON – Um objeto JSON que inclui um parâmetro MaxDailyAmount (o valor máximo de tokens que podem ser usados em transações diárias) e um parâmetro MaxDailyTransactions (o número máximo de transações que podem ser concluídas diariamente), conforme mostrado no exemplo a seguir.
    {
         "MaxDailyAmount": 100000
         "MaxDailyTransactions": 10000
     }
Retorna:
  • Com êxito, um objeto JSON da conta que foi criado. O parâmetro BapAccountVersion é definido no objeto de conta para uso interno.
Exemplo de valor de retorno:
{ 
   "AssetType":"oaccount",
   "AccountId":"oaccount~a73085a385bc96c4a45aa2dff032e7dede82c0664dee5f396b7c5854eeafd4bd",
   "BapAccountVersion": 0,
   "UserId":"user1",
   "OrgId":"Org1MSP",
   "AccountType":"fungible",
   "TokenId":"",
   "TokenName":"",
   "Balance":0,
   "BalanceOnHold":0
}

Requisitos de aprovação para mineração e queima

Você pode configurar aprovações para cunhar e gravar tokens, de modo que os usuários com o papel de mineiro ou gravador devem enviar uma solicitação a um aprovador, em vez de cunhar ou gravar tokens diretamente. Os aprovadores podem aceitar ou rejeitar solicitações de menta ou queimar tokens. Para ativar aprovações para cunhagem e gravação, use os parâmetros mint_approval_required e burn_approval_required. Você também deve especificar valores para mint_approver_role_name e burn_approval_role_name, conforme mostrado no exemplo a seguir.

behavior: # Token behaviors
          - divisible: 
                decimal: 2  
          - mintable: 
                max_mint_quantity: 1000 
                mint_approval_required: true
          - transferable
          - burnable 
                burn_approval_required: true
          - holdable 
          - roles: 
                minter_role_name: minter
                notary_role_name: notary
                mint_approver_role_name: minter_notary
                burn_approver_role_name: burner_notary
Os métodos a seguir suportam a solicitação, aceitação e rejeição de aprovações para gerar e queimar tokens.

TypeScript Métodos para Aprovação de Minting e Burning

requestMint
Este método pode ser chamado por um minter para enviar uma solicitação ao notário do minter para criar uma quantidade especificada de tokens.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())
public async requestMint( token_id: string, operation_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails) {

const token_asset = await this.getTokenObject(token_id);
const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
return await this.Ctx.Token.hold(operation_id, null, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.MINT, info_details);

}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário mineiro que processará a solicitação.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário mineiro que processará a solicitação.
  • quantity: number – A quantidade de tokens a serem cunhados.
  • time_to_expiration – O horário após o qual a solicitação de cunhagem expira e não é mais válida.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveMint
Este método pode ser chamado por um notário mineiro para aprovar uma solicitação de cunhagem.
@Validator(yup.string(), yup.string())
public async approveMint(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.executeHold(operation_id, token_asset);
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
Exemplo de valor de retorno:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectMint
Este método pode ser chamado por um notário mineiro para rejeitar uma solicitação de cunhagem.
@Validator(yup.string(), yup.string())
public async rejectMint(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.releaseHold(operation_id, token_asset);
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
Exemplo de valor de retorno:
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
requestBurn
Este método pode ser chamado por um gravador para enviar um pedido ao notário do gravador para destruir uma quantidade especificada de tokens.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())

public async requestBurn( token_id: string, operation_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails ) {

const token_asset = await this.getTokenObject(token_id);
const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
return await this.Ctx.Token.hold(operation_id, null, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.BURN, null, description);
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário do gravador que processará a solicitação.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário do gravador que processará a solicitação.
  • quantity: number – A quantidade de tokens a serem queimados.
  • time_to_expiration – O tempo após o qual a solicitação de gravação expira e não é mais válida.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveBurn
Este método pode ser chamado por um notário queimador para aprovar um pedido de queima.
@Validator(yup.string(), yup.string())
public async approveBurn(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.executeHold(operation_id, token_asset);
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
Exemplo de valor de retorno:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectBurn
Este método pode ser chamado por um notário queimador para rejeitar um pedido de queima.
@Validator(yup.string(), yup.string())
public async rejectBurn(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.releaseHold(operation_id, token_asset);
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
Exemplo de valor de retorno:
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Métodos Go para Minting e aprovação de queima

RequestMint
Este método pode ser chamado por um minter para enviar uma solicitação ao notário do minter para criar uma quantidade especificada de tokens.
func (t *Controller) RequestMint(token_id string, operation_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, "", notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldMint, info_details...)
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário mineiro que processará a solicitação.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário mineiro que processará a solicitação.
  • quantity: number – A quantidade de tokens a serem cunhados.
  • TimeToExpiration – O horário após o qual a solicitação de cunhagem expira e não é mais válida.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "Category" : "category input",
         "Description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveMint
Este método pode ser chamado por um notário mineiro para aprovar uma solicitação de cunhagem.
func (t *Controller) ApproveMint(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ExecuteHold(operation_id, tokenAssetValue.Interface())
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
Exemplo de valor de retorno:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectMint
Este método pode ser chamado por um notário mineiro para rejeitar uma solicitação de cunhagem.
func (t *Controller) RejectMint(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ReleaseHold(operation_id, tokenAssetValue.Interface())
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de mint.
Exemplo de valor de retorno:
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
RequestBurn
Este método pode ser chamado por um gravador para enviar um pedido ao notário do gravador para destruir uma quantidade especificada de tokens.
func (t *Controller) RequestBurn(token_id string, operation_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, "", notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldBurn, info_details...)
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário do gravador que processará a solicitação.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário do gravador que processará a solicitação.
  • quantity: number – A quantidade de tokens a serem queimados.
  • time_to_expiration – O tempo após o qual a solicitação de gravação expira e não é mais válida.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveBurn
Este método pode ser chamado por um notário queimador para aprovar um pedido de queima.
func (t *Controller) ApproveBurn(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ExecuteHold(operation_id, tokenAssetValue.Interface())
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
Exemplo de valor de retorno:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectBurn
Este método pode ser chamado por um notário queimador para rejeitar um pedido de queima.
func (t *Controller) RejectBurn(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ReleaseHold(operation_id, tokenAssetValue.Interface())
}
Parâmetros:
  • token_id: string – O ID do token a ser gravado.
  • operation_id: string – O ID de operação exclusivo que representa a solicitação de gravação.
Exemplo de valor de retorno:
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Extraindo o Histórico de Transações do Banco de Dados do Rich History

Você pode sincronizar dados com o banco de dados de histórico avançado e extrair os dados usando chamadas de API de chaincode. O método a seguir, mostrado em TypeScript e em Go, extrai o histórico de transações do banco de dados de histórico avançado. Para poder usar esses métodos, execute o Oracle Autonomous Database com o Oracle REST Data Services (ORDS) e o OAuth ativado, conforme descrito em Oracle Database View Definitions for Wholesale CBDC.
getAccountTransactionHistoryWithFiltersFromRichHistDB (TypeScript)
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.object().nullable())
public async getAccountTransactionHistoryWithFiltersFromRichHistDB(token_id: string, org_id: string, user_id: string, custom_endpoint: string, bearer_token: string, filters?: Filters) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistoryWithFilters", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTrxHistoryWithFiltersFromRichHistDB(account_id, org_id, user_id.toLowerCase(), custom_endpoint, bearer_token, filters);
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
  • custom_endpoint – O ponto final do serviço RESTful do banco de dados de histórico avançado.
  • bearer_token – O token de autorização de acesso para o ponto final do serviço RESTful.
  • filters: string – Um parâmetro opcional. Se estiver vazio, todos os registros serão retornados. A propriedade PageSize determina o número de registros a serem retornados. Se PageSize for 0, o tamanho padrão da página será 20. A propriedade Bookmark determina o índice inicial dos registros a serem retornados. Para obter mais informações, consulte a documentação do Hyperledger Fabric. As propriedades StartTime e EndTime devem ser especificadas no formato RFC-3339.
GetAccountTransactionHistoryWithFiltersFromRichHistDB (Go)
func (t *Controller) GetAccountTransactionHistoryWithFiltersFromRichHistDB(token_id string, org_id string, user_id string, custom_endPoint string, bearer_token string, filters ...account.AccountHistoryFilters) (interface{}, error) {
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistoryWithFilters", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}
// sample format of filter: []string{"3", "", "2022-01-16T15:16:36+00:00", "2022-01-17T15:16:36+00:00"}
transactionArray, err := t.Ctx.Account.GetAccountTransactionHistoryWithFiltersFromRichHistDB(account_id, org_id, user_id, custom_endPoint, bearer_token, filters...)
return transactionArray, err
}
Parâmetros:
  • token_id: string – O ID do token a ser cunhado.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
  • custom_endpoint – O ponto final do serviço RESTful do banco de dados de histórico avançado.
  • bearer_token – O token de autorização de acesso para o ponto final do serviço RESTful.
  • filters: string – Um parâmetro opcional. Se estiver vazio, todos os registros serão retornados. A propriedade PageSize determina o número de registros a serem retornados. Se PageSize for 0, o tamanho padrão da página será 20. A propriedade Bookmark determina o índice inicial dos registros a serem retornados. Para obter mais informações, consulte a documentação do Hyperledger Fabric. As propriedades StartTime e EndTime devem ser especificadas no formato RFC-3339.

Atributos de Categoria e Descrição em Objetos de Transação

  • Os atributos de categoria e descrição devem ser incluídos nos métodos transferTokens, holdTokens, issueTokens, requestMint, requestBurn, burnTokens e rejectBurn no arquivo do controlador. Os métodos SDK correspondentes também devem incluir atributos de categoria e descrição.
  • A entrada do atributo de categoria e descrição está no formato de um objeto JSON chamado info_details, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
  • O campo info_details é opcional. Você pode passar apenas uma categoria ou apenas uma descrição, conforme necessário.
  • Os métodos GET relacionados a qualquer transação para transferTokens, holdTokens, executeHold, releaseHold, requestMint, approveMint, rejectMint, requestBurn, approveBurn e rejectBurn devem incluir atributos de categoria e descrição na resposta do payload, se eles estiverem presentes.
  • O campo de categoria é limitado a 20 caracteres e o campo de descrição é limitado a 250 caracteres.

TypeScript Métodos com Entradas Modificadas

Os métodos a seguir suportam atributos opcionais de categoria e descrição quando você usa a versão aprimorada do Blockchain App Builder.

transferTokens
Este método transfere tokens do chamador para uma conta especificada.
@Validator(yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.object().nullable())
public async transferTokens(token_id: string, to_org_id: string, to_user_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
const to_account_id = await this.Ctx.Account.generateAccountId(token_id, to_org_id, to_user_id);
return await this.Ctx.Token.transfer(to_account_id, quantity, token_asset, info_details);
}
Parâmetros:
  • token_id: string – O ID do token.
  • to_org_id: string – O ID do prestador de serviço de associação (MSP) do destinatário (favorecido) na organização atual.
  • to_user_id: string – O nome do usuário ou o ID do e-mail do destinatário.
  • quantity: number – O número de tokens a serem transferidos.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
 msg: "Successfully transferred 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) to account id: oaccount~7yuijg39b4e1e4136dd86a806020c97a930909325340481b8fdhjklliugbv699 (Org-Id: Org1MSP, User-Id: user)",
}
holdTokens
Este método cria uma retenção em nome do proprietário dos tokens com a conta to_account_id.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())
  public async holdTokens( token_id: string, operation_id: string, to_org_id: string, to_user_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails) {
    const token_asset = await this.getTokenObject(token_id);
    const to_account_id = await this.Ctx.Account.generateAccountId(token_id, to_org_id, to_user_id);
    const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
    return await this.Ctx.Token.hold(operation_id, to_account_id, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.TRANSFER, info_details);
  }
Parâmetros:
  • token_id: string – O ID do token.
  • operation_id: string – Um ID exclusivo para identificar a operação de retenção. Normalmente, esse ID é passado pelo aplicativo cliente.
  • to_org_id: string – O ID do prestador de serviço de associação (MSP) do destinatário na organização atual.
  • to_user_id: string – O nome do usuário ou o ID do e-mail do destinatário.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário na organização atual.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário.
  • quantity: number – O número de tokens a serem colocados em espera.
  • time_to_expiration – O horário em que a retenção expira. Especifique 0 para uma retenção permanente. Caso contrário, use o formato RFC-3339. Por exemplo, 2021-06-02T12:46:06Z.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
issueTokens
Esse método mina tokens, que pertencem ao chamador do método.
@Validator(yup.string(), yup.number().positive(), yup.object().nullable())
public async issueTokens(token_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.mint(quantity, token_asset, info_details);
}
Parâmetros:
  • token_id: string – O ID do token.
  • quantity – O número de tokens a serem cunhados.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
burnTokens
Este método desativa ou queima tokens da conta do chamador da transação.
@Validator(yup.string(), yup.number().positive(), yup.object().nullable())

public async burnTokens(token_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.burn(quantity, token_asset, info_details);
}
Parâmetros:
  • token_id: string – O ID do token.
  • quantity – O número de tokens a serem gravados.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

Métodos Go com Entradas Modificadas

Os métodos a seguir suportam atributos opcionais de categoria e descrição quando você usa a versão aprimorada do Blockchain App Builder.

TransferTokens
Este método transfere tokens do chamador para uma conta especificada.
func (t *Controller) TransferTokens(token_id string, to_org_id string, to_user_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
to_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, to_org_id, to_user_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Transfer(to_account_id, quantity, tokenAssetValue.Interface(), info_details...)
}
Parâmetros:
  • token_id: string – O ID do token.
  • to_org_id: string – O ID do prestador de serviço de associação (MSP) do destinatário (favorecido) na organização atual.
  • to_user_id: string – O nome do usuário ou o ID do e-mail do destinatário.
  • quantity: number – O número de tokens a serem transferidos.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
 msg: "Successfully transferred 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) to account id: oaccount~7yuijg39b4e1e4136dd86a806020c97a930909325340481b8fdhjklliugbv699 (Org-Id: Org1MSP, User-Id: user)",
}
HoldTokens
Este método cria uma retenção em nome do proprietário dos tokens com a conta to_account_id.
func (t *Controller) HoldTokens(token_id string, operation_id string, to_org_id string, to_user_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
}
to_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, to_org_id, to_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting to_account id from org_id: %s and user_id: %s with token_id: %s, error %s ", to_org_id, to_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, to_account_id, notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldTransfer, info_details...)
}
Parâmetros:
  • token_id: string – O ID do token.
  • operation_id: string – Um ID exclusivo para identificar a operação de retenção. Normalmente, esse ID é passado pelo aplicativo cliente.
  • to_org_id: string – O ID do prestador de serviço de associação (MSP) do destinatário na organização atual.
  • to_user_id: string – O nome do usuário ou o ID do e-mail do destinatário.
  • notary_org_id: string – O ID do prestador de serviços de associação (MSP) do notário na organização atual.
  • notary_user_id: string – O nome de usuário ou o ID de e-mail do notário.
  • quantity: number – O número de tokens a serem colocados em espera.
  • time_to_expiration – O horário em que a retenção expira. Especifique 0 para uma retenção permanente. Caso contrário, use o formato RFC-3339. Por exemplo, 2021-06-02T12:46:06Z.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
IssueTokens
Esse método mina tokens, que pertencem ao chamador do método.
func (t *Controller) IssueTokens(token_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Mint(quantity, tokenAssetValue.Interface(), info_details...)
}
Parâmetros:
  • token_id: string – O ID do token.
  • quantity – O número de tokens a serem cunhados.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
BurnTokens
Este método desativa ou queima tokens da conta do chamador da transação.
func (t *Controller) BurnTokens(token_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Burn(quantity, tokenAssetValue.Interface(), info_details...)
}
Parâmetros:
  • token_id: string – O ID do token.
  • quantity – O número de tokens a serem gravados.
  • info_details: JSON – Um objeto que especifica a categoria (category) e a descrição (description) da solicitação, conforme mostrado no exemplo a seguir.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemplo de valor de retorno:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

TypeScript Métodos com Saídas Modificadas

Os métodos a seguir retornam a organização relevante e os IDs de usuário quando você usa a versão aprimorada do Blockchain App Builder.

getAccountTransactionHistory
Esse método retorna um array de detalhes do histórico de transações da conta para um usuário e token especificados.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string())
public async getAccountTransactionHistory(token_id: string, org_id: string, user_id: string) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistory", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTransactionHistory(account_id, org_id, user_id.toLowerCase());
}
Parâmetros:
  • token_id: string – O ID do token.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
Exemplo de Valor de Retorno:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]
getAccountTransactionHistoryWithFilters
Esse método retorna um array filtrado de detalhes do histórico de transações da conta para um usuário e token especificados.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string(), yup.object().nullable())
public async getAccountTransactionHistoryWithFilters(token_id: string, org_id: string, user_id: string, filters?: Filters) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistoryWithFilters", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTransactionHistoryWithFilters(account_id, org_id, user_id.toLowerCase(), filters);
}
Parâmetros:
  • token_id: string – O ID do token.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
  • filters: string – Um parâmetro opcional. Se estiver vazio, todos os registros serão retornados. A propriedade PageSize determina o número de registros a serem retornados. Se PageSize for 0, o tamanho padrão da página será 20. A propriedade Bookmark determina o índice inicial dos registros a serem retornados. Para obter mais informações, consulte a documentação do Hyperledger Fabric. As propriedades StartTime e EndTime devem ser especificadas no formato RFC-3339.
Exemplo de Valor de Retorno:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]

Métodos Go com Saídas Modificadas

Os métodos a seguir retornam a organização relevante e os IDs de usuário quando você usa a versão aprimorada do Blockchain App Builder.

GetAccountTransactionHistory
Esse método retorna um array de detalhes do histórico de transações da conta para um usuário e token especificados.
func (t *Controller) GetAccountTransactionHistory(token_id string, org_id string, user_id string) (interface{}, error) {
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistory", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}



transactionArray, err := t.Ctx.Account.GetAccountTransactionHistory(account_id, org_id, user_id)
return transactionArray, err
}
Parâmetros:
  • token_id: string – O ID do token.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
Exemplo de Valor de Retorno:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]
GetAccountTransactionHistoryWithFilters
Esse método retorna um array filtrado de detalhes do histórico de transações da conta para um usuário e token especificados.
func (t *Controller) GetAccountTransactionHistoryWithFilters(token_id string, filters ...account.AccountHistoryFilters) (interface{}, error) {
org_id, err := t.Ctx.Model.GetTransientMapKeyAsString(constants.OrgIdCC)
if err != nil {
return nil, err
}
user_id, err := t.Ctx.Model.GetTransientMapKeyAsString(constants.UserIdCC)
if err != nil {
return nil, err
}
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistoryWithFilters", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}



// sample format of filter: []string{"3", "", "2022-01-16T15:16:36+00:00", "2022-01-17T15:16:36+00:00"}
transactionArray, err := t.Ctx.Account.GetReconciledTransactionHistory(account_id, org_id, user_id, filters...)
return transactionArray, err
}
Parâmetros:
  • token_id: string – O ID do token.
  • org_id: string – O ID do prestador de serviço de associação (MSP) do usuário na organização atual.
  • user_id: string – O nome do usuário ou o ID do e-mail do usuário.
  • filters: string – Um parâmetro opcional. Se estiver vazio, todos os registros serão retornados. A propriedade PageSize determina o número de registros a serem retornados. Se PageSize for 0, o tamanho padrão da página será 20. A propriedade Bookmark determina o índice inicial dos registros a serem retornados. Para obter mais informações, consulte a documentação do Hyperledger Fabric. As propriedades StartTime e EndTime devem ser especificadas no formato RFC-3339.
Exemplo de Valor de Retorno:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]