Sending a Transaction
After getting a quote or executing an approval transaction, you'll next have to send a transaction to Swing's Cross-Chain API.
The steps for sending a transaction are as followed:
- First, we will make a request to
https://swap.prod.swing.xyz/v0/transfer/send - Using the
txDatareturned from the/sendrequest, sign the transaction by using a user's wallet
The full API reference for our /send endpoint can be found in the API reference section.
Making a Request
POST: https://swap.prod.swing.xyz/v0/transfer/send
Body Parameters:
| Key | Example | Description |
|---|---|---|
fromChain | ethereum | The blockchain where the transaction originates. |
fromTokenAddress | 0x0000000000000000000000000000000000000000 | Source Token Address |
fromUserAddress | 0x018c15DA1239B84b08283799B89045CD476BBbBb | Sender's wallet address |
tokenSymbol | ETH | Source token slug |
toTokenAddress | 0x0000000000000000000000000000000000000000 | Destination token address. |
toChain | polygon | Destination chain |
toTokenAmount | 1000000000000000000 | Amount of the destination token to be received. |
toTokenSymbol | MATIC | Destination Chain slug |
toUserAddress | 0x018c15DA1239B84b08283799B89045CD476BBbBb | Receiver's wallet address |
tokenAmount | 1000000000000000000 | Amount of the source token being sent (in wei for ETH). |
projectId | replug | Your project's ID |
route | see Requesting a qoute | Selected route |
Sample Request
const result = await axios.post(
'https://swap.prod.swing.xyz/v0/transfer/send',
{
fromChain: 'polygon',
tokenSymbol: 'USDC',
fromTokenAddress: '0xcbe56b00d173a26a5978ce90db2e33622fd95a28',
fromUserAddress: '0x018c15DA1239B84b08283799B89045CD476BBbBb',
toChain: 'ethereum',
toTokenSymbol: 'ETH',
toTokenAddress: '0x0000000000000000000000000000000000000000',
toUserAddress: '0x018c15DA1239B84b08283799B89045CD476BBbBb',
tokenAmount: '1000000000',
projectId: 'replug',
route: [
{
bridge: 'dodo',
bridgeTokenAddress: '0xc2132d05d31c914a87c6611c10748aeb04b58e8f',
steps: ['allowance', 'approve', 'send'],
name: 'USDT',
part: 100,
},
],
},
);Signing transaction callData
It's important to note that the /send endpoint only builds an unsigned transaction. To actually send the transaction, you'll have to give Swing the permission to do so by signing the transaction using a non-custodial wallet like MetaMask or Coinbase.
Now that we've got our txData, we next need to invoke a function in one of Swing's contracts to be able to take funds from a user's wallet and begin the transaction.
We'll be using ethers.js with MetaMask Wallet to demonstrate how you can execute our
txData, but feel free to use whatever wallet provider you're comfortable using.
The txData from the /send will look something like this:
{
....
"tx": {
"from": "0x018c15DA1239B84b08283799B89045CD476BBbBb",
"to": "0x39E3e49C99834C9573c9FC7Ff5A4B226cD7B0E63",
"data": "0x301a3720000000000000000000000000eeeeeeeeeeee........",
"value": "0x0e35fa931a0000",
"gas": "0x06a02f"
}
....
}First, we'll call the /send endpoint via the sendTransaction() function and retrieve our txData from it's response:
const transaction = await sendTransaction();
let txData = {
data: transaction.tx.data,
from: transaction.tx.from,
to: transaction.tx.to,
value: transaction.tx.value,
gasLimit: transaction.tx.gas,
};Next, we'll create a function called getSigner() to retrieve our Signer Object using MetaMask's Injected Provider:
async function getSigner() {
const provider = await new ethers.providers.Web3Provider(window.ethereum);
return provider.getSigner();
}Now that we've got our Signer Object, we can go ahead and execute the txData by calling the sendTransaction() function present in our signer object.
async function executeTxData(txData) {
const signer = await getSigner();
const txResponse = await signer.sendTransaction(txData);
const receipt = await txResponse.wait();
console.log('Transaction receipt:', receipt);
return txResponse.txHash; // We'll need this later for checking the transaction's status
}Finally, immediately after we get our txData from the /send Response, we'll prompt a user's MetaMask wallet to execute our txData by calling executeTxData():
const transaction = await sendTransaction();
let txData = {
data: transaction.tx.data,
from: transaction.tx.from,
to: transaction.tx.to,
value: transaction.tx.value,
gasLimit: transaction.tx.gas,
};
const txHash = await executeTxData(txData); // This will open MetaMask and ask the user to confirm the transaction
console.log(txHash);