@cosmos-kit/keplr-extension
Version:
cosmos-kit wallet connector
139 lines (138 loc) • 5.02 kB
JavaScript
import { chainRegistryChainToKeplr } from '@chain-registry/keplr';
import Long from 'long';
import { ExpiringLocalStorage } from './session';
export class KeplrClient {
client;
_defaultSignOptions = {
preferNoSetFee: false,
preferNoSetMemo: true,
disableBalanceCheck: true,
};
get defaultSignOptions() {
return this._defaultSignOptions;
}
setDefaultSignOptions(options) {
this._defaultSignOptions = options;
}
constructor(client) {
this.client = client;
}
async enable(chainIds) {
await this.client.enable(chainIds);
}
async suggestToken({ chainId, tokens, type }) {
if (type === 'cw20') {
for (const { contractAddress, viewingKey } of tokens) {
await this.client.suggestToken(chainId, contractAddress, viewingKey);
}
}
}
async getSimpleAccount(chainId) {
const { address, username } = await this.getAccount(chainId);
return {
namespace: 'cosmos',
chainId,
address,
username,
};
}
async getAccount(chainId) {
const key = await this.client.getKey(chainId);
return {
username: key.name,
address: key.bech32Address,
algo: key.algo,
pubkey: key.pubKey,
isNanoLedger: key.isNanoLedger,
};
}
getOfflineSigner(chainId, preferredSignType) {
switch (preferredSignType) {
case 'amino':
return this.getOfflineSignerAmino(chainId);
case 'direct':
return this.getOfflineSignerDirect(chainId);
default:
return this.getOfflineSignerAmino(chainId);
}
// return this.client.getOfflineSignerAuto(chainId);
}
getOfflineSignerAmino(chainId) {
return {
getAccounts: async () => {
return [await this.getAccount(chainId)];
},
signAmino: async (signerAddress, signDoc) => {
return this.signAmino(chainId, signerAddress, signDoc, this.defaultSignOptions);
},
};
// return this.client.getOfflineSignerOnlyAmino(chainId);
}
getOfflineSignerDirect(chainId) {
return {
getAccounts: async () => {
return [await this.getAccount(chainId)];
},
signDirect: async (signerAddress, signDoc) => {
const resp = await this.signDirect(chainId, signerAddress, signDoc, this.defaultSignOptions);
return {
...resp,
signed: {
...resp.signed,
accountNumber: BigInt(resp.signed.accountNumber.toString()),
},
};
},
};
// return this.client.getOfflineSigner(chainId) as OfflineDirectSigner;
}
async addChain(chainInfo) {
// TODO later allow walletInfo getter to be available here
// make this more generic
const chainsAlreadyAdded = ExpiringLocalStorage.getItems('cosmos-kit@2:keplr/supported-chain');
if (chainsAlreadyAdded && chainsAlreadyAdded.length > 0) {
if (chainsAlreadyAdded.includes(chainInfo.name)) {
return;
}
}
const suggestChain = chainRegistryChainToKeplr(chainInfo.chain, chainInfo.assetList ? [chainInfo.assetList] : []);
if (chainInfo.preferredEndpoints?.rest?.[0]) {
suggestChain.rest =
chainInfo.preferredEndpoints?.rest?.[0];
}
if (chainInfo.preferredEndpoints?.rpc?.[0]) {
suggestChain.rpc =
chainInfo.preferredEndpoints?.rpc?.[0];
}
try {
await this.client.experimentalSuggestChain(suggestChain);
ExpiringLocalStorage.addItem('cosmos-kit@2:keplr/supported-chain', chainInfo.name, 1000 * 60);
}
catch (error) {
console.log('Error while adding chain', error);
throw error;
}
}
async signAmino(chainId, signer, signDoc, signOptions) {
return await this.client.signAmino(chainId, signer, signDoc, signOptions || this.defaultSignOptions);
}
async signArbitrary(chainId, signer, data) {
return await this.client.signArbitrary(chainId, signer, data);
}
async signDirect(chainId, signer, signDoc, signOptions) {
const resp = await this.client.signDirect(chainId, signer, {
...signDoc,
accountNumber: Long.fromString(signDoc.accountNumber.toString()),
}, signOptions || this.defaultSignOptions);
return {
...resp,
signed: {
...resp.signed,
accountNumber: BigInt(resp.signed.accountNumber.toString()),
},
};
}
async sendTx(chainId, tx, mode) {
return await this.client.sendTx(chainId, tx, mode);
}
}