Sending Transactions

This page goes over how to build an inbound MAYAChain transaction for each chain type.

Confirm you have:

You are ready to make the transaction and swap via MAYAChain.

UTXO Chains

Memo limited to 80 bytes on BTC. Use abbreviated options and MAYANames where possible.

EVM Chains

depositWithExpiry(vault, asset, amount, memo, expiry)

ETH is 0x0000000000000000000000000000000000000000

COSMOS Chains

MAYAChain

To initiate a $CACAO-> $ASSET swap a MsgDeposit must be broadcasted to the MAYAChain blockchain. The MsgDeposit does not have a destination address, and has the following properties. The full definition can be found here.

MsgDeposit{
    Coins:  coins,
    Memo:   memo,
    Signer: signer,
}

If you are using Javascript, CosmJS is the recommended package to build and broadcast custom message types. Here is a walkthrough.

Code Examples (Javascript)

  1. Generate codec files. To build/broadcast native transactions in Javascript/Typescript, the protobuf files need to be generated into js types. The below script uses pbjs and pbts to generate the types using the relevant files from the MAYANode repo. Alternatively, the .js and .d.ts files can be downloaded directly from the XChainJS repo.

#!/bin/bash

# this script checks out mayanode master and generates the proto3 typescript buindings for MsgDeposit and MsgSend

MSG_COMPILED_OUTPUTFILE=src/types/proto/MsgCompiled.js
MSG_COMPILED_TYPES_OUTPUTFILE=src/types/proto/MsgCompiled.d.ts


TMP_DIR=$(mktemp -d)

tput setaf 2; echo "Checking out https://gitlab.com/mayachain/thornode  to $TMP_DIR";tput sgr0
(cd $TMP_DIR && git clone https://gitlab.com/mayachain/mayanode)

# Generate msgs
tput setaf 2; echo "Generating $MSG_COMPILED_OUTPUTFILE";tput sgr0
yarn run pbjs -w commonjs  -t static-module $TMP_DIR/mayanode/proto/mayachain/v1/common/common.proto $TMP_DIR/mayanode/proto/mayachain/v1/x/mayachain/types/msg_deposit.proto $TMP_DIR/mayanode/proto/mayachain/v1/x/mayachain/types/msg_send.proto $TMP_DIR/mayanode/third_party/proto/cosmos/base/v1beta1/coin.proto -o $MSG_COMPILED_OUTPUTFILE

tput setaf 2; echo "Generating $MSG_COMPILED_TYPES_OUTPUTFILE";tput sgr0
yarn run pbts  $MSG_COMPILED_OUTPUTFILE -o $MSG_COMPILED_TYPES_OUTPUTFILE

tput setaf 2; echo "Removing $TMP_DIR/mayanode";tput sgr0
rm -rf $TMP_DIR
  1. Using @cosmjs build/broadcast the TX.

const { DirectSecp256k1HdWallet, Registry } = require("@cosmjs/proto-signing");
const { defaultRegistryTypes: defaultStargateTypes, SigningStargateClient } = require("@cosmjs/stargate");
const { stringToPath } = require("@cosmjs/crypto");
const bech32 = require("bech32-buffer");

const { MsgDeposit } = require('./types/MsgCompiled').types

async function main() {
  const myRegistry = new Registry(defaultStargateTypes);
  myRegistry.register("/types.MsgDeposit", MsgDeposit); 

  const signerMnemonic = "mnemonic here"
  const signerAddr = "thor1..."

  const signer = await DirectSecp256k1HdWallet.fromMnemonic(
    signerMnemonic,
    { 
      prefix: "maya", // MAYAChain prefix
      hdPaths: [ stringToPath("m/44'/931'/0'/0/0")] // MAYAChain HD Path
    },
  );

  const client = await SigningStargateClient.connectWithSigner(
    "https://tendermint.mayachain.info/",
    signer,
    { registry: myRegistry },
  );

  const memo = `=:DASH/DASH:${signerAddr}` // MAYAChain memo

  const msg = {
    coins: [
      {
        asset: {
          chain: "THOR",
          symbol: "RUNE",
          ticker: "RUNE"
        },
        amount: "10000000000" // Value in 1e10 (10000000000 = 1 CACAO)
      }
    ],
    memo: memo,
    signer: bech32.decode(signerAddr).data,
  }

  const depositMsg = {
    typeUrl: "/types.MsgDeposit",
    value: MsgDeposit.fromObject(msg),
  };

  const fee = {
    amount: [],
    gas: "50000000", // Set arbitrarily high gas limit; this is not actually deducted from user account. 
  };

  const response = await client.signAndBroadcast(signerAddr, [depositMsg], fee, memo);
  console.log('response: ', response)

  if (response.code !== 0) {
    console.log('Error: ', response.rawLog)
  } else {
    console.log('Success!')
  }
}

main()

Last updated

Was this helpful?