diff --git a/examples/sandbox/package.json b/examples/sandbox/package.json index 4287d9082..126eaddde 100644 --- a/examples/sandbox/package.json +++ b/examples/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-sandbox", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "private": true, "browserslist": "> 0.5%, last 2 versions, not dead", @@ -12,24 +12,24 @@ "dependencies": { "@esm2cjs/p-queue": "^7.3.0", "@metamask/eth-sig-util": "^7.0.0", - "@shapeshiftoss/hdwallet-coinbase": "1.62.13", - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey-webusb": "1.62.13", - "@shapeshiftoss/hdwallet-keplr": "1.62.13", - "@shapeshiftoss/hdwallet-ledger": "1.62.13", - "@shapeshiftoss/hdwallet-ledger-webhid": "1.62.13", - "@shapeshiftoss/hdwallet-ledger-webusb": "1.62.13", - "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.13", - "@shapeshiftoss/hdwallet-native": "1.62.13", - "@shapeshiftoss/hdwallet-phantom": "1.62.13", - "@shapeshiftoss/hdwallet-portis": "1.62.13", - "@shapeshiftoss/hdwallet-trezor": "1.62.13", - "@shapeshiftoss/hdwallet-trezor-connect": "1.62.13", - "@shapeshiftoss/hdwallet-vultisig": "1.62.13", - "@shapeshiftoss/hdwallet-walletconnect": "1.62.13", - "@shapeshiftoss/hdwallet-walletconnectv2": "1.62.13", + "@shapeshiftoss/hdwallet-coinbase": "1.62.14", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey-webusb": "1.62.14", + "@shapeshiftoss/hdwallet-keplr": "1.62.14", + "@shapeshiftoss/hdwallet-ledger": "1.62.14", + "@shapeshiftoss/hdwallet-ledger-webhid": "1.62.14", + "@shapeshiftoss/hdwallet-ledger-webusb": "1.62.14", + "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.14", + "@shapeshiftoss/hdwallet-native": "1.62.14", + "@shapeshiftoss/hdwallet-phantom": "1.62.14", + "@shapeshiftoss/hdwallet-portis": "1.62.14", + "@shapeshiftoss/hdwallet-trezor": "1.62.14", + "@shapeshiftoss/hdwallet-trezor-connect": "1.62.14", + "@shapeshiftoss/hdwallet-vultisig": "1.62.14", + "@shapeshiftoss/hdwallet-walletconnect": "1.62.14", + "@shapeshiftoss/hdwallet-walletconnectv2": "1.62.14", "bip32": "^2.0.4", "eip-712": "^1.0.0", "jquery": "^3.7.1", diff --git a/integration/package.json b/integration/package.json index c253e75bc..026fe7784 100644 --- a/integration/package.json +++ b/integration/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/integration", - "version": "1.62.13", + "version": "1.62.14", "main": "index.js", "license": "MIT", "private": true, @@ -11,16 +11,16 @@ }, "dependencies": { "@bitcoinerlab/secp256k1": "^1.1.1", - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey-nodewebusb": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.13", - "@shapeshiftoss/hdwallet-ledger": "1.62.13", - "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.13", - "@shapeshiftoss/hdwallet-native": "1.62.13", - "@shapeshiftoss/hdwallet-portis": "1.62.13", - "@shapeshiftoss/hdwallet-trezor": "1.62.13", - "@shapeshiftoss/hdwallet-vultisig": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey-nodewebusb": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.14", + "@shapeshiftoss/hdwallet-ledger": "1.62.14", + "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.14", + "@shapeshiftoss/hdwallet-native": "1.62.14", + "@shapeshiftoss/hdwallet-portis": "1.62.14", + "@shapeshiftoss/hdwallet-trezor": "1.62.14", + "@shapeshiftoss/hdwallet-vultisig": "1.62.14", "fast-json-stable-stringify": "^2.1.0", "msw": "^0.27.1", "whatwg-fetch": "^3.6.2" diff --git a/lerna.json b/lerna.json index 1f0603047..309a5eaad 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "5.2.0", - "version": "1.62.13", + "version": "1.62.14", "npmClient": "yarn", "useWorkspaces": true, "command": { diff --git a/packages/hdwallet-coinbase/package.json b/packages/hdwallet-coinbase/package.json index 9cf1f8b9f..330419a39 100644 --- a/packages/hdwallet-coinbase/package.json +++ b/packages/hdwallet-coinbase/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-coinbase", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@coinbase/wallet-sdk": "^3.6.6", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "eth-rpc-errors": "^4.0.3", "lodash": "^4.17.21" }, diff --git a/packages/hdwallet-core/package.json b/packages/hdwallet-core/package.json index 763d0d3b3..040d8b002 100644 --- a/packages/hdwallet-core/package.json +++ b/packages/hdwallet-core/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-core", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" diff --git a/packages/hdwallet-core/src/index.ts b/packages/hdwallet-core/src/index.ts index dfc01046c..77b3b4357 100644 --- a/packages/hdwallet-core/src/index.ts +++ b/packages/hdwallet-core/src/index.ts @@ -18,6 +18,7 @@ export * from "./terra"; export * from "./thorchain"; export * from "./solana"; export * from "./transport"; +export * from "./tron"; export * from "./utils"; export * from "./utxoUtils"; export * from "./wallet"; diff --git a/packages/hdwallet-core/src/tron.ts b/packages/hdwallet-core/src/tron.ts new file mode 100644 index 000000000..beefee33e --- /dev/null +++ b/packages/hdwallet-core/src/tron.ts @@ -0,0 +1,87 @@ +import { addressNListToBIP32, slip44ByCoin } from "./utils"; +import { BIP32Path, HDWallet, HDWalletInfo, PathDescription } from "./wallet"; + +export interface TronGetAddress { + addressNList: BIP32Path; + showDisplay?: boolean; + pubKey?: string; +} + +export interface TronSignTx { + addressNList: BIP32Path; + /** Raw transaction data in hex format */ + rawDataHex: string; +} + +export interface TronSignedTx { + serialized: string; + signature: string; +} + +export interface TronTxSignature { + signature: string; +} + +export interface TronGetAccountPaths { + accountIdx: number; +} + +export interface TronAccountPath { + addressNList: BIP32Path; +} + +export interface TronWalletInfo extends HDWalletInfo { + readonly _supportsTronInfo: boolean; + + /** + * Returns a list of bip32 paths for a given account index in preferred order + * from most to least preferred. + */ + tronGetAccountPaths(msg: TronGetAccountPaths): Array; + + /** + * Returns the "next" account path, if any. + */ + tronNextAccountPath(msg: TronAccountPath): TronAccountPath | undefined; +} + +export interface TronWallet extends TronWalletInfo, HDWallet { + readonly _supportsTron: boolean; + + tronGetAddress(msg: TronGetAddress): Promise; + tronGetAddresses?(msgs: TronGetAddress[]): Promise; + tronSignTx(msg: TronSignTx): Promise; + tronSendTx?(msg: TronSignTx): Promise; +} + +export function tronDescribePath(path: BIP32Path): PathDescription { + const pathStr = addressNListToBIP32(path); + const unknown: PathDescription = { + verbose: pathStr, + coin: "Tron", + isKnown: false, + }; + + if (path.length != 5) return unknown; + if (path[0] != 0x80000000 + 44) return unknown; + if (path[1] != 0x80000000 + slip44ByCoin("Tron")) return unknown; + if ((path[2] & 0x80000000) >>> 0 !== 0x80000000) return unknown; + if (path[3] !== 0) return unknown; + if (path[4] !== 0) return unknown; + + const index = path[2] & 0x7fffffff; + return { + verbose: `Tron Account #${index}`, + accountIdx: index, + wholeAccount: true, + coin: "Tron", + isKnown: true, + }; +} + +// The standard BIP44 derivation path for Tron is: m/44'/195'/'/0/0 +// https://github.com/tronprotocol/tips/issues/102 +export function tronGetAccountPaths(msg: TronGetAccountPaths): Array { + const slip44 = slip44ByCoin("Tron"); + return [{ addressNList: [0x80000000 + 44, 0x80000000 + slip44, 0x80000000 + msg.accountIdx, 0, 0] }]; +} diff --git a/packages/hdwallet-core/src/utils.ts b/packages/hdwallet-core/src/utils.ts index 919302b0e..cb085715a 100644 --- a/packages/hdwallet-core/src/utils.ts +++ b/packages/hdwallet-core/src/utils.ts @@ -156,6 +156,7 @@ export const slip44Table = Object.freeze({ Terra: 330, Kava: 459, Solana: 501, + Tron: 195, // EVM chains all use the same SLIP44 Ethereum: 60, Avalanche: 60, diff --git a/packages/hdwallet-core/src/wallet.ts b/packages/hdwallet-core/src/wallet.ts index c66d4bc60..65c2fb133 100644 --- a/packages/hdwallet-core/src/wallet.ts +++ b/packages/hdwallet-core/src/wallet.ts @@ -16,6 +16,7 @@ import { SolanaWallet, SolanaWalletInfo } from "./solana"; import { TerraWallet, TerraWalletInfo } from "./terra"; import { ThorchainWallet, ThorchainWalletInfo } from "./thorchain"; import { Transport } from "./transport"; +import { TronWallet, TronWalletInfo } from "./tron"; export type BIP32Path = Array; @@ -257,6 +258,14 @@ export function infoSolana(info: HDWalletInfo): info is SolanaWalletInfo { return isObject(info) && (info as any)._supportsSolanaInfo; } +export function supportsTron(wallet: HDWallet): wallet is TronWallet { + return isObject(wallet) && (wallet as any)._supportsTron; +} + +export function infoTron(info: HDWalletInfo): info is TronWalletInfo { + return isObject(info) && (info as any)._supportsTronInfo; +} + export function supportsDebugLink(wallet: HDWallet): wallet is DebugLinkWallet { return isObject(wallet) && (wallet as any)._supportsDebugLink; } diff --git a/packages/hdwallet-gridplus/package.json b/packages/hdwallet-gridplus/package.json index 15e1fdda4..5f4ff9533 100644 --- a/packages/hdwallet-gridplus/package.json +++ b/packages/hdwallet-gridplus/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-gridplus", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -20,7 +20,7 @@ "@ethereumjs/rlp": "5.0.2", "@ethereumjs/tx": "5.4.0", "@metamask/eth-sig-util": "^7.0.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "bech32": "^1.1.4", "bs58": "^5.0.0", "crypto-js": "^4.2.0", diff --git a/packages/hdwallet-keepkey-chromeusb/package.json b/packages/hdwallet-keepkey-chromeusb/package.json index 86b7569c4..65e91b108 100644 --- a/packages/hdwallet-keepkey-chromeusb/package.json +++ b/packages/hdwallet-keepkey-chromeusb/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-chromeusb", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13" + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14" } } diff --git a/packages/hdwallet-keepkey-electron/package.json b/packages/hdwallet-keepkey-electron/package.json index 4be06f9e2..ddb01a4e7 100644 --- a/packages/hdwallet-keepkey-electron/package.json +++ b/packages/hdwallet-keepkey-electron/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-electron", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-keepkey": "1.62.13", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14", "uuid": "^8.3.2" }, "peerDependencies": { diff --git a/packages/hdwallet-keepkey-nodehid/package.json b/packages/hdwallet-keepkey-nodehid/package.json index 764b74f7a..be4e5ba79 100644 --- a/packages/hdwallet-keepkey-nodehid/package.json +++ b/packages/hdwallet-keepkey-nodehid/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-nodehid", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-keepkey": "1.62.13" + "@shapeshiftoss/hdwallet-keepkey": "1.62.14" }, "peerDependencies": { "node-hid": "^2.1.1" diff --git a/packages/hdwallet-keepkey-nodewebusb/package.json b/packages/hdwallet-keepkey-nodewebusb/package.json index 81dfab1a9..9a2cf0b27 100644 --- a/packages/hdwallet-keepkey-nodewebusb/package.json +++ b/packages/hdwallet-keepkey-nodewebusb/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-nodewebusb", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13" + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14" }, "peerDependencies": { "usb": "^2.3.1" diff --git a/packages/hdwallet-keepkey-tcp/package.json b/packages/hdwallet-keepkey-tcp/package.json index d2cd20397..b257739be 100644 --- a/packages/hdwallet-keepkey-tcp/package.json +++ b/packages/hdwallet-keepkey-tcp/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-tcp", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14", "axios": "^0.21.1" } } diff --git a/packages/hdwallet-keepkey-webusb/package.json b/packages/hdwallet-keepkey-webusb/package.json index 8105575cc..27fb356c0 100644 --- a/packages/hdwallet-keepkey-webusb/package.json +++ b/packages/hdwallet-keepkey-webusb/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey-webusb", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-keepkey": "1.62.13" + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-keepkey": "1.62.14" }, "devDependencies": { "@types/w3c-web-usb": "^1.0.4" diff --git a/packages/hdwallet-keepkey/package.json b/packages/hdwallet-keepkey/package.json index cf762570e..df6f1677b 100644 --- a/packages/hdwallet-keepkey/package.json +++ b/packages/hdwallet-keepkey/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -21,7 +21,7 @@ "@keepkey/device-protocol": "7.13.4", "@metamask/eth-sig-util": "^7.0.0", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@shapeshiftoss/proto-tx-builder": "0.10.0", "bignumber.js": "^9.0.1", "bnb-javascript-sdk-nobroadcast": "2.16.15", diff --git a/packages/hdwallet-keplr/package.json b/packages/hdwallet-keplr/package.json index 45f885737..147a3cf37 100644 --- a/packages/hdwallet-keplr/package.json +++ b/packages/hdwallet-keplr/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keplr", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -17,7 +17,7 @@ "@cosmjs/amino": "^0.28.13", "@cosmjs/stargate": "^0.28.13", "@shapeshiftoss/caip": "8.15.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@shapeshiftoss/proto-tx-builder": "0.10.0", "@shapeshiftoss/types": "3.1.3", "base64-js": "^1.5.1", diff --git a/packages/hdwallet-ledger-webhid/package.json b/packages/hdwallet-ledger-webhid/package.json index 4baa1b279..3bf6e5b6d 100644 --- a/packages/hdwallet-ledger-webhid/package.json +++ b/packages/hdwallet-ledger-webhid/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-ledger-webhid", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -18,8 +18,8 @@ "@ledgerhq/hw-app-eth": "^6.45.13", "@ledgerhq/hw-transport": "6.31.8", "@ledgerhq/hw-transport-webhid": "^6.30.4", - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-ledger": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-ledger": "1.62.14", "@types/w3c-web-hid": "^1.0.2" } } diff --git a/packages/hdwallet-ledger-webusb/package.json b/packages/hdwallet-ledger-webusb/package.json index 124340e27..377113a6a 100644 --- a/packages/hdwallet-ledger-webusb/package.json +++ b/packages/hdwallet-ledger-webusb/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-ledger-webusb", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -20,8 +20,8 @@ "@ledgerhq/hw-app-solana": "^7.5.1", "@ledgerhq/hw-transport": "6.31.8", "@ledgerhq/hw-transport-webusb": "6.29.8", - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-ledger": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-ledger": "1.62.14", "@types/w3c-web-usb": "^1.0.4", "p-queue": "^7.4.1" }, diff --git a/packages/hdwallet-ledger/package.json b/packages/hdwallet-ledger/package.json index 1fa0b727c..5134a5374 100644 --- a/packages/hdwallet-ledger/package.json +++ b/packages/hdwallet-ledger/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-ledger", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -25,7 +25,7 @@ "@ledgerhq/hw-transport": "6.31.8", "@ledgerhq/logs": "6.13.0", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@solana/web3.js": "1.95.8", "base64-js": "^1.5.1", "bchaddrjs": "^0.4.4", diff --git a/packages/hdwallet-metamask-multichain/package.json b/packages/hdwallet-metamask-multichain/package.json index 5d2364dd4..c9395b224 100644 --- a/packages/hdwallet-metamask-multichain/package.json +++ b/packages/hdwallet-metamask-multichain/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-metamask-multichain", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -17,7 +17,7 @@ "@metamask/detect-provider": "^1.2.0", "@metamask/onboarding": "^1.0.1", "@shapeshiftoss/common-api": "^9.3.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@shapeshiftoss/metamask-snaps-adapter": "^1.0.12", "@shapeshiftoss/metamask-snaps-types": "^1.0.12", "eth-rpc-errors": "^4.0.3", diff --git a/packages/hdwallet-native-vault/package.json b/packages/hdwallet-native-vault/package.json index 24c95d23f..b7b14ab64 100644 --- a/packages/hdwallet-native-vault/package.json +++ b/packages/hdwallet-native-vault/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-native-vault", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@bitcoinerlab/secp256k1": "^1.1.1", - "@shapeshiftoss/hdwallet-native": "1.62.13", + "@shapeshiftoss/hdwallet-native": "1.62.14", "bip39": "^3.0.4", "hash-wasm": "^4.11.0", "idb-keyval": "^6.0.3", diff --git a/packages/hdwallet-native/package.json b/packages/hdwallet-native/package.json index cd2f8d63a..f3cab4f12 100644 --- a/packages/hdwallet-native/package.json +++ b/packages/hdwallet-native/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-native", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -17,7 +17,7 @@ "@bitcoinerlab/secp256k1": "^1.1.1", "@noble/curves": "^1.4.0", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@shapeshiftoss/proto-tx-builder": "0.10.0", "@zxing/text-encoding": "^0.9.0", "bchaddrjs": "^0.4.9", diff --git a/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts b/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts index cf5d6f5b2..20183756e 100644 --- a/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts +++ b/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts @@ -6,3 +6,4 @@ export { default as Binance } from "./binance"; export { default as Cosmos } from "./cosmos"; export { default as CosmosDirect } from "./cosmosDirect"; export { default as Solana } from "./solana"; +export { default as Tron } from "./tron"; diff --git a/packages/hdwallet-native/src/crypto/isolation/adapters/tron.ts b/packages/hdwallet-native/src/crypto/isolation/adapters/tron.ts new file mode 100644 index 000000000..19afa6fe8 --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/adapters/tron.ts @@ -0,0 +1,69 @@ +import { keccak256 } from "@ethersproject/keccak256"; +import * as core from "@shapeshiftoss/hdwallet-core"; +import * as bs58check from "bs58check"; + +import { Isolation } from "../.."; +import { SecP256K1 } from "../core"; + +const TRON_ADDRESS_PREFIX = 0x41; + +export class TronAdapter { + protected readonly nodeAdapter: Isolation.Adapters.BIP32; + + constructor(nodeAdapter: Isolation.Adapters.BIP32) { + this.nodeAdapter = nodeAdapter; + } + + /** + * Get TRON address from BIP32 path + * Address generation: + * 1. Get uncompressed public key (65 bytes) + * 2. Remove first byte (0x04) + * 3. Hash with Keccak256 + * 4. Take last 20 bytes + * 5. Prepend 0x41 + * 6. Base58check encode + */ + async getAddress(addressNList: core.BIP32Path): Promise { + const nodeAdapter = await this.nodeAdapter.derivePath(core.addressNListToBIP32(addressNList)); + const publicKey = SecP256K1.UncompressedPoint.from(nodeAdapter.getPublicKey()); + + // Remove the 0x04 prefix from uncompressed public key + const publicKeyBytes = publicKey.slice(1); + + // Hash with Keccak256 + const hash = keccak256("0x" + Buffer.from(publicKeyBytes).toString("hex")); + + // Take last 20 bytes and prepend 0x41 (TRON prefix) + const addressBytes = Buffer.concat([Buffer.from([TRON_ADDRESS_PREFIX]), Buffer.from(hash.slice(-40), "hex")]); + + // Base58check encode + return bs58check.encode(addressBytes); + } + + /** + * Sign TRON transaction + * Transaction signing: + * 1. Get raw transaction hex + * 2. Hash with SHA256 (NOT Keccak256) + * 3. Sign with secp256k1 + * 4. Return hex signature + */ + async signTransaction(rawDataHex: string, addressNList: core.BIP32Path): Promise { + const nodeAdapter = await this.nodeAdapter.derivePath(core.addressNListToBIP32(addressNList)); + const txBuf = Buffer.from(rawDataHex, "hex"); + + // TRON uses SHA256 for transaction signing + const recoverableSig = await SecP256K1.RecoverableSignature.signCanonically(nodeAdapter.node, "sha256", txBuf); + + const sig = SecP256K1.RecoverableSignature.sig(recoverableSig); + const recoveryParam = SecP256K1.RecoverableSignature.recoveryParam(recoverableSig); + + // Concatenate signature (64 bytes) + recovery param (1 byte) + const fullSig = core.compatibleBufferConcat([sig, Buffer.from([recoveryParam])]); + + return fullSig.toString("hex"); + } +} + +export default TronAdapter; diff --git a/packages/hdwallet-native/src/native.ts b/packages/hdwallet-native/src/native.ts index 730fd73bf..eb0488643 100644 --- a/packages/hdwallet-native/src/native.ts +++ b/packages/hdwallet-native/src/native.ts @@ -18,6 +18,7 @@ import { MixinNativeSecretWallet, MixinNativeSecretWalletInfo } from "./secret"; import { MixinNativeSolanaWallet, MixinNativeSolanaWalletInfo } from "./solana"; import { MixinNativeTerraWallet, MixinNativeTerraWalletInfo } from "./terra"; import { MixinNativeThorchainWallet, MixinNativeThorchainWalletInfo } from "./thorchain"; +import { MixinNativeTronWallet, MixinNativeTronWalletInfo } from "./tron"; export enum NativeEvents { MNEMONIC_REQUIRED = "MNEMONIC_REQUIRED", @@ -126,12 +127,14 @@ class NativeHDWalletInfo MixinNativeCosmosWalletInfo( MixinNativeBinanceWalletInfo( MixinNativeSolanaWalletInfo( - MixinNativeThorchainWalletInfo( - MixinNativeMayachainWalletInfo( - MixinNativeSecretWalletInfo( - MixinNativeTerraWalletInfo( - MixinNativeKavaWalletInfo( - MixinNativeArkeoWalletInfo(MixinNativeOsmosisWalletInfo(NativeHDWalletBase)) + MixinNativeTronWalletInfo( + MixinNativeThorchainWalletInfo( + MixinNativeMayachainWalletInfo( + MixinNativeSecretWalletInfo( + MixinNativeTerraWalletInfo( + MixinNativeKavaWalletInfo( + MixinNativeArkeoWalletInfo(MixinNativeOsmosisWalletInfo(NativeHDWalletBase)) + ) ) ) ) @@ -149,6 +152,7 @@ class NativeHDWalletInfo core.CosmosWalletInfo, core.BinanceWalletInfo, core.SolanaWalletInfo, + core.TronWalletInfo, core.ThorchainWalletInfo, core.MayachainWalletInfo, core.SecretWalletInfo, @@ -203,6 +207,9 @@ class NativeHDWalletInfo return core.osmosisDescribePath(msg.path); case "arkeo": return core.arkeoDescribePath(msg.path); + case "tron": + case "trx": + return core.tronDescribePath(msg.path); default: throw new Error("Unsupported path"); } @@ -215,11 +222,13 @@ export class NativeHDWallet MixinNativeCosmosWallet( MixinNativeBinanceWallet( MixinNativeSolanaWallet( - MixinNativeThorchainWallet( - MixinNativeMayachainWallet( - MixinNativeSecretWallet( - MixinNativeTerraWallet( - MixinNativeKavaWallet(MixinNativeOsmosisWallet(MixinNativeArkeoWallet(NativeHDWalletInfo))) + MixinNativeTronWallet( + MixinNativeThorchainWallet( + MixinNativeMayachainWallet( + MixinNativeSecretWallet( + MixinNativeTerraWallet( + MixinNativeKavaWallet(MixinNativeOsmosisWallet(MixinNativeArkeoWallet(NativeHDWalletInfo))) + ) ) ) ) @@ -236,6 +245,7 @@ export class NativeHDWallet core.CosmosWallet, core.BinanceWallet, core.SolanaWallet, + core.TronWallet, core.ThorchainWallet, core.MayachainWallet, core.SecretWallet, @@ -359,6 +369,7 @@ export class NativeHDWallet super.cosmosInitializeWallet(secp256k1MasterKey), super.osmosisInitializeWallet(secp256k1MasterKey), super.binanceInitializeWallet(secp256k1MasterKey), + super.tronInitializeWallet(secp256k1MasterKey), super.thorchainInitializeWallet(secp256k1MasterKey), super.mayachainInitializeWallet(secp256k1MasterKey), super.secretInitializeWallet(secp256k1MasterKey), @@ -412,6 +423,7 @@ export class NativeHDWallet super.cosmosWipe(); super.osmosisWipe(); super.binanceWipe(); + super.tronWipe(); super.thorchainWipe(); super.mayachainWipe(); super.secretWipe(); diff --git a/packages/hdwallet-native/src/tron.ts b/packages/hdwallet-native/src/tron.ts new file mode 100644 index 000000000..b660ead47 --- /dev/null +++ b/packages/hdwallet-native/src/tron.ts @@ -0,0 +1,67 @@ +import * as core from "@shapeshiftoss/hdwallet-core"; + +import { Isolation } from "./crypto"; +import { TronAdapter } from "./crypto/isolation/adapters/tron"; +import { NativeHDWalletBase } from "./native"; + +export function MixinNativeTronWalletInfo>(Base: TBase) { + // eslint-disable-next-line @typescript-eslint/no-shadow + return class MixinNativeTronWalletInfo extends Base implements core.TronWalletInfo { + readonly _supportsTronInfo = true; + + tronGetAccountPaths(msg: core.TronGetAccountPaths): Array { + return core.tronGetAccountPaths(msg); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + tronNextAccountPath(msg: core.TronAccountPath): core.TronAccountPath | undefined { + throw new Error("Method not implemented"); + } + }; +} + +export function MixinNativeTronWallet>(Base: TBase) { + // eslint-disable-next-line @typescript-eslint/no-shadow + return class MixinNativeTronWallet extends Base { + readonly _supportsTron = true; + + tronAdapter: TronAdapter | undefined; + + async tronInitializeWallet(masterKey: Isolation.Core.BIP32.Node): Promise { + const nodeAdapter = await Isolation.Adapters.BIP32.create(masterKey); + this.tronAdapter = new TronAdapter(nodeAdapter); + } + + tronWipe() { + this.tronAdapter = undefined; + } + + async tronGetAddress(msg: core.TronGetAddress): Promise { + return this.needsMnemonic(!!this.tronAdapter, () => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return this.tronAdapter!.getAddress(msg.addressNList); + }); + } + + async tronSignTx(msg: core.TronSignTx): Promise { + return this.needsMnemonic(!!this.tronAdapter, async () => { + const address = await this.tronGetAddress({ + addressNList: msg.addressNList, + showDisplay: false, + }); + + if (!address) throw new Error("Failed to get TRON address"); + + const signature = await this.tronAdapter!.signTransaction(msg.rawDataHex, msg.addressNList); + + // Serialized transaction = rawDataHex + signature + const serialized = msg.rawDataHex + signature; + + return { + serialized, + signature, + }; + }); + } + }; +} diff --git a/packages/hdwallet-phantom/package.json b/packages/hdwallet-phantom/package.json index 3c6cd6314..4b7ed28ab 100644 --- a/packages/hdwallet-phantom/package.json +++ b/packages/hdwallet-phantom/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-phantom", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@solana/web3.js": "1.95.8", "base64-js": "^1.5.1", "bitcoinjs-message": "^2.0.0", diff --git a/packages/hdwallet-portis/package.json b/packages/hdwallet-portis/package.json index 0a5557a41..4d890b475 100644 --- a/packages/hdwallet-portis/package.json +++ b/packages/hdwallet-portis/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-portis", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -16,7 +16,7 @@ "dependencies": { "@portis/web3": "3.0.10", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "base64-js": "^1.5.1", "bip32": "^2.0.4", "bitcoinjs-message": "^2.1.0", diff --git a/packages/hdwallet-trezor-connect/package.json b/packages/hdwallet-trezor-connect/package.json index 06ef733a8..13f6f5edc 100644 --- a/packages/hdwallet-trezor-connect/package.json +++ b/packages/hdwallet-trezor-connect/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-trezor-connect", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", - "@shapeshiftoss/hdwallet-trezor": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", + "@shapeshiftoss/hdwallet-trezor": "1.62.14", "@trezor/connect-web": "^9.6.4" } } diff --git a/packages/hdwallet-trezor/package.json b/packages/hdwallet-trezor/package.json index 3e6bf2fe1..700f6f07b 100644 --- a/packages/hdwallet-trezor/package.json +++ b/packages/hdwallet-trezor/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-trezor", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -17,7 +17,7 @@ "dependencies": { "@ethereumjs/common": "3.2.0", "@ethereumjs/tx": "4.2.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "base64-js": "^1.5.1", "bchaddrjs": "^0.4.4", "lodash": "^4.17.21" diff --git a/packages/hdwallet-vultisig/package.json b/packages/hdwallet-vultisig/package.json index ce054ec88..721377176 100644 --- a/packages/hdwallet-vultisig/package.json +++ b/packages/hdwallet-vultisig/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-vultisig", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -17,7 +17,7 @@ "@cosmjs/amino": "^0.28.13", "@cosmjs/stargate": "^0.28.13", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.0", - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@solana/web3.js": "1.95.8", "base64-js": "^1.5.1", "bitcoinjs-message": "^2.0.0", diff --git a/packages/hdwallet-walletconnect/package.json b/packages/hdwallet-walletconnect/package.json index efc71df25..5d2d3b539 100644 --- a/packages/hdwallet-walletconnect/package.json +++ b/packages/hdwallet-walletconnect/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-walletconnect", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@walletconnect/qrcode-modal": "^1.7.8", "@walletconnect/web3-provider": "^1.7.8", "ethers": "^5.6.5" diff --git a/packages/hdwallet-walletconnectV2/package.json b/packages/hdwallet-walletconnectV2/package.json index 04e682d86..2ffd65e0f 100644 --- a/packages/hdwallet-walletconnectV2/package.json +++ b/packages/hdwallet-walletconnectV2/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-walletconnectv2", - "version": "1.62.13", + "version": "1.62.14", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ "prepublishOnly": "rm -rf dist && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.13", + "@shapeshiftoss/hdwallet-core": "1.62.14", "@walletconnect/ethereum-provider": "^2.20.2", "@walletconnect/modal": "^2.6.2", "ethers": "^5.6.5"