@bcpros/crypto-wallet-core
Version:
A multi-currency support library for address derivation, private key creation, and transaction creation
175 lines (162 loc) • 6.16 kB
text/typescript
import Web3 from 'web3';
import { AbiItem } from 'web3-utils';
import { MultisigAbi } from '../eth-multisig/abi';
import { MATICTxProvider } from '../matic';
export class MATICMULTISIGTxProvider extends MATICTxProvider {
getMultisigContract(multisigContractAddress: string) {
const web3 = new Web3();
const contract = new web3.eth.Contract(MultisigAbi as AbiItem[], multisigContractAddress);
return contract;
}
create(params: {
recipients: Array<{ address: string; amount: string }>;
nonce: number;
gasPrice: number;
data: string;
gasLimit: number;
multisigContractAddress: string;
network: string;
chainId?: number;
}) {
const { multisigContractAddress } = params;
const recipients = [{ address: multisigContractAddress, amount: '0' }];
const newParams = { ...params, recipients };
return super.create(newParams);
}
instantiateEncodeData(params: {
addresses: Array<string>;
requiredConfirmations: number;
multisigGnosisContractAddress: string;
dailyLimit: number;
}) {
const { addresses, requiredConfirmations, multisigGnosisContractAddress, dailyLimit } = params;
let requiredConfirmationsStr = Number(requiredConfirmations).toLocaleString('en', { useGrouping: false });
let dailyLimitStr = Number(dailyLimit).toLocaleString('en', { useGrouping: false });
const data = this.getMultisigContract(multisigGnosisContractAddress)
.methods.create(addresses, requiredConfirmationsStr, dailyLimitStr)
.encodeABI();
return data;
}
addOwnerEncodeData(params: { newOwnerAddress: string; multisigContractAddress: string }) {
const { multisigContractAddress, newOwnerAddress } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.addOwner(newOwnerAddress)
.encodeABI();
return this.submitEncodeData({
recipients: [
{
address: multisigContractAddress,
amount: '0'
}
],
multisigContractAddress,
data
});
}
removeOwnerEncodeData(params: { newOwnerAddress: string; multisigContractAddress: string }) {
const { multisigContractAddress, newOwnerAddress } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.removeOwner(newOwnerAddress)
.encodeABI();
return this.submitEncodeData({
recipients: [
{
address: multisigContractAddress,
amount: '0'
}
],
multisigContractAddress,
data
});
}
replaceOwnerEncodeData(params: {
oldOwnerAddress: string;
newOwnerAddress: string;
multisigContractAddress: string;
}) {
const { multisigContractAddress, newOwnerAddress, oldOwnerAddress } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.removeOwner(oldOwnerAddress, newOwnerAddress)
.encodeABI();
return this.submitEncodeData({
recipients: [
{
address: multisigContractAddress,
amount: '0'
}
],
multisigContractAddress,
data
});
}
changeRequirementEncodedData(params: { requiredConfirmations: number; multisigContractAddress: string }) {
const { requiredConfirmations, multisigContractAddress } = params;
let data;
let requiredConfirmationsStr = Number(requiredConfirmations).toLocaleString('en', { useGrouping: false });
data = this.getMultisigContract(multisigContractAddress)
.methods.changeRequirement(requiredConfirmationsStr)
.encodeABI();
return this.submitEncodeData({
recipients: [
{
address: multisigContractAddress,
amount: '0'
}
],
multisigContractAddress,
data
});
}
changeDailyLimitEncodedData(params: { requiredConfirmations: number; multisigContractAddress: string }) {
const { requiredConfirmations, multisigContractAddress } = params;
let data;
let requiredConfirmationsStr = Number(requiredConfirmations).toLocaleString('en', { useGrouping: false });
data = this.getMultisigContract(multisigContractAddress)
.methods.changeDailyLimit(requiredConfirmationsStr)
.encodeABI();
return this.submitEncodeData({
recipients: [
{
address: multisigContractAddress,
amount: '0'
}
],
multisigContractAddress,
data
});
}
confirmTransactionEncodeData(params: { multisigContractAddress: string; transactionId: number }) {
const { multisigContractAddress, transactionId } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.confirmTransaction(transactionId)
.encodeABI();
return data;
}
revokeConfirmationEncodeData(params: { multisigContractAddress: string; transactionId: number }) {
const { multisigContractAddress, transactionId } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.revokeConfirmation(transactionId)
.encodeABI();
return data;
}
executeTransactionEncodeData(params: { multisigContractAddress: string; transactionId: number }) {
const { multisigContractAddress, transactionId } = params;
const data = this.getMultisigContract(multisigContractAddress)
.methods.executeTransaction(transactionId)
.encodeABI();
return data;
}
// data: It is used to invoke functionalities of a contract and can be left empty ('0x') or bytes(0) for regular value transfers.
// address: It is used o invoke functionalities of a contract needs to be the address of the Smart Contract whose method you want to invoke.
submitEncodeData(params: {
recipients: Array<{ address: string; amount: string }>;
multisigContractAddress: string;
data: string;
}) {
const { multisigContractAddress, data } = params;
const [{ address, amount }] = params.recipients;
const amountStr = Number(amount).toLocaleString('en', { useGrouping: false });
const contract = this.getMultisigContract(multisigContractAddress);
return contract.methods.submitTransaction(address, amountStr, data).encodeABI();
}
}