@mysten/sui
Version:
Sui TypeScript API
1 lines • 6.54 kB
Source Map (JSON)
{"version":3,"file":"keypair.mjs","names":[],"sources":["../../src/cryptography/keypair.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs, toBase64 } from '@mysten/bcs';\nimport { blake2b } from '@noble/hashes/blake2.js';\nimport { bech32 } from '@scure/base';\n\nimport type { IntentScope } from './intent.js';\nimport { messageWithIntent } from './intent.js';\nimport type { PublicKey } from './publickey.js';\nimport { SIGNATURE_FLAG_TO_SCHEME, SIGNATURE_SCHEME_TO_FLAG } from './signature-scheme.js';\nimport type { SignatureScheme } from './signature-scheme.js';\nimport { toSerializedSignature } from './signature.js';\nimport type { Transaction } from '../transactions/Transaction.js';\nimport type { ClientWithCoreApi, SuiClientTypes } from '../client/index.js';\n\nexport const PRIVATE_KEY_SIZE = 32;\nexport const LEGACY_PRIVATE_KEY_SIZE = 64;\nexport const SUI_PRIVATE_KEY_PREFIX = 'suiprivkey';\n\nexport type ParsedKeypair = {\n\tscheme: SignatureScheme;\n\tsecretKey: Uint8Array;\n};\n\nexport interface SignatureWithBytes {\n\tbytes: string;\n\tsignature: string;\n}\n\nexport interface SignAndExecuteOptions {\n\ttransaction: Transaction;\n\tclient: ClientWithCoreApi;\n}\n\n/**\n * TODO: Document\n */\nexport abstract class Signer {\n\tabstract sign(bytes: Uint8Array): Promise<Uint8Array<ArrayBuffer>>;\n\t/**\n\t * Sign messages with a specific intent. By combining the message bytes with the intent before hashing and signing,\n\t * it ensures that a signed message is tied to a specific purpose and domain separator is provided\n\t */\n\tasync signWithIntent(bytes: Uint8Array, intent: IntentScope): Promise<SignatureWithBytes> {\n\t\tconst intentMessage = messageWithIntent(intent, bytes);\n\t\tconst digest = blake2b(intentMessage, { dkLen: 32 });\n\n\t\tconst signature = toSerializedSignature({\n\t\t\tsignature: await this.sign(digest),\n\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\tpublicKey: this.getPublicKey(),\n\t\t});\n\n\t\treturn {\n\t\t\tsignature,\n\t\t\tbytes: toBase64(bytes),\n\t\t};\n\t}\n\t/**\n\t * Signs provided transaction by calling `signWithIntent()` with a `TransactionData` provided as intent scope\n\t */\n\tasync signTransaction(bytes: Uint8Array) {\n\t\treturn this.signWithIntent(bytes, 'TransactionData');\n\t}\n\t/**\n\t * Signs provided personal message by calling `signWithIntent()` with a `PersonalMessage` provided as intent scope\n\t */\n\tasync signPersonalMessage(bytes: Uint8Array) {\n\t\tconst { signature } = await this.signWithIntent(\n\t\t\tbcs.byteVector().serialize(bytes).toBytes(),\n\t\t\t'PersonalMessage',\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature,\n\t\t};\n\t}\n\n\tasync signAndExecuteTransaction({\n\t\ttransaction,\n\t\tclient,\n\t}: SignAndExecuteOptions): Promise<\n\t\tSuiClientTypes.TransactionResult<{ transaction: true; effects: true }>\n\t> {\n\t\ttransaction.setSenderIfNotSet(this.toSuiAddress());\n\t\tconst bytes = await transaction.build({ client });\n\t\tconst { signature } = await this.signTransaction(bytes);\n\n\t\treturn client.core.executeTransaction({\n\t\t\ttransaction: bytes,\n\t\t\tsignatures: [signature],\n\t\t\tinclude: { transaction: true, effects: true },\n\t\t});\n\t}\n\n\ttoSuiAddress(): string {\n\t\treturn this.getPublicKey().toSuiAddress();\n\t}\n\n\t/**\n\t * Get the key scheme of the keypair: Secp256k1 or ED25519\n\t */\n\tabstract getKeyScheme(): SignatureScheme;\n\n\t/**\n\t * The public key for this keypair\n\t */\n\tabstract getPublicKey(): PublicKey;\n}\n\nexport abstract class Keypair extends Signer {\n\t/**\n\t * This returns the Bech32 secret key string for this keypair.\n\t */\n\tabstract getSecretKey(): string;\n}\n\n/**\n * This returns an ParsedKeypair object based by validating the\n * 33-byte Bech32 encoded string starting with `suiprivkey`, and\n * parse out the signature scheme and the private key in bytes.\n */\nexport function decodeSuiPrivateKey(value: string): ParsedKeypair {\n\tconst { prefix, words } = bech32.decode(value as `${string}1${string}`);\n\tif (prefix !== SUI_PRIVATE_KEY_PREFIX) {\n\t\tthrow new Error('invalid private key prefix');\n\t}\n\tconst extendedSecretKey = new Uint8Array(bech32.fromWords(words));\n\tconst secretKey = extendedSecretKey.slice(1);\n\tconst signatureScheme =\n\t\tSIGNATURE_FLAG_TO_SCHEME[extendedSecretKey[0] as keyof typeof SIGNATURE_FLAG_TO_SCHEME];\n\n\treturn {\n\t\tscheme: signatureScheme,\n\t\tsecretKey: secretKey,\n\t};\n}\n\n/**\n * This returns a Bech32 encoded string starting with `suiprivkey`,\n * encoding 33-byte `flag || bytes` for the given the 32-byte private\n * key and its signature scheme.\n */\nexport function encodeSuiPrivateKey(bytes: Uint8Array, scheme: SignatureScheme): string {\n\tif (bytes.length !== PRIVATE_KEY_SIZE) {\n\t\tthrow new Error('Invalid bytes length');\n\t}\n\tconst flag = SIGNATURE_SCHEME_TO_FLAG[scheme];\n\tconst privKeyBytes = new Uint8Array(bytes.length + 1);\n\tprivKeyBytes.set([flag]);\n\tprivKeyBytes.set(bytes, 1);\n\treturn bech32.encode(SUI_PRIVATE_KEY_PREFIX, bech32.toWords(privKeyBytes));\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,mBAAmB;AAChC,MAAa,0BAA0B;AACvC,MAAa,yBAAyB;;;;AAoBtC,IAAsB,SAAtB,MAA6B;;;;;CAM5B,MAAM,eAAe,OAAmB,QAAkD;EAEzF,MAAM,SAAS,QADO,kBAAkB,QAAQ,MAAM,EAChB,EAAE,OAAO,IAAI,CAAC;AAQpD,SAAO;GACN,WAPiB,sBAAsB;IACvC,WAAW,MAAM,KAAK,KAAK,OAAO;IAClC,iBAAiB,KAAK,cAAc;IACpC,WAAW,KAAK,cAAc;IAC9B,CAAC;GAID,OAAO,SAAS,MAAM;GACtB;;;;;CAKF,MAAM,gBAAgB,OAAmB;AACxC,SAAO,KAAK,eAAe,OAAO,kBAAkB;;;;;CAKrD,MAAM,oBAAoB,OAAmB;EAC5C,MAAM,EAAE,cAAc,MAAM,KAAK,eAChC,IAAI,YAAY,CAAC,UAAU,MAAM,CAAC,SAAS,EAC3C,kBACA;AAED,SAAO;GACN,OAAO,SAAS,MAAM;GACtB;GACA;;CAGF,MAAM,0BAA0B,EAC/B,aACA,UAGC;AACD,cAAY,kBAAkB,KAAK,cAAc,CAAC;EAClD,MAAM,QAAQ,MAAM,YAAY,MAAM,EAAE,QAAQ,CAAC;EACjD,MAAM,EAAE,cAAc,MAAM,KAAK,gBAAgB,MAAM;AAEvD,SAAO,OAAO,KAAK,mBAAmB;GACrC,aAAa;GACb,YAAY,CAAC,UAAU;GACvB,SAAS;IAAE,aAAa;IAAM,SAAS;IAAM;GAC7C,CAAC;;CAGH,eAAuB;AACtB,SAAO,KAAK,cAAc,CAAC,cAAc;;;AAc3C,IAAsB,UAAtB,cAAsC,OAAO;;;;;;AAY7C,SAAgB,oBAAoB,OAA8B;CACjE,MAAM,EAAE,QAAQ,UAAU,OAAO,OAAO,MAA+B;AACvE,KAAI,WAAW,uBACd,OAAM,IAAI,MAAM,6BAA6B;CAE9C,MAAM,oBAAoB,IAAI,WAAW,OAAO,UAAU,MAAM,CAAC;CACjE,MAAM,YAAY,kBAAkB,MAAM,EAAE;AAI5C,QAAO;EACN,QAHA,yBAAyB,kBAAkB;EAIhC;EACX;;;;;;;AAQF,SAAgB,oBAAoB,OAAmB,QAAiC;AACvF,KAAI,MAAM,WAAW,iBACpB,OAAM,IAAI,MAAM,uBAAuB;CAExC,MAAM,OAAO,yBAAyB;CACtC,MAAM,eAAe,IAAI,WAAW,MAAM,SAAS,EAAE;AACrD,cAAa,IAAI,CAAC,KAAK,CAAC;AACxB,cAAa,IAAI,OAAO,EAAE;AAC1B,QAAO,OAAO,OAAO,wBAAwB,OAAO,QAAQ,aAAa,CAAC"}