UNPKG

hyjs-test

Version:
113 lines (112 loc) 4.63 kB
import { InjectedEthereumSigner, ArweaveSigner } from 'arseeding-arbundles/src/signing'; import EthereumSigner from 'arseeding-arbundles/src/signing/chains/ethereumSigner'; import { createData, DataItem } from 'arseeding-arbundles'; import isString from 'lodash/isString'; import { mergeTags } from '../utils'; import { Web3Provider } from '@ethersproject/providers'; import { utils } from 'ethers'; export const checkArPermissions = async (permissions) => { let existingPermissions = []; permissions = isString(permissions) ? [permissions] : permissions; try { existingPermissions = await window.arweaveWallet.getPermissions(); } catch { throw new Error('PLEASE_INSTALL_ARCONNECT'); } if (permissions.length === 0) { return; } if (permissions.some((permission) => { return !existingPermissions.includes(permission); })) { await window.arweaveWallet.connect(permissions); } }; let ethPublicKey = ''; export const createAndSignItem = async (config, params) => { const sdkTimestampTag = [ { name: 'SDK-Timestamp', value: Date.now().toString() } ]; const { tags, processId: target, data = '' } = params; const finalTags = mergeTags(sdkTimestampTag, tags); if (((config === null || config === void 0 ? void 0 : config.signer) != null || config.signer !== undefined) && config.signer instanceof Web3Provider) { const signer = new InjectedEthereumSigner(config.signer); if (ethPublicKey !== '') { const signerAddr = await config.signer.getSigner().getAddress(); const publicKeyAddr = utils.computeAddress('0x' + ethPublicKey); if (signerAddr.toLowerCase() !== publicKeyAddr.toLowerCase()) { await signer.setPublicKey(); ethPublicKey = signer.publicKey.toString('hex'); } else { signer.setPublicKey = async function () { this.publicKey = Buffer.from(ethPublicKey, 'hex'); }; await signer.setPublicKey(); } } else { await signer.setPublicKey(); ethPublicKey = signer.publicKey.toString('hex'); } const dataItem = createData(data, signer, { tags: finalTags, target }); await dataItem.sign(signer); return dataItem.getRaw(); } else if ((config.arJWK != null || config.arJWK !== undefined) && config.arJWK === 'use_wallet') { await checkArPermissions([ 'ACCESS_ADDRESS', 'ACCESS_ALL_ADDRESSES', 'ACCESS_PUBLIC_KEY', 'SIGN_TRANSACTION', 'SIGNATURE' ]); if (window.arweaveWallet !== undefined && typeof window.arweaveWallet.signDataItem === 'function') { const signed = await window.arweaveWallet.signDataItem({ data, tags: finalTags, target }); const dataItem = new DataItem(Buffer.from(signed)); return dataItem.getRaw(); } else { throw new Error('window.arweaveWallet not undefined'); } } else if (typeof config.privateKey === 'string' && /^0x[0-9a-fA-F]{64}$/.test(config.privateKey)) { const signer = new EthereumSigner(config.privateKey.slice(2)); const dataItem = createData(data, signer, { tags: finalTags, target }); await dataItem.sign(signer); return dataItem.getRaw(); } else if (config.arJWK !== undefined && isJWKInterface(config.arJWK)) { const signer = new ArweaveSigner(config.arJWK); const dataItem = createData(data, signer, { tags: finalTags, target }); await dataItem.sign(signer); return dataItem.getRaw(); } throw new Error('Config must provide at least one of: ethSigner, privateKey, or arJWK'); }; export function isJWKInterface(obj) { return (obj !== null && typeof obj === 'object' && typeof obj.kty === 'string' && typeof obj.e === 'string' && typeof obj.n === 'string' // // 可选字段不强制判断,但可以加类型判断,防止异常 // (obj.d === undefined || typeof obj.d === 'string') && // (obj.p === undefined || typeof obj.p === 'string') && // (obj.q === undefined || typeof obj.q === 'string') && // (obj.dp === undefined || typeof obj.dp === 'string') && // (obj.dq === undefined || typeof obj.dq === 'string') && // (obj.qi === undefined || typeof obj.qi === 'string') ); }