barterjs-sdk
Version:
Barter Network SDK
225 lines (213 loc) • 6.48 kB
text/typescript
import {
BigNumber,
Contract as EthersContract,
ContractTransaction,
ethers,
Signer,
} from 'ethers';
import { Eth } from 'web3-eth';
import { IMapCrossChainService } from '../interfaces/IMapCrossChainService';
import {
BarterTransactionReceipt,
BarterTransactionResponse,
} from '../../types/responseTypes';
import {
adaptEthReceipt,
assembleEVMTransactionResponse,
} from '../../utils/responseUtil';
import { Provider, TransactionReceipt } from '@ethersproject/abstract-provider';
import { TransactionReceipt as Web3TransactionReceipt } from 'web3-core';
import { TransferOutOptions } from '../../types';
import { BarterContractType, BarterProviderType } from '../../types/paramTypes';
import { PromiEvent } from 'web3-core';
export class EVMCrossChainService implements IMapCrossChainService {
contract: BarterContractType;
provider: BarterProviderType;
constructor(
contractAddress: string,
abi: any,
signerOrProvider: BarterProviderType
) {
if (
signerOrProvider instanceof Signer ||
signerOrProvider instanceof Provider
) {
this.contract = new ethers.Contract(
contractAddress,
abi,
signerOrProvider
);
} else {
this.contract = new signerOrProvider.Contract(abi, contractAddress);
}
this.provider = signerOrProvider;
}
/**
* transfer out token(not native coin) from source chain to designated token on target chain
* @param fromAddress
* @param tokenAddress input token address
* @param amount amount in minimal unit
* @param toAddress target chain receiving address
* @param toChainId target chain id
* @param options
*/
async doTransferOutToken(
fromAddress: string,
tokenAddress: string,
amount: string,
toAddress: string,
toChainId: string,
options: TransferOutOptions
): Promise<BarterTransactionResponse> {
let txHash: string;
if (this.contract instanceof EthersContract) {
const transferOutTx: ContractTransaction =
await this.contract.transferOutToken(
tokenAddress,
toAddress,
amount,
toChainId
// { gasLimit: options.gas }
);
txHash = transferOutTx.hash;
return assembleEVMTransactionResponse(txHash!, this.provider);
// receipt = await transferOutTx.wait();
} else {
const promiReceipt: PromiEvent<Web3TransactionReceipt> =
this.contract.methods
.transferOutToken(tokenAddress, toAddress, amount, toChainId)
.send({
from: fromAddress,
gas: Number.parseInt(options.gas!.toString()),
});
return <BarterTransactionResponse>{
promiReceipt: promiReceipt,
};
}
}
async gasEstimateTransferOutToken(
fromAddress: string,
tokenAddress: string,
amount: string,
toAddress: string,
toChainId: string
): Promise<string> {
// gas estimation
let estimatedGas = '';
if (this.contract instanceof EthersContract) {
const gas: BigNumber = await this.contract.estimateGas.transferOutToken!(
tokenAddress,
toAddress,
amount,
toChainId
);
estimatedGas = gas.toString();
} else {
const gas = await this.contract.methods
.transferOutToken(tokenAddress, toAddress, amount, toChainId)
.estimateGas({ from: fromAddress });
estimatedGas = gas.toString();
}
return estimatedGas;
}
/**
* transfer out native coin from source chain to designated token on target chain
* @param fromAddress
* @param toAddress target chain receiving address
* @param toChainId target chain id
* @param amount amount to bridge in minimal unit
* @param options
*/
async doTransferOutNative(
fromAddress: string,
toAddress: string,
toChainId: string,
amount: string,
options: TransferOutOptions
): Promise<BarterTransactionResponse> {
let txHash: string;
if (this.contract instanceof EthersContract) {
const transferOutTx: ContractTransaction =
await this.contract.transferOutNative(toAddress, toChainId, {
// gasLimit: options.gas,
value: amount,
});
txHash = transferOutTx.hash;
return assembleEVMTransactionResponse(txHash!, this.provider);
} else {
const promiReceipt: PromiEvent<Web3TransactionReceipt> =
this.contract.methods.transferOutNative(toAddress, toChainId).send({
value: amount,
from: fromAddress,
gas: Number.parseInt(options.gas!.toString()),
});
return <BarterTransactionResponse>{
promiReceipt: promiReceipt,
};
}
}
async gasEstimateTransferOutNative(
fromAddress: string,
toAddress: string,
toChainId: string,
amount: string
): Promise<string> {
// gas estimation
let estimatedGas;
if (this.contract instanceof EthersContract) {
const gas = await this.contract.estimateGas.transferOutNative!(
toAddress,
toChainId,
{
value: amount,
}
);
estimatedGas = gas.toString();
} else {
const gas = await this.contract.methods
.transferOutNative(toAddress, toChainId)
.estimateGas({ value: amount });
estimatedGas = gas.toString();
}
return estimatedGas;
}
async doDepositOutToken(
tokenAddress: string,
from: string,
to: string,
amount: string
): Promise<string> {
let txHash;
if (this.contract instanceof EthersContract) {
const depositOutTx: ContractTransaction =
await this.contract.depositOutToken(tokenAddress, from, to, amount);
const receipt = await depositOutTx.wait();
txHash = receipt.transactionHash;
} else {
const eth = this.provider as Eth;
const receipt = await this.contract.methods
.depositOutToken(tokenAddress, from, to, amount)
.send({
from: eth.defaultAccount,
});
txHash = receipt.transactionHash;
}
return txHash;
}
async doSetCanBridgeToken(
tokenAddress: string,
toChainId: string,
canBridge: boolean
) {
if (this.contract instanceof EthersContract) {
const tx: ContractTransaction = await this.contract.setCanBridgeToken(
tokenAddress,
toChainId,
canBridge
);
const receipt = await tx.wait();
} else {
throw new Error('provided not supported');
}
}
}