Améliorations apportées à Token Taxonomy Framework

La version améliorée de Blockchain App Builder inclut de nouvelles fonctionnalités liées à la norme étendue Token Taxonomy Framework.

Limites de transaction quotidiennes

Vous pouvez limiter le nombre de transactions qu'un compte peut effectuer quotidiennement, ainsi que le nombre de jetons pouvant faire l'objet d'une action. Les paramètres d'entrée max_daily_amount et max_daily_transactions de la méthode createAccount contrôlent ce comportement. Ces paramètres sont facultatifs.

Vous pouvez obtenir un débit plus élevé si vous ne définissez pas les limites de transactions quotidiennes pour un compte.

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);
}
Paramètres supplémentaires :
  • daily_limits: JSON – Objet spécifiant la quantité maximale de jetons pouvant être utilisés dans les transactions quotidiennes (max_daily_amount) et le nombre maximal de transactions pouvant être effectuées quotidiennement (max_daily_transactions), comme indiqué dans l'exemple suivant.
    {
         "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...)
}
Paramètres supplémentaires :
  • daily_limits: JSON : objet JSON qui inclut un paramètre MaxDailyAmount (la quantité maximale de jetons pouvant être utilisés dans les transactions quotidiennes) et un paramètre MaxDailyTransactions (le nombre maximal de transactions pouvant être effectuées quotidiennement), comme indiqué dans l'exemple suivant.
    {
         "MaxDailyAmount": 100000
         "MaxDailyTransactions": 10000
     }
Renvoie :
  • En cas de succès, objet JSON du compte créé. Le paramètre BapAccountVersion est défini dans l'objet de compte pour une utilisation interne.
Exemple de valeur renvoyée :
{ 
   "AssetType":"oaccount",
   "AccountId":"oaccount~a73085a385bc96c4a45aa2dff032e7dede82c0664dee5f396b7c5854eeafd4bd",
   "BapAccountVersion": 0,
   "UserId":"user1",
   "OrgId":"Org1MSP",
   "AccountType":"fungible",
   "TokenId":"",
   "TokenName":"",
   "Balance":0,
   "BalanceOnHold":0
}

Exigences d'approbation pour la menthe et l'utilisation

Vous pouvez configurer des approbations pour l'extraction et la gravure de jetons, de sorte que les utilisateurs dotés du rôle d'extraction ou de brûleur doivent soumettre une demande à un approbateur, au lieu d'extraire ou de brûler des jetons directement. Les approbateurs peuvent accepter ou rejeter les demandes de mise à jour ou de gravure de jetons. Afin d'activer les approbations pour l'extraction et la gravure, utilisez les paramètres mint_approval_required et burn_approval_required. Vous devez ensuite également indiquer des valeurs pour mint_approver_role_name et burn_approval_role_name, comme indiqué dans l'exemple suivant.

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
Les méthodes suivantes prennent en charge la demande, l'acceptation et le rejet des approbations de jetons de menthe et de brûlage.

TypeScript Méthodes d'approbation de la menthe et de l'utilisation

requestMint
Cette méthode peut être appelée par un minter pour envoyer une demande au notaire minter afin de créer une quantité spécifiée de jetons.
@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);

}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
  • notary_org_id: string – ID du fournisseur de services d'adhésion (MSP) du notaire mineur qui traitera la demande.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire mineur qui traitera la demande.
  • quantity: number – La quantité de jetons à la menthe.
  • time_to_expiration : délai après lequel la demande de frappe expire et n'est plus valide.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveMint
Cette méthode peut être appelée par un notaire mineur pour approuver une demande de frappe.
@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);
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
Exemple de valeur renvoyée :
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectMint
Cette méthode peut être appelée par un notaire mineur pour rejeter une demande de frappe.
@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);
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
Exemple de valeur renvoyée :
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
requestBurn
Cette méthode peut être appelée par un brûleur pour envoyer une demande au notaire du brûleur de détruire une quantité spécifiée de jetons.
@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);
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
  • notary_org_id: string – ID du fournisseur de services d'adhésion (MSP) du notaire du brûleur qui traitera la demande.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire du brûleur qui traitera la demande.
  • quantity: number : quantité de jetons à brûler.
  • time_to_expiration : délai après lequel la demande de gravure expire et n'est plus valide.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveBurn
Cette méthode peut être appelée par un notaire de brûleur pour approuver une demande de gravure.
@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);
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
Exemple de valeur renvoyée :
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectBurn
Cette méthode peut être appelée par un notaire de brûleur pour rejeter une demande de gravure.
@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);
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
Exemple de valeur renvoyée :
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Méthodes Go pour l'approbation de menthe et d'utilisation

RequestMint
Cette méthode peut être appelée par un minter pour envoyer une demande au notaire minter afin de créer une quantité spécifiée de jetons.
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...)
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
  • notary_org_id: string – ID du fournisseur de services d'adhésion (MSP) du notaire mineur qui traitera la demande.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire mineur qui traitera la demande.
  • quantity: number – La quantité de jetons à la menthe.
  • TimeToExpiration : délai après lequel la demande de frappe expire et n'est plus valide.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "Category" : "category input",
         "Description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveMint
Cette méthode peut être appelée par un notaire mineur pour approuver une demande de frappe.
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())
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
Exemple de valeur renvoyée :
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectMint
Cette méthode peut être appelée par un notaire mineur pour rejeter une demande de frappe.
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())
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • operation_id: string : ID d'opération unique qui représente la demande menthe.
Exemple de valeur renvoyée :
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
RequestBurn
Cette méthode peut être appelée par un brûleur pour envoyer une demande au notaire du brûleur de détruire une quantité spécifiée de jetons.
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...)
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
  • notary_org_id: string – ID du fournisseur de services d'adhésion (MSP) du notaire du brûleur qui traitera la demande.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire du brûleur qui traitera la demande.
  • quantity: number : quantité de jetons à brûler.
  • time_to_expiration : délai après lequel la demande de gravure expire et n'est plus valide.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveBurn
Cette méthode peut être appelée par un notaire de brûleur pour approuver une demande de gravure.
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())
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
Exemple de valeur renvoyée :
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectBurn
Cette méthode peut être appelée par un notaire de brûleur pour rejeter une demande de gravure.
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())
}
Paramètres :
  • token_id: string : ID du jeton à graver.
  • operation_id: string : ID d'opération unique qui représente la demande de gravure.
Exemple de valeur renvoyée :
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Extraction de l'historique des transactions à partir de la base de données Rich History

Vous pouvez synchroniser les données avec la base de données d'historique enrichi, puis les extraire à l'aide des appels d'API de code chaîne. La méthode suivante, présentée dans TypeScript et dans Go, extrait l'historique des transactions de la base de données d'historique enrichi. Pour pouvoir utiliser ces méthodes, vous devez exécuter Oracle Autonomous Database avec Oracle REST Data Services (ORDS) et OAuth activés, comme décrit dans Définitions de vue Oracle Database pour 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);
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
  • custom_endpoint : adresse de service RESTful de la base de données d'historique enrichi.
  • bearer_token : jeton d'autorisation d'accès pour l'adresse de service RESTful.
  • filters: string : paramètre facultatif. Si ce champ est vide, tous les enregistrements sont renvoyés. La propriété PageSize détermine le nombre d'enregistrements à renvoyer. Si PageSize est égal à 0, la taille de page par défaut est de 20. La propriété Bookmark détermine l'index de début des enregistrements à renvoyer. Pour plus d'informations, reportez-vous à la documentation Hyperledger Fabric. Les propriétés StartTime et EndTime doivent être spécifiées au format 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
}
Paramètres :
  • token_id: string : ID du jeton à frapper.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
  • custom_endpoint : adresse de service RESTful de la base de données d'historique enrichi.
  • bearer_token : jeton d'autorisation d'accès pour l'adresse de service RESTful.
  • filters: string : paramètre facultatif. Si ce champ est vide, tous les enregistrements sont renvoyés. La propriété PageSize détermine le nombre d'enregistrements à renvoyer. Si PageSize est égal à 0, la taille de page par défaut est de 20. La propriété Bookmark détermine l'index de début des enregistrements à renvoyer. Pour plus d'informations, reportez-vous à la documentation Hyperledger Fabric. Les propriétés StartTime et EndTime doivent être spécifiées au format RFC-3339.

Attributs de catégorie et de description dans les objets de transaction

  • Les attributs de catégorie et de description doivent être inclus dans les méthodes transferTokens, holdTokens, issueTokens, requestMint, requestBurn, burnTokens et rejectBurn dans le fichier de contrôleur. Les méthodes SDK correspondantes doivent également inclure des attributs de catégorie et de description.
  • L'entrée d'attribut de catégorie et de description se présente sous la forme d'un objet JSON nommé info_details, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
  • Le champ info_details est facultatif. Vous ne pouvez transmettre qu'une catégorie ou une description si nécessaire.
  • Les méthodes GET associées à des transactions pour transferTokens, holdTokens, executeHold, releaseHold, requestMint, approveMint, rejectMint, requestBurn, approveBurn et rejectBurn doivent inclure des attributs de catégorie et de description dans la réponse de charge utile s'ils sont présents.
  • Le champ de catégorie est limité à 20 caractères et le champ de description est limité à 250 caractères.

Méthodes TypeScript avec entrées modifiées

Les méthodes suivantes prennent en charge les attributs facultatifs de catégorie et de description lorsque vous utilisez la version améliorée de Blockchain App Builder.

transferTokens
Cette méthode transfère les jetons de l'appelant vers un compte spécifié.
@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);
}
Paramètres :
  • token_id: string : ID du jeton.
  • to_org_id: string – ID du fournisseur de services d'adhésion du bénéficiaire (bénéficiaire) dans l'organisation actuelle.
  • to_user_id: string : nom d'utilisateur ou ID courriel du destinataire.
  • quantity: number : nombre de jetons à transférer.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
 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
Cette méthode crée un blocage pour le compte du propriétaire des jetons avec le compte 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);
  }
Paramètres :
  • token_id: string : ID du jeton.
  • operation_id: string : ID unique permettant d'identifier l'opération de blocage. Cet ID est généralement transmis par l'application client.
  • to_org_id: string : ID du fournisseur de services d'adhésion du destinataire dans l'organisation actuelle.
  • to_user_id: string : nom d'utilisateur ou ID courriel du destinataire.
  • notary_org_id: string : ID du fournisseur de services d'adhésion du notaire dans l'organisation actuelle.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire.
  • quantity: number : nombre de jetons à mettre en attente.
  • time_to_expiration : heure à laquelle la mise en attente expire. Spécifiez 0 pour un blocage permanent. Sinon, utilisez le format RFC-3339. Par exemple, 2021-06-02T12 :46 :06Z.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
issueTokens
Cette méthode extrait des jetons, qui appartiennent ensuite à l'appelant de la méthode.
@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);
}
Paramètres :
  • token_id: string : ID du jeton.
  • quantity : nombre de jetons à menthe.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
burnTokens
Cette méthode désactive ou brûle les jetons du compte de l'appelant de la transaction.
@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);
}
Paramètres :
  • token_id: string : ID du jeton.
  • quantity : nombre de jetons à brûler.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

Méthodes Go avec entrées modifiées

Les méthodes suivantes prennent en charge les attributs facultatifs de catégorie et de description lorsque vous utilisez la version améliorée de Blockchain App Builder.

TransferTokens
Cette méthode transfère les jetons de l'appelant vers un compte spécifié.
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...)
}
Paramètres :
  • token_id: string : ID du jeton.
  • to_org_id: string – ID du fournisseur de services d'adhésion du bénéficiaire (bénéficiaire) dans l'organisation actuelle.
  • to_user_id: string : nom d'utilisateur ou ID courriel du destinataire.
  • quantity: number : nombre de jetons à transférer.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
 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
Cette méthode crée un blocage pour le compte du propriétaire des jetons avec le compte 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...)
}
Paramètres :
  • token_id: string : ID du jeton.
  • operation_id: string : ID unique permettant d'identifier l'opération de blocage. Cet ID est généralement transmis par l'application client.
  • to_org_id: string : ID du fournisseur de services d'adhésion du destinataire dans l'organisation actuelle.
  • to_user_id: string : nom d'utilisateur ou ID courriel du destinataire.
  • notary_org_id: string : ID du fournisseur de services d'adhésion du notaire dans l'organisation actuelle.
  • notary_user_id: string : nom d'utilisateur ou ID courriel du notaire.
  • quantity: number : nombre de jetons à mettre en attente.
  • time_to_expiration : heure à laquelle la mise en attente expire. Spécifiez 0 pour un blocage permanent. Sinon, utilisez le format RFC-3339. Par exemple, 2021-06-02T12 :46 :06Z.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
IssueTokens
Cette méthode extrait des jetons, qui appartiennent ensuite à l'appelant de la méthode.
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...)
}
Paramètres :
  • token_id: string : ID du jeton.
  • quantity : nombre de jetons à menthe.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
BurnTokens
Cette méthode désactive ou brûle les jetons du compte de l'appelant de la transaction.
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...)
}
Paramètres :
  • token_id: string : ID du jeton.
  • quantity : nombre de jetons à brûler.
  • info_details: JSON : objet indiquant la catégorie (category) et la description (description) de la demande, comme indiqué dans l'exemple suivant.
    {
         "category" : "category input",
         "description" : "description input"
    }
Exemple de valeur renvoyée :
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

TypeScript Méthodes avec sorties modifiées

Les méthodes suivantes renvoient les ID d'organisation et d'utilisateur pertinents lorsque vous utilisez la version améliorée de Blockchain App Builder.

getAccountTransactionHistory
Cette méthode renvoie un tableau des détails de l'historique des transactions de compte pour un utilisateur et un jeton spécifiés.
@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());
}
Paramètres :
  • token_id: string : ID du jeton.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
Exemple de valeur renvoyée :
[
            {
                "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
Cette méthode renvoie un tableau filtré des détails de l'historique des transactions de compte pour un utilisateur et un jeton spécifiés.
@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);
}
Paramètres :
  • token_id: string : ID du jeton.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
  • filters: string : paramètre facultatif. Si ce champ est vide, tous les enregistrements sont renvoyés. La propriété PageSize détermine le nombre d'enregistrements à renvoyer. Si PageSize est égal à 0, la taille de page par défaut est de 20. La propriété Bookmark détermine l'index de début des enregistrements à renvoyer. Pour plus d'informations, reportez-vous à la documentation Hyperledger Fabric. Les propriétés StartTime et EndTime doivent être spécifiées au format RFC-3339.
Exemple de valeur renvoyée :
[
            {
                "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éthodes Go avec sorties modifiées

Les méthodes suivantes renvoient les ID d'organisation et d'utilisateur pertinents lorsque vous utilisez la version améliorée de Blockchain App Builder.

GetAccountTransactionHistory
Cette méthode renvoie un tableau des détails de l'historique des transactions de compte pour un utilisateur et un jeton spécifiés.
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
}
Paramètres :
  • token_id: string : ID du jeton.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
Exemple de valeur renvoyée :
[
            {
                "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
Cette méthode renvoie un tableau filtré des détails de l'historique des transactions de compte pour un utilisateur et un jeton spécifiés.
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
}
Paramètres :
  • token_id: string : ID du jeton.
  • org_id: string : ID du fournisseur de services d'adhésion de l'utilisateur dans l'organisation actuelle.
  • user_id: string : nom d'utilisateur ou ID de courriel de l'utilisateur.
  • filters: string : paramètre facultatif. Si ce champ est vide, tous les enregistrements sont renvoyés. La propriété PageSize détermine le nombre d'enregistrements à renvoyer. Si PageSize est égal à 0, la taille de page par défaut est de 20. La propriété Bookmark détermine l'index de début des enregistrements à renvoyer. Pour plus d'informations, reportez-vous à la documentation Hyperledger Fabric. Les propriétés StartTime et EndTime doivent être spécifiées au format RFC-3339.
Exemple de valeur renvoyée :
[
            {
                "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"
            }
 ]