diff --git a/examples/sandbox/package.json b/examples/sandbox/package.json index 39d58fcb8..1cef67cf1 100644 --- a/examples/sandbox/package.json +++ b/examples/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-sandbox", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "private": true, "browserslist": "> 0.5%, last 2 versions, not dead", @@ -12,25 +12,25 @@ "dependencies": { "@esm2cjs/p-queue": "^7.3.0", "@metamask/eth-sig-util": "^7.0.0", - "@shapeshiftoss/hdwallet-coinbase": "1.62.32", - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-gridplus": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey-webusb": "1.62.32", - "@shapeshiftoss/hdwallet-keplr": "1.62.32", - "@shapeshiftoss/hdwallet-ledger": "1.62.32", - "@shapeshiftoss/hdwallet-ledger-webhid": "1.62.32", - "@shapeshiftoss/hdwallet-ledger-webusb": "1.62.32", - "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.32", - "@shapeshiftoss/hdwallet-native": "1.62.32", - "@shapeshiftoss/hdwallet-phantom": "1.62.32", - "@shapeshiftoss/hdwallet-portis": "1.62.32", - "@shapeshiftoss/hdwallet-trezor": "1.62.32", - "@shapeshiftoss/hdwallet-trezor-connect": "1.62.32", - "@shapeshiftoss/hdwallet-vultisig": "1.62.32", - "@shapeshiftoss/hdwallet-walletconnect": "1.62.32", - "@shapeshiftoss/hdwallet-walletconnectv2": "1.62.32", + "@shapeshiftoss/hdwallet-coinbase": "1.62.33", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-gridplus": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey-webusb": "1.62.33", + "@shapeshiftoss/hdwallet-keplr": "1.62.33", + "@shapeshiftoss/hdwallet-ledger": "1.62.33", + "@shapeshiftoss/hdwallet-ledger-webhid": "1.62.33", + "@shapeshiftoss/hdwallet-ledger-webusb": "1.62.33", + "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.33", + "@shapeshiftoss/hdwallet-native": "1.62.33", + "@shapeshiftoss/hdwallet-phantom": "1.62.33", + "@shapeshiftoss/hdwallet-portis": "1.62.33", + "@shapeshiftoss/hdwallet-trezor": "1.62.33", + "@shapeshiftoss/hdwallet-trezor-connect": "1.62.33", + "@shapeshiftoss/hdwallet-vultisig": "1.62.33", + "@shapeshiftoss/hdwallet-walletconnect": "1.62.33", + "@shapeshiftoss/hdwallet-walletconnectv2": "1.62.33", "bip32": "^2.0.4", "eip-712": "^1.0.0", "jquery": "^3.7.1", diff --git a/integration/package.json b/integration/package.json index c8a4fa42b..ec5344522 100644 --- a/integration/package.json +++ b/integration/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/integration", - "version": "1.62.32", + "version": "1.62.33", "main": "index.js", "license": "MIT", "private": true, @@ -12,16 +12,16 @@ "dependencies": { "@bitcoinerlab/secp256k1": "^1.1.1", "@bitgo/utxo-lib": "^11.18.0", - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey-nodewebusb": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.32", - "@shapeshiftoss/hdwallet-ledger": "1.62.32", - "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.32", - "@shapeshiftoss/hdwallet-native": "1.62.32", - "@shapeshiftoss/hdwallet-portis": "1.62.32", - "@shapeshiftoss/hdwallet-trezor": "1.62.32", - "@shapeshiftoss/hdwallet-vultisig": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey-nodewebusb": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey-tcp": "1.62.33", + "@shapeshiftoss/hdwallet-ledger": "1.62.33", + "@shapeshiftoss/hdwallet-metamask-multichain": "1.62.33", + "@shapeshiftoss/hdwallet-native": "1.62.33", + "@shapeshiftoss/hdwallet-portis": "1.62.33", + "@shapeshiftoss/hdwallet-trezor": "1.62.33", + "@shapeshiftoss/hdwallet-vultisig": "1.62.33", "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 aeb48107e..58af82508 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "5.2.0", - "version": "1.62.32", + "version": "1.62.33", "npmClient": "yarn", "useWorkspaces": true, "command": { diff --git a/packages/hdwallet-coinbase/package.json b/packages/hdwallet-coinbase/package.json index 13f68ca69..fc2d978ba 100644 --- a/packages/hdwallet-coinbase/package.json +++ b/packages/hdwallet-coinbase/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-coinbase", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@coinbase/wallet-sdk": "^3.6.6", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "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 40ec47a78..1bce7adfe 100644 --- a/packages/hdwallet-core/package.json +++ b/packages/hdwallet-core/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-core", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" diff --git a/packages/hdwallet-core/src/index.ts b/packages/hdwallet-core/src/index.ts index 706b7b199..b87836bc2 100644 --- a/packages/hdwallet-core/src/index.ts +++ b/packages/hdwallet-core/src/index.ts @@ -17,6 +17,7 @@ export * from "./secret"; export * from "./terra"; export * from "./thorchain"; export * from "./solana"; +export * from "./starknet"; export * from "./sui"; export * from "./transport"; export * from "./tron"; diff --git a/packages/hdwallet-core/src/starknet.ts b/packages/hdwallet-core/src/starknet.ts new file mode 100644 index 000000000..519b841c1 --- /dev/null +++ b/packages/hdwallet-core/src/starknet.ts @@ -0,0 +1,73 @@ +import { addressNListToBIP32, slip44ByCoin } from "./utils"; +import { BIP32Path, HDWallet, HDWalletInfo, PathDescription } from "./wallet"; + +export interface StarknetGetAddress { + addressNList: BIP32Path; + showDisplay?: boolean; +} + +export interface StarknetGetPublicKey { + addressNList: BIP32Path; +} + +export interface StarknetSignTx { + addressNList: BIP32Path; + txHash: string; +} + +export interface StarknetSignedTx { + signature: string[]; +} + +export interface StarknetGetAccountPaths { + accountIdx: number; +} + +export interface StarknetAccountPath { + addressNList: BIP32Path; +} + +export interface StarknetWalletInfo extends HDWalletInfo { + readonly _supportsStarknetInfo: boolean; + + starknetGetAccountPaths(msg: StarknetGetAccountPaths): Array; + starknetNextAccountPath(msg: StarknetAccountPath): StarknetAccountPath | undefined; +} + +export interface StarknetWallet extends StarknetWalletInfo, HDWallet { + readonly _supportsStarknet: boolean; + + starknetGetAddress(msg: StarknetGetAddress): Promise; + starknetGetPublicKey(msg: StarknetGetPublicKey): Promise; + starknetSignTx(msg: StarknetSignTx): Promise; +} + +export function starknetDescribePath(path: BIP32Path): PathDescription { + const pathStr = addressNListToBIP32(path); + const unknown: PathDescription = { + verbose: pathStr, + coin: "Starknet", + isKnown: false, + }; + + if (path.length != 5) return unknown; + if (path[0] != 0x80000000 + 44) return unknown; + if (path[1] != 0x80000000 + slip44ByCoin("Starknet")) 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: `Starknet Account #${index}`, + accountIdx: index, + wholeAccount: true, + coin: "Starknet", + isKnown: true, + }; +} + +export function starknetGetAccountPaths(msg: StarknetGetAccountPaths): Array { + const slip44 = slip44ByCoin("Starknet"); + 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 08ecc2a48..6d4516507 100644 --- a/packages/hdwallet-core/src/utils.ts +++ b/packages/hdwallet-core/src/utils.ts @@ -157,6 +157,7 @@ export const slip44Table = Object.freeze({ Terra: 330, Kava: 459, Solana: 501, + Starknet: 9004, Tron: 195, Sui: 784, // EVM chains all use the same SLIP44 diff --git a/packages/hdwallet-core/src/wallet.ts b/packages/hdwallet-core/src/wallet.ts index 677ee32dc..f5fc66056 100644 --- a/packages/hdwallet-core/src/wallet.ts +++ b/packages/hdwallet-core/src/wallet.ts @@ -13,6 +13,7 @@ import { OsmosisWallet, OsmosisWalletInfo } from "./osmosis"; import { RippleWallet, RippleWalletInfo } from "./ripple"; import { SecretWallet, SecretWalletInfo } from "./secret"; import { SolanaWallet, SolanaWalletInfo } from "./solana"; +import { StarknetWallet, StarknetWalletInfo } from "./starknet"; import { SuiWallet, SuiWalletInfo } from "./sui"; import { TerraWallet, TerraWalletInfo } from "./terra"; import { ThorchainWallet, ThorchainWalletInfo } from "./thorchain"; @@ -271,6 +272,14 @@ export function infoSolana(info: HDWalletInfo): info is SolanaWalletInfo { return isObject(info) && (info as any)._supportsSolanaInfo; } +export function supportsStarknet(wallet: HDWallet): wallet is StarknetWallet { + return isObject(wallet) && (wallet as any)._supportsStarknet; +} + +export function infoStarknet(info: HDWalletInfo): info is StarknetWalletInfo { + return isObject(info) && (info as any)._supportsStarknetInfo; +} + export function supportsTron(wallet: HDWallet): wallet is TronWallet { return isObject(wallet) && (wallet as any)._supportsTron; } diff --git a/packages/hdwallet-gridplus/package.json b/packages/hdwallet-gridplus/package.json index ede6140d8..9d4a1ba32 100644 --- a/packages/hdwallet-gridplus/package.json +++ b/packages/hdwallet-gridplus/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-gridplus", - "version": "1.62.32", + "version": "1.62.33", "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.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "bech32": "^1.1.4", "bs58": "^5.0.0", "bs58check": "^4.0.0", diff --git a/packages/hdwallet-keepkey-chromeusb/package.json b/packages/hdwallet-keepkey-chromeusb/package.json index 142436cd6..b7ea931ff 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32" + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33" } } diff --git a/packages/hdwallet-keepkey-electron/package.json b/packages/hdwallet-keepkey-electron/package.json index 18b382225..8b93c2f25 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-keepkey": "1.62.32", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33", "uuid": "^8.3.2" }, "peerDependencies": { diff --git a/packages/hdwallet-keepkey-nodehid/package.json b/packages/hdwallet-keepkey-nodehid/package.json index 83c67c24e..beac61907 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,7 +14,7 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-keepkey": "1.62.32" + "@shapeshiftoss/hdwallet-keepkey": "1.62.33" }, "peerDependencies": { "node-hid": "^2.1.1" diff --git a/packages/hdwallet-keepkey-nodewebusb/package.json b/packages/hdwallet-keepkey-nodewebusb/package.json index 297edba22..e7dadd535 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32" + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33" }, "peerDependencies": { "usb": "^2.3.1" diff --git a/packages/hdwallet-keepkey-tcp/package.json b/packages/hdwallet-keepkey-tcp/package.json index 743bfc49d..f6761ce48 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33", "axios": "^0.21.1" } } diff --git a/packages/hdwallet-keepkey-webusb/package.json b/packages/hdwallet-keepkey-webusb/package.json index 90cae6d05..8dc64f515 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-keepkey": "1.62.32" + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-keepkey": "1.62.33" }, "devDependencies": { "@types/w3c-web-usb": "^1.0.4" diff --git a/packages/hdwallet-keepkey/package.json b/packages/hdwallet-keepkey/package.json index a0d6dab14..ee735a731 100644 --- a/packages/hdwallet-keepkey/package.json +++ b/packages/hdwallet-keepkey/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keepkey", - "version": "1.62.32", + "version": "1.62.33", "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.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 7a8b2a51b..1916c0cb0 100644 --- a/packages/hdwallet-keplr/package.json +++ b/packages/hdwallet-keplr/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-keplr", - "version": "1.62.32", + "version": "1.62.33", "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.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 ce9b77f42..39b4b006e 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -18,8 +18,8 @@ "@ledgerhq/hw-app-eth": "7.0.0", "@ledgerhq/hw-transport": "6.31.13", "@ledgerhq/hw-transport-webhid": "6.30.6", - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-ledger": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-ledger": "1.62.33", "@types/w3c-web-hid": "^1.0.2" } } diff --git a/packages/hdwallet-ledger-webusb/package.json b/packages/hdwallet-ledger-webusb/package.json index 3f04547d8..4c2f44d8b 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -20,8 +20,8 @@ "@ledgerhq/hw-app-solana": "7.6.0", "@ledgerhq/hw-transport": "6.31.13", "@ledgerhq/hw-transport-webusb": "6.29.13", - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-ledger": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-ledger": "1.62.33", "@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 8024e48c3..907741f8b 100644 --- a/packages/hdwallet-ledger/package.json +++ b/packages/hdwallet-ledger/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-ledger", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -28,7 +28,7 @@ "@ledgerhq/logs": "6.13.0", "@mysten/ledgerjs-hw-app-sui": "^0.7.0", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 814f5b66f..aee9ab2d6 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.32", + "version": "1.62.33", "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.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 89b5ca9df..c12e3b85b 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@bitcoinerlab/secp256k1": "^1.1.1", - "@shapeshiftoss/hdwallet-native": "1.62.32", + "@shapeshiftoss/hdwallet-native": "1.62.33", "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 59ab6c3ad..b2eb371bc 100644 --- a/packages/hdwallet-native/package.json +++ b/packages/hdwallet-native/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-native", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -16,8 +16,9 @@ "dependencies": { "@bitcoinerlab/secp256k1": "^1.1.1", "@noble/curves": "^1.4.0", + "@scure/starknet": "^1.0.0", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@shapeshiftoss/proto-tx-builder": "0.10.0", "@zxing/text-encoding": "^0.9.0", "bchaddrjs": "^0.4.9", @@ -38,6 +39,7 @@ "node-fetch": "^2.6.1", "p-lazy": "^3.1.0", "scrypt-js": "^3.0.1", + "starknet": "^6.11.0", "tendermint-tx-builder": "1.0.16" }, "devDependencies": { diff --git a/packages/hdwallet-native/src/adapter.ts b/packages/hdwallet-native/src/adapter.ts index f3ce19805..9603997bc 100644 --- a/packages/hdwallet-native/src/adapter.ts +++ b/packages/hdwallet-native/src/adapter.ts @@ -3,6 +3,21 @@ import * as core from "@shapeshiftoss/hdwallet-core"; import * as Isolation from "./crypto/isolation"; import * as native from "./native"; +/** + * NativeAdapter arguments + * + * Supports two initialization modes: + * 1. From mnemonic: Wallet derives all master keys (secp256k1, ed25519, stark) + * 2. From master keys: Externally-provided master keys for each curve type + * + * MASTER KEY TYPES: + * - secp256k1MasterKey: For Bitcoin, Ethereum, Tron, Cosmos chains + * - ed25519MasterKey: For Solana, Sui chains + * - starkMasterKey: For Starknet (uses STARK curve, separate from secp256k1) + * + * Note: Starknet uses secp256k1 BIP32 derivation math but STARK curve for signing, + * requiring a separate master key type. See engines/default/stark.ts for details. + */ export type NativeAdapterArgs = { deviceId: string; } & ( @@ -10,11 +25,13 @@ export type NativeAdapterArgs = { mnemonic?: string | Isolation.Core.BIP39.Mnemonic; secp256k1MasterKey?: never; ed25519MasterKey?: never; + starkMasterKey?: never; } | { mnemonic?: never; secp256k1MasterKey?: Isolation.Core.BIP32.Node; ed25519MasterKey?: Isolation.Core.Ed25519.Node; + starkMasterKey?: Isolation.Core.Stark.Node; } ); diff --git a/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts b/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts index 0858fdedc..3ad44c0ed 100644 --- a/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts +++ b/packages/hdwallet-native/src/crypto/isolation/adapters/index.ts @@ -1,10 +1,12 @@ export { default as Bitcoin } from "./bitcoin"; export { default as BIP32 } from "./bip32"; export { default as Ed25519 } from "./ed25519"; +export { default as Stark } from "./stark"; export { default as Ethereum } from "./ethereum"; 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"; +export { default as Starknet } from "./starknet"; export { default as Sui } from "./sui"; +export { default as Tron } from "./tron"; diff --git a/packages/hdwallet-native/src/crypto/isolation/adapters/stark.ts b/packages/hdwallet-native/src/crypto/isolation/adapters/stark.ts new file mode 100644 index 000000000..af6cdfab5 --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/adapters/stark.ts @@ -0,0 +1,43 @@ +import { Stark } from "../core"; + +/** + * Stark curve adapter for Starknet + * + * Simple wrapper around Stark.Node providing derivation utilities. + * The Stark Node handles all Starknet-specific operations (key grinding, + * STARK curve public keys, and ECDSA signing on STARK curve). + * + * STARK Curve Specifications: + * - Curve type: Weierstrass (y² = x³ + ax + b) + * - Prime field (p): 2^251 + 17×2^192 + 1 (251-bit) + * - Curve parameters: a = 1, b = π (3141592...) + * - Curve order (n): 252-bit + * + * References: + * - STARK Curve Spec: https://docs.starkware.co/starkex/crypto/stark-curve.html + * - Key Derivation: https://docs.starkware.co/starkex/crypto/key-derivation.html + * - Account Standard: https://community.starknet.io/t/account-keys-and-addresses-derivation-standard/1230 + * - Starknet Cryptography: https://docs.starknet.io/architecture/cryptography/ + * - @scure/starknet: https://github.com/paulmillr/scure-starknet + */ +export class StarkAdapter { + readonly node: Stark.Node; + + constructor(node: Stark.Node) { + this.node = node; + } + + async getPublicKey(): Promise { + return this.node.getPublicKey(); + } + + async derive(index: number): Promise { + return new StarkAdapter(await this.node.derive(index)) as this; + } + + async derivePath(path: string): Promise { + return Stark.derivePath(this, path); + } +} + +export default StarkAdapter; diff --git a/packages/hdwallet-native/src/crypto/isolation/adapters/starknet.ts b/packages/hdwallet-native/src/crypto/isolation/adapters/starknet.ts new file mode 100644 index 000000000..ab970686d --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/adapters/starknet.ts @@ -0,0 +1,92 @@ +import * as core from "@shapeshiftoss/hdwallet-core"; +import { CallData, hash } from "starknet"; + +import { Isolation } from "../.."; + +/** + * Starknet adapter using Stark curve engine + * + * Uses dedicated Stark engine with STARK curve operations instead of + * polluting the generic BIP32 secp256k1 engine with chain-specific code. + * + * ACCOUNT ABSTRACTION: + * All Starknet accounts are smart contracts (no EOAs). The account address is computed from: + * - Account contract class hash (OpenZeppelin, Argent, Braavos implementations) + * - Constructor calldata (including public key) + * - Salt (typically the public key) + * - Deployer address (0 for counterfactual deployment) + * + * DERIVATION PATH: + * Uses BIP-44 format: m/44'/9004'/accountIdx'/0/0 + * - SLIP-044 coin type: 9004 (Starknet) + * - Community consensus: BIP-44 preferred over EIP-2645 + * - See: https://community.starknet.io/t/account-keys-and-addresses-derivation-standard/1230 + * + * REFERENCES: + * - Starknet Account Architecture: https://docs.starknet.io/architecture/accounts/ + * - Account Abstraction Part I: https://medium.com/starknet-edu/account-abstraction-on-starknet-part-i-2ff84c6a3c30 + * - Account Abstraction Part II: https://medium.com/starknet-edu/account-abstraction-on-starknet-part-ii-24d52874e0bd + * - Account Creation Guide: https://starknetjs.com/docs/guides/create_account/ + * - OpenZeppelin Accounts: https://docs.openzeppelin.com/contracts-cairo/0.14.0/accounts + * - SLIP-044 Registry: https://github.com/satoshilabs/slips/blob/master/slip-0044.md + */ +export class StarknetAdapter { + protected readonly nodeAdapter: Isolation.Adapters.Stark; + + // OpenZeppelin account v0.15.0-rc.0 class hash (used by most wallets) + // See: https://docs.openzeppelin.com/contracts-cairo/0.14.0/accounts + private readonly OZ_ACCOUNT_CLASS_HASH = "0x05b4b537eaa2399e3aa99c4e2e0208ebd6c71bc1467938cd52c798c601e43564"; + + constructor(nodeAdapter: Isolation.Adapters.Stark) { + this.nodeAdapter = nodeAdapter; + } + + /** + * Get Starknet public key from BIP32 path + */ + async getPublicKey(addressNList: core.BIP32Path): Promise { + const bip32Path = core.addressNListToBIP32(addressNList); + const nodeAdapter = await this.nodeAdapter.derivePath(bip32Path); + const publicKey = await nodeAdapter.getPublicKey(); + return publicKey; + } + + /** + * Get Starknet address from BIP32 path + * Computes the counterfactual contract address using OpenZeppelin account implementation + */ + async getAddress(addressNList: core.BIP32Path): Promise { + const bip32Path = core.addressNListToBIP32(addressNList); + const nodeAdapter = await this.nodeAdapter.derivePath(bip32Path); + const publicKey = await nodeAdapter.getPublicKey(); + + // Compute actual contract address using OpenZeppelin account contract + const constructorCalldata = CallData.compile({ publicKey }); + const contractAddress = hash.calculateContractAddressFromHash( + publicKey, + this.OZ_ACCOUNT_CLASS_HASH, + constructorCalldata, + 0 + ); + + // Ensure contract address is zero-padded to 64 hex chars (Starknet spec) + const paddedAddress = contractAddress.startsWith("0x") + ? "0x" + contractAddress.slice(2).padStart(64, "0") + : "0x" + contractAddress.padStart(64, "0"); + + return paddedAddress; + } + + /** + * Sign Starknet transaction + * Starknet uses ECDSA on the STARK curve for transaction signing + */ + async signTransaction(txHash: string, addressNList: core.BIP32Path): Promise { + const bip32Path = core.addressNListToBIP32(addressNList); + const nodeAdapter = await this.nodeAdapter.derivePath(bip32Path); + const signature = await nodeAdapter.node.sign(txHash); + return [signature.r, signature.s]; + } +} + +export default StarknetAdapter; diff --git a/packages/hdwallet-native/src/crypto/isolation/core/bip32/interfaces.ts b/packages/hdwallet-native/src/crypto/isolation/core/bip32/interfaces.ts index 680df615e..4c5857a50 100644 --- a/packages/hdwallet-native/src/crypto/isolation/core/bip32/interfaces.ts +++ b/packages/hdwallet-native/src/crypto/isolation/core/bip32/interfaces.ts @@ -1,12 +1,13 @@ import * as core from "@shapeshiftoss/hdwallet-core"; -import { BIP32, Ed25519, Revocable } from ".."; +import { BIP32, Ed25519, Revocable, Stark } from ".."; import * as SecP256K1 from "../secp256k1"; import { ChainCode } from "."; export interface Seed extends Partial { toSecp256k1MasterKey(): Promise; toEd25519MasterKey(): Promise; + toStarkMasterKey(): Promise; } export interface Node extends Partial, SecP256K1.ECDSAKey, Partial { diff --git a/packages/hdwallet-native/src/crypto/isolation/core/index.ts b/packages/hdwallet-native/src/crypto/isolation/core/index.ts index 20cad8086..87f66b738 100644 --- a/packages/hdwallet-native/src/crypto/isolation/core/index.ts +++ b/packages/hdwallet-native/src/crypto/isolation/core/index.ts @@ -3,6 +3,7 @@ export * as BIP39 from "./bip39"; export * as Digest from "./digest"; export * as SecP256K1 from "./secp256k1"; export * as Ed25519 from "./ed25519"; +export * as Stark from "./stark"; export class IsolationError extends Error { constructor(name: string) { diff --git a/packages/hdwallet-native/src/crypto/isolation/core/stark/index.ts b/packages/hdwallet-native/src/crypto/isolation/core/stark/index.ts new file mode 100644 index 000000000..fa928439f --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/core/stark/index.ts @@ -0,0 +1,2 @@ +export { derivePath } from "../bip32"; +export * from "./interfaces"; diff --git a/packages/hdwallet-native/src/crypto/isolation/core/stark/interfaces.ts b/packages/hdwallet-native/src/crypto/isolation/core/stark/interfaces.ts new file mode 100644 index 000000000..aca290f3d --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/core/stark/interfaces.ts @@ -0,0 +1,40 @@ +import { Revocable } from ".."; +import { ChainCode } from "../bip32"; + +/** + * Stark curve Node interface for Starknet + * + * OVERVIEW: + * Implements hierarchical deterministic key derivation for Starknet using the STARK curve. + * Uses standard BIP32 secp256k1 derivation math (per SLIP-0010 and industry standard), + * then applies Starknet-specific key grinding for public key generation and signing. + * + * STARK CURVE: + * - Weierstrass curve: y² = x³ + ax + b (mod p) + * - Prime field: p = 2^251 + 17×2^192 + 1 (251-bit, not 256-bit like secp256k1) + * - Parameters: a = 1, b = π + * - Different from secp256k1, requires separate implementation + * - Spec: https://docs.starkware.co/starkex/crypto/stark-curve.html + * + * KEY METHODS: + * - getPublicKey(): Returns Stark public key (after grinding) as hex string + * - sign(): ECDSA signature on STARK curve, returns {r, s} with 64-char hex padding + * - derive(): BIP32 child key derivation using secp256k1 field arithmetic + * + * REFERENCES: + * - STARK Curve: https://docs.starkware.co/starkex/crypto/stark-curve.html + * - Key Grinding: https://docs.starkware.co/starkex/crypto/key-derivation.html + * - Starknet Cryptography: https://docs.starknet.io/architecture/cryptography/ + * - SLIP-0010: https://github.com/satoshilabs/slips/blob/master/slip-0010.md + */ +export interface Node extends Partial { + readonly explicitPath?: string; + /** Get Stark public key (applies key grinding, returns hex string) */ + getPublicKey(): Promise; + /** Get BIP32 chain code for derivation */ + getChainCode(): Promise; + /** Derive child key using BIP32 secp256k1 math (per industry standard) */ + derive(index: number): Promise; + /** Sign transaction hash on STARK curve (returns padded 64-char hex r,s) */ + sign(txHash: string): Promise<{ r: string; s: string }>; +} diff --git a/packages/hdwallet-native/src/crypto/isolation/engines/default/bip32.ts b/packages/hdwallet-native/src/crypto/isolation/engines/default/bip32.ts index 6d967019b..4d0e0479b 100644 --- a/packages/hdwallet-native/src/crypto/isolation/engines/default/bip32.ts +++ b/packages/hdwallet-native/src/crypto/isolation/engines/default/bip32.ts @@ -5,6 +5,7 @@ import { Core } from "../../../isolation"; import { assertType, ByteArray, checkType, safeBufferFrom, Uint32 } from "../../types"; import * as Ed25519 from "./ed25519"; import { Revocable, revocable } from "./revocable"; +import * as Stark from "./stark"; export * from "../../core/bip32"; @@ -184,4 +185,29 @@ export class Seed extends Revocable(class {}) implements Core.BIP32.Seed { this.addRevoker(() => out.revoke?.()); return out; } + + /** + * Create Stark master key for Starknet + * + * Uses "Bitcoin seed" HMAC key per SLIP-0010 because Starknet follows the + * industry standard of using secp256k1 BIP32 derivation math, then applying + * Stark-specific operations (grinding, STARK curve signing) only at the end. + * + * This matches implementations by Argent and Ledger. + * + * References: + * - https://github.com/argentlabs/argent-starknet-recover/blob/main/keyDerivation.ts + * - https://community.starknet.io/t/account-keys-and-addresses-derivation-standard/1230 + */ + async toStarkMasterKey(): Promise { + // Use "Bitcoin seed" per SLIP-0010 standard for secp256k1-based derivation + // Starknet uses standard BIP32 secp256k1 derivation, then applies grinding + const hmacKey = safeBufferFrom(new TextEncoder().encode("Bitcoin seed")); + const I = safeBufferFrom(bip32crypto.hmacSHA512(safeBufferFrom(hmacKey), this.#seed)); + const IL = I.subarray(0, 32); + const IR = I.subarray(32, 64); + const out = await Stark.Node.create(IL, IR); + this.addRevoker(() => out.revoke?.()); + return out; + } } diff --git a/packages/hdwallet-native/src/crypto/isolation/engines/default/index.ts b/packages/hdwallet-native/src/crypto/isolation/engines/default/index.ts index d949e6862..660e67da0 100644 --- a/packages/hdwallet-native/src/crypto/isolation/engines/default/index.ts +++ b/packages/hdwallet-native/src/crypto/isolation/engines/default/index.ts @@ -1,4 +1,5 @@ export * as BIP32 from "./bip32"; export * as BIP39 from "./bip39"; export * as ED25519 from "./ed25519"; +export * as Stark from "./stark"; export * from "./revocable"; diff --git a/packages/hdwallet-native/src/crypto/isolation/engines/default/stark.ts b/packages/hdwallet-native/src/crypto/isolation/engines/default/stark.ts new file mode 100644 index 000000000..358567b76 --- /dev/null +++ b/packages/hdwallet-native/src/crypto/isolation/engines/default/stark.ts @@ -0,0 +1,132 @@ +import ecc from "@bitcoinerlab/secp256k1"; +import * as starknet from "@scure/starknet"; +import * as bip32crypto from "bip32/src/crypto"; + +import { Core } from "../../../isolation"; +import { ByteArray, checkType, safeBufferFrom, Uint32 } from "../../types"; +import { Revocable, revocable } from "./revocable"; + +export * from "../../core/stark"; + +/** + * Stark curve Node for Starknet + * + * DERIVATION APPROACH: + * Uses standard BIP32 secp256k1 derivation (same as Bitcoin/Ethereum) per SLIP-0010, + * then applies Starknet-specific key grinding and uses STARK curve for final operations. + * + * This matches industry standard implementations (Argent, Ledger) which derive using + * secp256k1 BIP32 math, then apply grinding for Stark operations. + * + * STARK CURVE SPECIFICATIONS: + * - Type: Weierstrass elliptic curve (y² = x³ + ax + b) + * - Prime field (p): 2^251 + 17×2^192 + 1 = 3618502788666131213697322783095070105623107215331596699973092056135872020481 + * - Curve order (n): 3618502788666131213697322783095070105526743751716087489154079457884512865583 + * - Parameters: a = 1, b = 3141592653589793238462643383279502884197169399375105820974944592307816406665 + * - Bit length: 252 bits (vs 256 for secp256k1) + * - Generator: (874739451078007766457464989774322083649278607533249481151382481072868806602, 152666792071518830868575557812948353041420400780739481342941381225525861407) + * + * KEY GRINDING: + * Starknet requires "key grinding" to ensure derived private keys fall within the STARK curve order. + * The grinding algorithm iteratively hashes until finding a valid key: hash(key||i) mod stark_order. + * See: https://docs.starkware.co/starkex/crypto/key-derivation.html + * + * REFERENCES: + * - STARK Curve: https://docs.starkware.co/starkex/crypto/stark-curve.html + * - Key Derivation: https://docs.starkware.co/starkex/crypto/key-derivation.html + * - Community Standard (BIP-44 preferred): https://community.starknet.io/t/account-keys-and-addresses-derivation-standard/1230 + * - Starknet Cryptography: https://docs.starknet.io/architecture/cryptography/ + * - SLIP-0010 (HD wallet standard): https://github.com/satoshilabs/slips/blob/master/slip-0010.md + * - @scure/starknet (implementation): https://github.com/paulmillr/scure-starknet + * - Argent reference: https://github.com/argentlabs/argent-starknet-recover/blob/main/keyDerivation.ts + */ +export class Node extends Revocable(class {}) implements Core.Stark.Node { + readonly #privateKey: Buffer & ByteArray<32>; + readonly chainCode: Buffer & Core.BIP32.ChainCode; + readonly explicitPath?: string; + + protected constructor(privateKey: Uint8Array, chainCode: Uint8Array, explicitPath?: string) { + super(); + // We avoid handing the private key to any non-platform code -- including our type-checking machinery. + if (privateKey.length !== 32) throw new Error("bad private key length"); + this.#privateKey = safeBufferFrom(privateKey) as Buffer & ByteArray<32>; + this.addRevoker(() => this.#privateKey.fill(0)); + this.chainCode = safeBufferFrom(checkType(Core.BIP32.ChainCode, chainCode)) as Buffer & Core.BIP32.ChainCode; + this.explicitPath = explicitPath; + } + + static async create(privateKey: Uint8Array, chainCode: Uint8Array, explicitPath?: string): Promise { + const obj = new Node(privateKey, chainCode, explicitPath); + return revocable(obj, (x) => obj.addRevoker(x)); + } + + /** + * Get Stark public key + * Applies Starknet-specific key grinding before deriving public key on STARK curve + * Returns zero-padded 64-character hex string (66 chars total with 0x prefix) + */ + async getPublicKey(): Promise { + const groundPrivateKey = starknet.grindKey(this.#privateKey); + const publicKey = starknet.getStarkKey(groundPrivateKey); + // Ensure proper zero-padding to 64 hex characters per Starknet address spec + return publicKey.startsWith("0x") + ? "0x" + publicKey.slice(2).padStart(64, "0") + : "0x" + publicKey.padStart(64, "0"); + } + + async getChainCode() { + return this.chainCode; + } + + /** + * Sign transaction hash on STARK curve + * Applies key grinding and returns ECDSA signature with proper padding + */ + async sign(txHash: string): Promise<{ r: string; s: string }> { + const groundPrivateKey = starknet.grindKey(this.#privateKey); + const signature = starknet.sign(txHash, groundPrivateKey); + return { + r: signature.r.toString(16).padStart(64, "0"), + s: signature.s.toString(16).padStart(64, "0"), + }; + } + + /** + * Derive child key using standard BIP32 secp256k1 derivation + * + * NOTE: This uses secp256k1 field arithmetic (ecc.privateAdd) per SLIP-0010, + * which is the industry standard for Starknet (matches Argent, Ledger implementations). + * The derived key is then ground for Stark operations in getPublicKey/sign methods. + */ + async derive(index: Uint32): Promise { + Uint32.assert(index); + + const serP = Buffer.alloc(37); + if (index < 0x80000000) { + // Non-hardened derivation uses public key + // For Stark, we use secp256k1 public key for BIP32 derivation (industry standard) + // The grinding + Stark operations happen only in final getPublicKey/sign + const secp256k1PubKey = ecc.pointFromScalar(this.#privateKey, true); + if (secp256k1PubKey === null) { + throw new Error("Failed to generate public key from private key"); + } + serP.set(secp256k1PubKey, 0); + } else { + // Hardened derivation uses private key + serP.set(this.#privateKey, 1); + } + serP.writeUInt32BE(index, 33); + + const I = bip32crypto.hmacSHA512(this.chainCode, serP); + const IL = I.slice(0, 32); + const IR = I.slice(32, 64); + + // Use secp256k1 curve arithmetic for derivation (per SLIP-0010 / industry standard) + const ki = ecc.privateAdd(this.#privateKey, IL); + if (ki === null) throw new Error("ki is null; this should be cryptographically impossible"); + + const out = await Node.create(ki, IR); + this.addRevoker(() => out.revoke?.()); + return out as this; + } +} diff --git a/packages/hdwallet-native/src/crypto/isolation/engines/dummy/bip32.ts b/packages/hdwallet-native/src/crypto/isolation/engines/dummy/bip32.ts index 75e75a051..edcebcf83 100644 --- a/packages/hdwallet-native/src/crypto/isolation/engines/dummy/bip32.ts +++ b/packages/hdwallet-native/src/crypto/isolation/engines/dummy/bip32.ts @@ -118,4 +118,12 @@ export class Seed implements Core.BIP32.Seed { async toEd25519MasterKey(): Promise { throw new DummyEngineError(); } + + /** + * Dummy engine doesn't support Stark curve operations + * Stark curve requires actual private key material for key grinding and signing + */ + async toStarkMasterKey(): Promise { + throw new DummyEngineError(); + } } diff --git a/packages/hdwallet-native/src/native.test.ts b/packages/hdwallet-native/src/native.test.ts index 0faf179c0..7ea094991 100644 --- a/packages/hdwallet-native/src/native.test.ts +++ b/packages/hdwallet-native/src/native.test.ts @@ -1,6 +1,6 @@ import * as core from "@shapeshiftoss/hdwallet-core"; -import { BIP32, ED25519 } from "./crypto/isolation/engines/default"; +import { BIP32, ED25519, Stark } from "./crypto/isolation/engines/default"; import { fromB64ToArray } from "./crypto/utils"; import * as native from "./native"; @@ -10,6 +10,8 @@ const SECP256K1_PRIVATE_KEY = "oe5ysT50Qkvnh1q9JwLULQuvK7flK664UkVA/srziyY="; // const SECP256K1_CHAIN_CODE = "UBS48IuLdtYu2dXcWEAQDfUWmcwYvdSIAPM3VgRd0tI="; // root chain code generated from the 'all all all' seed const ED25519_PRIVATE_KEY = "m1ePSnLVfJlUMtO6sdjQ6lEYSKZSdDImlpygUYoTqiM="; // root private key generated from the 'all all all' seed const ED25519_CHAIN_CODE = "FGt+sOOu5gvvu5mQqdQdG9RanoW0dgCfwtOduZZTZc8="; // root chain code generated from the 'all all all' seed +const STARK_PRIVATE_KEY = "oe5ysT50Qkvnh1q9JwLULQuvK7flK664UkVA/srziyY="; // root private key generated from the 'all all all' seed +const STARK_CHAIN_CODE = "UBS48IuLdtYu2dXcWEAQDfUWmcwYvdSIAPM3VgRd0tI="; // root chain code generated from the 'all all all' seed const mswMock = require("mswMock")().startServer(); afterEach(() => expect(mswMock).not.toHaveBeenCalled()); @@ -173,10 +175,14 @@ describe("NativeHDWallet", () => { fromB64ToArray(ED25519_PRIVATE_KEY), fromB64ToArray(ED25519_CHAIN_CODE) ); - const wallet = native.create({ deviceId: "native", secp256k1MasterKey, ed25519MasterKey }); + const starkMasterKey = await Stark.Node.create( + fromB64ToArray(STARK_PRIVATE_KEY), + fromB64ToArray(STARK_CHAIN_CODE) + ); + const wallet = native.create({ deviceId: "native", secp256k1MasterKey, ed25519MasterKey, starkMasterKey }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey }); + await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey, starkMasterKey }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -250,7 +256,11 @@ describe("NativeHDWallet", () => { const wallet = native.create({ deviceId: "native", secp256k1MasterKey }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -279,7 +289,11 @@ describe("NativeHDWallet", () => { const wallet = native.create({ deviceId: "native", secp256k1MasterKey }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -307,7 +321,11 @@ describe("NativeHDWallet", () => { const wallet = native.create({ deviceId: "native", secp256k1MasterKey }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -333,7 +351,11 @@ describe("NativeHDWallet", () => { const wallet = native.create({ deviceId: "native", secp256k1MasterKey }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -356,7 +378,11 @@ describe("NativeHDWallet", () => { }); expect(await wallet.isInitialized()).toBe(false); expect(await wallet.isLocked()).toBe(false); - await wallet.loadDevice({ secp256k1MasterKey: secp256k1Node, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey: secp256k1Node, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBe(true); expect(await wallet.isInitialized()).toBe(true); expect(await wallet.isLocked()).toBe(false); @@ -462,7 +488,11 @@ describe("NativeHDWallet", () => { }), jest.spyOn(wallet, "wipe"), ]; - await wallet.loadDevice({ secp256k1MasterKey, ed25519MasterKey: {} as ED25519.Node }); + await wallet.loadDevice({ + secp256k1MasterKey, + ed25519MasterKey: {} as ED25519.Node, + starkMasterKey: {} as Stark.Node, + }); expect(await wallet.initialize()).toBeFalsy(); mocks.forEach((x) => { expect(x).toHaveBeenCalled(); diff --git a/packages/hdwallet-native/src/native.ts b/packages/hdwallet-native/src/native.ts index 165701bcb..cda43e08d 100644 --- a/packages/hdwallet-native/src/native.ts +++ b/packages/hdwallet-native/src/native.ts @@ -16,6 +16,7 @@ import { MixinNativeMayachainWallet, MixinNativeMayachainWalletInfo } from "./ma import { MixinNativeOsmosisWallet, MixinNativeOsmosisWalletInfo } from "./osmosis"; import { MixinNativeSecretWallet, MixinNativeSecretWalletInfo } from "./secret"; import { MixinNativeSolanaWallet, MixinNativeSolanaWalletInfo } from "./solana"; +import { MixinNativeStarknetWallet, MixinNativeStarknetWalletInfo } from "./starknet"; import { MixinNativeSuiWallet, MixinNativeSuiWalletInfo } from "./sui"; import { MixinNativeTerraWallet, MixinNativeTerraWalletInfo } from "./terra"; import { MixinNativeThorchainWallet, MixinNativeThorchainWalletInfo } from "./thorchain"; @@ -38,11 +39,13 @@ type LoadDevice = Omit & { mnemonic: string | Isolation.Core.BIP39.Mnemonic; secp256k1MasterKey?: never; ed25519MasterKey?: never; + starkMasterKey?: never; } | { mnemonic?: never; secp256k1MasterKey: Isolation.Core.BIP32.Node; ed25519MasterKey: Isolation.Core.Ed25519.Node; + starkMasterKey: Isolation.Core.Stark.Node; } ); @@ -128,14 +131,16 @@ class NativeHDWalletInfo MixinNativeCosmosWalletInfo( MixinNativeBinanceWalletInfo( MixinNativeSolanaWalletInfo( - MixinNativeTronWalletInfo( - MixinNativeSuiWalletInfo( - MixinNativeThorchainWalletInfo( - MixinNativeMayachainWalletInfo( - MixinNativeSecretWalletInfo( - MixinNativeTerraWalletInfo( - MixinNativeKavaWalletInfo( - MixinNativeArkeoWalletInfo(MixinNativeOsmosisWalletInfo(NativeHDWalletBase)) + MixinNativeStarknetWalletInfo( + MixinNativeTronWalletInfo( + MixinNativeSuiWalletInfo( + MixinNativeThorchainWalletInfo( + MixinNativeMayachainWalletInfo( + MixinNativeSecretWalletInfo( + MixinNativeTerraWalletInfo( + MixinNativeKavaWalletInfo( + MixinNativeArkeoWalletInfo(MixinNativeOsmosisWalletInfo(NativeHDWalletBase)) + ) ) ) ) @@ -155,6 +160,7 @@ class NativeHDWalletInfo core.CosmosWalletInfo, core.BinanceWalletInfo, core.SolanaWalletInfo, + core.StarknetWalletInfo, core.TronWalletInfo, core.SuiWalletInfo, core.ThorchainWalletInfo, @@ -213,6 +219,9 @@ class NativeHDWalletInfo return core.osmosisDescribePath(msg.path); case "arkeo": return core.arkeoDescribePath(msg.path); + case "starknet": + case "strk": + return core.starknetDescribePath(msg.path); case "tron": case "trx": return core.tronDescribePath(msg.path); @@ -228,13 +237,15 @@ export class NativeHDWallet MixinNativeCosmosWallet( MixinNativeBinanceWallet( MixinNativeSolanaWallet( - MixinNativeTronWallet( - MixinNativeSuiWallet( - MixinNativeThorchainWallet( - MixinNativeMayachainWallet( - MixinNativeSecretWallet( - MixinNativeTerraWallet( - MixinNativeKavaWallet(MixinNativeOsmosisWallet(MixinNativeArkeoWallet(NativeHDWalletInfo))) + MixinNativeStarknetWallet( + MixinNativeTronWallet( + MixinNativeSuiWallet( + MixinNativeThorchainWallet( + MixinNativeMayachainWallet( + MixinNativeSecretWallet( + MixinNativeTerraWallet( + MixinNativeKavaWallet(MixinNativeOsmosisWallet(MixinNativeArkeoWallet(NativeHDWalletInfo))) + ) ) ) ) @@ -253,6 +264,7 @@ export class NativeHDWallet core.CosmosWallet, core.BinanceWallet, core.SolanaWallet, + core.StarknetWallet, core.TronWallet, core.SuiWallet, core.ThorchainWallet, @@ -269,8 +281,9 @@ export class NativeHDWallet #initialized = false; #secp256k1MasterKey: Promise | undefined = undefined; #ed25519MasterKey: Promise | undefined = undefined; + #starkMasterKey: Promise | undefined = undefined; - constructor({ mnemonic, deviceId, secp256k1MasterKey, ed25519MasterKey }: NativeAdapterArgs) { + constructor({ mnemonic, deviceId, secp256k1MasterKey, ed25519MasterKey, starkMasterKey }: NativeAdapterArgs) { super(); if (mnemonic) { this.#secp256k1MasterKey = (async () => { @@ -285,9 +298,16 @@ export class NativeHDWallet const seed = await isolatedMnemonic.toSeed(); return await seed.toEd25519MasterKey(); })(); + this.#starkMasterKey = (async () => { + const isolatedMnemonic = + typeof mnemonic === "string" ? await Isolation.Engines.Default.BIP39.Mnemonic.create(mnemonic) : mnemonic; + const seed = await isolatedMnemonic.toSeed(); + return await seed.toStarkMasterKey(); + })(); } else { if (secp256k1MasterKey) this.#secp256k1MasterKey = Promise.resolve(secp256k1MasterKey); if (ed25519MasterKey) this.#ed25519MasterKey = Promise.resolve(ed25519MasterKey); + if (starkMasterKey) this.#starkMasterKey = Promise.resolve(starkMasterKey); } this.#deviceId = deviceId; } @@ -366,38 +386,44 @@ export class NativeHDWallet // eslint-disable-next-line @typescript-eslint/no-empty-function async clearSession(): Promise {} + // eslint-disable-next-line no-console async initialize(): Promise { - return this.needsMnemonic(!!this.#secp256k1MasterKey && !!this.#ed25519MasterKey, async () => { - const secp256k1MasterKey = await this.#secp256k1MasterKey!; - const ed25519MasterKey = await this.#ed25519MasterKey!; + return this.needsMnemonic( + !!this.#secp256k1MasterKey && !!this.#ed25519MasterKey && !!this.#starkMasterKey, + async () => { + const secp256k1MasterKey = await this.#secp256k1MasterKey!; + const ed25519MasterKey = await this.#ed25519MasterKey!; + const starkMasterKey = await this.#starkMasterKey!; + + try { + await Promise.all([ + super.btcInitializeWallet(secp256k1MasterKey), + super.ethInitializeWallet(secp256k1MasterKey), + super.cosmosInitializeWallet(secp256k1MasterKey), + super.osmosisInitializeWallet(secp256k1MasterKey), + super.binanceInitializeWallet(secp256k1MasterKey), + super.starknetInitializeWallet(starkMasterKey), + super.tronInitializeWallet(secp256k1MasterKey), + super.thorchainInitializeWallet(secp256k1MasterKey), + super.mayachainInitializeWallet(secp256k1MasterKey), + super.secretInitializeWallet(secp256k1MasterKey), + super.terraInitializeWallet(secp256k1MasterKey), + super.kavaInitializeWallet(secp256k1MasterKey), + super.arkeoInitializeWallet(secp256k1MasterKey), + super.solanaInitializeWallet(ed25519MasterKey), + super.suiInitializeWallet(ed25519MasterKey), + ]); + + this.#initialized = true; + } catch (e) { + console.error("NativeHDWallet:initialize:error", e); + this.#initialized = false; + await this.wipe(); + } - try { - await Promise.all([ - super.btcInitializeWallet(secp256k1MasterKey), - super.ethInitializeWallet(secp256k1MasterKey), - super.cosmosInitializeWallet(secp256k1MasterKey), - super.osmosisInitializeWallet(secp256k1MasterKey), - super.binanceInitializeWallet(secp256k1MasterKey), - super.tronInitializeWallet(secp256k1MasterKey), - super.thorchainInitializeWallet(secp256k1MasterKey), - super.mayachainInitializeWallet(secp256k1MasterKey), - super.secretInitializeWallet(secp256k1MasterKey), - super.terraInitializeWallet(secp256k1MasterKey), - super.kavaInitializeWallet(secp256k1MasterKey), - super.arkeoInitializeWallet(secp256k1MasterKey), - super.solanaInitializeWallet(ed25519MasterKey), - super.suiInitializeWallet(ed25519MasterKey), - ]); - - this.#initialized = true; - } catch (e) { - console.error("NativeHDWallet:initialize:error", e); - this.#initialized = false; - await this.wipe(); + return this.#initialized; } - - return this.#initialized; - }); + ); } async ping(msg: core.Ping): Promise { @@ -434,6 +460,7 @@ export class NativeHDWallet super.cosmosWipe(); super.osmosisWipe(); super.binanceWipe(); + super.starknetWipe(); super.tronWipe(); super.thorchainWipe(); super.mayachainWipe(); @@ -497,6 +524,28 @@ export class NativeHDWallet })(msg?.mnemonic, msg?.ed25519MasterKey) ); + this.#starkMasterKey = Promise.resolve( + await (async (mnemonic, starkMasterKey) => { + if (starkMasterKey !== undefined) { + return starkMasterKey; + } else if (mnemonic !== undefined) { + const isolatedMnemonic = await (async () => { + if (isMnemonicInterface(mnemonic)) return mnemonic; + if (typeof mnemonic === "string" && bip39.validateMnemonic(mnemonic)) { + return await Isolation.Engines.Default.BIP39.Mnemonic.create(mnemonic); + } + throw new Error("Required property [mnemonic] is invalid"); + })(); + const seed = await isolatedMnemonic.toSeed(); + seed.addRevoker?.(() => isolatedMnemonic.revoke?.()); + const out = await seed.toStarkMasterKey(); + out.addRevoker?.(() => seed.revoke?.()); + return out; + } + throw new Error("Either [mnemonic] or [starkMasterKey] is required"); + })(msg?.mnemonic, msg?.starkMasterKey) + ); + if (typeof msg?.deviceId === "string") this.#deviceId = msg?.deviceId; this.#initialized = false; diff --git a/packages/hdwallet-native/src/starknet.ts b/packages/hdwallet-native/src/starknet.ts new file mode 100644 index 000000000..21bdaa249 --- /dev/null +++ b/packages/hdwallet-native/src/starknet.ts @@ -0,0 +1,55 @@ +import * as core from "@shapeshiftoss/hdwallet-core"; + +import { Isolation } from "./crypto"; +import { StarknetAdapter } from "./crypto/isolation/adapters/starknet"; +import { NativeHDWalletBase } from "./native"; + +export function MixinNativeStarknetWalletInfo>(Base: TBase) { + return class MixinNativeStarknetWalletInfoClass extends Base implements core.StarknetWalletInfo { + readonly _supportsStarknetInfo = true; + + starknetGetAccountPaths(msg: core.StarknetGetAccountPaths): Array { + return core.starknetGetAccountPaths(msg); + } + + starknetNextAccountPath(): core.StarknetAccountPath | undefined { + throw new Error("Method not implemented"); + } + }; +} + +export function MixinNativeStarknetWallet>(Base: TBase) { + return class MixinNativeStarknetWalletClass extends Base { + readonly _supportsStarknet = true; + + starknetAdapter: StarknetAdapter | undefined; + + async starknetInitializeWallet(masterKey: Isolation.Core.Stark.Node): Promise { + const nodeAdapter = new Isolation.Adapters.Stark(masterKey); + this.starknetAdapter = new StarknetAdapter(nodeAdapter); + } + + starknetWipe() { + this.starknetAdapter = undefined; + } + + async starknetGetAddress(msg: core.StarknetGetAddress): Promise { + return this.needsMnemonic(!!this.starknetAdapter, async () => { + return await this.starknetAdapter!.getAddress(msg.addressNList); + }); + } + + async starknetGetPublicKey(msg: core.StarknetGetPublicKey): Promise { + return this.needsMnemonic(!!this.starknetAdapter, async () => { + return await this.starknetAdapter!.getPublicKey(msg.addressNList); + }); + } + + async starknetSignTx(msg: core.StarknetSignTx): Promise { + return this.needsMnemonic(!!this.starknetAdapter, async () => { + const signature = await this.starknetAdapter!.signTransaction(msg.txHash, msg.addressNList); + return { signature }; + }); + } + }; +} diff --git a/packages/hdwallet-phantom/package.json b/packages/hdwallet-phantom/package.json index d8b127f0b..3ca6357cd 100644 --- a/packages/hdwallet-phantom/package.json +++ b/packages/hdwallet-phantom/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-phantom", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ }, "dependencies": { "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 f163f5bb4..f64af931c 100644 --- a/packages/hdwallet-portis/package.json +++ b/packages/hdwallet-portis/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-portis", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -16,7 +16,7 @@ "dependencies": { "@portis/web3": "3.0.10", "@shapeshiftoss/bitcoinjs-lib": "7.0.0-shapeshift.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "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 140b998b2..988c2f797 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.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -14,8 +14,8 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", - "@shapeshiftoss/hdwallet-trezor": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", + "@shapeshiftoss/hdwallet-trezor": "1.62.33", "@trezor/connect-web": "^9.6.4" } } diff --git a/packages/hdwallet-trezor/package.json b/packages/hdwallet-trezor/package.json index 501212184..1e9e1f9f7 100644 --- a/packages/hdwallet-trezor/package.json +++ b/packages/hdwallet-trezor/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-trezor", - "version": "1.62.32", + "version": "1.62.33", "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.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "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 9a748d0f8..5e68e18fd 100644 --- a/packages/hdwallet-vultisig/package.json +++ b/packages/hdwallet-vultisig/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-vultisig", - "version": "1.62.32", + "version": "1.62.33", "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.2", - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 262b87294..69066e1fc 100644 --- a/packages/hdwallet-walletconnect/package.json +++ b/packages/hdwallet-walletconnect/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-walletconnect", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@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 d7e43de05..12e34d684 100644 --- a/packages/hdwallet-walletconnectV2/package.json +++ b/packages/hdwallet-walletconnectV2/package.json @@ -1,6 +1,6 @@ { "name": "@shapeshiftoss/hdwallet-walletconnectv2", - "version": "1.62.32", + "version": "1.62.33", "license": "MIT", "publishConfig": { "access": "public" @@ -15,7 +15,7 @@ "prepublishOnly": "yarn clean && yarn build" }, "dependencies": { - "@shapeshiftoss/hdwallet-core": "1.62.32", + "@shapeshiftoss/hdwallet-core": "1.62.33", "@walletconnect/ethereum-provider": "^2.20.2", "@walletconnect/modal": "^2.6.2", "ethers": "^5.6.5" diff --git a/yarn.lock b/yarn.lock index fa5b1aa66..c95dc0564 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3172,6 +3172,13 @@ dependencies: "@noble/hashes" "1.4.0" +"@noble/curves@1.7.0", "@noble/curves@~1.7.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + "@noble/curves@1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.0.tgz#fe035a23959e6aeadf695851b51a87465b5ba8f7" @@ -3241,6 +3248,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + "@noble/hashes@1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.0.tgz#5d9e33af2c7d04fee35de1519b80c958b2e35e39" @@ -3266,6 +3278,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@~1.6.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@noble/secp256k1@1.6.3": version "1.6.3" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" @@ -4040,6 +4057,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== +"@scure/base@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" + integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== + "@scure/base@^1.0.0", "@scure/base@^1.1.1", "@scure/base@^1.1.3", "@scure/base@~1.1.3", "@scure/base@~1.1.6": version "1.1.8" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" @@ -4101,6 +4123,22 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" +"@scure/starknet@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.1.0.tgz#d1902e053d98196e161b9b2c3996b20999094e7a" + integrity sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ== + dependencies: + "@noble/curves" "~1.7.0" + "@noble/hashes" "~1.6.0" + +"@scure/starknet@^1.0.0": + version "1.1.2" + resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.1.2.tgz#3b9492d83e773092158a240fb1e2a437933d2a7e" + integrity sha512-Qo2uNQJC/1IwfXC0f2BnDjtXnY1cVyfmK1WcGNFzfnktvlNmmmbjYeUNdYe3DBiDYyMzp1MhRUFllFW5moBaMg== + dependencies: + "@noble/curves" "~1.9.0" + "@noble/hashes" "~1.8.0" + "@shapeshiftoss/bitcoinjs-lib@7.0.0-shapeshift.0": version "7.0.0-shapeshift.0" resolved "https://registry.yarnpkg.com/@shapeshiftoss/bitcoinjs-lib/-/bitcoinjs-lib-7.0.0-shapeshift.0.tgz#00a4cd26916037b843d3083a42d7cd265958f4df" @@ -6369,6 +6407,16 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abi-wan-kanabi@^2.2.3: + version "2.2.4" + resolved "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.4.tgz#47ebbafbb7f8df81773efbdcca60cdda8008c821" + integrity sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg== + dependencies: + ansicolors "^0.3.2" + cardinal "^2.1.1" + fs-extra "^10.0.0" + yargs "^17.7.2" + abitype@1.0.8, abitype@^1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" @@ -6574,6 +6622,11 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansicolors@^0.3.2, ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -7932,6 +7985,14 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -9885,7 +9946,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -10727,6 +10788,14 @@ feaxios@^0.0.23: dependencies: is-retry-allowed "^3.0.0" +fetch-cookie@~3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963" + integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q== + dependencies: + set-cookie-parser "^2.4.8" + tough-cookie "^4.0.0" + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -10958,6 +11027,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.1.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" @@ -12484,6 +12562,14 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + isomorphic-timers-promises@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" @@ -13755,6 +13841,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lossless-json@^4.0.1: + version "4.3.0" + resolved "https://registry.npmjs.org/lossless-json/-/lossless-json-4.3.0.tgz#7d26864820ecf08aee800213fc193666e794802a" + integrity sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g== + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -15310,6 +15401,11 @@ pacote@^13.0.3, pacote@^13.6.1: ssri "^9.0.0" tar "^6.1.11" +pako@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -16294,6 +16390,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + reflect-metadata@^0.1.13: version "0.1.14" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" @@ -16953,6 +17056,11 @@ set-cookie-parser@^2.4.6: resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz#ef5552b56dc01baae102acb5fc9fb8cd060c30f9" integrity sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ== +set-cookie-parser@^2.4.8: + version "2.7.2" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" + integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== + set-function-length@^1.2.1, set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -17395,6 +17503,28 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" +"starknet-types-07@npm:@starknet-io/types-js@^0.7.10": + version "0.7.10" + resolved "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760" + integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w== + +starknet@^6.11.0: + version "6.24.1" + resolved "https://registry.npmjs.org/starknet/-/starknet-6.24.1.tgz#87333339795038e93ef32a20726b5272ddb78fe1" + integrity sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg== + dependencies: + "@noble/curves" "1.7.0" + "@noble/hashes" "1.6.0" + "@scure/base" "1.2.1" + "@scure/starknet" "1.1.0" + abi-wan-kanabi "^2.2.3" + fetch-cookie "~3.0.0" + isomorphic-fetch "~3.0.0" + lossless-json "^4.0.1" + pako "^2.0.4" + starknet-types-07 "npm:@starknet-io/types-js@^0.7.10" + ts-mixer "^6.0.3" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -19243,7 +19373,7 @@ whatwg-fetch@^2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== -whatwg-fetch@^3.6.2: +whatwg-fetch@^3.4.1, whatwg-fetch@^3.6.2: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==