Skip to content

Commit

Permalink
Update SignMultisigTransaction flow to Albatross PoS SDK
Browse files Browse the repository at this point in the history
And latest multisig Keyguard client.
  • Loading branch information
sisou committed Jan 15, 2025
1 parent 6835f99 commit 0be1504
Show file tree
Hide file tree
Showing 14 changed files with 124 additions and 52 deletions.
18 changes: 8 additions & 10 deletions client/PublicRequestTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,27 +260,25 @@ export interface EncryptionKeyParams {

export interface MultisigInfo {
publicKeys: Bytes[];
numberOfSigners: number;
signerPublicKeys?: Bytes[]; // Can be omitted when all publicKeys need to sign
secret: {
aggregatedSecret: Bytes;
} | {
encryptedSecrets: Bytes[];
bScalar: Bytes;
signers: Array<{
publicKey: Bytes;
commitments: Bytes[];
}>;
secrets: Bytes[] | {
encrypted: Bytes[];
keyParams: EncryptionKeyParams;
};
aggregatedCommitment: Bytes;
userName?: string;
}

export interface SignMultisigTransactionRequest extends BasicRequest {
signer: string; // Address

sender: string;
senderType?: Nimiq.Account.Type;
senderType?: Nimiq.AccountType;
senderLabel: string;
recipient: string;
recipientType?: Nimiq.Account.Type;
recipientType?: Nimiq.AccountType;
recipientLabel?: string;
value: number;
fee?: number;
Expand Down
8 changes: 8 additions & 0 deletions client/dist/HubApi.es.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ var RequestType;
RequestType["CHECKOUT"] = "checkout";
RequestType["SIGN_MESSAGE"] = "sign-message";
RequestType["SIGN_TRANSACTION"] = "sign-transaction";
RequestType["SIGN_MULTISIG_TRANSACTION"] = "sign-multisig-transaction";
RequestType["SIGN_STAKING"] = "sign-staking";
RequestType["ONBOARD"] = "onboard";
RequestType["SIGNUP"] = "signup";
Expand All @@ -313,6 +314,7 @@ var RequestType;
RequestType["ACTIVATE_POLYGON"] = "activate-polygon";
RequestType["SETUP_SWAP"] = "setup-swap";
RequestType["REFUND_SWAP"] = "refund-swap";
RequestType["CONNECT_ACCOUNT"] = "connect-account";
})(RequestType || (RequestType = {}));
var AccountType;
(function (AccountType) {
Expand Down Expand Up @@ -438,6 +440,12 @@ class HubApi {
refundSwap(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.REFUND_SWAP, [request]);
}
signMultisigTransaction(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.SIGN_MULTISIG_TRANSACTION, [request]);
}
connectAccount(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.CONNECT_ACCOUNT, [request]);
}
/**
* Account Management
*
Expand Down
8 changes: 8 additions & 0 deletions client/dist/HubApi.umd.js
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@
RequestType["CHECKOUT"] = "checkout";
RequestType["SIGN_MESSAGE"] = "sign-message";
RequestType["SIGN_TRANSACTION"] = "sign-transaction";
RequestType["SIGN_MULTISIG_TRANSACTION"] = "sign-multisig-transaction";
RequestType["SIGN_STAKING"] = "sign-staking";
RequestType["ONBOARD"] = "onboard";
RequestType["SIGNUP"] = "signup";
Expand All @@ -316,6 +317,7 @@
RequestType["ACTIVATE_POLYGON"] = "activate-polygon";
RequestType["SETUP_SWAP"] = "setup-swap";
RequestType["REFUND_SWAP"] = "refund-swap";
RequestType["CONNECT_ACCOUNT"] = "connect-account";
})(RequestType || (RequestType = {}));
var AccountType;
(function (AccountType) {
Expand Down Expand Up @@ -441,6 +443,12 @@
refundSwap(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.REFUND_SWAP, [request]);
}
signMultisigTransaction(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.SIGN_MULTISIG_TRANSACTION, [request]);
}
connectAccount(request, requestBehavior = this._defaultBehavior) {
return this._request(requestBehavior, RequestType.CONNECT_ACCOUNT, [request]);
}
/**
* Account Management
*
Expand Down
4 changes: 3 additions & 1 deletion client/dist/src/HubApi.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { PopupRequestBehavior, RequestBehavior, RedirectRequestBehavior, BehaviorType } from './RequestBehavior';
import { AccountType, RequestType, BasicRequest, SimpleRequest, OnboardRequest, ChooseAddressRequest, ChooseAddressResult, CheckoutRequest, SignTransactionRequest, RenameRequest, SignMessageRequest, ExportRequest, ResultByRequestType, Account, Address, SignedTransaction, SimpleResult, ExportResult, SignedMessage, CreateCashlinkRequest, ManageCashlinkRequest, SignBtcTransactionRequest, SignedBtcTransaction, AddBtcAddressesRequest, AddBtcAddressesResult, SignPolygonTransactionRequest, SignedPolygonTransaction, Cashlink, CashlinkState, CashlinkTheme, Currency, PaymentType, PaymentState, SetupSwapRequest, SetupSwapResult, RefundSwapRequest, SignStakingRequest } from './PublicRequestTypes';
import { AccountType, RequestType, BasicRequest, SimpleRequest, OnboardRequest, ChooseAddressRequest, ChooseAddressResult, CheckoutRequest, SignTransactionRequest, RenameRequest, SignMessageRequest, ExportRequest, ResultByRequestType, Account, Address, SignedTransaction, SimpleResult, ExportResult, SignedMessage, CreateCashlinkRequest, ManageCashlinkRequest, SignBtcTransactionRequest, SignedBtcTransaction, AddBtcAddressesRequest, AddBtcAddressesResult, SignPolygonTransactionRequest, SignedPolygonTransaction, Cashlink, CashlinkState, CashlinkTheme, Currency, PaymentType, PaymentState, SetupSwapRequest, SetupSwapResult, RefundSwapRequest, SignMultisigTransactionRequest, PartialSignature, SignStakingRequest, ConnectAccountRequest, ConnectedAccount } from './PublicRequestTypes';
export default class HubApi<DB extends BehaviorType = BehaviorType.POPUP, IB extends BehaviorType = BehaviorType.IFRAME> {
static readonly BehaviorType: typeof BehaviorType;
static readonly RequestType: typeof RequestType;
Expand Down Expand Up @@ -39,6 +39,8 @@ export default class HubApi<DB extends BehaviorType = BehaviorType.POPUP, IB ext
signPolygonTransaction<B extends BehaviorType = DB>(request: Promise<SignPolygonTransactionRequest> | SignPolygonTransactionRequest, requestBehavior?: RequestBehavior<B>): Promise<B extends BehaviorType.REDIRECT ? void : SignedPolygonTransaction>;
setupSwap<B extends BehaviorType = DB>(request: Promise<SetupSwapRequest> | SetupSwapRequest, requestBehavior?: RequestBehavior<B>): Promise<B extends BehaviorType.REDIRECT ? void : SetupSwapResult>;
refundSwap<B extends BehaviorType = DB>(request: Promise<RefundSwapRequest> | RefundSwapRequest, requestBehavior?: RequestBehavior<B>): Promise<B extends BehaviorType.REDIRECT ? void : SignedTransaction | SignedBtcTransaction | SignedPolygonTransaction>;
signMultisigTransaction<B extends BehaviorType = DB>(request: Promise<SignMultisigTransactionRequest> | SignMultisigTransactionRequest, requestBehavior?: RequestBehavior<B>): Promise<B extends BehaviorType.REDIRECT ? void : PartialSignature>;
connectAccount<B extends BehaviorType = DB>(request: Promise<ConnectAccountRequest> | ConnectAccountRequest, requestBehavior?: RequestBehavior<B>): Promise<B extends BehaviorType.REDIRECT ? void : ConnectedAccount>;
/**
* Account Management
*
Expand Down
66 changes: 62 additions & 4 deletions client/dist/src/PublicRequestTypes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export declare enum RequestType {
CHECKOUT = "checkout",
SIGN_MESSAGE = "sign-message",
SIGN_TRANSACTION = "sign-transaction",
SIGN_MULTISIG_TRANSACTION = "sign-multisig-transaction",
SIGN_STAKING = "sign-staking",
ONBOARD = "onboard",
SIGNUP = "signup",
Expand All @@ -27,7 +28,8 @@ export declare enum RequestType {
ACTIVATE_BITCOIN = "activate-bitcoin",
ACTIVATE_POLYGON = "activate-polygon",
SETUP_SWAP = "setup-swap",
REFUND_SWAP = "refund-swap"
REFUND_SWAP = "refund-swap",
CONNECT_ACCOUNT = "connect-account"
}
export declare type Bytes = Uint8Array | string;
export declare enum AccountType {
Expand Down Expand Up @@ -203,6 +205,38 @@ export interface SignedTransaction {
proof: Uint8Array;
};
}
export interface EncryptionKeyParams {
kdf: string;
iterations: number;
keySize: number;
}
export interface MultisigInfo {
publicKeys: Bytes[];
signers: Array<{
publicKey: Bytes;
commitments: Bytes[];
}>;
secrets: Bytes[] | {
encrypted: Bytes[];
keyParams: EncryptionKeyParams;
};
userName?: string;
}
export interface SignMultisigTransactionRequest extends BasicRequest {
signer: string;
sender: string;
senderType?: Nimiq.AccountType;
senderLabel: string;
recipient: string;
recipientType?: Nimiq.AccountType;
recipientLabel?: string;
value: number;
fee?: number;
extraData?: Bytes;
flags?: number;
validityStartHeight: number;
multisigConfig: MultisigInfo;
}
export interface NimiqHtlcCreationInstructions {
type: 'NIM';
sender: string;
Expand Down Expand Up @@ -384,6 +418,7 @@ export interface SignedMessage {
signerPublicKey: Uint8Array;
signature: Uint8Array;
}
export declare type PartialSignature = SignedMessage;
export interface Address {
address: string;
label: string;
Expand Down Expand Up @@ -481,6 +516,29 @@ export declare type CreateCashlinkRequest = BasicRequest & {
export interface ManageCashlinkRequest extends BasicRequest {
cashlinkAddress: string;
}
export interface ConnectAccountRequest extends BasicRequest {
appLogoUrl: string;
permissions: RequestType[];
requestedKeyPaths: string[];
challenge: string;
}
export interface ConnectedAccount {
signatures: SignedMessage[];
encryptionKey: {
format: 'spki';
keyData: Uint8Array;
algorithm: {
name: string;
hash: string;
};
keyUsages: ['encrypt'];
keyParams: EncryptionKeyParams;
};
account: {
label: string;
type: string;
};
}
/**
* Bitcoin
*/
Expand Down Expand Up @@ -554,6 +612,6 @@ export interface SignedPolygonTransaction {
message: Record<string, any>;
signature: string;
}
export declare type RpcRequest = SignTransactionRequest | SignStakingRequest | CreateCashlinkRequest | ManageCashlinkRequest | CheckoutRequest | BasicRequest | SimpleRequest | ChooseAddressRequest | OnboardRequest | RenameRequest | SignMessageRequest | ExportRequest | SignBtcTransactionRequest | AddBtcAddressesRequest | SignPolygonTransactionRequest | SetupSwapRequest | RefundSwapRequest;
export declare type RpcResult = SignedTransaction | SignedTransaction[] | Account | Account[] | SimpleResult | ChooseAddressResult | Address | Cashlink | Cashlink[] | SignedMessage | ExportResult | SignedBtcTransaction | AddBtcAddressesResult | SignedPolygonTransaction | SetupSwapResult;
export declare type ResultByRequestType<T> = T extends RequestType.RENAME ? Account : T extends RequestType.ONBOARD | RequestType.SIGNUP | RequestType.LOGIN | RequestType.MIGRATE | RequestType.LIST ? Account[] : T extends RequestType.LIST_CASHLINKS ? Cashlink[] : T extends RequestType.CHOOSE_ADDRESS ? ChooseAddressResult : T extends RequestType.ADD_ADDRESS ? Address : T extends RequestType.SIGN_TRANSACTION ? SignedTransaction : T extends RequestType.SIGN_STAKING ? SignedTransaction[] : T extends RequestType.CHECKOUT ? SignedTransaction | SimpleResult : T extends RequestType.SIGN_MESSAGE ? SignedMessage : T extends RequestType.LOGOUT | RequestType.CHANGE_PASSWORD ? SimpleResult : T extends RequestType.EXPORT ? ExportResult : T extends RequestType.CREATE_CASHLINK | RequestType.MANAGE_CASHLINK ? Cashlink : T extends RequestType.SIGN_BTC_TRANSACTION ? SignedBtcTransaction : T extends RequestType.SIGN_POLYGON_TRANSACTION ? SignedPolygonTransaction : T extends RequestType.ACTIVATE_BITCOIN ? Account : T extends RequestType.ACTIVATE_POLYGON ? Account : T extends RequestType.ADD_BTC_ADDRESSES ? AddBtcAddressesResult : T extends RequestType.SETUP_SWAP ? SetupSwapResult : never;
export declare type RpcRequest = SignTransactionRequest | SignMultisigTransactionRequest | SignStakingRequest | CreateCashlinkRequest | ManageCashlinkRequest | CheckoutRequest | BasicRequest | SimpleRequest | ChooseAddressRequest | OnboardRequest | RenameRequest | SignMessageRequest | ExportRequest | SignBtcTransactionRequest | AddBtcAddressesRequest | SignPolygonTransactionRequest | SetupSwapRequest | RefundSwapRequest | ConnectAccountRequest;
export declare type RpcResult = SignedTransaction | SignedTransaction[] | PartialSignature | Account | Account[] | SimpleResult | ChooseAddressResult | Address | Cashlink | Cashlink[] | SignedMessage | ExportResult | SignedBtcTransaction | AddBtcAddressesResult | SignedPolygonTransaction | SetupSwapResult | ConnectedAccount;
export declare type ResultByRequestType<T> = T extends RequestType.RENAME ? Account : T extends RequestType.ONBOARD | RequestType.SIGNUP | RequestType.LOGIN | RequestType.MIGRATE | RequestType.LIST ? Account[] : T extends RequestType.LIST_CASHLINKS ? Cashlink[] : T extends RequestType.CHOOSE_ADDRESS ? ChooseAddressResult : T extends RequestType.ADD_ADDRESS ? Address : T extends RequestType.SIGN_TRANSACTION ? SignedTransaction : T extends RequestType.SIGN_MULTISIG_TRANSACTION ? PartialSignature : T extends RequestType.SIGN_STAKING ? SignedTransaction[] : T extends RequestType.CHECKOUT ? SignedTransaction | SimpleResult : T extends RequestType.SIGN_MESSAGE ? SignedMessage : T extends RequestType.LOGOUT | RequestType.CHANGE_PASSWORD ? SimpleResult : T extends RequestType.EXPORT ? ExportResult : T extends RequestType.CREATE_CASHLINK | RequestType.MANAGE_CASHLINK ? Cashlink : T extends RequestType.SIGN_BTC_TRANSACTION ? SignedBtcTransaction : T extends RequestType.SIGN_POLYGON_TRANSACTION ? SignedPolygonTransaction : T extends RequestType.ACTIVATE_BITCOIN ? Account : T extends RequestType.ACTIVATE_POLYGON ? Account : T extends RequestType.ADD_BTC_ADDRESSES ? AddBtcAddressesResult : T extends RequestType.SETUP_SWAP ? SetupSwapResult : T extends RequestType.CONNECT_ACCOUNT ? ConnectedAccount : never;
2 changes: 1 addition & 1 deletion client/dist/standalone/HubApi.standalone.es.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion client/dist/standalone/HubApi.standalone.umd.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"@nimiq/electrum-client": "https://github.com/nimiq/electrum-client#build",
"@nimiq/fastspot-api": "^1.10.2",
"@nimiq/iqons": "^1.5.2",
"@nimiq/keyguard-client": "https://gitpkg.now.sh/nimiq/keyguard?scripts.postinstall=cd%20client%20%26%26%20.%2Fbuild-gitpkg.sh&a62aa9f557e2ac4c0d7306828e423230f423a0f1",
"@nimiq/keyguard-client": "https://gitpkg.now.sh/nimiq/keyguard?scripts.postinstall=cd%20client%20%26%26%20.%2Fbuild-gitpkg.sh&fbbcf067a5043d9d56bd24c5a2ac79f63355fac1",
"@nimiq/ledger-api": "^3.1.1",
"@nimiq/oasis-api": "^1.1.1",
"@nimiq/rpc": "^0.4.1",
Expand Down
9 changes: 9 additions & 0 deletions src/i18n/en.po
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,10 @@ msgstr ""
msgid "Choose an Account"
msgstr ""

#: src/views/ConnectAccount.vue:5
msgid "Choose an Account to log in"
msgstr ""

#: src/views/CashlinkReceive.vue:64
#: src/views/ChooseAddress.vue:18
#: src/views/ChooseAddress.vue:5
Expand Down Expand Up @@ -697,7 +701,12 @@ msgstr ""
msgid "Login File saved!"
msgstr ""

#: src/views/ConnectAccountSuccess.vue:4
msgid "Login successful"
msgstr ""

#: src/views/ChooseAddress.vue:67
#: src/views/ConnectAccount.vue:40
msgid "Login to another account"
msgstr ""

Expand Down
28 changes: 12 additions & 16 deletions src/lib/RequestParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -795,35 +795,31 @@ export class RequestParser {
signer: Nimiq.Address.fromAny(signMultisigTxRequest.signer),

sender: Nimiq.Address.fromString(signMultisigTxRequest.sender),
senderType: signMultisigTxRequest.senderType || Nimiq.Account.Type.BASIC,
senderType: signMultisigTxRequest.senderType || Nimiq.AccountType.Basic,
senderLabel: signMultisigTxRequest.senderLabel,
recipient: Nimiq.Address.fromString(signMultisigTxRequest.recipient),
recipientType: signMultisigTxRequest.recipientType || Nimiq.Account.Type.BASIC,
recipientType: signMultisigTxRequest.recipientType || Nimiq.AccountType.Basic,
recipientLabel: signMultisigTxRequest.recipientLabel,
value: signMultisigTxRequest.value,
fee: signMultisigTxRequest.fee || 0,
data: parseMessage(signMultisigTxRequest.extraData) || new Uint8Array(0),
flags: signMultisigTxRequest.flags || Nimiq.Transaction.Flag.NONE,
flags: signMultisigTxRequest.flags || Nimiq.TransactionFlag.None,
validityStartHeight: signMultisigTxRequest.validityStartHeight,

multisigConfig: {
publicKeys: signMultisigTxRequest.multisigConfig.publicKeys.map((bytes) => parseBytes(bytes)),
numberOfSigners: signMultisigTxRequest.multisigConfig.numberOfSigners,
signerPublicKeys: signMultisigTxRequest.multisigConfig.signerPublicKeys
? signMultisigTxRequest.multisigConfig.signerPublicKeys.map((bytes) => parseBytes(bytes))
: signMultisigTxRequest.multisigConfig.publicKeys.map((bytes) => parseBytes(bytes)),
secret: 'aggregatedSecret' in signMultisigTxRequest.multisigConfig.secret
? {aggregatedSecret: parseBytes(
signMultisigTxRequest.multisigConfig.secret.aggregatedSecret,
) }
signers: signMultisigTxRequest.multisigConfig.signers.map((signer) => ({
publicKey: parseBytes(signer.publicKey),
commitments: signer.commitments.map((bytes) => parseBytes(bytes)),
})),
secrets: Array.isArray(signMultisigTxRequest.multisigConfig.secrets)
? signMultisigTxRequest.multisigConfig.secrets.map((bytes) => parseBytes(bytes))
: {
encryptedSecrets: signMultisigTxRequest.multisigConfig.secret.encryptedSecrets.map(
encrypted: signMultisigTxRequest.multisigConfig.secrets.encrypted.map(
(bytes) => parseBytes(bytes),
),
bScalar: parseBytes(signMultisigTxRequest.multisigConfig.secret.bScalar),
keyParams: signMultisigTxRequest.multisigConfig.secret.keyParams,
keyParams: signMultisigTxRequest.multisigConfig.secrets.keyParams,
},
aggregatedCommitment: parseBytes(signMultisigTxRequest.multisigConfig.aggregatedCommitment),
userName: signMultisigTxRequest.multisigConfig.userName,
},
};
Expand All @@ -836,7 +832,7 @@ export class RequestParser {
}

if (connectAccountRequest.appLogoUrl) {
let origin;
let origin: string;
try {
origin = new URL(connectAccountRequest.appLogoUrl).origin;
} catch (err) {
Expand Down
18 changes: 8 additions & 10 deletions src/lib/RequestTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,31 +56,29 @@ export interface ParsedSignTransactionRequest extends ParsedBasicRequest {

export interface ParsedMultisigInfo {
publicKeys: Uint8Array[];
numberOfSigners: number;
signerPublicKeys: Uint8Array[]; // Can be omitted when all publicKeys need to sign
secret: {
aggregatedSecret: Uint8Array;
} | {
encryptedSecrets: Uint8Array[];
bScalar: Uint8Array;
signers: Array<{
publicKey: Uint8Array;
commitments: Uint8Array[];
}>;
secrets: Uint8Array[] | {
encrypted: Uint8Array[];
keyParams: {
kdf: string;
iterations: number;
keySize: number;
};
};
aggregatedCommitment: Uint8Array;
userName?: string;
}

export interface ParsedSignMultisigTransactionRequest extends ParsedBasicRequest {
signer: Nimiq.Address;

sender: Nimiq.Address;
senderType: Nimiq.Account.Type;
senderType: Nimiq.AccountType;
senderLabel: string;
recipient: Nimiq.Address;
recipientType: Nimiq.Account.Type;
recipientType: Nimiq.AccountType;
recipientLabel?: string;
value: number;
fee?: number;
Expand Down
Loading

0 comments on commit 0be1504

Please sign in to comment.