diff --git a/packages/neuron-wallet/package.json b/packages/neuron-wallet/package.json index 60abb5453b..b76c2736e8 100644 --- a/packages/neuron-wallet/package.json +++ b/packages/neuron-wallet/package.json @@ -40,6 +40,7 @@ "@ckb-lumos/base": "0.20.0-alpha.3", "@ckb-lumos/ckb-indexer": "0.20.0-alpha.3", "@ckb-lumos/codec": "0.20.0-alpha.3", + "@ckb-lumos/lumos": "0.20.0-alpha.3", "@ckb-lumos/rpc": "0.20.0-alpha.3", "@iarna/toml": "2.2.5", "@ledgerhq/hw-transport-node-hid": "6.27.15", diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts index 7a3c1d7b63..812f19a62d 100644 --- a/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts +++ b/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts @@ -8,7 +8,7 @@ import AddressMeta from '../../database/address/meta' import { scheduler } from 'timers/promises' import SyncProgressService from '../../services/sync-progress' import { BlockTips, LumosCellQuery, Connector, AppendScript } from './connector' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import { FetchTransactionReturnType, LightRPC, LightScriptFilter } from '../../utils/ckb-rpc' import HexUtils from '../../utils/hex' import Multisig from '../../services/multisig' @@ -125,7 +125,7 @@ export default class LightConnector extends Connector { } }) syncScripts.forEach(syncScript => { - const scriptHash = scriptToHash(syncScript.script) + const scriptHash = utils.computeScriptHash(syncScript.script) const syncStatus = syncStatusMap.get(scriptHash) if ( syncStatus && @@ -159,7 +159,7 @@ export default class LightConnector extends Connector { const syncScripts = await this.lightRpc.getScripts() const existSyncscripts: Record = {} syncScripts.forEach(v => { - existSyncscripts[scriptToHash(v.script)] = v + existSyncscripts[utils.computeScriptHash(v.script)] = v }) const currentWalletId = WalletService.getInstance().getCurrent()?.id const allScripts = this.addressMetas @@ -188,15 +188,15 @@ export default class LightConnector extends Connector { ...allScripts.map(v => ({ ...v, blockNumber: - existSyncscripts[scriptToHash(v.script)]?.blockNumber ?? + existSyncscripts[utils.computeScriptHash(v.script)]?.blockNumber ?? walletStartBlockMap[v.walletId] ?? `0x${(walletMinBlockNumber?.[v.walletId] ?? 0).toString(16)}`, })), ...appendScripts.map(v => ({ ...v, blockNumber: - existSyncscripts[scriptToHash(v.script)]?.blockNumber ?? - `0x${(otherTypeSyncProgress[scriptToHash(v.script)] ?? 0).toString(16)}`, + existSyncscripts[utils.computeScriptHash(v.script)]?.blockNumber ?? + `0x${(otherTypeSyncProgress[utils.computeScriptHash(v.script)] ?? 0).toString(16)}`, })), ] await this.lightRpc.setScripts(setScriptsParams) @@ -205,7 +205,7 @@ export default class LightConnector extends Connector { await SyncProgressService.updateSyncProgressFlag(walletIds) await SyncProgressService.removeByHashesAndAddressType( SyncAddressType.Multisig, - appendScripts.map(v => scriptToHash(v.script)) + appendScripts.map(v => utils.computeScriptHash(v.script)) ) } diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/tx-address-finder.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/tx-address-finder.ts index e82b5700d5..ee8e07423e 100644 --- a/packages/neuron-wallet/src/block-sync-renderer/sync/tx-address-finder.ts +++ b/packages/neuron-wallet/src/block-sync-renderer/sync/tx-address-finder.ts @@ -1,5 +1,5 @@ import { getConnection } from 'typeorm' -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import OutputEntity from '../../database/chain/entities/output' import NetworksService from '../../services/networks' import Output from '../../models/chain/output' @@ -33,7 +33,8 @@ export default class TxAddressFinder { const outputsResult: [boolean, Output[], AnyoneCanPayInfo[]] = this.selectOutputs() const isMainnet = NetworksService.getInstance().isMainnet() - const outputAddresses: string[] = outputsResult[1].map(output => scriptToAddress(output.lock, isMainnet)) + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + const outputAddresses: string[] = outputsResult[1].map(output => helpers.encodeToAddress(output.lock, lumosOptions)) return [ inputAddressesResult[0] || outputsResult[0], @@ -86,6 +87,7 @@ export default class TxAddressFinder { const anyoneCanPayInfos: AnyoneCanPayInfo[] = [] const inputs = this.tx.inputs!.filter(i => i.previousOutput !== null) const isMainnet = NetworksService.getInstance().isMainnet() + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } let shouldSync = false for (const input of inputs) { @@ -104,7 +106,7 @@ export default class TxAddressFinder { } if (output && this.lockHashes.has(output.lockHash)) { shouldSync = true - addresses.push(scriptToAddress(output.lockScript(), isMainnet)) + addresses.push(helpers.encodeToAddress(output.lockScript(), lumosOptions)) } if (output && SystemScriptInfo.isMultiSignScript(output.lockScript())) { const multiSignBlake160 = output.lockScript().args.slice(0, 42) diff --git a/packages/neuron-wallet/src/controllers/asset-account.ts b/packages/neuron-wallet/src/controllers/asset-account.ts index 36e6e1fda0..9c7463820f 100644 --- a/packages/neuron-wallet/src/controllers/asset-account.ts +++ b/packages/neuron-wallet/src/controllers/asset-account.ts @@ -1,4 +1,4 @@ -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import AssetAccount from '../models/asset-account' import Transaction from '../models/chain/transaction' import AssetAccountService from '../services/asset-account-service' @@ -81,11 +81,12 @@ export default class AssetAccountController { } const isMainnet = NetworksService.getInstance().isMainnet() + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } const result = assetAccounts.map(aa => { return { ...aa, - address: scriptToAddress(assetAccountInfo.generateAnyoneCanPayScript(aa.blake160), isMainnet), + address: helpers.encodeToAddress(assetAccountInfo.generateAnyoneCanPayScript(aa.blake160), lumosOptions), } }) @@ -125,12 +126,13 @@ export default class AssetAccountController { const assetAccountInfo = new AssetAccountInfo() const isMainnet = NetworksService.getInstance().isMainnet() + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } return { status: ResponseCode.Success, result: { ...account, - address: scriptToAddress(assetAccountInfo.generateAnyoneCanPayScript(account.blake160), isMainnet), + address: helpers.encodeToAddress(assetAccountInfo.generateAnyoneCanPayScript(account.blake160), lumosOptions), }, } } diff --git a/packages/neuron-wallet/src/controllers/multisig.ts b/packages/neuron-wallet/src/controllers/multisig.ts index 43dd200504..f50ea3906e 100644 --- a/packages/neuron-wallet/src/controllers/multisig.ts +++ b/packages/neuron-wallet/src/controllers/multisig.ts @@ -2,7 +2,6 @@ import fs from 'fs' import path from 'path' import { dialog, BrowserWindow } from 'electron' import { t } from 'i18next' -import { addressToScript, scriptToAddress, scriptToHash } from '@nervosnetwork/ckb-sdk-utils' import { ResponseCode } from '../utils/const' import MultisigConfig from '../database/chain/entities/multisig-config' import MultisigConfigModel from '../models/multisig-config' @@ -12,6 +11,7 @@ import OfflineSignService from '../services/offline-sign' import Multisig from '../models/multisig' import SystemScriptInfo from '../models/system-script-info' import NetworksService from '../services/networks' +import { config as lumosConig, helpers, utils, config } from '@ckb-lumos/lumos' interface MultisigConfigOutput { multisig_configs: Record< @@ -122,7 +122,13 @@ export default class MultisigController { r: +config.require_first_n, m: +config.threshold, n: config.sighash_addresses.length, - blake160s: config.sighash_addresses.map(v => addressToScript(v).args), + blake160s: config.sighash_addresses.map(v => { + const isMainnet = v.startsWith('ckb') + const lumosOptions = isMainnet + ? { config: lumosConig.predefined.LINA } + : { config: lumosConig.predefined.AGGRON4 } + return helpers.addressToScript(v, lumosOptions).args + }), walletId, alias: config.alias, })) @@ -170,11 +176,13 @@ export default class MultisigController { return } const isMainnet = NetworksService.getInstance().isMainnet() + const lumosOptions = isMainnet ? { config: lumosConig.predefined.LINA } : { config: lumosConig.predefined.AGGRON4 } + const output: MultisigConfigOutput = { multisig_configs: {} } configs.forEach(v => { output.multisig_configs[Multisig.hash(v.blake160s, v.r, v.m, v.n)] = { sighash_addresses: v.blake160s.map(args => - scriptToAddress(SystemScriptInfo.generateSecpScript(args), isMainnet) + helpers.encodeToAddress(SystemScriptInfo.generateSecpScript(args), lumosOptions) ), require_first_n: v.r, threshold: v.m, @@ -214,7 +222,9 @@ export default class MultisigController { } } const tx = result.json - const lockHash = scriptToHash(addressToScript(fullPayload)) + const isMainnet = fullPayload.startsWith('ckb') + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + const lockHash = utils.computeScriptHash(helpers.addressToScript(fullPayload, lumosOptions)) if (tx.transaction.inputs.every(v => v.lockHash !== lockHash)) { dialog.showErrorBox(t('common.error'), t('messages.multisig-lock-hash-mismatch')) return { diff --git a/packages/neuron-wallet/src/controllers/sudt.ts b/packages/neuron-wallet/src/controllers/sudt.ts index a2191a26e0..cac84776cf 100644 --- a/packages/neuron-wallet/src/controllers/sudt.ts +++ b/packages/neuron-wallet/src/controllers/sudt.ts @@ -1,4 +1,4 @@ -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import LiveCellService from '../services/live-cell-service' import AssetAccountInfo from '../models/asset-account-info' import Script, { ScriptHashType } from '../models/chain/script' @@ -41,7 +41,7 @@ export default class SUDTController { const script = new Script(assetAcount.infos.sudt.codeHash, params.tokenID, assetAcount.infos.sudt.hashType) return { status: ResponseCode.Success, - result: scriptToHash(script.toSDK()), + result: utils.computeScriptHash(script.toSDK()), } } } diff --git a/packages/neuron-wallet/src/database/chain/entities/multisig-output.ts b/packages/neuron-wallet/src/database/chain/entities/multisig-output.ts index deeaf9f9ba..942376d298 100644 --- a/packages/neuron-wallet/src/database/chain/entities/multisig-output.ts +++ b/packages/neuron-wallet/src/database/chain/entities/multisig-output.ts @@ -1,7 +1,7 @@ import { Entity, BaseEntity, Column, PrimaryColumn } from 'typeorm' import Script, { ScriptHashType } from '../../../models/chain/script' import OutPoint from '../../../models/chain/out-point' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import { OutputStatus } from '../../../models/chain/output' @Entity() @@ -71,7 +71,7 @@ export default class MultisigOutput extends BaseEntity { entity.lockArgs = params.output.lock.args entity.lockCodeHash = params.output.lock.code_hash entity.lockHashType = params.output.lock.hash_type as ScriptHashType - entity.lockHash = scriptToHash({ + entity.lockHash = utils.computeScriptHash({ args: entity.lockArgs, codeHash: entity.lockCodeHash, hashType: entity.lockHashType, diff --git a/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts b/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts index 552778becd..4600cd1abb 100644 --- a/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts +++ b/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts @@ -1,5 +1,5 @@ import { HexString } from '@ckb-lumos/base' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import { Entity, PrimaryColumn, Column } from 'typeorm' export enum SyncAddressType { @@ -49,7 +49,7 @@ export default class SyncProgress { addressType?: SyncAddressType }) { const res = new SyncProgress() - res.hash = scriptToHash(obj.script) + res.hash = utils.computeScriptHash(obj.script) res.args = obj.script.args res.codeHash = obj.script.codeHash res.hashType = obj.script.hashType diff --git a/packages/neuron-wallet/src/database/chain/migrations/1650984779265-UpdateAddressDescription.ts b/packages/neuron-wallet/src/database/chain/migrations/1650984779265-UpdateAddressDescription.ts index 7b4b2e125f..60ead380d2 100644 --- a/packages/neuron-wallet/src/database/chain/migrations/1650984779265-UpdateAddressDescription.ts +++ b/packages/neuron-wallet/src/database/chain/migrations/1650984779265-UpdateAddressDescription.ts @@ -1,14 +1,17 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; -import { scriptToAddress, addressToScript } from '@nervosnetwork/ckb-sdk-utils' +import { MigrationInterface, QueryRunner } from 'typeorm' import AddressDescription from '../entities/address-description' +import { config, helpers } from '@ckb-lumos/lumos' export class UpdateAddressDescription1650984779265 implements MigrationInterface { name = 'UpdateAddressDescription1650984779265' public async up(queryRunner: QueryRunner): Promise { const descList = await queryRunner.manager.find(AddressDescription) + const updated = descList.map(desc => { - desc.address = scriptToAddress(addressToScript(desc.address), desc.address.startsWith('ckb')) + const isMainnet = desc.address.startsWith('ckb') + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + desc.address = helpers.encodeToAddress(helpers.addressToScript(desc.address), lumosOptions) return desc }) await queryRunner.manager.save(updated) @@ -17,5 +20,4 @@ export class UpdateAddressDescription1650984779265 implements MigrationInterface public async down(): Promise { // do nothing } - } diff --git a/packages/neuron-wallet/src/database/chain/migrations/1651820157100-RemoveAddressesMultisigConfig.ts b/packages/neuron-wallet/src/database/chain/migrations/1651820157100-RemoveAddressesMultisigConfig.ts index dbd5e2d5fd..8949808ec7 100644 --- a/packages/neuron-wallet/src/database/chain/migrations/1651820157100-RemoveAddressesMultisigConfig.ts +++ b/packages/neuron-wallet/src/database/chain/migrations/1651820157100-RemoveAddressesMultisigConfig.ts @@ -1,23 +1,22 @@ -import { MigrationInterface, QueryRunner } from "typeorm" -import { addressToScript } from "@nervosnetwork/ckb-sdk-utils" -import MultisigConfig from "../entities/multisig-config" +import { MigrationInterface, QueryRunner } from 'typeorm' +import MultisigConfig from '../entities/multisig-config' +import { helpers } from '@ckb-lumos/lumos' export class RemoveAddressesMultisigConfig1651820157100 implements MigrationInterface { - name = 'RemoveAddressesMultisigConfig1651820157100' + name = 'RemoveAddressesMultisigConfig1651820157100' - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.renameColumn('multisig_config', 'addresses', 'blake160s') - await queryRunner.dropColumn('multisig_config', 'fullpayload') - const configList = await queryRunner.manager.find(MultisigConfig) - const updated = configList.map(v => { - v.blake160s = v.blake160s.map(v => addressToScript(v).args) - return v - }) - await queryRunner.manager.save(updated) - } - - public async down(): Promise { - // do nothing - } + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.renameColumn('multisig_config', 'addresses', 'blake160s') + await queryRunner.dropColumn('multisig_config', 'fullpayload') + const configList = await queryRunner.manager.find(MultisigConfig) + const updated = configList.map(v => { + v.blake160s = v.blake160s.map(v => helpers.addressToScript(v).args) + return v + }) + await queryRunner.manager.save(updated) + } + public async down(): Promise { + // do nothing + } } diff --git a/packages/neuron-wallet/src/database/chain/migrations/1652945662504-UpdateOutputChequeLockHash.ts b/packages/neuron-wallet/src/database/chain/migrations/1652945662504-UpdateOutputChequeLockHash.ts index 9d4d306ad8..dc545f3874 100644 --- a/packages/neuron-wallet/src/database/chain/migrations/1652945662504-UpdateOutputChequeLockHash.ts +++ b/packages/neuron-wallet/src/database/chain/migrations/1652945662504-UpdateOutputChequeLockHash.ts @@ -1,23 +1,23 @@ -import { In, MigrationInterface, QueryRunner } from "typeorm"; -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' -import { ScriptHashType } from "../../../models/chain/script"; -import Output from "../entities/output"; +import { In, MigrationInterface, QueryRunner } from 'typeorm' +import { utils } from '@ckb-lumos/lumos' +import { ScriptHashType } from '../../../models/chain/script' +import Output from '../entities/output' export class UpdateOutputChequeLockHash1652945662504 implements MigrationInterface { name = 'UpdateOutputChequeLockHash1652945662504' public async up(queryRunner: QueryRunner): Promise { const errLockHash = [ - scriptToHash({ + utils.computeScriptHash({ args: '0x' + '0'.repeat(80), codeHash: process.env.TESTNET_CHEQUE_SCRIPT_CODEHASH!, - hashType: process.env.TESTNET_CHEQUE_SCRIPT_HASHTYPE! as ScriptHashType + hashType: process.env.TESTNET_CHEQUE_SCRIPT_HASHTYPE! as ScriptHashType, }), - scriptToHash({ + utils.computeScriptHash({ args: '0x' + '0'.repeat(80), codeHash: process.env.MAINNET_CHEQUE_SCRIPT_CODEHASH!, - hashType: process.env.MAINNET_CHEQUE_SCRIPT_HASHTYPE! as ScriptHashType - }) + hashType: process.env.MAINNET_CHEQUE_SCRIPT_HASHTYPE! as ScriptHashType, + }), ] const chequeOutput = await queryRunner.connection .getRepository(Output) @@ -25,10 +25,10 @@ export class UpdateOutputChequeLockHash1652945662504 implements MigrationInterfa .where({ lockHash: In(errLockHash) }) .getMany() const updated = chequeOutput.map(output => { - output.lockHash = scriptToHash({ + output.lockHash = utils.computeScriptHash({ args: output.lockArgs, hashType: output.lockHashType, - codeHash: output.lockCodeHash + codeHash: output.lockCodeHash, }) return output }) @@ -38,5 +38,4 @@ export class UpdateOutputChequeLockHash1652945662504 implements MigrationInterfa public async down(): Promise { // do nothing } - } diff --git a/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts b/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts index 70a0bd3ecc..7fdae8961c 100644 --- a/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts +++ b/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts @@ -1,31 +1,34 @@ -import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from "typeorm" -import Multisig from "../../../models/multisig" -import { scriptToHash } from "@nervosnetwork/ckb-sdk-utils" -import { SyncAddressType } from "../entities/sync-progress" -import MultisigConfig from "../entities/multisig-config" +import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from 'typeorm' +import Multisig from '../../../models/multisig' +import { SyncAddressType } from '../entities/sync-progress' +import MultisigConfig from '../entities/multisig-config' +import { utils } from '@ckb-lumos/lumos' export class AddTypeSyncProgress1681360188494 implements MigrationInterface { name = 'AddTypeSyncProgress1681360188494' public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('sync_progress', new TableColumn({ - name: 'addressType', - type: 'INTEGER', - isNullable: false, - default: SyncAddressType.Default, - })) - await queryRunner.createIndex("sync_progress", new TableIndex({ columnNames: ["addressType"] })) - const multisigConfigs = await queryRunner.connection - .getRepository(MultisigConfig) - .createQueryBuilder() - .getMany() - const scriptHashes = multisigConfigs.map(v => scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))) - await queryRunner.query(`UPDATE sync_progress set addressType=1 where hash in (${scriptHashes.map(v => `'${v}'`).join(',')})`) + await queryRunner.addColumn( + 'sync_progress', + new TableColumn({ + name: 'addressType', + type: 'INTEGER', + isNullable: false, + default: SyncAddressType.Default, + }) + ) + await queryRunner.createIndex('sync_progress', new TableIndex({ columnNames: ['addressType'] })) + const multisigConfigs = await queryRunner.connection.getRepository(MultisigConfig).createQueryBuilder().getMany() + const scriptHashes = multisigConfigs.map(v => + utils.computeScriptHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)) + ) + await queryRunner.query( + `UPDATE sync_progress set addressType=1 where hash in (${scriptHashes.map(v => `'${v}'`).join(',')})` + ) } public async down(queryRunner: QueryRunner): Promise { await queryRunner.dropColumn('sync_progress', 'addressType') - await queryRunner.dropIndex("sync_progress", new TableIndex({ columnNames: ["addressType"] })) + await queryRunner.dropIndex('sync_progress', new TableIndex({ columnNames: ['addressType'] })) } - } diff --git a/packages/neuron-wallet/src/models/address-parser.ts b/packages/neuron-wallet/src/models/address-parser.ts index ae48dd1e8a..d1519514cd 100644 --- a/packages/neuron-wallet/src/models/address-parser.ts +++ b/packages/neuron-wallet/src/models/address-parser.ts @@ -1,11 +1,14 @@ import Script, { ScriptHashType } from './chain/script' -import { addressToScript } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import SystemScriptInfo from './system-script-info' export default class AddressParser { public static parse(address: string): Script { try { - const script = addressToScript(address) + const isMainnet = address.startsWith('ckb') + const script = isMainnet + ? helpers.addressToScript(address, { config: config.predefined.LINA }) + : helpers.addressToScript(address, { config: config.predefined.AGGRON4 }) return new Script(script.codeHash, script.args, script.hashType as ScriptHashType) } catch { throw new Error('Address format error') diff --git a/packages/neuron-wallet/src/models/blake2b.ts b/packages/neuron-wallet/src/models/blake2b.ts deleted file mode 100644 index 17bc2accf6..0000000000 --- a/packages/neuron-wallet/src/models/blake2b.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { blake2b, PERSONAL, hexToBytes } from '@nervosnetwork/ckb-sdk-utils' - -export default class Blake2b { - private blake2b: any - - constructor() { - this.blake2b = blake2b(32, null, null, PERSONAL) - } - - public update = (message: string): void => { - const msg = message.startsWith('0x') ? message : `0x${message}` - this.blake2b.update(hexToBytes(msg)) - } - - public updateBuffer = (message: Buffer): void => { - this.blake2b.update(message) - } - - public digest = (): string => { - return `0x${this.blake2b.digest('hex')}` - } - - public static digest = (message: string): string => { - const blake2bHash = new Blake2b() - blake2bHash.update(message) - return blake2bHash.digest() - } -} diff --git a/packages/neuron-wallet/src/models/chain/script.ts b/packages/neuron-wallet/src/models/chain/script.ts index 09a341e039..a3ec5b1f66 100644 --- a/packages/neuron-wallet/src/models/chain/script.ts +++ b/packages/neuron-wallet/src/models/chain/script.ts @@ -1,4 +1,4 @@ -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import HexUtils from '../../utils/hex' import TypeChecker from '../../utils/type-checker' @@ -18,6 +18,10 @@ export default class Script { this.codeHash = codeHash this.hashType = hashType + // TODO: args should be hex string, but when we create a script from SDK, it's not hex string + if (!this.args.startsWith('0x')) { + this.args = `0x${args}` + } TypeChecker.hashChecker(this.codeHash) } @@ -34,7 +38,7 @@ export default class Script { } public computeHash(): string { - const hash: string = scriptToHash(this.toSDK()) + const hash: string = utils.computeScriptHash(this.toSDK()) return HexUtils.addPrefix(hash) } diff --git a/packages/neuron-wallet/src/models/chain/transaction.ts b/packages/neuron-wallet/src/models/chain/transaction.ts index d128270a8f..ae89cad904 100644 --- a/packages/neuron-wallet/src/models/chain/transaction.ts +++ b/packages/neuron-wallet/src/models/chain/transaction.ts @@ -3,11 +3,12 @@ import Input from './input' import Output from './output' import WitnessArgs from './witness-args' import HexUtils from '../../utils/hex' -import { serializeWitnessArgs, rawTransactionToHash } from '@nervosnetwork/ckb-sdk-utils' import BlockHeader from './block-header' import TypeCheckerUtils from '../../utils/type-checker' import OutPoint from './out-point' import { Signatures } from '../../models/offline-sign' +import { bytes } from '@ckb-lumos/codec' +import { blockchain, utils } from '@ckb-lumos/base' export enum TransactionStatus { Pending = 'pending', @@ -252,7 +253,7 @@ export default class Transaction { if (typeof wit === 'string') { return wit } - return serializeWitnessArgs(wit.toSDK()) + return bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) }) } @@ -268,7 +269,24 @@ export default class Transaction { } public computeHash(): string { - return rawTransactionToHash(this.toSDKRawTransaction()) + const rawTransaction = this.toSDKRawTransaction() + return utils.ckbHash( + blockchain.RawTransaction.pack({ + ...rawTransaction, + outputs: rawTransaction.outputs.map(o => ({ + ...o, + type: o.type || undefined, + })), + cellDeps: rawTransaction.cellDeps.map(cd => ({ + ...cd, + outPoint: cd.outPoint!, + })), + inputs: rawTransaction.inputs.map(i => ({ + ...i, + previousOutput: i.previousOutput!, + })), + }) + ) } public toSDKRawTransaction(): CKBComponents.RawTransaction { diff --git a/packages/neuron-wallet/src/models/chain/witness-args.ts b/packages/neuron-wallet/src/models/chain/witness-args.ts index c177ec4e4f..74a3f90eca 100644 --- a/packages/neuron-wallet/src/models/chain/witness-args.ts +++ b/packages/neuron-wallet/src/models/chain/witness-args.ts @@ -70,10 +70,11 @@ export default class WitnessArgs { } public toSDK(): CKBComponents.WitnessArgs { + // values can't be empty string, `BytesOpt` should be valid hex string or undefined return { - lock: this.lock, - inputType: this.inputType, - outputType: this.outputType, + lock: this.lock !== '' ? this.lock : undefined, + inputType: this.inputType !== '' ? this.inputType : undefined, + outputType: this.outputType !== '' ? this.outputType : undefined, } } } diff --git a/packages/neuron-wallet/src/models/keys/address.ts b/packages/neuron-wallet/src/models/keys/address.ts index 52f14b79f9..10302f43fb 100644 --- a/packages/neuron-wallet/src/models/keys/address.ts +++ b/packages/neuron-wallet/src/models/keys/address.ts @@ -1,8 +1,5 @@ -import { AddressPrefix, blake160, scriptToAddress, systemScripts, bytesToHex } from '@nervosnetwork/ckb-sdk-utils' - import { AccountExtendedPublicKey } from './key' - -export { AddressPrefix } +import { config, helpers, utils } from '@ckb-lumos/lumos' export enum AddressType { Receiving = 0, // External chain @@ -11,7 +8,17 @@ export enum AddressType { export const publicKeyToAddress = (publicKey: string, isMainnet = false) => { const pubkey = publicKey.startsWith('0x') ? publicKey : `0x${publicKey}` - return scriptToAddress({ ...systemScripts.SECP256K1_BLAKE160, args: bytesToHex(blake160(pubkey)) }, isMainnet) + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + const args = utils.ckbHash(pubkey).slice(0, 42) + + return helpers.encodeToAddress( + { + codeHash: lumosOptions.config.SCRIPTS.SECP256K1_BLAKE160.CODE_HASH, + hashType: lumosOptions.config.SCRIPTS.SECP256K1_BLAKE160.HASH_TYPE, + args, + }, + lumosOptions + ) } export default class Address { diff --git a/packages/neuron-wallet/src/models/keys/hd-public-key-info.ts b/packages/neuron-wallet/src/models/keys/hd-public-key-info.ts index de0b070121..f3af66ed47 100644 --- a/packages/neuron-wallet/src/models/keys/hd-public-key-info.ts +++ b/packages/neuron-wallet/src/models/keys/hd-public-key-info.ts @@ -1,4 +1,4 @@ -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import SystemScriptInfo from '../../models/system-script-info' import NetworksService from '../../services/networks' import Address, { AddressType } from './address' @@ -11,13 +11,17 @@ export default class HdPublicKeyInfoModel { public description?: string public get address() { - return scriptToAddress( + const lumosOptions = NetworksService.getInstance().isMainnet() + ? { config: config.predefined.LINA } + : { config: config.predefined.AGGRON4 } + + return helpers.encodeToAddress( { codeHash: SystemScriptInfo.SECP_CODE_HASH, hashType: SystemScriptInfo.SECP_HASH_TYPE, args: this.publicKeyInBlake160, }, - NetworksService.getInstance().isMainnet() + lumosOptions ) } diff --git a/packages/neuron-wallet/src/models/multisig-config.ts b/packages/neuron-wallet/src/models/multisig-config.ts index 69cbfd9fa2..31cdd9cd54 100644 --- a/packages/neuron-wallet/src/models/multisig-config.ts +++ b/packages/neuron-wallet/src/models/multisig-config.ts @@ -1,4 +1,4 @@ -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import Multisig from './multisig' export default class MultisigConfigModel { @@ -51,6 +51,6 @@ export default class MultisigConfigModel { } public getLockHash() { - return scriptToHash(Multisig.getMultisigScript(this.blake160s, this.r, this.m, this.n)) + return utils.computeScriptHash(Multisig.getMultisigScript(this.blake160s, this.r, this.m, this.n)) } } diff --git a/packages/neuron-wallet/src/models/multisig.ts b/packages/neuron-wallet/src/models/multisig.ts index 39f2153d41..214455d058 100644 --- a/packages/neuron-wallet/src/models/multisig.ts +++ b/packages/neuron-wallet/src/models/multisig.ts @@ -1,5 +1,5 @@ +import { utils } from '@ckb-lumos/lumos' import { MultisigPrefixError } from '../exceptions' -import Blake2b from './blake2b' import SystemScriptInfo from './system-script-info' export interface MultisigPrefix { @@ -24,7 +24,7 @@ export default class Multisig { static hash(blake160s: string[], r: number = 0, m: number = 1, n: number = 1): string { const serializeResult = Multisig.serialize(blake160s, r, m, n) - return Blake2b.digest(serializeResult).slice(0, 42) + return utils.ckbHash(serializeResult).slice(0, 42) } since(minutes: number, headerEpoch: string): string { diff --git a/packages/neuron-wallet/src/models/system-script-info.ts b/packages/neuron-wallet/src/models/system-script-info.ts index b1a282f02a..1a77bc1f9d 100644 --- a/packages/neuron-wallet/src/models/system-script-info.ts +++ b/packages/neuron-wallet/src/models/system-script-info.ts @@ -3,6 +3,7 @@ import CellDep, { DepType } from './chain/cell-dep' import NetworksService from '../services/networks' import RpcService from '../services/rpc-service' import Script, { ScriptHashType } from './chain/script' +import { config, utils } from '@ckb-lumos/lumos' export default class SystemScriptInfo { static SECP_CODE_HASH = process.env.SECP256K1_CODE_HASH! @@ -13,11 +14,18 @@ export default class SystemScriptInfo { static DAO_HASH_TYPE = ScriptHashType.Type static MULTI_SIGN_HASH_TYPE = ScriptHashType.Type - static DAO_SCRIPT_HASH = new Script( - SystemScriptInfo.DAO_CODE_HASH, - '0x', - SystemScriptInfo.DAO_HASH_TYPE - ).computeHash() + // FIXME: this is werid that `blockchain.Script.pack` will throw error here + // static DAO_SCRIPT_HASH = new Script( + // SystemScriptInfo.DAO_CODE_HASH, + // '0x', + // SystemScriptInfo.DAO_HASH_TYPE + // ).computeHash() + + static DAO_SCRIPT_HASH = utils.computeScriptHash({ + codeHash: config.predefined.LINA.SCRIPTS.DAO.CODE_HASH, + hashType: config.predefined.LINA.SCRIPTS.DAO.HASH_TYPE, + args: '0x', + }) private static instance: SystemScriptInfo static getInstance(): SystemScriptInfo { diff --git a/packages/neuron-wallet/src/models/transaction-size.ts b/packages/neuron-wallet/src/models/transaction-size.ts index 4bdca0deb3..ac2f995c99 100644 --- a/packages/neuron-wallet/src/models/transaction-size.ts +++ b/packages/neuron-wallet/src/models/transaction-size.ts @@ -1,6 +1,7 @@ -import { serializeOutput, serializeWitnessArgs } from '@nervosnetwork/ckb-sdk-utils/lib/serialization/transaction' import HexUtils from '../utils/hex' -import { serializeFixVec } from '@nervosnetwork/ckb-sdk-utils/lib/serialization' +import { bytes as bytesUtils, number } from '@ckb-lumos/codec' +import { fixvec } from '@ckb-lumos/codec/lib/molecule/layout' +import { blockchain } from '@ckb-lumos/base' import Output from './chain/output' import WitnessArgs from './chain/witness-args' import Transaction from './chain/transaction' @@ -28,7 +29,15 @@ export default class TransactionSize { } public static output(output: Output): number { - const bytes = serializeOutput(output.toSDK()) + // const bytes = serializeOutput(output.toSDK()) + const cellOutput = output.toSDK() + const bytes = bytesUtils.hexify( + blockchain.CellOutput.pack({ + capacity: cellOutput.capacity, + lock: cellOutput.lock, + type: cellOutput.type || undefined, // TODO: null is not a packable type + }) + ) return HexUtils.byteLength(bytes) + TransactionSize.SERIALIZED_OFFSET_BYTESIZE } @@ -54,9 +63,12 @@ export default class TransactionSize { return TransactionSize.output(sudtOutput) } + // TODO: the function name need to be changed, like getOutputDataSize public static outputData(data: string): number { - const bytes = serializeFixVec(data) - return HexUtils.byteLength(bytes) + TransactionSize.SERIALIZED_OFFSET_BYTESIZE + const fixvecCodec = fixvec(number.Uint8) + const serializedData = fixvecCodec.pack(Array.from(bytesUtils.bytify(data))) + + return serializedData.byteLength + TransactionSize.SERIALIZED_OFFSET_BYTESIZE } // TODO: and here @@ -65,10 +77,19 @@ export default class TransactionSize { return TransactionSize.outputData(data) } + /** + * @param witness a witness object or a hex string + * @returns witness wraped in a fixed Uint32Le vector (+4 bytes for header) and add another +4 bytes for the offset + */ public static witness(witness: WitnessArgs | string): number { - const wit: string = typeof witness === 'string' ? witness : serializeWitnessArgs(witness.toSDK()) - const bytes = serializeFixVec(wit) - return HexUtils.byteLength(bytes) + TransactionSize.SERIALIZED_OFFSET_BYTESIZE + if (typeof witness === 'string') { + const fixvecCodec = fixvec(number.Uint8) + const serializedData = fixvecCodec.pack(Array.from(bytesUtils.bytify(witness))) + return serializedData.byteLength + TransactionSize.SERIALIZED_OFFSET_BYTESIZE + } else { + const wit = blockchain.WitnessArgs.pack(witness.toSDK()) + return wit.byteLength + TransactionSize.SERIALIZED_OFFSET_BYTESIZE + TransactionSize.SERIALIZED_OFFSET_BYTESIZE + } } public static secpLockWitness(): number { diff --git a/packages/neuron-wallet/src/services/cells.ts b/packages/neuron-wallet/src/services/cells.ts index 7034ebb6ca..5cc7c5e45c 100644 --- a/packages/neuron-wallet/src/services/cells.ts +++ b/packages/neuron-wallet/src/services/cells.ts @@ -1,5 +1,4 @@ import { getConnection, In } from 'typeorm' -import { addressToScript, scriptToAddress, scriptToHash } from '@nervosnetwork/ckb-sdk-utils' import { CapacityNotEnough, CapacityNotEnoughForChange, @@ -30,6 +29,7 @@ import NFT from '../models/nft' import MultisigConfigModel from '../models/multisig-config' import MultisigOutput from '../database/chain/entities/multisig-output' import { MIN_CELL_CAPACITY } from '../utils/const' +import { config, helpers, utils } from '@ckb-lumos/lumos' export interface PaginationResult { totalCount: number @@ -1142,7 +1142,8 @@ export default class CellsService { if (!multisigAddresses.length) { return {} } - const lockHashes = multisigAddresses.map(v => scriptToHash(addressToScript(v))) + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + const lockHashes = multisigAddresses.map(v => utils.computeScriptHash(helpers.addressToScript(v, lumosOptions))) const connection = await getConnection() const [sql, parameters] = connection.driver.escapeQueryWithParameters( ` @@ -1171,13 +1172,13 @@ export default class CellsService { cells.forEach(c => { balances[ - scriptToAddress( + helpers.encodeToAddress( { args: c.lockArgs, codeHash: SystemScriptInfo.MULTI_SIGN_CODE_HASH, hashType: SystemScriptInfo.MULTI_SIGN_HASH_TYPE, }, - isMainnet + lumosOptions ) ] = c.balance }) diff --git a/packages/neuron-wallet/src/services/hardware/hardware.ts b/packages/neuron-wallet/src/services/hardware/hardware.ts index 002f379c94..511a592995 100644 --- a/packages/neuron-wallet/src/services/hardware/hardware.ts +++ b/packages/neuron-wallet/src/services/hardware/hardware.ts @@ -1,6 +1,5 @@ import type Transaction from '../../models/chain/transaction' import WitnessArgs from '../../models/chain/witness-args' -import { serializeWitnessArgs } from '@nervosnetwork/ckb-sdk-utils' import AddressService from '../../services/addresses' import TransactionSender from '../../services/transaction-sender' import Multisig from '../../models/multisig' @@ -9,6 +8,8 @@ import DeviceSignIndexSubject from '../../models/subjects/device-sign-index-subj import type { DeviceInfo, ExtendedPublicKey, PublicKey } from './common' import { AccountExtendedPublicKey } from '../../models/keys/key' import AssetAccountInfo from '../../models/asset-account-info' +import { blockchain } from '@ckb-lumos/base' +import { bytes } from '@ckb-lumos/codec' export abstract class Hardware { public deviceInfo: DeviceInfo @@ -84,7 +85,7 @@ export abstract class Hardware { if (args.lock === undefined && args.inputType === undefined && args.outputType === undefined) { return '0x' } - return serializeWitnessArgs(args.toSDK()) + return bytes.hexify(blockchain.WitnessArgs.pack(args.toSDK())) }) const blake160 = addressInfos.find( i => witnessesArgs[0].lockArgs.slice(0, 42) === Multisig.hash([i.blake160]) @@ -100,12 +101,12 @@ export abstract class Hardware { const signature = await this.signTransaction( walletID, tx, - witnesses.map(w => (typeof w === 'string' ? w : serializeWitnessArgs(w.toSDK()))), + witnesses.map(w => (typeof w === 'string' ? w : bytes.hexify(blockchain.WitnessArgs.pack(w.toSDK())))), path ) const wit = witnesses[0] as WitnessArgs wit.lock = serializedMultiSign + signature - witnesses[0] = serializeWitnessArgs(wit.toSDK()) + witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) witnessesArgs[index].witness = witnesses[0] for (let i = 0; i < witnessesArgs.length; ++i) { witnessesArgs[i].witness = witnesses[i] as string @@ -116,15 +117,17 @@ export abstract class Hardware { if (args.lock === undefined && args.inputType === undefined && args.outputType === undefined) { return '0x' } - return serializeWitnessArgs(args.toSDK()) + return bytes.hexify(blockchain.WitnessArgs.pack(args.toSDK())) }) const signture = await this.signTransaction(walletID, tx, serializedWitnesses, path, context) const witnessEntry = witnessSigningEntries.find(w => w.lockHash === lockHash)! - witnessEntry.witness = serializeWitnessArgs({ - lock: '0x' + signture, - inputType: witnessEntry.witnessArgs.inputType ?? '', - outputType: '', - }) + witnessEntry.witness = bytes.hexify( + blockchain.WitnessArgs.pack({ + lock: '0x' + signture, + inputType: witnessEntry.witnessArgs.inputType ?? '', + outputType: '', + }) + ) } } diff --git a/packages/neuron-wallet/src/services/multisig.ts b/packages/neuron-wallet/src/services/multisig.ts index 64e08a260e..e909230562 100644 --- a/packages/neuron-wallet/src/services/multisig.ts +++ b/packages/neuron-wallet/src/services/multisig.ts @@ -3,7 +3,7 @@ import MultisigConfig from '../database/chain/entities/multisig-config' import MultisigOutput from '../database/chain/entities/multisig-output' import { MultisigConfigNotExistError, MultisigConfigExistError } from '../exceptions/multisig' import { rpcBatchRequest } from '../utils/rpc-request' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import MultisigOutputChangedSubject from '../models/subjects/multisig-output-db-changed-subject' import Transaction from '../models/chain/transaction' import { OutputStatus } from '../models/chain/output' @@ -245,7 +245,7 @@ export default class MultisigService { static async deleteRemovedMultisigOutput() { const multisigConfigs = await getConnection().getRepository(MultisigConfig).createQueryBuilder().getMany() const multisigLockHashList = multisigConfigs.map(v => - scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)) + utils.computeScriptHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)) ) await getConnection() .createQueryBuilder() @@ -262,7 +262,7 @@ export default class MultisigService { const network = await NetworksService.getInstance().getCurrent() if (network.type === NetworkType.Light) { const multisigScriptHashList = multisigConfigs.map(v => - scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)) + utils.computeScriptHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)) ) const syncBlockNumbers = await getConnection() .getRepository(SyncProgress) @@ -278,7 +278,7 @@ export default class MultisigService { .save( multisigConfigs.map(v => { const blockNumber = - syncBlockNumbersMap[scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))] + syncBlockNumbersMap[utils.computeScriptHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))] v.lastestBlockNumber = `0x${BigInt(blockNumber).toString(16)}` return v }) diff --git a/packages/neuron-wallet/src/services/sign-message.ts b/packages/neuron-wallet/src/services/sign-message.ts index eb186cc0c6..712f11b5d7 100644 --- a/packages/neuron-wallet/src/services/sign-message.ts +++ b/packages/neuron-wallet/src/services/sign-message.ts @@ -1,12 +1,11 @@ import AddressService from './addresses' import WalletService, { Wallet } from './wallets' import Keychain from '../models/keys/keychain' -import Blake2b from '../models/blake2b' -import ECPair from '@nervosnetwork/ckb-sdk-utils/lib/ecpair' import { ec as EC } from 'elliptic' import { AddressNotFound } from '../exceptions' import HardwareWalletService from './hardware' import AddressParser from '../models/address-parser' +import { hd, utils } from '@ckb-lumos/lumos' export default class SignMessage { static GENERATE_COUNT = 100 @@ -40,8 +39,7 @@ export default class SignMessage { private static signByPrivateKey(privateKey: string, message: string): string { const digest = SignMessage.signatureHash(message) - const ecPair = new ECPair(privateKey) - const signature = ecPair.signRecoverable(digest) + const signature = hd.key.signRecoverable(digest, privateKey) return signature } @@ -57,10 +55,8 @@ export default class SignMessage { } const oldSignature = '0x' + Buffer.from(signature, 'base64').toString('hex') const buffer = Buffer.from(message, 'utf-8') - const blake2b = new Blake2b() - blake2b.updateBuffer(buffer) - digest = blake2b.digest() - if (SignMessage.verify(address, oldSignature, digest)) { + const digestHash = utils.ckbHash(buffer) + if (SignMessage.verify(address, oldSignature, digestHash)) { return 'old-sign' } } @@ -77,7 +73,7 @@ export default class SignMessage { '0x' + SignMessage.ec.recoverPubKey(msgBuffer, options, options.recoveryParam).encode('hex', true) const recoverBlake160 = AddressParser.toBlake160(address) - return Blake2b.digest(publicKey).slice(0, 42) === recoverBlake160 + return utils.ckbHash(publicKey).slice(0, 42) === recoverBlake160 } catch (error) { return false } @@ -85,9 +81,7 @@ export default class SignMessage { private static signatureHash(message: string) { const buffer = Buffer.from(SignMessage.magicString + message, 'utf-8') - const blake2b = new Blake2b() - blake2b.updateBuffer(buffer) - return blake2b.digest() + return utils.ckbHash(buffer) } private static getPrivateKey(wallet: Wallet, path: string, password: string): string { diff --git a/packages/neuron-wallet/src/services/sync-progress.ts b/packages/neuron-wallet/src/services/sync-progress.ts index ae93cb54dc..b1cee1d751 100644 --- a/packages/neuron-wallet/src/services/sync-progress.ts +++ b/packages/neuron-wallet/src/services/sync-progress.ts @@ -1,5 +1,5 @@ import { Equal, getConnection, In, Not } from 'typeorm' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import { HexString } from '@ckb-lumos/base' import SyncProgress, { SyncAddressType } from '../database/chain/entities/sync-progress' import WalletService from './wallets' @@ -56,7 +56,7 @@ export default class SyncProgressService { } static async getSyncStatus(script: CKBComponents.Script) { - const scriptHash = scriptToHash(script) + const scriptHash = utils.computeScriptHash(script) const res = await getConnection() .getRepository(SyncProgress) .createQueryBuilder() diff --git a/packages/neuron-wallet/src/services/transaction-sender.ts b/packages/neuron-wallet/src/services/transaction-sender.ts index d5ed3b8a79..0468e8e5f8 100644 --- a/packages/neuron-wallet/src/services/transaction-sender.ts +++ b/packages/neuron-wallet/src/services/transaction-sender.ts @@ -1,7 +1,5 @@ -import ECPair from '@nervosnetwork/ckb-sdk-utils/lib/ecpair' import signWitnesses from '@nervosnetwork/ckb-sdk-core/lib/signWitnesses' import NodeService from './node' -import { scriptToAddress, serializeWitnessArgs, toUint64Le } from '@nervosnetwork/ckb-sdk-utils' import { TransactionPersistor, TransactionGenerator, TargetOutput } from './tx' import AddressService from './addresses' import WalletService, { Wallet } from '../services/wallets' @@ -19,7 +17,6 @@ import WitnessArgs from '../models/chain/witness-args' import Transaction from '../models/chain/transaction' import Script from '../models/chain/script' import Multisig from '../models/multisig' -import Blake2b from '../models/blake2b' import logger from '../utils/logger' import HexUtils from '../utils/hex' import SystemScriptInfo from '../models/system-script-info' @@ -44,6 +41,10 @@ import NetworksService from './networks' import { generateRPC } from '../utils/ckb-rpc' import CKB from '@nervosnetwork/ckb-sdk-core' import CellsService from './cells' +import { config, hd, helpers } from '@ckb-lumos/lumos' +import { utils } from '@ckb-lumos/lumos' +import { blockchain } from '@ckb-lumos/base' +import { bytes, number } from '@ckb-lumos/codec' interface SignInfo { witnessArgs: WitnessArgs @@ -195,7 +196,7 @@ export default class TransactionSender { if (args.lock === undefined && args.inputType === undefined && args.outputType === undefined) { return '0x' } - return serializeWitnessArgs(args.toSDK()) + return bytes.hexify(blockchain.WitnessArgs.pack(args.toSDK())) }) let signed: (string | CKBComponents.WitnessArgs | WitnessArgs)[] = [] @@ -213,7 +214,7 @@ export default class TransactionSender { ) const wit = signed[0] as WitnessArgs wit.lock = serializedMultisig + wit.lock!.slice(2) - signed[0] = serializeWitnessArgs(wit.toSDK()) + signed[0] = bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) } else { signed = signWitnesses(privateKey)({ transactionHash: txHash, @@ -329,7 +330,7 @@ export default class TransactionSender { if (args.lock === undefined && args.inputType === undefined && args.outputType === undefined) { return '0x' } - return serializeWitnessArgs(args.toSDK()) + return bytes.hexify(blockchain.WitnessArgs.pack(args.toSDK())) }) let witnesses: (string | WitnessArgs)[] = [] const serializedMultiSign: string = Multisig.serialize( @@ -351,7 +352,7 @@ export default class TransactionSender { wit.lock = await device!.signTransaction( walletID, tx, - witnesses.map(w => (typeof w === 'string' ? w : serializeWitnessArgs(w.toSDK()))), + witnesses.map(w => (typeof w === 'string' ? w : bytes.hexify(blockchain.WitnessArgs.pack(w.toSDK())))), privateKey!, context ) @@ -366,7 +367,7 @@ export default class TransactionSender { tx.setSignatures(lockHash, blake160!) const signStatus = getMultisigStatus(multisigConfig, tx.signatures) if (signStatus === SignStatus.Signed) { - witnesses[0] = serializeWitnessArgs(wit.toSDK()) + witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) } else { witnesses[0] = wit } @@ -399,25 +400,24 @@ export default class TransactionSender { ...firstWitness, lock: `0x` + serializedMultiSign.slice(2) + '0'.repeat(130 * m), }) - const serializedEmptyWitness = serializeWitnessArgs(emptyWitness.toSDK()) + const serializedEmptyWitness = bytes.hexify(blockchain.WitnessArgs.pack(emptyWitness.toSDK())) const serialziedEmptyWitnessSize = HexUtils.byteLength(serializedEmptyWitness) - const blake2b = new Blake2b() - blake2b.update(txHash) - blake2b.update(toUint64Le(`0x${serialziedEmptyWitnessSize.toString(16)}`)) - blake2b.update(serializedEmptyWitness) + const ckbHasher = new utils.CKBHasher() + ckbHasher.update(txHash) + ckbHasher.update(number.Uint64LE.pack(`0x${serialziedEmptyWitnessSize.toString(16)}`)) + ckbHasher.update(serializedEmptyWitness) restWitnesses.forEach(w => { - const wit: string = typeof w === 'string' ? w : serializeWitnessArgs(w.toSDK()) + const wit: string = typeof w === 'string' ? w : bytes.hexify(blockchain.WitnessArgs.pack(w.toSDK())) const byteLength = HexUtils.byteLength(wit) - blake2b.update(toUint64Le(`0x${byteLength.toString(16)}`)) - blake2b.update(wit) + ckbHasher.update(number.Uint64LE.pack(`0x${byteLength.toString(16)}`)) + ckbHasher.update(wit) }) - const message = blake2b.digest() + const message = ckbHasher.digestHex() if (!wallet.isHardware()) { - const keyPair = new ECPair(privateKeyOrPath) - emptyWitness.lock = keyPair.signRecoverable(message) + emptyWitness.lock = hd.key.signRecoverable(message, privateKeyOrPath) } return [emptyWitness, ...restWitnesses] @@ -506,7 +506,10 @@ export default class TransactionSender { multisigConfig.m, multisigConfig.n ) - const multisigAddresses = scriptToAddress(lockScript, NetworksService.getInstance().isMainnet()) + const isMainnet = NetworksService.getInstance().isMainnet() + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } + + const multisigAddresses = helpers.encodeToAddress(lockScript, lumosOptions) const tx: Transaction = await TransactionGenerator.generateTx( '', targetOutputs, diff --git a/packages/neuron-wallet/src/services/tx/transaction-generator.ts b/packages/neuron-wallet/src/services/tx/transaction-generator.ts index 94fc6c4cc8..5d88dacdc9 100644 --- a/packages/neuron-wallet/src/services/tx/transaction-generator.ts +++ b/packages/neuron-wallet/src/services/tx/transaction-generator.ts @@ -28,7 +28,7 @@ import BufferUtils from '../../utils/buffer' import assert from 'assert' import AssetAccount from '../../models/asset-account' import AddressService from '../../services/addresses' -import { addressToScript } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import MultisigConfigModel from '../../models/multisig-config' import WalletService from '../../services/wallets' import { MIN_CELL_CAPACITY, MIN_SUDT_CAPACITY } from '../../utils/const' @@ -222,8 +222,13 @@ export class TransactionGenerator { // change if (hasChangeOutput) { const changeCapacity = BigInt(capacities) - needCapacities - finalFeeInt + const isMainnet = changeAddress.startsWith('ckb') + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } - const output = new Output(changeCapacity.toString(), Script.fromSDK(addressToScript(changeAddress))) + const output = new Output( + changeCapacity.toString(), + Script.fromSDK(helpers.addressToScript(changeAddress, lumosOptions)) + ) tx.addOutput(output) } @@ -1407,8 +1412,10 @@ export class TransactionGenerator { if (!inputSudtCell.type) { throw new MigrateSudtCellNoTypeError() } + const isMainnet = acpAddress.startsWith('ckb') + const lumosOptions = isMainnet ? { config: config.predefined.LINA } : { config: config.predefined.AGGRON4 } const receiverAcpCell = await LiveCellService.getInstance().getOneByLockScriptAndTypeScript( - Script.fromSDK(addressToScript(acpAddress)), + Script.fromSDK(helpers.addressToScript(acpAddress, lumosOptions)), inputSudtCell.type ) if (!receiverAcpCell) { diff --git a/packages/neuron-wallet/src/utils/multisig.ts b/packages/neuron-wallet/src/utils/multisig.ts index a31c710219..2d4266774f 100644 --- a/packages/neuron-wallet/src/utils/multisig.ts +++ b/packages/neuron-wallet/src/utils/multisig.ts @@ -1,10 +1,10 @@ -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos' import Multisig from '../models/multisig' import MultisigConfigModel from '../models/multisig-config' import { Signatures, SignStatus } from '../models/offline-sign' export const getMultisigStatus = (multisigConfig: MultisigConfigModel, signatures: Signatures) => { - const multisigLockHash = scriptToHash( + const multisigLockHash = utils.computeScriptHash( Multisig.getMultisigScript(multisigConfig.blake160s, multisigConfig.r, multisigConfig.m, multisigConfig.n) ) let signed = 0 diff --git a/packages/neuron-wallet/tests/block-sync-renderer/indexer-connector.test.ts b/packages/neuron-wallet/tests/block-sync-renderer/indexer-connector.test.ts index 401ef9728e..a6cb2b621e 100644 --- a/packages/neuron-wallet/tests/block-sync-renderer/indexer-connector.test.ts +++ b/packages/neuron-wallet/tests/block-sync-renderer/indexer-connector.test.ts @@ -1,4 +1,4 @@ -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import { when } from 'jest-when' import { AddressType } from '../../src/models/keys/address' import { Address, AddressVersion } from '../../src/models/address' @@ -147,7 +147,7 @@ describe('unit tests for IndexerConnector', () => { const shortAddressInfo = { lock: SystemScriptInfo.generateSecpScript('0x36c329ed630d6ce750712a477543672adab57f4c'), } - const address = scriptToAddress(shortAddressInfo.lock, false) + const address = helpers.encodeToAddress(shortAddressInfo.lock, { config: config.predefined.AGGRON4 }) const walletId1 = 'walletid1' const walletId2 = 'walletid2' const addressObj1: Address = { diff --git a/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts b/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts index 779a7f366e..2c2d555617 100644 --- a/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts +++ b/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts @@ -1,4 +1,4 @@ -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos'; import LightConnector from '../../src/block-sync-renderer/sync/light-connector' import SyncProgress from '../../src/database/chain/entities/sync-progress' import HexUtils from '../../src/utils/hex' @@ -97,7 +97,7 @@ const script: CKBComponents.Script = { codeHash: '0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8', hashType: 'type' } -const scriptHash = scriptToHash(script) +const scriptHash = utils.computeScriptHash(script) const address = 'ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq2q8ux5aqem92xnwfmj5cl6e233phlwlysqhjx5w' describe('test light connector', () => { diff --git a/packages/neuron-wallet/tests/block-sync-renderer/queue.test.ts b/packages/neuron-wallet/tests/block-sync-renderer/queue.test.ts index c510304219..dc629bcdbb 100644 --- a/packages/neuron-wallet/tests/block-sync-renderer/queue.test.ts +++ b/packages/neuron-wallet/tests/block-sync-renderer/queue.test.ts @@ -1,6 +1,6 @@ import { Subject } from 'rxjs' import { Tip } from '@ckb-lumos/base' -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import { AddressType } from '../../src/models/keys/address' import SystemScriptInfo from '../../src/models/system-script-info' import { Address, AddressVersion } from '../../src/models/address' @@ -97,11 +97,12 @@ describe('queue', () => { const shortAddressInfo = { lock: SystemScriptInfo.generateSecpScript('0x36c329ed630d6ce750712a477543672adab57f4c'), } - const address = scriptToAddress(shortAddressInfo.lock, false) + const address = helpers.encodeToAddress(shortAddressInfo.lock, { config: config.predefined.AGGRON4 }) const fakeWalletId = 'w1' const addressInfo: Address = { address, - blake160: '0xfakeblake160', + // DELETE ME: blake160: '0xfakeblake160', // not valid hex nor valid blake160 + blake160: '0x1234567890123456789012345678901234567890', walletId: fakeWalletId, path: '', addressType: AddressType.Receiving, diff --git a/packages/neuron-wallet/tests/controllers/anyone-can-pay.test.ts b/packages/neuron-wallet/tests/controllers/anyone-can-pay.test.ts index 58fb1fc3f1..2088daec71 100644 --- a/packages/neuron-wallet/tests/controllers/anyone-can-pay.test.ts +++ b/packages/neuron-wallet/tests/controllers/anyone-can-pay.test.ts @@ -3,7 +3,7 @@ import Transaction from '../../src/models/chain/transaction' import { ServiceHasNoResponse } from '../../src/exceptions' import { ResponseCode } from '../../src/utils/const' import AssetAccountInfo from '../../src/models/asset-account-info' -import { addressToScript } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from "@ckb-lumos/lumos" const generateAnyoneCanPayTxMock = jest.fn() const generateSudtMigrateAcpTxMock = jest.fn() @@ -134,7 +134,8 @@ describe('anyone-can-pay-controller', () => { const address = 'ckt1qq6pngwqn6e9vlm92th84rk0l4jp2h8lurchjmnwv8kq3rt5psf4vqvyxgyfu4z8yq4t790um8jef7lpm40h2csv4cv7m' await anyoneCanPayController.getHoldSudtCellCapacity(address, 'tokenID') - expect(getHoldSUDTCellCapacityMock).toHaveBeenCalledWith(addressToScript(address), 'tokenID') + const script = helpers.parseAddress(address, {config: config.predefined.AGGRON4}) + expect(getHoldSUDTCellCapacityMock).toHaveBeenCalledWith(script, 'tokenID') }) it('error address', async () => { const address = 'ct1qq6pngwqn6e9vlm92th84rk0l4jp2h8lurchjmnwv8kq3rt5psf4vqvyxgyfu4z8yq4t790um8jef7lpm40h2csv4cv7m' diff --git a/packages/neuron-wallet/tests/controllers/multisig.test.ts b/packages/neuron-wallet/tests/controllers/multisig.test.ts index 6b793af56e..92acfcc6e8 100644 --- a/packages/neuron-wallet/tests/controllers/multisig.test.ts +++ b/packages/neuron-wallet/tests/controllers/multisig.test.ts @@ -2,7 +2,7 @@ import { ResponseCode } from '../../src/utils/const' import MultisigService from '../../src/services/multisig' import MultisigController from '../../src/controllers/multisig' import CellsService from '../../src/services/cells' -import { scriptToAddress, systemScripts } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' let response = 0 let dialogRes = { canceled: false, filePaths: ['./'], filePath: './' } @@ -23,9 +23,9 @@ jest.mock('services/wallets', () => ({ return { getCurrent() { return jest.fn() - } + }, } - } + }, })) jest.mock('../../src/services/multisig') @@ -77,13 +77,13 @@ const multisigConfig = { params: { multisig_configs: { sighash_addresses: multisigBlake160s.map(args => - scriptToAddress( + helpers.encodeToAddress( { args, - codeHash: systemScripts.SECP256K1_BLAKE160.codeHash, - hashType: systemScripts.SECP256K1_BLAKE160.hashType, + codeHash: config.predefined.AGGRON4.SCRIPTS.SECP256K1_BLAKE160.CODE_HASH, + hashType: config.predefined.AGGRON4.SCRIPTS.SECP256K1_BLAKE160.HASH_TYPE, }, - false + { config: config.predefined.AGGRON4 } ) ), require_first_n: 1, @@ -97,13 +97,13 @@ const multisigConfig = { params: { multisig_configs: { sighash_addresses: multisigBlake160s.map(args => - scriptToAddress( + helpers.encodeToAddress( { args, - codeHash: systemScripts.SECP256K1_BLAKE160.codeHash, - hashType: systemScripts.SECP256K1_BLAKE160.hashType, + codeHash: config.predefined.LINA.SCRIPTS.SECP256K1_BLAKE160.CODE_HASH, + hashType: config.predefined.LINA.SCRIPTS.SECP256K1_BLAKE160.HASH_TYPE, }, - true + { config: config.predefined.LINA } ) ), require_first_n: 1, diff --git a/packages/neuron-wallet/tests/controllers/sudt.test.ts b/packages/neuron-wallet/tests/controllers/sudt.test.ts index 44ab0f3347..3735d43744 100644 --- a/packages/neuron-wallet/tests/controllers/sudt.test.ts +++ b/packages/neuron-wallet/tests/controllers/sudt.test.ts @@ -63,8 +63,8 @@ describe('SUDTController', () => { 'txHash', '0', '10000', - Script.fromObject({ codeHash: '', args: '', hashType: ScriptHashType.Type }), - Script.fromObject({ codeHash: '', args: '', hashType: ScriptHashType.Type }), + Script.fromObject({ codeHash: `0x${'00'.repeat(32)}`, args: '0x', hashType: ScriptHashType.Type }), + Script.fromObject({ codeHash: `0x${'00'.repeat(32)}`, args: '0x', hashType: ScriptHashType.Type }), '0x080a456972632d320a455432' ) beforeEach(async () => { diff --git a/packages/neuron-wallet/tests/models/chain/witness-args.test.ts b/packages/neuron-wallet/tests/models/chain/witness-args.test.ts index 9a62ba7d9b..dd91b8be8b 100644 --- a/packages/neuron-wallet/tests/models/chain/witness-args.test.ts +++ b/packages/neuron-wallet/tests/models/chain/witness-args.test.ts @@ -1,12 +1,13 @@ +import { blockchain } from '@ckb-lumos/base' +import { bytes } from '@ckb-lumos/codec' import WitnessArgs from '../../../src/models/chain/witness-args' -import { serializeWitnessArgs } from '@nervosnetwork/ckb-sdk-utils' describe('WitnessArgs', () => { describe('deserialize', () => { it('only lock', () => { const wit = new WitnessArgs('0x' + '1'.repeat(64)) - const s = serializeWitnessArgs(wit.toSDK()) + const s = bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) const dWit = WitnessArgs.deserialize(s) expect(dWit.lock).toEqual(wit.lock) @@ -17,7 +18,7 @@ describe('WitnessArgs', () => { it('with inputType and outputType', () => { const wit = new WitnessArgs('0x' + '1'.repeat(64), '0x1234', '0x5678') - const s = serializeWitnessArgs(wit.toSDK()) + const s = bytes.hexify(blockchain.WitnessArgs.pack(wit.toSDK())) const dWit = WitnessArgs.deserialize(s) expect(dWit.lock).toEqual(wit.lock) diff --git a/packages/neuron-wallet/tests/models/keys/hd-public-key-info.test.ts b/packages/neuron-wallet/tests/models/keys/hd-public-key-info.test.ts index 12b42e4090..a784fb7a7c 100644 --- a/packages/neuron-wallet/tests/models/keys/hd-public-key-info.test.ts +++ b/packages/neuron-wallet/tests/models/keys/hd-public-key-info.test.ts @@ -1,6 +1,6 @@ -import { scriptToAddress, systemScripts } from '@nervosnetwork/ckb-sdk-utils' import { AddressType } from '../../../src/models/keys/address' import KeyInfos from '../../setupAndTeardown/public-key-info.fixture' +import { config, helpers } from '@ckb-lumos/lumos' const stubbedIsMainnet = jest.fn() @@ -35,9 +35,10 @@ describe('HdPublicKeyInfoModel', () => { }) }) it('generates mainnet address by property', () => { - const address = scriptToAddress( - { ...systemScripts.SECP256K1_BLAKE160, args: keyInfo.publicKeyInBlake160 }, - true + const systemScript = config.predefined.LINA.SCRIPTS.SECP256K1_BLAKE160 + const address = helpers.encodeToAddress( + { codeHash: systemScript.CODE_HASH, hashType: systemScript.HASH_TYPE, args: keyInfo.publicKeyInBlake160 }, + { config: config.predefined.LINA } ) expect(keyInfoModel.address).toEqual(address) }) @@ -50,9 +51,11 @@ describe('HdPublicKeyInfoModel', () => { }) }) it('generates testnet address by property', () => { - const address = scriptToAddress( - { ...systemScripts.SECP256K1_BLAKE160, args: keyInfo.publicKeyInBlake160 }, - false + const systemScript = config.predefined.AGGRON4.SCRIPTS.SECP256K1_BLAKE160 + + const address = helpers.encodeToAddress( + { codeHash: systemScript.CODE_HASH, hashType: systemScript.HASH_TYPE, args: keyInfo.publicKeyInBlake160 }, + { config: config.predefined.AGGRON4 } ) expect(keyInfoModel.address).toEqual(address) }) diff --git a/packages/neuron-wallet/tests/models/transaction-size.test.ts b/packages/neuron-wallet/tests/models/transaction-size.test.ts index de105ce411..976a2a4f81 100644 --- a/packages/neuron-wallet/tests/models/transaction-size.test.ts +++ b/packages/neuron-wallet/tests/models/transaction-size.test.ts @@ -25,12 +25,26 @@ describe('TransactionSize', () => { it('witnessArgs', () => { const result = TransactionSize.witness(witnessArgs) - expect(result).toEqual(HexUtils.byteLength('0x10000000100000001000000010000000') + 4 + 4) + // FIXME: this may cause bug if not used properly + // + // in `@ckb-lumos/codec` format: + // 0x1400000010000000100000001400000000000000 for + // { + // lock:undefined + // input_type:"0x" // more 4 bytes representin '0' in Uint32 format to indicate the length of input_type + // output_type:undefined + // } + // it has the same for 0x1000000010000000100000 (in ckb-sdk-js format) + // { + // lock: undefined + // input_type: undefined + // output_type: undefined + // } + expect(result).toEqual(HexUtils.byteLength('0x1400000010000000100000001400000000000000') + 4 + 4) }) it('witnessArgs only lock', () => { const witnessArgs = WitnessArgs.emptyLock() - const result = TransactionSize.witness(witnessArgs) expect(result).toEqual(85 + 4 + 4) }) diff --git a/packages/neuron-wallet/tests/services/address.test.ts b/packages/neuron-wallet/tests/services/address.test.ts index 67b2d59fc4..0b58ade6b5 100644 --- a/packages/neuron-wallet/tests/services/address.test.ts +++ b/packages/neuron-wallet/tests/services/address.test.ts @@ -310,7 +310,8 @@ describe('integration tests for AddressService', () => { describe('#generateAndSaveForPublicKey', () => { describe('with public key info exist for the public key', () => { - const publicKey = 'public key' + // const publicKey = 'public key' // not valid public key + const publicKey = '0x' + '00'.repeat(65) // 65 bytes pub key const addressType = AddressType.Receiving const addressIndex = 0 beforeEach(async () => { diff --git a/packages/neuron-wallet/tests/services/cells.test.ts b/packages/neuron-wallet/tests/services/cells.test.ts index 09ba116676..60185de5fd 100644 --- a/packages/neuron-wallet/tests/services/cells.test.ts +++ b/packages/neuron-wallet/tests/services/cells.test.ts @@ -1,5 +1,5 @@ import { getConnection } from 'typeorm' -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import { initConnection } from '../../src/database/chain/ormconfig' import OutputEntity from '../../src/database/chain/entities/output' import { OutputStatus } from '../../src/models/chain/output' @@ -53,7 +53,7 @@ describe('CellsService', () => { const alice = { lockScript: aliceLockScript, lockHash: aliceLockScript.computeHash(), - address: scriptToAddress(aliceLockScript, false), + address: helpers.encodeToAddress(aliceLockScript, { config: config.predefined.AGGRON4 }), blake160: alicePublicKeyHash, walletId: walletId1, } @@ -63,7 +63,7 @@ describe('CellsService', () => { const bob = { lockScript: bobLockScript, lockHash: bobLockScript.computeHash(), - address: scriptToAddress(bobLockScript, false), + address: helpers.encodeToAddress(bobLockScript, { config: config.predefined.AGGRON4 }), blake160: bobPublicKeyHash, walletId: walletId1, } @@ -73,7 +73,7 @@ describe('CellsService', () => { const multisigInfo = { lockScript: multisigLockScript, lockHash: multisigLockScript.computeHash(), - address: scriptToAddress(multisigLockScript, false), + address: helpers.encodeToAddress(multisigLockScript, { config: config.predefined.AGGRON4 }), blake160: multisigPublicKeyHash, walletId: walletId1, } @@ -83,7 +83,7 @@ describe('CellsService', () => { const charlie = { lockScript: charlieLockScript, lockHash: charlieLockScript.computeHash(), - address: scriptToAddress(charlieLockScript, false), + address: helpers.encodeToAddress(charlieLockScript, { config: config.predefined.AGGRON4 }), blake160: charliePublicKeyHash, walletId: walletId2, } @@ -1090,9 +1090,9 @@ describe('CellsService', () => { }) describe('#usedByAnyoneCanPayBlake160s', () => { - const fakeArgs1 = '0x1' - const fakeArgs2 = '0x2' - const fakeArgs3 = '0x3' + const fakeArgs1 = '0x01' + const fakeArgs2 = '0x02' + const fakeArgs3 = '0x03' const codeHash = randomHex() const lockScript1 = new Script(codeHash, fakeArgs1, ScriptHashType.Type) const lockScript2 = new Script(codeHash, fakeArgs2, ScriptHashType.Type) diff --git a/packages/neuron-wallet/tests/services/multisig.test.ts b/packages/neuron-wallet/tests/services/multisig.test.ts index 5972057641..b0c4d6ec31 100644 --- a/packages/neuron-wallet/tests/services/multisig.test.ts +++ b/packages/neuron-wallet/tests/services/multisig.test.ts @@ -8,7 +8,7 @@ import { OutputStatus } from '../../src/models/chain/output' import { keyInfos } from '../setupAndTeardown/public-key-info.fixture' import Multisig from '../../src/models/multisig' import SystemScriptInfo from '../../src/models/system-script-info' -import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils' +import { utils } from '@ckb-lumos/lumos'; const [alice, bob, charlie] = keyInfos @@ -316,7 +316,7 @@ describe('multisig service', () => { describe('deleteRemovedMultisigOutput', () => { it('delete cell thats config not in db', async () => { const output = MultisigOutput.fromIndexer(defaultOutput) - output.lockHash = scriptToHash(alice.lockScript) + output.lockHash = utils.computeScriptHash(alice.lockScript) output.outPointTxHash = '0x9821d3184b5743726e4686541a74213eaa63e2d8f4fb9ee9ff50878aa9177c87' await getConnection().manager.save(output) await MultisigService.deleteRemovedMultisigOutput() diff --git a/packages/neuron-wallet/tests/services/tx/transaction-generator.test.ts b/packages/neuron-wallet/tests/services/tx/transaction-generator.test.ts index 62316a55de..273dfbb94d 100644 --- a/packages/neuron-wallet/tests/services/tx/transaction-generator.test.ts +++ b/packages/neuron-wallet/tests/services/tx/transaction-generator.test.ts @@ -1,5 +1,6 @@ import { when } from 'jest-when' import { getConnection } from 'typeorm' +import { config, helpers } from '@ckb-lumos/lumos' import { initConnection } from '../../../src/database/chain/ormconfig' import OutputEntity from '../../../src/database/chain/entities/output' import InputEntity from '../../../src/database/chain/entities/input' @@ -17,7 +18,6 @@ import SystemScriptInfo from '../../../src/models/system-script-info' import AssetAccountInfo from '../../../src/models/asset-account-info' import BufferUtils from '../../../src/utils/buffer' import WitnessArgs from '../../../src/models/chain/witness-args' -import { serializeWitnessArgs, scriptToAddress, addressToScript } from '@nervosnetwork/ckb-sdk-utils' import { CapacityNotEnough, CurrentWalletNotSet, @@ -47,10 +47,11 @@ const fullAddressLockScript: Script = new Script( '0x1234', ScriptHashType.Type ) + const fullAddressInfo = { lockScript: fullAddressLockScript, lockHash: fullAddressLockScript.computeHash(), - address: scriptToAddress(fullAddressLockScript, false), + address: helpers.encodeToAddress(fullAddressLockScript, { config: config.predefined.AGGRON4 }), } // diff = 1000min @@ -84,6 +85,8 @@ import HdPublicKeyInfo from '../../../src/database/chain/entities/hd-public-key- import AssetAccount from '../../../src/models/asset-account' import MultisigConfigModel from '../../../src/models/multisig-config' import MultisigOutput from '../../../src/database/chain/entities/multisig-output' +import { bytes } from '@ckb-lumos/codec' +import { blockchain } from '@ckb-lumos/base' import { LumosCell } from '../../../src/block-sync-renderer/sync/connector' describe('TransactionGenerator', () => { @@ -755,7 +758,7 @@ describe('TransactionGenerator', () => { 'ckt1qyqdpymnu202x3p4cnrrgek5czcdsg95xznswjr98y', 'ckt1qyqdpymnu202x3p4cnrrgek5czcdsg95xznswjr98y', 'ckt1qyqwqcknusdreymrhhme00hg9af3pr5hcmwqzfxvda', - ].map(v => addressToScript(v).args), + ].map(v => helpers.addressToScript(v, {config: config.predefined.AGGRON4}).args), }) ) @@ -1158,7 +1161,8 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + // tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1195,7 +1199,8 @@ describe('TransactionGenerator', () => { const targetOutput: Output = Output.fromObject({ capacity: toShannon('61'), lock: aliceAnyoneCanPayLockScript, - type: assetAccountInfo.generateSudtScript('0xuuid'), + // DELETE ME: 0xuuid is not a valid args for sudt + type: assetAccountInfo.generateSudtScript('0x1234567890123456789012345678901234567890'), data: '0x', }) @@ -1208,7 +1213,7 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1265,7 +1270,7 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1350,7 +1355,7 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) tx.witnesses[1] = '0x' expectedTxSize = TransactionSize.tx(tx) @@ -1401,8 +1406,8 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) - tx.witnesses[1] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) + tx.witnesses[1] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1454,8 +1459,8 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) - tx.witnesses[1] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) + tx.witnesses[1] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) }) it('should not use insufficient ACP cell as input', async () => { expect(tx.inputs.length).toEqual(3) @@ -1616,7 +1621,7 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1690,7 +1695,7 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1773,8 +1778,8 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) - tx.witnesses[1] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) + tx.witnesses[1] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -1851,7 +1856,7 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) tx.witnesses[1] = '0x' expectedTxSize = TransactionSize.tx(tx) @@ -1966,7 +1971,7 @@ describe('TransactionGenerator', () => { '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -2037,8 +2042,8 @@ describe('TransactionGenerator', () => { feeRate, '0' ) - tx.witnesses[0] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) - tx.witnesses[1] = serializeWitnessArgs(WitnessArgs.emptyLock().toSDK()) + tx.witnesses[0] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) + tx.witnesses[1] = bytes.hexify(blockchain.WitnessArgs.pack(WitnessArgs.emptyLock().toSDK())) expectedTxSize = TransactionSize.tx(tx) expectedTxFee = TransactionFee.fee(expectedTxSize, BigInt(feeRate)).toString() @@ -2511,7 +2516,7 @@ describe('TransactionGenerator', () => { const sudtCell = Output.fromObject(sudtCellObject) when(stubbedQueryIndexer) .calledWith({ - lock: addressToScript('ckt1qyq0tejcz8rl6yyjw3m3vnu7r955d9ecj9gq46suu6'), + lock: helpers.addressToScript('ckt1qyq0tejcz8rl6yyjw3m3vnu7r955d9ecj9gq46suu6', {config: config.predefined.AGGRON4}), type: sudtCell.type, data: null, }) @@ -2524,7 +2529,7 @@ describe('TransactionGenerator', () => { const sudtCell = Output.fromObject(sudtCellObject) sudtCell.setCapacity(toShannon('144')) getCurrentMock.mockReturnValueOnce({}) - const bobLockHash = scriptToAddress(bobAnyoneCanPayLockScript) + const bobLockHash = helpers.encodeToAddress(bobAnyoneCanPayLockScript) const res = (await TransactionGenerator.generateSudtMigrateAcpTx(sudtCell, bobLockHash)) as Transaction expect(res.outputs).toHaveLength(2) expect(res.outputs[1].data).toEqual(BufferUtils.writeBigUInt128LE(BigInt(200))) @@ -2535,7 +2540,7 @@ describe('TransactionGenerator', () => { id: alice.walletId, getNextChangeAddress: () => ({ address: alice.address }), }) - const bobLockHash = scriptToAddress(bobAnyoneCanPayLockScript) + const bobLockHash = helpers.encodeToAddress(bobAnyoneCanPayLockScript) const res = (await TransactionGenerator.generateSudtMigrateAcpTx(sudtCell, bobLockHash)) as Transaction expect(res.outputs).toHaveLength(3) expect(res.outputs[1].data).toEqual(BufferUtils.writeBigUInt128LE(BigInt(200))) diff --git a/packages/neuron-wallet/tests/services/tx/transaction-sender.test.ts b/packages/neuron-wallet/tests/services/tx/transaction-sender.test.ts index 853d4e6aa9..c10cef169d 100644 --- a/packages/neuron-wallet/tests/services/tx/transaction-sender.test.ts +++ b/packages/neuron-wallet/tests/services/tx/transaction-sender.test.ts @@ -172,7 +172,9 @@ import { import TransactionSender from '../../../src/services/transaction-sender' import MultisigConfigModel from '../../../src/models/multisig-config' import Multisig from '../../../src/models/multisig' -import { addressToScript, serializeWitnessArgs } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' +import { bytes } from '@ckb-lumos/codec' +import { blockchain } from '@ckb-lumos/base' const fakeScript = new Script( '0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8', @@ -850,7 +852,11 @@ describe('TransactionSender Test', () => { } const createMultisigConfig = (r: number, m: number, addresses: string[]): [string, MultisigConfigModel] => { - const blake160s = addresses.map(v => addressToScript(v).args) + const blake160s = addresses.map(v => { + const isMainnet = v.startsWith('ckb') + const lumosOptions = isMainnet ? {config: config.predefined.LINA} : {config: config.predefined.AGGRON4}; + return helpers.addressToScript(v, lumosOptions).args + }) const multiArgs = Multisig.hash(blake160s, r, m, addresses.length) return [ multiArgs, @@ -859,7 +865,11 @@ describe('TransactionSender Test', () => { r, m, n: addresses.length, - blake160s: addresses.map(v => addressToScript(v).args), + blake160s: addresses.map(v => { + const isMainnet = v.startsWith('ckb') + const lumosOptions = isMainnet ? config.predefined.LINA : config.predefined.AGGRON4; + return helpers.addressToScript(v, {config: lumosOptions}).args + }), }), ] } @@ -873,7 +883,7 @@ describe('TransactionSender Test', () => { const addr = { walletId: fakeWallet.id, path: `m/44'/309'/0'/0/0`, - blake160: addressToScript(addresses[0]).args, + blake160: helpers.addressToScript(addresses[0], {config: config.predefined.AGGRON4}).args, version: 'testnet', } @@ -904,7 +914,12 @@ describe('TransactionSender Test', () => { const mockGAI = jest.fn() mockGAI.mockReturnValue( - [addr, addr, addr].map((v, idx) => ({ ...v, blake160: addressToScript(addresses[idx]).args })) + [addr, addr, addr].map((v, idx) => { + const address = addresses[idx] + const isMainnet = address.startsWith('ckb') + const lumosOptions = isMainnet ? {config: config.predefined.LINA} : {config: config.predefined.AGGRON4}; + return { ...v, blake160: helpers.addressToScript(address, lumosOptions).args } + }) ) let tx = Transaction.fromObject(transcationObject) it('first sign', async () => { @@ -914,7 +929,11 @@ describe('TransactionSender Test', () => { tx = await transactionSender.signMultisig(fakeWallet.id, tx, '1234', [multisigConfig]) const lock = (tx.witnesses[0] as WitnessArgs).lock! const serializedMultiSign: string = Multisig.serialize( - addresses.map(v => addressToScript(v).args), + addresses.map(v => { + const isMainnet = v.startsWith('ckb') + const lumosOptions = isMainnet ? config.predefined.LINA : config.predefined.AGGRON4; + return helpers.addressToScript(v, {config: lumosOptions}).args + }), 1, 2, 3 @@ -952,7 +971,7 @@ describe('TransactionSender Test', () => { const addr = { walletId: fakeWallet.id, address: noMatchAddress, - blake160: addressToScript(noMatchAddress).args, + blake160: helpers.addressToScript(noMatchAddress, {config: config.predefined.AGGRON4}).args, version: 'testnet', } @@ -990,7 +1009,7 @@ describe('TransactionSender Test', () => { const addr = { walletId: fakeWallet.id, path: `m/44'/309'/0'/0/0`, - blake160: addressToScript(addresses[0]).args, + blake160: helpers.addressToScript(addresses[0], {config: config.predefined.AGGRON4}).args, version: 'testnet', } @@ -1000,17 +1019,22 @@ describe('TransactionSender Test', () => { const tx = Transaction.fromObject(transcationObject) tx.inputs[0]!.setLock(SystemScriptInfo.generateMultiSignScript(multiArgs)) const res = await transactionSender.signMultisig(fakeWallet.id, tx, '1234', [multisigConfig]) - const expectedValue = serializeWitnessArgs({ + const witness = { inputType: undefined, outputType: undefined, lock: Multisig.serialize( - addresses.map(v => addressToScript(v).args), + addresses.map(v => { + const isMainnet = v.startsWith('ckb') + const lumosOptions = isMainnet ? config.predefined.LINA : config.predefined.AGGRON4; + return helpers.addressToScript(v, {config: lumosOptions}).args + }), 1, 1, 2 ) + witnessLock, - }) + } + const expectedValue = bytes.hexify(blockchain.WitnessArgs.pack(witness)) expect(res.witnesses[0]).toBe(expectedValue) }) }) @@ -1024,7 +1048,7 @@ describe('TransactionSender Test', () => { const addr = { walletId: fakeWallet.id, path: `m/44'/309'/0'/0/0`, - blake160: addressToScript(addresses[0]).args, + blake160: helpers.addressToScript(addresses[0], {config: config.predefined.AGGRON4}).args, version: 'testnet', } diff --git a/packages/neuron-wallet/tests/services/tx/transaction-service.test.ts b/packages/neuron-wallet/tests/services/tx/transaction-service.test.ts index 3aa87e818c..547f0a27dc 100644 --- a/packages/neuron-wallet/tests/services/tx/transaction-service.test.ts +++ b/packages/neuron-wallet/tests/services/tx/transaction-service.test.ts @@ -606,7 +606,7 @@ describe('Test TransactionService', () => { lock: { codeHash: `0x${'0'.repeat(64)}`, hashType: 'data', - args: '0x0' + args: '0x00' }, } ] @@ -633,12 +633,12 @@ describe('Test TransactionService', () => { lock: { codeHash: `0x${'0'.repeat(64)}`, hashType: 'data', - args: '0x0' + args: '0x00' }, type: { codeHash: `0x${'1'.repeat(64)}`, hashType: 'data', - args: '0x1' + args: '0x01' } } ] diff --git a/packages/neuron-wallet/tests/setup.ts b/packages/neuron-wallet/tests/setup.ts index 340ae061cf..5d8bd75435 100644 --- a/packages/neuron-wallet/tests/setup.ts +++ b/packages/neuron-wallet/tests/setup.ts @@ -1,4 +1,4 @@ -import { systemScripts } from '@nervosnetwork/ckb-sdk-utils' +import { config } from '@ckb-lumos/lumos' import '../src/locales/i18n' import { LedgerHID, LedgerCkbApp } from './mock/hardware' @@ -23,8 +23,8 @@ jest.mock('dotenv', () => ({ process.env.MAINNET_ACP_DEP_TXHASH = '0x0000000000000000000000000000000000000000000000000000000000000000' process.env.MAINNET_ACP_DEP_INDEX = '0' process.env.MAINNET_ACP_DEP_TYPE = 'code' - process.env.MAINNET_ACP_SCRIPT_CODEHASH = systemScripts.ANYONE_CAN_PAY_MAINNET.codeHash - process.env.MAINNET_ACP_SCRIPT_HASHTYPE = systemScripts.ANYONE_CAN_PAY_MAINNET.hashType + process.env.MAINNET_ACP_SCRIPT_CODEHASH = config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.CODE_HASH + process.env.MAINNET_ACP_SCRIPT_HASHTYPE = config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.HASH_TYPE process.env.LEGACY_MAINNET_ACP_DEP_TXHASH = '0x0000000000000000000000000000000000000000000000000000000000000001' process.env.LEGACY_MAINNET_ACP_DEP_INDEX = '0' @@ -56,8 +56,8 @@ jest.mock('dotenv', () => ({ process.env.TESTNET_ACP_DEP_TXHASH = '0x4f32b3e39bd1b6350d326fdfafdfe05e5221865c3098ae323096f0bfc69e0a8c' process.env.TESTNET_ACP_DEP_INDEX = '0' process.env.TESTNET_ACP_DEP_TYPE = 'depGroup' - process.env.TESTNET_ACP_SCRIPT_CODEHASH = systemScripts.ANYONE_CAN_PAY_TESTNET.codeHash - process.env.TESTNET_ACP_SCRIPT_HASHTYPE = systemScripts.ANYONE_CAN_PAY_TESTNET.hashType + process.env.TESTNET_ACP_SCRIPT_CODEHASH = config.predefined.AGGRON4.SCRIPTS.ANYONE_CAN_PAY.CODE_HASH + process.env.TESTNET_ACP_SCRIPT_HASHTYPE = config.predefined.AGGRON4.SCRIPTS.ANYONE_CAN_PAY.HASH_TYPE process.env.LEGACY_TESTNET_ACP_DEP_TXHASH = '0x0000000000000000000000000000000000000000000000000000000000000001' process.env.LEGACY_TESTNET_ACP_DEP_INDEX = '0' @@ -78,9 +78,10 @@ jest.mock('dotenv', () => ({ process.env.TESTNET_CHEQUE_SCRIPT_CODEHASH = '0x0000000000000000000000000000000000000000000000000000000000000003' process.env.TESTNET_CHEQUE_SCRIPT_HASHTYPE = 'type' - process.env.SECP256K1_CODE_HASH = systemScripts.SECP256K1_BLAKE160.codeHash - process.env.DAO_CODE_HASH = systemScripts.NERVOS_DAO.codeHash - process.env.MULTISIG_CODE_HASH = systemScripts.SECP256K1_MULTISIG.codeHash + // script code hash are same for any(testnet/mainnet/devnet) network + process.env.SECP256K1_CODE_HASH = config.predefined.LINA.SCRIPTS.SECP256K1_BLAKE160.CODE_HASH + process.env.DAO_CODE_HASH = config.predefined.LINA.SCRIPTS.DAO.CODE_HASH + process.env.MULTISIG_CODE_HASH = config.predefined.LINA.SCRIPTS.SECP256K1_BLAKE160_MULTISIG.CODE_HASH }, })) diff --git a/packages/neuron-wallet/tests/setupAndTeardown/public-key-info.fixture.ts b/packages/neuron-wallet/tests/setupAndTeardown/public-key-info.fixture.ts index 585fb8dde0..2e7fb7c399 100644 --- a/packages/neuron-wallet/tests/setupAndTeardown/public-key-info.fixture.ts +++ b/packages/neuron-wallet/tests/setupAndTeardown/public-key-info.fixture.ts @@ -1,4 +1,4 @@ -import { scriptToAddress } from '@nervosnetwork/ckb-sdk-utils' +import { config, helpers } from '@ckb-lumos/lumos' import { AddressType } from '../../src/models/keys/address' import SystemScriptInfo from '../../src/models/system-script-info' @@ -11,7 +11,7 @@ const aliceLockScript = SystemScriptInfo.generateSecpScript(alicePublicKeyHash) const alice = { lockScript: aliceLockScript, lockHash: aliceLockScript.computeHash(), - address: scriptToAddress(aliceLockScript, false), + address: helpers.encodeToAddress(aliceLockScript, { config: config.predefined.AGGRON4 }), blake160: aliceLockScript.args, walletId: walletId1, } @@ -21,7 +21,7 @@ const bobLockScript = SystemScriptInfo.generateSecpScript(bobPublicKeyHash) const bob = { lockScript: bobLockScript, lockHash: bobLockScript.computeHash(), - address: scriptToAddress(bobLockScript, false), + address: helpers.encodeToAddress(bobLockScript, { config: config.predefined.AGGRON4 }), blake160: bobPublicKeyHash, walletId: walletId1, } @@ -31,7 +31,7 @@ const charlieLockScript = SystemScriptInfo.generateSecpScript(charliePublicKeyHa const charlie = { lockScript: charlieLockScript, lockHash: charlieLockScript.computeHash(), - address: scriptToAddress(charlieLockScript, false), + address: helpers.encodeToAddress(charlieLockScript, { config: config.predefined.AGGRON4 }), blake160: charliePublicKeyHash, walletId: walletId2, } diff --git a/packages/neuron-wallet/tests/setupAndTeardown/transactions.fixture.ts b/packages/neuron-wallet/tests/setupAndTeardown/transactions.fixture.ts index 378fb42e48..f8930e335e 100644 --- a/packages/neuron-wallet/tests/setupAndTeardown/transactions.fixture.ts +++ b/packages/neuron-wallet/tests/setupAndTeardown/transactions.fixture.ts @@ -6,7 +6,7 @@ import Input from '../../src/models/chain/input' import Script from '../../src/models/chain/script' import Output from '../../src/models/chain/output' import { DEPLOY_KEY } from './keys' -import { systemScripts } from '@nervosnetwork/ckb-sdk-utils' +import { config } from '@ckb-lumos/lumos' const fromTxObject = (tx: any) => Transaction.fromObject({ @@ -177,8 +177,8 @@ const ACPTx0 = { // address: ckt1qyq9t2w0l0u7rnylrxmj2uq6a28sstnctcwfu4vnst4n3u0p2luawfsmjrmsz lock: { args: '0xe2193df51d78411601796b35b17b4f8f2cd85bd0', - codeHash: systemScripts.ANYONE_CAN_PAY_MAINNET.codeHash, - hashType: systemScripts.ANYONE_CAN_PAY_MAINNET.hashType, + codeHash: config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.CODE_HASH, + hashType: config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.HASH_TYPE, }, type: { args: '0xe2193df51d78411601796b35b17b4f8f2cd85bd0', @@ -224,8 +224,8 @@ const ACPTx1 = { // address: ckt1qyq9t2w0l0u7rnylrxmj2uq6a28sstnctcwfu4vnst4n3u0p2luawfsmjrmsz lock: { args: '0xe2193df51d78411601796b35b17b4f8f2cd85bd0', - codeHash: systemScripts.ANYONE_CAN_PAY_MAINNET.codeHash, - hashType: systemScripts.ANYONE_CAN_PAY_MAINNET.hashType, + codeHash: config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.CODE_HASH, + hashType: config.predefined.LINA.SCRIPTS.ANYONE_CAN_PAY.HASH_TYPE, }, capacity: '0x34e62ce00', outPoint: { txHash: '0x230ab250ee0ae681e88e462102e5c01a9994ac82bf0effbfb58d6c11a8657900', index: '0' }, diff --git a/yarn.lock b/yarn.lock index 0997b4d289..a79d3176f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1456,6 +1456,71 @@ dependencies: "@ckb-lumos/bi" "0.20.0-alpha.3" +"@ckb-lumos/common-scripts@0.20.0-alpha.3": + version "0.20.0-alpha.3" + resolved "https://registry.yarnpkg.com/@ckb-lumos/common-scripts/-/common-scripts-0.20.0-alpha.3.tgz#39f33d4f523d20a95e3e4c61649bc738694e8664" + integrity sha512-EEfwxAz8SPO+jECljSetZ9vOZsfPTf00IjiskTv3xW5rzHfldOtQSJwCpf0KZDPjMt2R4BixL6kHxv4FAZ2HJQ== + dependencies: + "@ckb-lumos/base" "0.20.0-alpha.3" + "@ckb-lumos/bi" "0.20.0-alpha.3" + "@ckb-lumos/codec" "0.20.0-alpha.3" + "@ckb-lumos/config-manager" "0.20.0-alpha.3" + "@ckb-lumos/helpers" "0.20.0-alpha.3" + "@ckb-lumos/rpc" "0.20.0-alpha.3" + "@ckb-lumos/toolkit" "0.20.0-alpha.3" + immutable "^4.0.0-rc.12" + +"@ckb-lumos/config-manager@0.20.0-alpha.3": + version "0.20.0-alpha.3" + resolved "https://registry.yarnpkg.com/@ckb-lumos/config-manager/-/config-manager-0.20.0-alpha.3.tgz#160b02e46074b75bfd6065b5eeb9546739649e88" + integrity sha512-NUF6p313dbqUhoxt+J/nTF3fkLb5Tg7PPu8oknBdpi3GudeSJfEX4SuenTqLh5kaely39dSRjB0adHXnDvFzpQ== + dependencies: + "@ckb-lumos/base" "0.20.0-alpha.3" + "@ckb-lumos/bi" "0.20.0-alpha.3" + "@ckb-lumos/codec" "0.20.0-alpha.3" + "@types/deep-freeze-strict" "^1.1.0" + deep-freeze-strict "^1.1.1" + +"@ckb-lumos/hd@0.20.0-alpha.3": + version "0.20.0-alpha.3" + resolved "https://registry.yarnpkg.com/@ckb-lumos/hd/-/hd-0.20.0-alpha.3.tgz#608bded07aed41f71bda40e4f66af365a9ab18db" + integrity sha512-ladOBv4CPdW3q6fZorMIBpavzKII12ClAs7jvjtub8/CPziJAdTW0o62UFBvP1zt51eG0nP/NObuHzAos3pJnw== + dependencies: + "@ckb-lumos/base" "0.20.0-alpha.3" + "@ckb-lumos/bi" "0.20.0-alpha.3" + bn.js "^5.1.3" + elliptic "^6.5.4" + scrypt-js "^3.0.1" + sha3 "^2.1.3" + uuid "^8.3.0" + +"@ckb-lumos/helpers@0.20.0-alpha.3": + version "0.20.0-alpha.3" + resolved "https://registry.yarnpkg.com/@ckb-lumos/helpers/-/helpers-0.20.0-alpha.3.tgz#17e715664b871fdb0b20cc9d146b0ccb3a7e288e" + integrity sha512-KGOwxWLP5ut+3RJ0qv974Fpy/KPWtJydlFaRPgkBlpJYfhrds809CO/27oAw8R8TZm+tg+ovu+9Qq75l2PNkwA== + dependencies: + "@ckb-lumos/base" "0.20.0-alpha.3" + "@ckb-lumos/bi" "0.20.0-alpha.3" + "@ckb-lumos/config-manager" "0.20.0-alpha.3" + "@ckb-lumos/toolkit" "0.20.0-alpha.3" + bech32 "^2.0.0" + immutable "^4.0.0-rc.12" + +"@ckb-lumos/lumos@0.20.0-alpha.3": + version "0.20.0-alpha.3" + resolved "https://registry.yarnpkg.com/@ckb-lumos/lumos/-/lumos-0.20.0-alpha.3.tgz#ff907cca86d9bd27a851121ed450f3ddec06f451" + integrity sha512-jscHhSDsQOXAZywX8dnieuOoJUiQHJXrstAAqErBu30V7HDKmWmwkdLm1XBWgXlI970HrmNK4J38qD2e1G7iyA== + dependencies: + "@ckb-lumos/base" "0.20.0-alpha.3" + "@ckb-lumos/bi" "0.20.0-alpha.3" + "@ckb-lumos/ckb-indexer" "0.20.0-alpha.3" + "@ckb-lumos/common-scripts" "0.20.0-alpha.3" + "@ckb-lumos/config-manager" "0.20.0-alpha.3" + "@ckb-lumos/hd" "0.20.0-alpha.3" + "@ckb-lumos/helpers" "0.20.0-alpha.3" + "@ckb-lumos/rpc" "0.20.0-alpha.3" + "@ckb-lumos/toolkit" "0.20.0-alpha.3" + "@ckb-lumos/rpc@0.20.0-alpha.3": version "0.20.0-alpha.3" resolved "https://registry.yarnpkg.com/@ckb-lumos/rpc/-/rpc-0.20.0-alpha.3.tgz#e1c7d1aaaaedfca1d7da75aac699ffd2fa060cc5" @@ -4269,6 +4334,11 @@ dependencies: "@types/ms" "*" +"@types/deep-freeze-strict@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/deep-freeze-strict/-/deep-freeze-strict-1.1.0.tgz#447a6a2576191344aa42310131dd3df5c41492c4" + integrity sha512-fILflsS66kGQ4iIBzYoxuQCWK1wQdy/ooguTofUk0KSxA+G5ZzH8WdU8mf6IU+5cMBW+j9u+eh+7kv63R3O9Tw== + "@types/electron-devtools-installer@2.2.2": version "2.2.2" resolved "https://registry.yarnpkg.com/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.2.tgz#5a91929ee76b5de0d171edec5bd049292d48a2a4" @@ -6636,7 +6706,7 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bech32@2.0.0: +bech32@2.0.0, bech32@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== @@ -6744,7 +6814,7 @@ bn.js@4.12.0, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -8584,6 +8654,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-freeze-strict@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-freeze-strict/-/deep-freeze-strict-1.1.1.tgz#77d0583ca24a69be4bbd9ac2fae415d55523e5b0" + integrity sha512-QemROZMM2IvhAcCFvahdX2Vbm4S/txeq5rFYU9fh4mQP79WTMW5c/HkQ2ICl1zuzcDZdPZ6zarDxQeQMsVYoNA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -9166,7 +9241,7 @@ electron@24.5.1: "@types/node" "^18.11.18" extract-zip "^2.0.1" -elliptic@6.5.4, elliptic@^6.5.3: +elliptic@6.5.4, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -11618,7 +11693,7 @@ immer@9.0.21, immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -immutable@^4.0.0: +immutable@^4.0.0, immutable@^4.0.0-rc.12: version "4.3.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== @@ -17821,6 +17896,11 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -17986,7 +18066,7 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -sha3@2.1.4: +sha3@2.1.4, sha3@^2.1.3: version "2.1.4" resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== @@ -19867,7 +19947,7 @@ uuid-browser@^3.1.0: resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" integrity sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg== -uuid@8.3.2, uuid@^8.3.2: +uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==