Celo
The Celo part carries out the practice using ethers. Please prepare by installing the package.
Create Signed transaction
For a signed transaction, there are three essential steps.
- Create a raw transaction first.
- Make a raw transaction signature.
- Convert a raw transaction into a signed transaction by adding a signature.
1. getCeloTx
Transaction and signature are needed. We first develop a getCeloTx
function to generate raw transaction because it is necessary to have a raw transaction to receive a signature via kms.
import { ethers, UnsignedTransaction } from 'ethers';
import { Account, CHAIN } from '@dsrv/kms/lib/types';
import { Ethereum } from '@dsrv/kms/lib/blockchains/ethereum';
interface RawTransaction {
unSignedTx: UnsignedTransaction;
serializedTx: string;
}
export const getCeloTx = async (mnemonic: string): Promise<RawTransaction> => {
/* 1. get Account */
const account = Ethereum.getAccount({
mnemonic,
path: { type: CHAIN.CELO, account: 0, index: 0 },
});
/* 2. make raw transaction */
const provider = new ethers.providers.JsonRpcProvider(
'https://celo-alfajores-rpc.allthatnode.com',
); //allthatnode rpc
const nonce = await provider.getTransactionCount(account.address);
const gasLimit = await provider.estimateGas({
value: '0x1',
to: account.address, // send to yourself
from: account.address,
});
const transactionParameters = {
to: account.address, // send to yourself
value: ethers.utils.parseEther('0.0005'),
gasLimit: gasLimit.mul(10).toString(),
gasPrice: '0x07f9acf02',
type: 2,
nonce,
// alfajores network
chainId: 44787,
type: 1,
gasPrice: '0x07f9acf02',
maxPriorityFeePerGas: '0x07f9acf02',
maxFeePerGas: '0x07f9acf02',
nonce,
};
return {
serializedTx: ethers.utils.serializeTransaction(transactionParameters),
unSignedTx: transactionParameters,
};
};
2. getCeloSignature
We then develop a method called getCeloSignature
that produces a signature by using serializedTx as a factor in order to gain a signature for the transaction.
import { CHAIN } from '@dsrv/kms/lib/types';
import { Ethereum } from '@dsrv/kms/lib/blockchains/ethereum';
export const getCeloSignature = (serializedTx: string): string => {
const { signature } = Ethereum.signTx(
{
mnemonic,
path: { type: CHAIN.CELO, account: 0, index: 0 },
},
serializedTx,
);
return signature;
};
3. createCeloSignedTx
Finally, we develop the createCeloSignedTx
function, which takes an unsignedTx
and a signature
generated earlier and returns a signed transaction.
import { ethers, UnsignedTransaction } from 'ethers';
interface createCeloSignedTxProps {
unSignedTx: UnsignedTransaction;
signature: string;
}
/* create singedTx by combining tx and signature */
export const createCeloSignedTx = ({ unSignedTx, signature }: createCeloSignedTxProps): string => {
const signedTx = ethers.utils.serializeTransaction(unSignedTx, signature);
return signedTx;
};
Finally, you can construct a getCeloSignedTx
function that returns a signed transaction by combining the functions you made before, getCeloTx
, getCeloSignature
, and createCeloSignedTx
.
export const getCeloSignedTx = async (mnemonic: string) => {
/* 1. get rawTransaction */
const { serializedTx, unSignedTx } = await getCeloTx(mnemonic);
/* 2. get signature */
const celoSignature = getCeloSignature(serializedTx);
/* 3. create singedTx by combining rawTransaction and signature */
const celoSignedTx = createCeloSignedTx({
unSignedTx,
signature: celoSignature,
});
return celoSignedTx;
};
Send Signed transaction
You can transmit the transaction using a signed transaction you've prepared.
import { Transaction, providers } from 'ethers';
export const sendCeloTransaction = async (serializedTx: string): Promise<Transaction> => {
const provider = new providers.JsonRpcProvider('https://celo-alfajores-rpc.allthatnode.com');
const result = await provider.sendTransaction(serializedTx);
return result;
};
const mnemonic = 'sample mnemonic';
const main = async () => {
const celoSignedTx = await getCeloSignedTx(mnemonic);
const celoTxResult = await sendCeloTransaction(celoSignedTx);
console.log('Celo Tx Result : ', celoTxResult);
};
main();
Examples
To complete the transaction, follow the steps outlined below. A faucet is required to transmit a transaction. You can request faucet through the FAUCET tab in the wallet.
The loss of all cryptocurrency holdings is possible if mnemonic is revealed. To execute the following example, use a test or development mnemonic.