import type { Address } from '../types/primitives.mjs'; import type { DualKeyAccount, KeySource, PreparedTransaction } from './types.mjs'; export type DualKeyAccountArgs = { address: Address; master: KeySource; normal: KeySource; }; /** * Locus dual-key account 를 만든다. 반환된 `signTransaction` 은 prepare 된 * TX 에 대해 master/normal 라우팅을 모두 캡슐화하므로, wallet action 들이 * tx.type 분기를 직접 할 필요가 없다. * * 2 단계 흐름 노트: * * - OPEN_ACCOUNT 는 prepare RPC 에서도 master key-bind 서명이 필요하다. * `prepareParams` 는 호출자가 `keySign` 을 빈 값으로 둔 경우 자동으로 * 채운다. FALCON+ED25519 가 non-deterministic 이라 submit 단계에서 * 서명을 다시 계산하지 *않고*, `prepared.tx.keyBind.sign` 에서 prepare * 단계 값을 그대로 읽어 쓴다 (노드가 prepare 파라미터를 그대로 echo). * * - CHANGE_KEYPAIR 는 *자동으로 채우지 않는다*. 노드가 메인 tx 서명을 * 이전 키가 아닌 *새* normal pubkey 로 검증 (proof-of-possession) * 하므로, 호출자가 새 normal secret 을 보유한 상태로 새 DualKeyAccount * 를 만들어 호출해야 한다. account.normal.getPublicKey() 가 새 키로 * 바뀐 후라면 auto-compute 된 `signByMasterKey` 는 잘못된 `currentNpk` * 를 쓰게 되므로 자동 계산을 비활성화한다. 호출자 측 흐름: * * 1. signByMasterKey = await oldAccount.master.signKeyBind({ * newNpk: <새 normal pubkey>, * currentNpk: <이전 normal pubkey>, * }); * 2. const newAccount = keysToAccount({ address, msk, mpk, * nsk: , npk: }); * 3. await wallet.changeKey({ ..., signByMasterKey }); * * signByMasterKey 가 비어 있으면 prepareParams 가 throw 한다. * * - 그 외 모든 TX 는 prepareParams 가 pass-through. * * 정책 (single source of truth — 노드 측 ParamsOpenAccount / ParamsChangeKey * / ParamsChangeVKey / ParamsCloseAccount RPC struct 와 동기 유지): * * TX_CLOSE_ACCOUNT -> sign = master.signMessage(hash) * TX_OPEN_ACCOUNT -> sign = normal.signMessage(hash) AND * keySign = prepared.tx.keyBind.sign * TX_CHANGE_KEYPAIR -> sign = normal.signMessage(hash) // normal 은 *새* 키여야 함 * signByMasterKey = prepared.tx.keyBind.sign * TX_CHANGE_VKEY -> sign = normal.signMessage(hash) * 그 외 -> sign = normal.signMessage(hash) * * public key 필드 (mpk/pk/mpkey/masterPkey/newNormalPkey) 는 여기서 * 합성하지 않는다 — 호출자가 prepare 파라미터에 직접 포함시켜 넘기고, * `_sendPreparedTransaction` 이 submit 단계에서 params[0] 에 추가 필드들 * 을 병합할 때 원본 값을 보존한다. */ export declare function dualKeyAccount(args: DualKeyAccountArgs): DualKeyAccount; export declare const toAccount: typeof dualKeyAccount; export type { PreparedTransaction };