Skip to content

Commit

Permalink
Add wallet information
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelKim20 committed Jan 26, 2024
1 parent 8701149 commit a4c205b
Show file tree
Hide file tree
Showing 8 changed files with 296 additions and 31 deletions.
4 changes: 2 additions & 2 deletions packages/client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "multisig-wallet-sdk-client",
"version": "1.0.0",
"version": "1.0.1",
"author": "BOSagora Foundation",
"license": "LGPL-3.0",
"main": "dist/index.js",
Expand Down Expand Up @@ -72,7 +72,7 @@
"@ethersproject/providers": "^5.7.0",
"@ethersproject/random": "^5.7.0",
"@ethersproject/wallet": "^5.7.0",
"multisig-wallet-contracts-lib": "^1.0.4",
"multisig-wallet-contracts-lib": "^1.0.6",
"multisig-wallet-sdk-common": "^1.0.0"
},
"jest": {
Expand Down
17 changes: 13 additions & 4 deletions packages/client/src/interface/IMultiSigWalletFactory.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
import { IClientCore } from "../client-common";
import { CreateMultiSigWallet } from "../interfaces";
import { ChangeInformation, ContractWalletInfo, CreateMultiSigWallet } from "../interfaces";

export interface IMultiSigWalletFactory {
multiSigWalletFactory: IMultiSigWalletFactoryMethods;
}

/** Defines the shape of the general purpose Client class */
export interface IMultiSigWalletFactoryMethods extends IClientCore {
create: (owners: string[], required: number) => AsyncGenerator<CreateMultiSigWallet>;
create: (
name: string,
description: string,
owners: string[],
required: number
) => AsyncGenerator<CreateMultiSigWallet>;
getNumberOfWalletsForCreator: (creator: string) => Promise<number>;
getWalletsForCreator: (creator: string, from: number, to: number) => Promise<string[]>;
getWalletsForCreator: (creator: string, from: number, to: number) => Promise<ContractWalletInfo[]>;

getNumberOfWalletsForOwner: (owner: string) => Promise<number>;
getWalletsForOwner: (owner: string, from: number, to: number) => Promise<string[]>;
getWalletsForOwner: (owner: string, from: number, to: number) => Promise<ContractWalletInfo[]>;

getWalletInfo: (wallet: string) => Promise<ContractWalletInfo>;
changeName: (wallet: string, name: string) => AsyncGenerator<ChangeInformation>;
changeDescription: (wallet: string, description: string) => AsyncGenerator<ChangeInformation>;
}
17 changes: 17 additions & 0 deletions packages/client/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,26 @@ export type RevokeTransaction =
transactionId: BigNumber;
};

export type ChangeInformation =
| {
key: NormalSteps.SENT;
txHash: BytesLike;
}
| {
key: NormalSteps.SUCCESS;
};

export interface ContractTransactionData {
destination: string;
value: BigNumber;
data: string;
executed: boolean;
}

export interface ContractWalletInfo {
creator: string;
wallet: string;
name: string;
description: string;
time: BigNumber;
}
163 changes: 155 additions & 8 deletions packages/client/src/internal/client/MultiSigWalletFactoryMethods.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { ClientCore, Context, SupportedNetworks, SupportedNetworksArray } from "../../client-common";
import { IMultiSigWalletFactoryMethods } from "../../interface/IMultiSigWalletFactory";
import { NormalSteps, CreateMultiSigWallet } from "../../interfaces";
import { ContractUtils, GasPriceManager, NonceManager, FailedCreateWallet } from "../../utils";
import { NormalSteps, CreateMultiSigWallet, ContractWalletInfo, ChangeInformation } from "../../interfaces";
import {
ContractUtils,
GasPriceManager,
NonceManager,
FailedCreateWallet,
FailedChangeName,
FailedChangeDescription
} from "../../utils";

import { NoProviderError, NoSignerError, UnsupportedNetworkError } from "multisig-wallet-sdk-common";
import { MultiSigWalletFactory, MultiSigWalletFactory__factory } from "multisig-wallet-contracts-lib";
Expand All @@ -16,7 +23,12 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
Object.freeze(this);
}

public async *create(owners: string[], required: number): AsyncGenerator<CreateMultiSigWallet> {
public async *create(
name: string,
description: string,
owners: string[],
required: number
): AsyncGenerator<CreateMultiSigWallet> {
const signer = this.web3.getConnectedSigner();
if (!signer) {
throw new NoSignerError();
Expand All @@ -37,7 +49,7 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
);

try {
const tx = await contract.create(owners, required);
const tx = await contract.create(name, description, owners, required);
yield {
key: NormalSteps.SENT,
creator: await signer.getAddress(),
Expand Down Expand Up @@ -82,7 +94,8 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
);
return (await contract.getNumberOfWalletsForCreator(creator)).toNumber();
}
public async getWalletsForCreator(creator: string, from: number, to: number): Promise<string[]> {

public async getWalletsForCreator(creator: string, from: number, to: number): Promise<ContractWalletInfo[]> {
const provider = this.web3.getProvider() as Provider;
if (!provider) throw new NoProviderError();

Expand All @@ -96,7 +109,16 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
this.web3.getWalletFactoryAddress(),
provider
);
return await contract.getWalletsForCreator(creator, from, to);
const res = await contract.getWalletsForCreator(creator, from, to);
return res.map((m) => {
return {
creator: m.creator,
wallet: m.wallet,
name: m.name,
description: m.description,
time: m.time
};
});
}

public async getNumberOfWalletsForOwner(owner: string): Promise<number> {
Expand All @@ -116,7 +138,7 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
return (await contract.getNumberOfWalletsForOwner(owner)).toNumber();
}

public async getWalletsForOwner(owner: string, from: number, to: number): Promise<string[]> {
public async getWalletsForOwner(owner: string, from: number, to: number): Promise<ContractWalletInfo[]> {
const provider = this.web3.getProvider() as Provider;
if (!provider) throw new NoProviderError();

Expand All @@ -130,6 +152,131 @@ export class MultiSigWalletFactoryMethods extends ClientCore implements IMultiSi
this.web3.getWalletFactoryAddress(),
provider
);
return await contract.getWalletsForOwner(owner, from, to);
const res = await contract.getWalletsForOwner(owner, from, to);
return res.map((m) => {
return {
creator: m.creator,
wallet: m.wallet,
name: m.name,
description: m.description,
time: m.time
};
});
}

public async getWalletInfo(wallet: string): Promise<ContractWalletInfo> {
const provider = this.web3.getProvider() as Provider;
if (!provider) throw new NoProviderError();

const network = getNetwork((await provider.getNetwork()).chainId);
const networkName = network.name as SupportedNetworks;
if (!SupportedNetworksArray.includes(networkName)) {
throw new UnsupportedNetworkError(networkName);
}

const contract: MultiSigWalletFactory = MultiSigWalletFactory__factory.connect(
this.web3.getWalletFactoryAddress(),
provider
);
const res = await contract.getWalletInfo(wallet);
return {
creator: res.creator,
wallet: res.wallet,
name: res.name,
description: res.description,
time: res.time
};
}

public async *changeName(wallet: string, name: string): AsyncGenerator<ChangeInformation> {
const signer = this.web3.getConnectedSigner();
if (!signer) {
throw new NoSignerError();
} else if (!signer.provider) {
throw new NoProviderError();
}

const network = getNetwork((await signer.provider.getNetwork()).chainId);
const networkName = network.name as SupportedNetworks;
if (!SupportedNetworksArray.includes(networkName)) {
throw new UnsupportedNetworkError(networkName);
}

const nonceSigner = new NonceManager(new GasPriceManager(signer));
const contract: MultiSigWalletFactory = MultiSigWalletFactory__factory.connect(
this.web3.getWalletFactoryAddress(),
nonceSigner
);

let success = true;
try {
const tx = await contract.changeName(wallet, name);
yield {
key: NormalSteps.SENT,
txHash: tx.hash
};

const newName = await ContractUtils.getEventValueString(tx, contract.interface, "ChangedName", "name");

if (newName === name) {
yield {
key: NormalSteps.SUCCESS
};
} else {
success = false;
}
} catch (error) {
success = false;
}

if (!success) throw new FailedChangeName();
}

public async *changeDescription(wallet: string, description: string): AsyncGenerator<ChangeInformation> {
const signer = this.web3.getConnectedSigner();
if (!signer) {
throw new NoSignerError();
} else if (!signer.provider) {
throw new NoProviderError();
}

const network = getNetwork((await signer.provider.getNetwork()).chainId);
const networkName = network.name as SupportedNetworks;
if (!SupportedNetworksArray.includes(networkName)) {
throw new UnsupportedNetworkError(networkName);
}

const nonceSigner = new NonceManager(new GasPriceManager(signer));
const contract: MultiSigWalletFactory = MultiSigWalletFactory__factory.connect(
this.web3.getWalletFactoryAddress(),
nonceSigner
);

let success = true;
try {
const tx = await contract.changeDescription(wallet, description);
yield {
key: NormalSteps.SENT,
txHash: tx.hash
};

const newDescription = await ContractUtils.getEventValueString(
tx,
contract.interface,
"ChangedDescription",
"description"
);

if (newDescription === description) {
yield {
key: NormalSteps.SUCCESS
};
} else {
success = false;
}
} catch (error) {
success = false;
}
if (!success) throw new FailedChangeDescription();
}
}
23 changes: 14 additions & 9 deletions packages/client/src/internal/client/MultiSigWalletMethods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
import { NoProviderError, NoSignerError, UnsupportedNetworkError } from "multisig-wallet-sdk-common";
import { MultiSigWallet, MultiSigWallet__factory } from "multisig-wallet-contracts-lib";

import { ABIStorage, ContractUtils, GasPriceManager, NonceManager } from "../../utils/";
import { ABIStorage, ContractUtils, FailedChangeDescription, GasPriceManager, NonceManager } from "../../utils/";
import {
FailedConfirmTransaction,
FailedRevokeTransaction,
Expand Down Expand Up @@ -186,6 +186,7 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
const nonceSigner = new NonceManager(new GasPriceManager(signer));
const contract = this.getWalletContract(nonceSigner);

let success = true;
try {
const tx = await contract.submitTransaction(destination, value, data);
yield {
Expand All @@ -206,11 +207,12 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
transactionId
};
} else {
throw new FailedSubmitTransaction();
success = false;
}
} catch (error) {
throw new FailedSubmitTransaction();
success = false;
}
if (!success) throw new FailedSubmitTransaction();
}

public async *confirmTransaction(transactionId: BigNumber): AsyncGenerator<ConfirmTransaction> {
Expand All @@ -230,6 +232,7 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
const nonceSigner = new NonceManager(new GasPriceManager(signer));
const contract = this.getWalletContract(nonceSigner);

let success = true;
try {
const tx = await contract.confirmTransaction(transactionId);
yield {
Expand All @@ -253,15 +256,15 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
transactionId: txId
};
} else {
throw new FailedConfirmTransaction();
success = false;
}
} else {
throw new FailedConfirmTransaction();
success = false;
}
} catch (error) {
console.log(error);
throw new FailedConfirmTransaction();
success = false;
}
if (!success) throw new FailedConfirmTransaction();
}

public async *revokeConfirmation(transactionId: BigNumber): AsyncGenerator<RevokeTransaction> {
Expand All @@ -281,6 +284,7 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
const nonceSigner = new NonceManager(new GasPriceManager(signer));
const contract = this.getWalletContract(nonceSigner);

let success = true;
try {
const tx = await contract.revokeConfirmation(transactionId);
yield {
Expand All @@ -301,11 +305,12 @@ export class MultiSigWalletMethods extends ClientCore implements IMultiSigWallet
transactionId: txId
};
} else {
throw new FailedRevokeTransaction();
success = false;
}
} catch (error) {
throw new FailedRevokeTransaction();
success = false;
}
if (!success) throw new FailedRevokeTransaction();
}

public async getTransactionCountInCondition(pending: boolean, executed: boolean): Promise<number> {
Expand Down
14 changes: 13 additions & 1 deletion packages/client/src/utils/Errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,19 @@ export class NoWalletAddress extends Error {

export class FailedCreateWallet extends Error {
constructor() {
super("Failed to create a multi sig wallet");
super("Failed to create a multi sig wallet");
}
}

export class FailedChangeName extends Error {
constructor() {
super("Failed to change the name of wallet");
}
}

export class FailedChangeDescription extends Error {
constructor() {
super("Failed to change the description of wallet");
}
}

Expand Down
Loading

0 comments on commit a4c205b

Please sign in to comment.