Cryptocurrency bridging

I would think that you only use that bridge for sending transactions, in case that the bridge already exists as a set of smart contracts.

I’m getting a cloud function error on my server https://5mvwcjt1udmr.usemoralis.com:2053/server. Any way someone can see what’s going on for my cross chain bridge

Can you please make another post with more details - what the error is, what your cloud function is.

> const logger = Moralis.Cloud.getLogger();
> 
> const web3Main = https://speedy-nodes-nyc.moralis.io/602c31f2fce703bb491b08fb/bsc/mainnet
> const web3Side = https://speedy-nodes-nyc.moralis.io/602c31f2fce703bb491b08fb/eth/mainnet
> 
> const MainBridge_address = "";0xd70697B620437Db03c2b0DBE4A1404b8e36bE810n
> const SideBridge_address = "";0x49e7759526092a14016De004a5b3DcEdD912de6Bn
> const mainToken_address = "";0xa701EC6B9C1883fcF727FED7e41FE925A1b1E91Cn
> const childToken_address = "";0xB0b3cF80cAEDdec50f5b803B59B89e4bC4C889FAn
> const gateway_address = "";0x8F1a70DDeb36b715bA8A20b7Dcb021324a821623n
> const gatewayKey = "";646369f30f442aaecfddd2e32410b17ec01cde9888da69df9fb5776a7108e86a
> const MainBridge_abi = '[{"inputs": [{"internalType": "address", "name": "_mainToken", "type": "address"}, {"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensLocked", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensUnlocked", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "lockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "unlockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
> const SideBridge_abi = '[{"inputs": [{"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "BridgeInitialized", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensBridged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensReturned", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "bridgeTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_childTokenAddress", "type": "address"}], "name": "initializeBridge", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "returnTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
> const MainBridge = new web3Main.eth.Contract(JSON.parse(MainBridge_abi),MainBridge_address);
> const SideBridge = new web3Side.eth.Contract(JSON.parse(SideBridge_abi),SideBridge_address);
> 
> Moralis.Cloud.afterSave("EthTokenTransfers", (request) => {
>     const data = JSON.parse(JSON.stringify(request.object, ["token_address", "to_address", "from_address","transaction_hash","value", "confirmed"]));
>     logger.info(data);
>     if (data["token_address"] == mainToken_address.toLocaleLowerCase() && data["to_address"] == MainBridge_address.toLocaleLowerCase() && !data["confirmed"]) {
>         const txlock = processBridgeRequestLock(data);
>         const txbridge = processBridgeRequestBridge(data);
>     }
>     else{
>         logger.info("transaction not related to bridge");
>     }
>     async function processBridgeRequestLock(data) {
>         logger.info("bridging starting locking tokens");
>         const functionCall = MainBridge.methods.lockTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
>         const gatewayNonce = web3Main.eth.getTransactionCount(gateway_address);
>         const transactionBody = {
>             to: MainBridge_address,
>             nonce:gatewayNonce,
>             data:functionCall,
>             gas:400000,
>             gasPrice:web3Main.utils.toWei("2", "gwei")
>         }
>         signedTransaction = await web3Main.eth.accounts.signTransaction(transactionBody,gatewayKey);
>         logger.info(signedTransaction.transactionHash);
>         fulfillTx = await web3Main.eth.sendSignedTransaction(signedTransaction.rawTransaction);
>         logger.info("fulfillTx: " + JSON.stringify(fulfillTx));
>     }
>     async function processBridgeRequestBridge(data) {
>         logger.info("bridging tokens");
>         const functionCall = SideBridge.methods.bridgeTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
>         const gatewayNonce = web3Side.eth.getTransactionCount(gateway_address);
>         const transactionBody = {
>             to: SideBridge_address,
>               nonce:gatewayNonce,
>               data:functionCall,
>               gas:400000,
>               gasPrice:web3Side.utils.toWei("2", "gwei")
>         }
>         signedTransaction = await web3Side.eth.accounts.signTransaction(transactionBody,gatewayKey);
>         logger.info(signedTransaction.transactionHash);`Preformatted text`

And I get error this error

2022-05-29T22:43:12.432Z - SyntaxError: Unexpected identifier
at customUserPlugin (/moralis-server/cloud/main.js:157:26)
at /moralis-server/lib/cloud-code/plugins/index.js:144:15
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async Object.initialize (/moralis-server/lib/cloud-code/plugins/index.js:133:3)

First of all, your addresses and speedy nodes need to be inside the strings. E.g.

const web3Main = "https://speedy-nodes-nyc.moralis.io/602c31f2fce703bb491b08fb/bsc/mainnet";
...
const MainBridge_address = "0xd70697B620437Db03c2b0DBE4A1404b8e36bE810n";
...

Also your MainBridge and SideBridge won’t work, you’re trying to call web3.js methods on strings.

Make sure you’re following your tutorial properly and check that your code matches.

Ok got those fixed no only error I get is undefined is all it says

What have you done so far now and what is the tutorial you’re using?

https://youtu.be/UkWj7rwOGGc Is the tutorial

You can view all of the final code here to compare with your own.

Yes I got the code there my man fixed the address (); with this

const logger = Moralis.Cloud.getLogger();

const web3Main = Moralis.web3ByChain("0x4"); // Rinkeby Testnet
const web3Side = Moralis.web3ByChain("0x13881"); // Mumbai Testnet

const MainBridge_address = "0xd70697B620437Db03c2b0DBE4A1404b8e36bE810";
const SideBridge_address = "0x49e7759526092a14016De004a5b3DcEdD912de6B";
const mainToken_address = "0xa701EC6B9C1883fcF727FED7e41FE925A1b1E91C";
const childToken_address = "0xB0b3cF80cAEDdec50f5b803B59B89e4bC4C889FA";
const gateway_address = "0x8F1a70DDeb36b715bA8A20b7Dcb021324a821623";
const gatewayKey = "646369f30f442aaecfddd2e32410b17ec01cde9888da69df9fb5776a7108e86a";
const MainBridge_abi = '[{"inputs": [{"internalType": "address", "name": "_mainToken", "type": "address"}, {"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensLocked", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensUnlocked", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "lockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "unlockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
const SideBridge_abi = '[{"inputs": [{"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "BridgeInitialized", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensBridged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensReturned", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "bridgeTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_childTokenAddress", "type": "address"}], "name": "initializeBridge", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "returnTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
const MainBridge = new web3Main.eth.Contract(JSON.parse(MainBridge_abi),MainBridge_address);
const SideBridge = new web3Side.eth.Contract(JSON.parse(SideBridge_abi),SideBridge_address);

Moralis.Cloud.afterSave("EthTokenTransfers", (request) => {
    const data = JSON.parse(JSON.stringify(request.object, ["token_address", "to_address", "from_address","transaction_hash","value", "confirmed"]));
    logger.info(data);
    if (data["token_address"] == mainToken_address.toLocaleLowerCase() && data["to_address"] == MainBridge_address.toLocaleLowerCase() && !data["confirmed"]) {
        const txlock = processBridgeRequestLock(data);
        const txbridge = processBridgeRequestBridge(data);
    }
    else{
        logger.info("transaction not related to bridge");
    }
    async function processBridgeRequestLock(data) {
        logger.info("bridging starting locking tokens");
        const functionCall = MainBridge.methods.lockTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
        const gatewayNonce = web3Main.eth.getTransactionCount(gateway_address);
        const transactionBody = {
            to: MainBridge_address,
            nonce:gatewayNonce,
            data:functionCall,
            gas:400000,
            gasPrice:web3Main.utils.toWei("2", "gwei")
        }
        signedTransaction = await web3Main.eth.accounts.signTransaction(transactionBody,gatewayKey);
        logger.info(signedTransaction.transactionHash);
        fulfillTx = await web3Main.eth.sendSignedTransaction(signedTransaction.rawTransaction);
        logger.info("fulfillTx: " + JSON.stringify(fulfillTx));
    }
    async function processBridgeRequestBridge(data) {
        logger.info("bridging tokens");
        const functionCall = SideBridge.methods.bridgeTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
        const gatewayNonce = web3Side.eth.getTransactionCount(gateway_address);
        const transactionBody = {
            to: SideBridge_address,
              nonce:gatewayNonce,
              data:functionCall,
              gas:400000,
              gasPrice:web3Side.utils.toWei("2", "gwei")
        }
        signedTransaction = await web3Side.eth.accounts.signTransaction(transactionBody,gatewayKey);
        logger.info(signedTransaction.transactionHash);
        fulfillTx = await web3Side.eth.sendSignedTransaction(signedTransaction.rawTransaction);
        logger.info("fulfillTx: " + JSON.stringify(fulfillTx))
        return fulfillTx;
    }
});


Moralis.Cloud.afterSave("PolygonTokenTransfers", (request) => {
    const data = JSON.parse(JSON.stringify(request.object, ["token_address", "to_address", "from_address","transaction_hash","value", "confirmed"]));
    logger.info(data);
    if (data["token_address"] == childToken_address.toLocaleLowerCase() && data["to_address"] == SideBridge_address.toLocaleLowerCase() && !data["confirmed"]) {
        const txlock = processReturnBurn(data);
        const txbridge = processReturnUnlock(data);
    }
    else{
        logger.info("transaction not related to bridge");
    }
    async function processReturnBurn(data) {
        logger.info("returning tokens burning");
        const functionCall = SideBridge.methods.returnTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
        const gatewayNonce = web3Side.eth.getTransactionCount(gateway_address);
        const transactionBody = {
            to: SideBridge_address,
              nonce:gatewayNonce,
              data:functionCall,
              gas:400000,
              gasPrice:web3Side.utils.toWei("2", "gwei")
        }
        signedTransaction = await web3Side.eth.accounts.signTransaction(transactionBody,gatewayKey);
        logger.info(signedTransaction.transactionHash);
        fulfillTx = await web3Side.eth.sendSignedTransaction(signedTransaction.rawTransaction);
        logger.info("fulfillTx: " + JSON.stringify(fulfillTx))
        return fulfillTx;
    }
    async function processReturnUnlock(data) {
        logger.info("returning starting unlocking tokens");
        const functionCall = MainBridge.methods.unlockTokens(data["from_address"],data["value"],data["transaction_hash"]).encodeABI();
        const gatewayNonce = web3Main.eth.getTransactionCount(gateway_address);
        const transactionBody = {
            to: MainBridge_address,
              nonce:gatewayNonce,
              data:functionCall,
              gas:400000,
              gasPrice:web3Main.utils.toWei("2", "gwei")
        }
        signedTransaction = await web3Main.eth.accounts.signTransaction(transactionBody,gatewayKey);
        logger.info(signedTransaction.transactionHash);
        fulfillTx = await web3Main.eth.sendSignedTransaction(signedTransaction.rawTransaction);
        logger.info("fulfillTx: " + JSON.stringify(fulfillTx));
    }
});

God makes it look so easy in the video dang only get this error now

  1. 2022-05-30T00:07:51.192Z - undefined
  2. 2022-05-30T00:07:51.191Z - CLOUD FUNCTION ERROR PLEASE CHECK YOUR CLOUD FUNCTION CODE

Is everything in a cloud function?

Moralis.Cloud.define('bridge', async (request) => {

...

});

Yes I copied it into cloud functions

You are still getting “CLOUD FUNCTION ERROR”? This is fine, whether it actually works once you call the cloud function is a different issue:

Moralis.Cloud.define('bridge', async (request) => {
  const logger = Moralis.Cloud.getLogger();

  const web3Main = Moralis.web3ByChain('0x4'); // Rinkeby Testnet
  const web3Side = Moralis.web3ByChain('0x13881'); // Mumbai Testnet

  const MainBridge_address = '0xd70697B620437Db03c2b0DBE4A1404b8e36bE810';
  const SideBridge_address = '0x49e7759526092a14016De004a5b3DcEdD912de6B';
  const mainToken_address = '0xa701EC6B9C1883fcF727FED7e41FE925A1b1E91C';
  const childToken_address = '0xB0b3cF80cAEDdec50f5b803B59B89e4bC4C889FA';
  const gateway_address = '0x8F1a70DDeb36b715bA8A20b7Dcb021324a821623';
  const gatewayKey =
    '646369f30f442aaecfddd2e32410b17ec01cde9888da69df9fb5776a7108e86a';
  const MainBridge_abi =
    '[{"inputs": [{"internalType": "address", "name": "_mainToken", "type": "address"}, {"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensLocked", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensUnlocked", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "lockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "unlockTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
  const SideBridge_abi =
    '[{"inputs": [{"internalType": "address", "name": "_gateway", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor", "name": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "BridgeInitialized", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "mainDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensBridged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "requester", "type": "address"}, {"indexed": true, "internalType": "bytes32", "name": "sideDepositHash", "type": "bytes32"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256"}], "name": "TokensReturned", "type": "event"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_mainDepositHash", "type": "bytes32"}], "name": "bridgeTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_childTokenAddress", "type": "address"}], "name": "initializeBridge", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "_requester", "type": "address"}, {"internalType": "uint256", "name": "_bridgedAmount", "type": "uint256"}, {"internalType": "bytes32", "name": "_sideDepositHash", "type": "bytes32"}], "name": "returnTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]';
  const MainBridge = new web3Main.eth.Contract(
    JSON.parse(MainBridge_abi),
    MainBridge_address
  );
  const SideBridge = new web3Side.eth.Contract(
    JSON.parse(SideBridge_abi),
    SideBridge_address
  );

  Moralis.Cloud.afterSave('EthTokenTransfers', (request) => {
    const data = JSON.parse(
      JSON.stringify(request.object, [
        'token_address',
        'to_address',
        'from_address',
        'transaction_hash',
        'value',
        'confirmed',
      ])
    );
    logger.info(data);
    if (
      data['token_address'] == mainToken_address.toLocaleLowerCase() &&
      data['to_address'] == MainBridge_address.toLocaleLowerCase() &&
      !data['confirmed']
    ) {
      const txlock = processBridgeRequestLock(data);
      const txbridge = processBridgeRequestBridge(data);
    } else {
      logger.info('transaction not related to bridge ');
    }
    async function processBridgeRequestLock(data) {
      logger.info('bridging starting locking tokens');
      const functionCall = MainBridge.methods
        .lockTokens(
          data['from_address'],
          data['value'],
          data['transaction_hash']
        )
        .encodeABI();
      const gatewayNonce = web3Main.eth.getTransactionCount(gateway_address);
      const transactionBody = {
        to: MainBridge_address,
        nonce: gatewayNonce,
        data: functionCall,
        gas: 400000,
        gasPrice: web3Main.utils.toWei('2', 'gwei'),
      };
      signedTransaction = await web3Main.eth.accounts.signTransaction(
        transactionBody,
        gatewayKey
      );
      logger.info(signedTransaction.transactionHash);
      fulfillTx = await web3Main.eth.sendSignedTransaction(
        signedTransaction.rawTransaction
      );
      logger.info('fulfillTx: ' + JSON.stringify(fulfillTx));
    }
    async function processBridgeRequestBridge(data) {
      logger.info('bridging tokens');
      const functionCall = SideBridge.methods
        .bridgeTokens(
          data['from_address'],
          data['value'],
          data['transaction_hash']
        )
        .encodeABI();
      const gatewayNonce = web3Side.eth.getTransactionCount(gateway_address);
      const transactionBody = {
        to: SideBridge_address,
        nonce: gatewayNonce,
        data: functionCall,
        gas: 400000,
        gasPrice: web3Side.utils.toWei('2', 'gwei'),
      };
      signedTransaction = await web3Side.eth.accounts.signTransaction(
        transactionBody,
        gatewayKey
      );
      logger.info(signedTransaction.transactionHash);
      fulfillTx = await web3Side.eth.sendSignedTransaction(
        signedTransaction.rawTransaction
      );
      logger.info('fulfillTx: ' + JSON.stringify(fulfillTx));
      return fulfillTx;
    }
  });

  Moralis.Cloud.afterSave('PolygonTokenTransfers', (request) => {
    const data = JSON.parse(
      JSON.stringify(request.object, [
        'token_address',
        'to_address',
        'from_address',
        'transaction_hash',
        'value',
        'confirmed',
      ])
    );
    logger.info(data);
    if (
      data['token_address'] == childToken_address.toLocaleLowerCase() &&
      data['to_address'] == SideBridge_address.toLocaleLowerCase() &&
      !data['confirmed']
    ) {
      const txlock = processReturnBurn(data);
      const txbridge = processReturnUnlock(data);
    } else {
      logger.info('transaction not related to bridge');
    }
    async function processReturnBurn(data) {
      logger.info('returning tokens burning');
      const functionCall = SideBridge.methods
        .returnTokens(
          data['from_address'],
          data['value'],
          data['transaction_hash']
        )
        .encodeABI();
      const gatewayNonce = web3Side.eth.getTransactionCount(gateway_address);
      const transactionBody = {
        to: SideBridge_address,
        nonce: gatewayNonce,
        data: functionCall,
        gas: 400000,
        gasPrice: web3Side.utils.toWei('2', 'gwei'),
      };
      signedTransaction = await web3Side.eth.accounts.signTransaction(
        transactionBody,
        gatewayKey
      );
      logger.info(signedTransaction.transactionHash);
      fulfillTx = await web3Side.eth.sendSignedTransaction(
        signedTransaction.rawTransaction
      );
      logger.info('fulfillTx: ' + JSON.stringify(fulfillTx));
      return fulfillTx;
    }
    async function processReturnUnlock(data) {
      logger.info('returning starting unlocking tokens');
      const functionCall = MainBridge.methods
        .unlockTokens(
          data['from_address'],
          data['value'],
          data['transaction_hash']
        )
        .encodeABI();
      const gatewayNonce = web3Main.eth.getTransactionCount(gateway_address);
      const transactionBody = {
        to: MainBridge_address,
        nonce: gatewayNonce,
        data: functionCall,
        gas: 400000,
        gasPrice: web3Main.utils.toWei('2', 'gwei'),
      };
      signedTransaction = await web3Main.eth.accounts.signTransaction(
        transactionBody,
        gatewayKey
      );
      logger.info(signedTransaction.transactionHash);
      fulfillTx = await web3Main.eth.sendSignedTransaction(
        signedTransaction.rawTransaction
      );
      logger.info('fulfillTx: ' + JSON.stringify(fulfillTx));
    }
  });
});

Nope I got it guys had the wrong number for my main chain and other chain

Thank u for the help

the return side lets me connect via meta to return from side to main but button dont work for the bridge side from main bridge to side bridge button dont work [Bridge Token https://safutools.biz/bridge.html I know it’s something silly missed got to be everything else works

Do you get any errors?