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
MAYAChain does NOT currently support BTC Taproot. User funds will be lost if sent to or from a taproot address!
Inbound transactions should not be delayed for any reason else there is risk funds will be sent to an unreachable address. Use standard transactions, check the Inbound_Address
before sending and use the recommended gas rate
to ensure transactions are confirmed in the next block to the latest Inbound_Address
.
Do not use HD wallets that forward the change to a new address, because MAYAChain IDs the user as the address in VIN0. The user must keep their VIN0 address funded for refunds.
Override randomised VOUT ordering; MAYAChain requires specific output ordering.
EVM Chains
depositWithExpiry(vault, asset, amount, memo, expiry)
ETH is sent and received as an internal transaction. Your wallet may not be set to read internal balances and transactions
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.
MsgDeposit
must also be broadcasted when swapping from Synths.
Code Examples (Javascript)
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
andpbts
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
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?