Abar Transfer

Below you can see an example of how to perform abar transfer operation (a.k.a. abar to abar).
// An instance of the Anonymous wallet, where the `abar` would be sent from
const anonKeysSender = {
axfrPublicKey: "-Gdf_hulMdWPeC2dG3RG-Hjo8yLTdWnPfB5csEGkbmg=",
decKey: "1Js-MFSVJipTNL-y09zkSBakd15WLK-SfAUTTfsUInE=",
encKey: "bim4EWU_PnClrNiVpKen4DZ0v-RwsVLSUtZy7PXCOCc=",
// An instance of the Anonymous wallet, where the `abar` would be sent to
const anonKeysReceiver = {
axfrPublicKey: "T_0kQOWEToeg53Q8dS8eej91sJKVBEV2f7rs7Btz5CY=",
decKey: "GMzcWMbWz41hO5AEpXk1q1XYr8wpkq_zRscrxqg7TW0=",
encKey: "nGfox4UJTBHCjiUMUmyUolyOGMAmR25ktfEYOZXTJ0s=",
const abarToAbar = async () => {
// First we need to provide a commitment string for the abar which we would `transfer` to another anonymous wallet
const givenCommitmentToTransfer =
// `abar to abar` fee is paid using an abar data, so to cover the fee for the operation
// we need to provide another commitment (there might be more than one).
// It would be used solely to pay the fee for the operation amd must be in FRA
const givenCommitmentsToPayFee = [
// Just a helper varibale to keep all the commitments which belong to a sender in one place
// It would be updated with a new commitment later
const givenCommitmentsListSender = [
// Abars data, which would be used to pay the fee, is also stored in a container for convenience purposes
const additionalOwnedAbarItems = [];
// Transfer operation would require instances of abars, which will be created (restored)
// using given commitment strings
const ownedAbarsResponseOne = await TripleMasking.getOwnedAbars(
const [ownedAbarToUseAsSource] = ownedAbarsResponseOne;
for (let givenCommitmentToPayFee of givenCommitmentsToPayFee) {
const ownedAbarsResponseTwo = await TripleMasking.getOwnedAbars(
const [additionalOwnedAbarItem] = ownedAbarsResponseTwo;
// Amount of funds to be sent. For custom asset it has to match with the amount of the ownedAbarToUseAsSource abar
const amount = "3";
// Next is a key method, which returns 2 things:
// - an instance of the anonTransferOperationBuilder, which would be used to submit the generated tx to the network
// - an object with the information about the mapping for the new commitments, which contains remanined funds after paying the fee, as well as the receiver commitment inforamtion
const { anonTransferOperationBuilder, abarToAbarData } =
await TripleMasking.abarToAbar(
// Then we retrieve transaction data (to be broadcasted)
const submitData = anonTransferOperationBuilder.transaction();
// Finally, we submut the transaction to the network to finalize the `abar to bar` operation
// and, as a result we receive a transaction hash
const result = await Network.submitTransaction(submitData);
const { response: resultHandle } = result;
// Here we simply wait for 17s until next block is produced by the network
await sleep(17000);
// Now we are processing the commitments mapping returned by the `abar to abar` operation
// to update a `givenCommitmentsListSender` list of commitments with the commitments which belong to the sender
// and vice versa for the receiver.
// It is very important to preserve this data and have it properly processed, otherwise both receiver and sender
// will lose their funds
const { commitmentsMap } = abarToAbarData;
const retrivedRandomizersListReceiver = [];
for (const commitmentsMapEntry of commitmentsMap) {
const { commitmentKey, commitmentAxfrPublicKey } = commitmentsMapEntry;
if (commitmentAxfrPublicKey === anonKeysSender.axfrPublicKey) {
if (commitmentAxfrPublicKey === anonKeysReceiver.axfrPublicKey) {