Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eth auth and offline signer #61

Merged
merged 5 commits into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions networks/cosmos/src/base/base-wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
import {
AminoSignResponse,
DirectSignResponse,
ICosmosGeneralOfflineSigner,
ICosmosGenericOfflineSigner,
OfflineAminoSigner,
OfflineDirectSigner,
WalletOptions,
Expand Down Expand Up @@ -145,7 +145,7 @@ implements ICosmosWallet, OfflineAminoSigner, OfflineDirectSigner
* @param signMode sign mode. (direct or amino)
* @returns general offline signer for direct or amino
*/
toGeneralOfflineSigner(signMode: string): ICosmosGeneralOfflineSigner {
toGenericOfflineSigner(signMode: string): ICosmosGenericOfflineSigner {
switch (signMode) {
case SIGN_MODE.DIRECT:
return {
Expand Down
10 changes: 5 additions & 5 deletions networks/cosmos/src/signers/amino.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
SignerOptions,
} from '../types';
import { AminoDocAuth } from '../types/docAuth';
import { IAminoGeneralOfflineSigner, isOfflineAminoSigner, OfflineAminoSigner } from '../types/wallet';
import { IAminoGenericOfflineSigner, isOfflineAminoSigner, OfflineAminoSigner } from '../types/wallet';

/**
* AminoDocSigner is a signer for Amino document.
Expand Down Expand Up @@ -125,7 +125,7 @@ export class AminoSigner
* if there're multiple accounts in the wallet, it will return the first one by default.
*/
static async fromWallet(
signer: OfflineAminoSigner | IAminoGeneralOfflineSigner,
signer: OfflineAminoSigner | IAminoGenericOfflineSigner,
encoders: Encoder[],
converters: AminoConverter[],
endpoint?: string | HttpEndpoint,
Expand All @@ -136,7 +136,7 @@ export class AminoSigner
if(isOfflineAminoSigner(signer)){
[auth] = await AminoDocAuth.fromOfflineSigner(signer);
} else {
[auth] = await AminoDocAuth.fromGeneralOfflineSigner(signer);
[auth] = await AminoDocAuth.fromGenericOfflineSigner(signer);
}

return new AminoSigner(auth, encoders, converters, endpoint, options);
Expand All @@ -147,7 +147,7 @@ export class AminoSigner
* if there're multiple accounts in the wallet, it will return all of the signers.
*/
static async fromWalletToSigners(
signer: OfflineAminoSigner | IAminoGeneralOfflineSigner,
signer: OfflineAminoSigner | IAminoGenericOfflineSigner,
encoders: Encoder[],
converters: AminoConverter[],
endpoint?: string | HttpEndpoint,
Expand All @@ -158,7 +158,7 @@ export class AminoSigner
if(isOfflineAminoSigner(signer)) {
auths = await AminoDocAuth.fromOfflineSigner(signer);
} else {
auths = await AminoDocAuth.fromGeneralOfflineSigner(signer);
auths = await AminoDocAuth.fromGenericOfflineSigner(signer);
}

return auths.map((auth) => {
Expand Down
10 changes: 5 additions & 5 deletions networks/cosmos/src/signers/direct.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
SignerOptions,
} from '../types';
import { DirectDocAuth } from '../types/docAuth';
import { IDirectGeneralOfflineSigner, isOfflineDirectSigner, OfflineDirectSigner } from '../types/wallet';
import { IDirectGenericOfflineSigner, isOfflineDirectSigner, OfflineDirectSigner } from '../types/wallet';

/**
* DirectDocSigner is a signer for Direct document.
Expand Down Expand Up @@ -72,7 +72,7 @@ export class DirectSigner
* If there're multiple accounts in the wallet, it will return the first one by default.
*/
static async fromWallet(
signer: OfflineDirectSigner | IDirectGeneralOfflineSigner,
signer: OfflineDirectSigner | IDirectGenericOfflineSigner,
encoders: Encoder[],
endpoint?: string | HttpEndpoint,
options?: SignerOptions
Expand All @@ -82,7 +82,7 @@ export class DirectSigner
if(isOfflineDirectSigner(signer)){
[auth] = await DirectDocAuth.fromOfflineSigner(signer);
} else {
[auth] = await DirectDocAuth.fromGeneralOfflineSigner(signer);
[auth] = await DirectDocAuth.fromGenericOfflineSigner(signer);
}

return new DirectSigner(auth, encoders, endpoint, options);
Expand All @@ -93,7 +93,7 @@ export class DirectSigner
* If there're multiple accounts in the wallet, it will return all of the signers.
*/
static async fromWalletToSigners(
signer: OfflineDirectSigner | IDirectGeneralOfflineSigner,
signer: OfflineDirectSigner | IDirectGenericOfflineSigner,
encoders: Encoder[],
endpoint?: string | HttpEndpoint,
options?: SignerOptions
Expand All @@ -103,7 +103,7 @@ export class DirectSigner
if(isOfflineDirectSigner(signer)) {
auths = await DirectDocAuth.fromOfflineSigner(signer);
} else {
auths = await DirectDocAuth.fromGeneralOfflineSigner(signer);
auths = await DirectDocAuth.fromGenericOfflineSigner(signer);
}

return auths.map((auth) => {
Expand Down
20 changes: 11 additions & 9 deletions networks/cosmos/src/signing-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import {
QueryClient,
} from './types';
import {
IAminoGeneralOfflineSigner,
ICosmosGeneralOfflineSigner,
IDirectGeneralOfflineSigner,
IAminoGenericOfflineSigner,
ICosmosGenericOfflineSigner,
IDirectGenericOfflineSigner,
isOfflineAminoSigner,
isOfflineDirectSigner,
OfflineSigner,
Expand Down Expand Up @@ -39,7 +39,7 @@ import {
*/
export class SigningClient {
readonly client: QueryClient | null | undefined;
readonly offlineSigner: ICosmosGeneralOfflineSigner;
readonly offlineSigner: ICosmosGenericOfflineSigner;
readonly options: SignerOptions;

readonly signers: Record<string, DirectSigner | AminoSigner> = {};
Expand All @@ -53,7 +53,7 @@ export class SigningClient {

constructor(
client: QueryClient | null | undefined,
offlineSigner: ICosmosGeneralOfflineSigner,
offlineSigner: ICosmosGenericOfflineSigner,
options: SignerOptions = {}
) {
this.client = client;
Expand All @@ -74,7 +74,7 @@ export class SigningClient {

static async connectWithSigner(
endpoint: string | HttpEndpoint,
signer: ICosmosGeneralOfflineSigner,
signer: ICosmosGenericOfflineSigner,
options: SignerOptions = {}
): Promise<SigningClient> {
const signingClient = new SigningClient(
Expand All @@ -94,7 +94,7 @@ export class SigningClient {
switch (this.offlineSigner.signMode) {
case SIGN_MODE.DIRECT:
signers = await DirectSigner.fromWalletToSigners(
this.offlineSigner as IDirectGeneralOfflineSigner,
this.offlineSigner as IDirectGenericOfflineSigner,
this.encoders,
this.endpoint,
{
Expand All @@ -105,7 +105,7 @@ export class SigningClient {

case SIGN_MODE.AMINO:
signers = await AminoSigner.fromWalletToSigners(
this.offlineSigner as IAminoGeneralOfflineSigner,
this.offlineSigner as IAminoGenericOfflineSigner,
this.encoders,
this.converters,
this.endpoint,
Expand Down Expand Up @@ -275,7 +275,9 @@ export class SigningClient {
};

get endpoint(): HttpEndpoint {
return this.queryClient.endpoint;
return typeof this.queryClient.endpoint === 'string' ?
{ url: this.queryClient.endpoint, headers: {} }
: this.queryClient.endpoint;
}

async getTx(id: string): Promise<IndexedTx | null> {
Expand Down
59 changes: 23 additions & 36 deletions networks/cosmos/src/types/docAuth.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
DocAuth,
BaseDocAuth,
IKey,
SIGN_MODE,
SignDoc,
Expand All @@ -8,34 +8,17 @@ import {
} from '@interchainjs/types';
import { Key } from '@interchainjs/utils';

import { AminoSignResponse, DirectSignResponse, IAminoGeneralOfflineSigner, IDirectGeneralOfflineSigner, isOfflineAminoSigner, isOfflineDirectSigner, OfflineAminoSigner, OfflineDirectSigner } from './wallet';
import { AminoSignResponse, DirectSignResponse, IAminoGenericOfflineSigner, IDirectGenericOfflineSigner, isOfflineAminoSigner, isOfflineDirectSigner, OfflineAminoSigner, OfflineDirectSigner } from './wallet';
import { CosmosAminoDoc, CosmosDirectDoc } from './signer';

/**
* Base class for Doc Auth.
* a helper class to sign the StdSignDoc with Amino encoding using offline signer.
*/
export abstract class BaseDocAuth<TSigner, TDoc, TArgs = unknown, TAddr = string> implements DocAuth<TDoc, TArgs, TAddr> {
constructor(
public readonly algo: string,
public readonly address: TAddr,
public readonly pubkey: Uint8Array,
public readonly offlineSigner: TSigner
) {
this.algo = algo;
this.address = address;
this.pubkey = pubkey;
}

export class AminoDocAuth extends BaseDocAuth<OfflineAminoSigner | IAminoGenericOfflineSigner, StdSignDoc> {
getPublicKey(): IKey {
return Key.from(this.pubkey);
}
abstract signDoc(doc: TDoc, args?: TArgs): Promise<SignDocResponse<TDoc>>;
}

/**
* a helper class to sign the StdSignDoc with Amino encoding using offline signer.
*/
export class AminoDocAuth extends BaseDocAuth<OfflineAminoSigner | IAminoGeneralOfflineSigner, StdSignDoc> {
async signDoc(doc: StdSignDoc): Promise<SignDocResponse<StdSignDoc>> {
let resp;
if(isOfflineAminoSigner(this.offlineSigner)) {
Expand All @@ -58,15 +41,15 @@ export class AminoDocAuth extends BaseDocAuth<OfflineAminoSigner | IAminoGeneral

return accounts.map((account) => {
return new AminoDocAuth(
account.algo,
offlineSigner,
account.address,
account.algo,
account.pubkey,
offlineSigner
);
});
}

static async fromGeneralOfflineSigner(offlineSigner: IAminoGeneralOfflineSigner) {
static async fromGenericOfflineSigner(offlineSigner: IAminoGenericOfflineSigner) {
if(offlineSigner.signMode !== SIGN_MODE.AMINO) {
throw new Error('not an amino general offline signer');
}
Expand All @@ -75,15 +58,15 @@ export class AminoDocAuth extends BaseDocAuth<OfflineAminoSigner | IAminoGeneral

return accounts.map((account) => {
return new AminoDocAuth(
account.algo,
account.address,
account.pubkey,
{
getAccounts: offlineSigner.getAccounts,
signAmino(signerAddress: string, signDoc: CosmosAminoDoc) {
return offlineSigner.sign({ signerAddress, signDoc }) as Promise<AminoSignResponse>;
}
}
},
account.address,
account.algo,
account.pubkey,
);
});
}
Expand All @@ -92,7 +75,11 @@ export class AminoDocAuth extends BaseDocAuth<OfflineAminoSigner | IAminoGeneral
/**
* a helper class to sign the SignDoc with Direct encoding using offline signer.
*/
export class DirectDocAuth extends BaseDocAuth<OfflineDirectSigner | IDirectGeneralOfflineSigner, SignDoc> {
export class DirectDocAuth extends BaseDocAuth<OfflineDirectSigner | IDirectGenericOfflineSigner, SignDoc> {
getPublicKey(): IKey {
return Key.from(this.pubkey);
}

async signDoc(doc: SignDoc): Promise<SignDocResponse<SignDoc>> {
// let resp = await this.offlineSigner.signDirect(this.address, doc);
let resp;
Expand All @@ -117,15 +104,15 @@ export class DirectDocAuth extends BaseDocAuth<OfflineDirectSigner | IDirectGene

return accounts.map((account) => {
return new DirectDocAuth(
account.algo,
offlineSigner,
account.address,
account.algo,
account.pubkey,
offlineSigner
);
});
}

static async fromGeneralOfflineSigner(offlineSigner: IDirectGeneralOfflineSigner) {
static async fromGenericOfflineSigner(offlineSigner: IDirectGenericOfflineSigner) {
if(offlineSigner.signMode !== SIGN_MODE.DIRECT) {
throw new Error('not a direct general offline signer');
}
Expand All @@ -134,15 +121,15 @@ export class DirectDocAuth extends BaseDocAuth<OfflineDirectSigner | IDirectGene

return accounts.map((account) => {
return new DirectDocAuth(
account.algo,
account.address,
account.pubkey,
{
getAccounts: offlineSigner.getAccounts,
signDirect(signerAddress: string, signDoc: CosmosDirectDoc) {
return offlineSigner.sign({ signerAddress, signDoc }) as Promise<DirectSignResponse>;
}
}
},
account.address,
account.algo,
account.pubkey,
);
});
}
Expand Down
17 changes: 7 additions & 10 deletions networks/cosmos/src/types/signer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ import {
CreateDocResponse,
HttpEndpoint,
IAccount,
IGeneralOfflineSigner,
IGenericOfflineSigner,
IKey,
Price,
SignerConfig,
StdFee,
StdSignDoc,
UniSigner,
IApiClient
} from '@interchainjs/types';
import { Event } from '@interchainjs/types';
import { AccountBase } from '@interchainjs/types/account';
Expand Down Expand Up @@ -188,8 +189,8 @@ export type TxOptions = {
/**
* Query client ops for cosmos chains
*/
export interface QueryClient {
readonly endpoint: HttpEndpoint;
export interface QueryClient extends IApiClient<Uint8Array, BroadcastResponse, BroadcastOptions>{
readonly endpoint: string | HttpEndpoint;
getChainId: () => Promise<string>;
getAccountNumber: (address: string) => Promise<bigint>;
getSequence: (address: string) => Promise<bigint>;
Expand All @@ -199,10 +200,6 @@ export interface QueryClient {
txBody: TxBody,
signerInfos: SignerInfo[]
) => Promise<SimulateResponse>;
broadcast: (
txBytes: Uint8Array,
options?: BroadcastOptions
) => Promise<BroadcastResponse>;
}

/**
Expand All @@ -227,7 +224,7 @@ export type UniCosmosBaseSigner<SignDoc> = UniSigner<
CosmosSignArgs,
CosmosTx,
SignDoc,
Promise<string>,
string,
BroadcastResponse
>;

Expand All @@ -238,7 +235,7 @@ export type CosmosDirectSigner = UniSigner<
CosmosSignArgs,
CosmosTx,
CosmosDirectDoc,
Promise<string>,
string,
BroadcastResponse
>;
/**
Expand All @@ -248,7 +245,7 @@ export type CosmosAminoSigner = UniSigner<
CosmosSignArgs,
CosmosTx,
CosmosAminoDoc,
Promise<string>,
string,
BroadcastResponse
>;

Expand Down
Loading
Loading