UNPKG

@enjin-protos/snap

Version:

MetaMask snap for interacting with Enjin dApps

60 lines (55 loc) 2.07 kB
import type { ApiPromise } from '@polkadot/api/'; import type { SignerPayloadJSON, SignerPayloadRaw } from '@polkadot/types/types'; import { stringToU8a, u8aToHex } from '@polkadot/util'; import { getKeyPair } from '../../polkadot/account'; import { showRawPayloadDialog, showJSONPayloadDialog } from '../../util/confirmation'; export async function signPayloadJSON( api: ApiPromise, payload: SignerPayloadJSON ): Promise<{ signature: string } | void> { const keyPair = await getKeyPair(); const extrinsic = api.registry.createType('ExtrinsicPayload', payload, { version: payload.version }); const method = api.registry.createType('Call', extrinsic.method); const confirmation = await showJSONPayloadDialog({ address: `polkadot:${api.genesisHash.toString().slice(2, 34)}:${keyPair.address}`, prompt: `Do you want to sign this transaction?`, info: [ { message: 'chain', value: api.runtimeChain.toString() }, { message: 'version', value: extrinsic.specVersion.toString() }, { message: 'nonce', value: extrinsic.nonce.toString() }, { message: 'tip', value: extrinsic.tip.toString() }, { message: 'method', value: `${method.section}.${method.method}` }, { message: 'arguments', value: method.toHuman().args as Record<string, string> }, { message: 'info', value: method.meta?.docs.join(' ') } ] }); if (confirmation) { return extrinsic.sign(keyPair); } } export async function signPayloadRaw( api: ApiPromise, payload: SignerPayloadRaw ): Promise<{ signature: string } | void> { const keyPair = await getKeyPair(); const confirmation = await showRawPayloadDialog({ address: `polkadot:${api.genesisHash.toString().slice(2, 34)}:${keyPair.address}`, prompt: `Do you want to sign this message?`, textAreaContent: payload.data }); // return seed if user confirmed action if (confirmation) { const signedBytes = keyPair.sign(stringToU8a(payload.data)); return { signature: u8aToHex(signedBytes) }; } }