Skip to content

Commit 76bf66c

Browse files
committed
fix: comments
1 parent fd1c98f commit 76bf66c

File tree

5 files changed

+51
-192
lines changed

5 files changed

+51
-192
lines changed

packages/neuron-ui/src/components/DepositDialog/hooks.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
useClearGeneratedTx,
2121
validateAmount,
2222
} from 'utils'
23+
import getMultisigSignStatus from 'utils/getMultisigSignStatus'
2324
import { MAX_DECIMAL_DIGITS, MIN_DEPOSIT_AMOUNT, SHANNON_CKB_RATIO } from 'utils/const'
2425

2526
const PERCENT_100 = 100
@@ -278,11 +279,12 @@ export const useOnDepositDialogSubmit = ({
278279
const dispatch = useDispatch()
279280
return useCallback(() => {
280281
if (multisigConfig) {
282+
const { canBroadcastAfterSign } = getMultisigSignStatus({ multisigConfig, addresses: wallet.addresses })
281283
dispatch({
282284
type: AppActions.RequestPassword,
283285
payload: {
284286
walletID: wallet.id,
285-
actionType: multisigConfig.m === 1 ? 'send-from-multisig-need-one' : 'send-from-multisig',
287+
actionType: canBroadcastAfterSign ? 'send-from-multisig-need-one' : 'send-from-multisig',
286288
multisigConfig,
287289
onSuccess: onDepositSuccess,
288290
title: 'password-request.verify-password',

packages/neuron-wallet/src/controllers/dao.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import OutPoint from '../models/chain/out-point'
77
import Cell from '../models/chain/output'
88
import Transaction from '../models/chain/transaction'
99
import MultisigConfigModel from '../models/multisig-config'
10+
import Multisig from '../models/multisig'
1011

1112
export default class DaoController {
1213
public async getDaoCells(params: Controller.Params.GetDaoCellsParams): Promise<Controller.Response<Cell[]>> {
@@ -27,7 +28,13 @@ export default class DaoController {
2728
multisigConfig: MultisigConfigModel
2829
}): Promise<Controller.Response<Cell[]>> {
2930
const { multisigConfig } = params
30-
const cells = await CellsService.getMultisigDaoCells(multisigConfig)
31+
const multiSignBlake160 = Multisig.hash(
32+
multisigConfig.blake160s,
33+
multisigConfig.r,
34+
multisigConfig.m,
35+
multisigConfig.n
36+
)
37+
const cells = await CellsService.getDaoCells({ walletId: '', lockArgs: multiSignBlake160 })
3138

3239
if (!cells) {
3340
throw new ServiceHasNoResponse('DaoCells')
@@ -206,7 +213,8 @@ export default class DaoController {
206213
throw new IsRequired('Parameters')
207214
}
208215

209-
const tx = await new TransactionSender().withdrawFromMultisigDao(
216+
const tx = await new TransactionSender().withdrawFromDao(
217+
'',
210218
OutPoint.fromSDK(params.depositOutPoint),
211219
OutPoint.fromSDK(params.withdrawingOutPoint),
212220
params.fee,

packages/neuron-wallet/src/services/cells.ts

Lines changed: 13 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,16 @@ export default class CellsService {
223223
return cells
224224
}
225225

226-
public static async getDaoCells(walletId: string): Promise<Cell[]> {
226+
public static async getDaoCells({ walletId, lockArgs }: { walletId: string; lockArgs?: string }): Promise<Cell[]> {
227227
const outputs: OutputEntity[] = await getConnection()
228228
.getRepository(OutputEntity)
229229
.createQueryBuilder('output')
230230
.leftJoinAndSelect('output.transaction', 'tx')
231231
.where(
232-
`
232+
lockArgs
233+
? `
233234
output.daoData IS NOT NULL AND
235+
output.lockArgs = :lockArgs AND
234236
(
235237
output.status = :liveStatus OR
236238
output.status = :sentStatus OR
@@ -242,65 +244,9 @@ export default class CellsService {
242244
) AND
243245
output.depositTxHash is not null
244246
)
245-
) AND
246-
output.lockArgs in (
247-
SELECT publicKeyInBlake160
248-
FROM hd_public_key_info
249-
WHERE walletId = :walletId
250-
)`,
251-
{
252-
walletId,
253-
liveStatus: OutputStatus.Live,
254-
sentStatus: OutputStatus.Sent,
255-
failedStatus: TransactionStatus.Failed,
256-
deadStatus: OutputStatus.Dead,
257-
pendingStatus: OutputStatus.Pending,
258-
}
259-
)
260-
.orderBy(`CASE output.daoData WHEN '0x0000000000000000' THEN 1 ELSE 0 END`, 'ASC')
261-
.addOrderBy('tx.timestamp', 'ASC')
262-
.getMany()
263-
264-
const cells: Cell[] = outputs.map(output => {
265-
const cell = output.toModel()
266-
if (!output.depositTxHash) {
267-
// if deposit cell, set depositInfo
268-
cell.setDepositInfo({
269-
txHash: output.transaction!.hash,
270-
timestamp: output.transaction!.timestamp!,
271-
})
272-
} else {
273-
// if not deposit cell, set withdrawInfo
274-
const withdrawTx = output.transaction
275-
cell.setWithdrawInfo({
276-
txHash: withdrawTx!.hash,
277-
timestamp: withdrawTx!.timestamp!,
278-
})
279-
}
280-
return cell
281-
})
282-
283-
await Promise.all([CellsService.addDepositInfo(cells), CellsService.addUnlockInfo(cells)])
284-
285-
return cells
286-
}
287-
288-
public static async getMultisigDaoCells(multisigConfig: MultisigConfigModel): Promise<Cell[]> {
289-
const multiSignBlake160 = Multisig.hash(
290-
multisigConfig.blake160s,
291-
multisigConfig.r,
292-
multisigConfig.m,
293-
multisigConfig.n
294-
)
295-
296-
const outputs: OutputEntity[] = await getConnection()
297-
.getRepository(OutputEntity)
298-
.createQueryBuilder('output')
299-
.leftJoinAndSelect('output.transaction', 'tx')
300-
.where(
301-
`
247+
)`
248+
: `
302249
output.daoData IS NOT NULL AND
303-
output.lockArgs = :multiSignBlake160 AND
304250
(
305251
output.status = :liveStatus OR
306252
output.status = :sentStatus OR
@@ -312,9 +258,15 @@ export default class CellsService {
312258
) AND
313259
output.depositTxHash is not null
314260
)
261+
) AND
262+
output.lockArgs in (
263+
SELECT publicKeyInBlake160
264+
FROM hd_public_key_info
265+
WHERE walletId = :walletId
315266
)`,
316267
{
317-
multiSignBlake160,
268+
walletId,
269+
lockArgs,
318270
liveStatus: OutputStatus.Live,
319271
sentStatus: OutputStatus.Sent,
320272
failedStatus: TransactionStatus.Failed,

packages/neuron-wallet/src/services/transaction-sender.ts

Lines changed: 24 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,8 @@ export default class TransactionSender {
788788
depositOutPoint: OutPoint,
789789
withdrawingOutPoint: OutPoint,
790790
fee: string = '0',
791-
feeRate: string = '0'
791+
feeRate: string = '0',
792+
multisigConfig?: MultisigConfigModel
792793
): Promise<Transaction> => {
793794
const DAO_LOCK_PERIOD_EPOCHS = BigInt(180)
794795

@@ -808,7 +809,9 @@ export default class TransactionSender {
808809
throw new TransactionIsNotCommittedYet()
809810
}
810811

811-
const secpCellDep = await SystemScriptInfo.getInstance().getSecpCellDep()
812+
const cellDep = multisigConfig
813+
? await SystemScriptInfo.getInstance().getMultiSignCellDep()
814+
: await SystemScriptInfo.getInstance().getSecpCellDep()
812815
const daoCellDep = await SystemScriptInfo.getInstance().getDaoCellDep()
813816

814817
const content = withdrawOutput.daoData
@@ -848,131 +851,27 @@ export default class TransactionSender {
848851

849852
const outputCapacity: bigint = await this.calculateDaoMaximumWithdraw(depositOutPoint, withdrawBlockHeader.hash)
850853

851-
const wallet = WalletService.getInstance().get(walletID)
852-
const address = await wallet.getNextAddress()
853-
const blake160 = AddressParser.toBlake160(address!.address)
854-
855-
const output: Output = new Output(
856-
outputCapacity.toString(),
857-
new Script(SystemScriptInfo.SECP_CODE_HASH, blake160, SystemScriptInfo.SECP_HASH_TYPE),
858-
undefined,
859-
'0x'
860-
)
861-
862-
const outputs: Output[] = [output]
863-
864-
const input: Input = new Input(
865-
withdrawingOutPoint,
866-
minimalSince.toString(),
867-
withdrawOutput.capacity,
868-
withdrawOutput.lock
869-
)
870-
871-
const withdrawWitnessArgs: WitnessArgs = new WitnessArgs(WitnessArgs.EMPTY_LOCK, '0x0000000000000000')
872-
const tx: Transaction = Transaction.fromObject({
873-
version: '0',
874-
cellDeps: [secpCellDep, daoCellDep],
875-
headerDeps: [depositBlockHeader.hash, withdrawBlockHeader.hash],
876-
inputs: [input],
877-
outputs,
878-
outputsData: outputs.map(o => o.data || '0x'),
879-
witnesses: [withdrawWitnessArgs],
880-
interest: (BigInt(outputCapacity) - depositCapacity).toString(),
881-
})
882-
if (mode.isFeeRateMode()) {
883-
const txSize: number = TransactionSize.tx(tx)
884-
const txFee: bigint = TransactionFee.fee(txSize, BigInt(feeRate))
885-
tx.fee = txFee.toString()
886-
tx.outputs[0].capacity = (outputCapacity - txFee).toString()
854+
let output: Output
855+
if (multisigConfig) {
856+
const lockScript = Multisig.getMultisigScript(
857+
multisigConfig.blake160s,
858+
multisigConfig.r,
859+
multisigConfig.m,
860+
multisigConfig.n
861+
)
862+
const multisigAddresses = scriptToAddress(lockScript, NetworksService.getInstance().isMainnet())
863+
output = new Output(outputCapacity.toString(), AddressParser.parse(multisigAddresses), undefined, '0x')
887864
} else {
888-
tx.fee = fee
889-
tx.outputs[0].capacity = (outputCapacity - feeInt).toString()
890-
}
891-
892-
logger.debug('withdrawFromDao fee:', tx.fee)
893-
894-
return tx
895-
}
896-
897-
public withdrawFromMultisigDao = async (
898-
depositOutPoint: OutPoint,
899-
withdrawingOutPoint: OutPoint,
900-
fee: string = '0',
901-
feeRate: string = '0',
902-
multisigConfig: MultisigConfigModel
903-
): Promise<Transaction> => {
904-
const DAO_LOCK_PERIOD_EPOCHS = BigInt(180)
905-
906-
const feeInt = BigInt(fee)
907-
const feeRateInt = BigInt(feeRate)
908-
const mode = new FeeMode(feeRateInt)
909-
910-
const currentNetwork = NetworksService.getInstance().getCurrent()
911-
const rpcService = new RpcService(currentNetwork.remote, currentNetwork.type)
912-
913-
const withdrawOutput = await CellsService.getLiveCell(withdrawingOutPoint)
914-
if (!withdrawOutput) {
915-
throw new CellIsNotYetLive()
916-
}
917-
const prevTx = (await rpcService.getTransaction(withdrawingOutPoint.txHash))!
918-
if (!prevTx.txStatus.isCommitted()) {
919-
throw new TransactionIsNotCommittedYet()
920-
}
921-
922-
const cellDep = await SystemScriptInfo.getInstance().getMultiSignCellDep()
923-
const daoCellDep = await SystemScriptInfo.getInstance().getDaoCellDep()
924-
925-
const content = withdrawOutput.daoData
926-
if (!content) {
927-
throw new Error(`Withdraw output cell is not a dao cell, ${withdrawOutput.outPoint?.txHash}`)
928-
}
929-
if (!withdrawOutput.depositOutPoint) {
930-
throw new Error('DAO has not finish step first withdraw')
931-
}
932-
const depositTx = await rpcService.getTransaction(withdrawOutput.depositOutPoint.txHash)
933-
if (!depositTx?.txStatus.blockHash) {
934-
throw new Error(`Get deposit block hash failed with tx hash ${withdrawOutput.depositOutPoint.txHash}`)
935-
}
936-
const depositBlockHeader = await rpcService.getHeader(depositTx.txStatus.blockHash)
937-
if (!depositBlockHeader) {
938-
throw new Error(`Get Header failed with blockHash ${depositTx.txStatus.blockHash}`)
939-
}
940-
const depositEpoch = this.parseEpoch(BigInt(depositBlockHeader.epoch))
941-
const depositCapacity: bigint = BigInt(withdrawOutput.capacity)
942-
943-
const withdrawBlockHeader = (await rpcService.getHeader(prevTx.txStatus.blockHash!))!
944-
const withdrawEpoch = this.parseEpoch(BigInt(withdrawBlockHeader.epoch))
945-
946-
const withdrawFraction = withdrawEpoch.index * depositEpoch.length
947-
const depositFraction = depositEpoch.index * withdrawEpoch.length
948-
let depositedEpochs = withdrawEpoch.number - depositEpoch.number
949-
if (withdrawFraction > depositFraction) {
950-
depositedEpochs += BigInt(1)
865+
const wallet = WalletService.getInstance().get(walletID)
866+
const address = await wallet.getNextAddress()
867+
const blake160 = AddressParser.toBlake160(address!.address)
868+
output = new Output(
869+
outputCapacity.toString(),
870+
new Script(SystemScriptInfo.SECP_CODE_HASH, blake160, SystemScriptInfo.SECP_HASH_TYPE),
871+
undefined,
872+
'0x'
873+
)
951874
}
952-
const lockEpochs =
953-
((depositedEpochs + (DAO_LOCK_PERIOD_EPOCHS - BigInt(1))) / DAO_LOCK_PERIOD_EPOCHS) * DAO_LOCK_PERIOD_EPOCHS
954-
const minimalSinceEpochNumber = depositEpoch.number + lockEpochs
955-
const minimalSinceEpochIndex = depositEpoch.index
956-
const minimalSinceEpochLength = depositEpoch.length
957-
958-
const minimalSince = this.epochSince(minimalSinceEpochLength, minimalSinceEpochIndex, minimalSinceEpochNumber)
959-
960-
const outputCapacity: bigint = await this.calculateDaoMaximumWithdraw(depositOutPoint, withdrawBlockHeader.hash)
961-
962-
const lockScript = Multisig.getMultisigScript(
963-
multisigConfig.blake160s,
964-
multisigConfig.r,
965-
multisigConfig.m,
966-
multisigConfig.n
967-
)
968-
const multisigAddresses = scriptToAddress(lockScript, NetworksService.getInstance().isMainnet())
969-
970-
const output: Output = new Output(
971-
outputCapacity.toString(),
972-
AddressParser.parse(multisigAddresses),
973-
undefined,
974-
'0x'
975-
)
976875

977876
const outputs: Output[] = [output]
978877

packages/neuron-wallet/src/services/tx/transaction-generator.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,7 @@ export class TransactionGenerator {
505505
const allInputs: Input[] = await CellsService.gatherAllInputs(
506506
walletId,
507507
multisigConfig
508-
? Script.fromSDK(
509-
Multisig.getMultisigScript(multisigConfig.blake160s, multisigConfig.r, multisigConfig.m, multisigConfig.n)
510-
)
508+
? Multisig.getMultisigScript(multisigConfig.blake160s, multisigConfig.r, multisigConfig.m, multisigConfig.n)
511509
: undefined
512510
)
513511
if (allInputs.length === 0) {

0 commit comments

Comments
 (0)