Skip to content
Draft
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: 3 additions & 1 deletion packages/hdwallet-vultisig/src/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ export class VultisigAdapter {
const bitcoinProvider = window.vultisig?.bitcoin;
const solanaProvider = window.vultisig?.solana;
const thorchainProvider = window.vultisig?.keplr;
const mayachainProvider = window.vultisig?.keplr;
const cosmosProvider = window.vultisig?.keplr;

if (!evmProvider || !bitcoinProvider || !solanaProvider || !thorchainProvider || !cosmosProvider) {
if (!evmProvider || !bitcoinProvider || !solanaProvider || !thorchainProvider || !mayachainProvider || !cosmosProvider) {
window.open("https://vultisig.com/", "_blank");
console.error("Please install Vultisig!");
throw new Error("Vultisig provider not found");
Expand All @@ -60,6 +61,7 @@ export class VultisigAdapter {
bitcoinProvider,
solanaProvider,
thorchainProvider,
mayachainProvider,
cosmosProvider,
});
await wallet.initialize();
Expand Down
43 changes: 43 additions & 0 deletions packages/hdwallet-vultisig/src/mayachain.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { StdTx } from "@cosmjs/amino";
import { SignerData } from "@cosmjs/stargate";
import {
CosmosAccountPath,
CosmosGetAccountPaths,
CosmosSignedTx,
CosmosSignTx,
slip44ByCoin,
} from "@shapeshiftoss/hdwallet-core";
import { sign } from "@shapeshiftoss/proto-tx-builder";

import { VultisigOfflineProvider } from "./types";

export function mayachainGetAccountPaths(msg: CosmosGetAccountPaths): Array<CosmosAccountPath> {
return [
{
addressNList: [0x80000000 + 44, 0x80000000 + slip44ByCoin("Mayachain"), 0x80000000 + msg.accountIdx, 0, 0],
},
];
}

export async function mayachainGetAddress(provider: VultisigOfflineProvider): Promise<string | undefined> {
const offlineSigner = provider.getOfflineSigner("mayachain-mainnet-v1");
const accounts = await offlineSigner.getAccounts();
return accounts[0].address;
}

export async function mayachainSignTx(provider: VultisigOfflineProvider, msg: CosmosSignTx): Promise<CosmosSignedTx> {
const offlineSigner = provider.getOfflineSigner(msg.chain_id);

const address = await mayachainGetAddress(provider);
if (!address) throw new Error("failed to get address");

const signerData: SignerData = {
sequence: Number(msg.sequence),
accountNumber: Number(msg.account_number),
chainId: msg.chain_id,
};

const result = await sign(address, msg.tx as StdTx, offlineSigner, signerData, "maya");

return result;
}
1 change: 1 addition & 0 deletions packages/hdwallet-vultisig/src/vultisig.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ describe("VultisigHDWallet", () => {
bitcoinProvider: core.untouchable("VultisigHDWallet:provider"),
solanaProvider: core.untouchable("VultisigHDWallet:provider"),
thorchainProvider: core.untouchable("VultisigHDWallet:provider"),
mayachainProvider: core.untouchable("VultisigHDWallet:provider"),
cosmosProvider: core.untouchable("VultisigHDWallet:provider"),
});
});
Expand Down
31 changes: 30 additions & 1 deletion packages/hdwallet-vultisig/src/vultisig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import isObject from "lodash/isObject";
import * as btc from "./bitcoin";
import * as cosmos from "./cosmos";
import * as eth from "./ethereum";
import * as mayachain from "./mayachain";
import { solanaSendTx, solanaSignTx } from "./solana";
import * as thorchain from "./thorchain";
import { VultisigEvmProvider, VultisigOfflineProvider, VultisigSolanaProvider, VultisigUtxoProvider } from "./types";
Expand All @@ -23,13 +24,15 @@ export class VultisigHDWalletInfo
core.ETHWalletInfo,
core.SolanaWalletInfo,
core.ThorchainWalletInfo,
core.MayachainWalletInfo,
core.CosmosWalletInfo
{
// TODO(gomes): turn me back once signPSBT is fixed upstream
readonly _supportsBTCInfo = false;
readonly _supportsETHInfo = true;
readonly _supportsSolanaInfo = true;
readonly _supportsThorchainInfo = true;
readonly _supportsMayachainInfo = true;
readonly _supportsCosmosInfo = true;

constructor() {}
Expand Down Expand Up @@ -92,6 +95,8 @@ export class VultisigHDWalletInfo
return core.cosmosDescribePath(msg.path);
case "thorchain":
return core.thorchainDescribePath(msg.path);
case "mayachain":
return core.mayachainDescribePath(msg.path);
default:
throw new Error(`Unsupported path for coin: ${msg.coin}`);
}
Expand Down Expand Up @@ -184,6 +189,15 @@ export class VultisigHDWalletInfo
throw new Error("Method not implemented.");
}

public mayachainGetAccountPaths(msg: core.MayachainGetAccountPaths): Array<core.MayachainAccountPath> {
return mayachain.mayachainGetAccountPaths(msg);
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars
public mayachainNextAccountPath(msg: core.MayachainAccountPath): core.MayachainAccountPath | undefined {
throw new Error("Method not implemented.");
}

public cosmosGetAccountPaths(msg: core.CosmosGetAccountPaths): Array<core.CosmosAccountPath> {
return cosmos.cosmosGetAccountPaths(msg);
}
Expand All @@ -196,7 +210,7 @@ export class VultisigHDWalletInfo

export class VultisigHDWallet
extends VultisigHDWalletInfo
implements core.HDWallet, core.BTCWallet, core.ETHWallet, core.SolanaWallet, core.ThorchainWallet, core.CosmosWallet
implements core.HDWallet, core.BTCWallet, core.ETHWallet, core.SolanaWallet, core.ThorchainWallet, core.MayachainWallet, core.CosmosWallet
{
// TODO(gomes): turn me back once signPSBT is fixed upstream
readonly _supportsBTC = false;
Expand All @@ -212,13 +226,15 @@ export class VultisigHDWallet
readonly _supportsBSC = true;
readonly _supportsSolana = true;
readonly _supportsThorchain = true;
readonly _supportsMayachain = true;
readonly _supportsCosmos = true;
readonly _isVultisig = true;

evmProvider: VultisigEvmProvider;
bitcoinProvider: VultisigUtxoProvider;
solanaProvider: VultisigSolanaProvider;
thorchainProvider: VultisigOfflineProvider;
mayachainProvider: VultisigOfflineProvider;
cosmosProvider: VultisigOfflineProvider;

ethAddress?: Address | null;
Expand All @@ -228,6 +244,7 @@ export class VultisigHDWallet
bitcoinProvider: VultisigUtxoProvider;
solanaProvider: VultisigSolanaProvider;
thorchainProvider: VultisigOfflineProvider;
mayachainProvider: VultisigOfflineProvider;
cosmosProvider: VultisigOfflineProvider;
}) {
super();
Expand All @@ -236,6 +253,7 @@ export class VultisigHDWallet
this.bitcoinProvider = providers.bitcoinProvider;
this.solanaProvider = providers.solanaProvider;
this.thorchainProvider = providers.thorchainProvider;
this.mayachainProvider = providers.mayachainProvider;
this.cosmosProvider = providers.cosmosProvider;
}

Expand Down Expand Up @@ -446,6 +464,17 @@ export class VultisigHDWallet
return thorchain.thorchainSignTx(this.thorchainProvider, msg);
}

/** Mayachain */

public async mayachainGetAddress(): Promise<string | null> {
const address = await mayachain.mayachainGetAddress(this.mayachainProvider);
return address || null;
}

public async mayachainSignTx(msg: core.MayachainSignTx): Promise<core.MayachainSignedTx | null> {
return mayachain.mayachainSignTx(this.mayachainProvider, msg);
}

/** Cosmos */

public async cosmosGetAddress(): Promise<string | null> {
Expand Down