@subwallet/extension-base 0.5.3-0 → 0.5.5-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,59 @@
1
+ // Copyright 2017-2022 @polkadot/react-signer authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { ExternalRequestPromiseStatus } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { u8aToHex } from '@polkadot/util';
5
+ import { blake2AsU8a } from '@polkadot/util-crypto';
6
+ export default class QrSigner {
7
+ #callback;
8
+ #id;
9
+ #registry;
10
+ #resolver;
11
+ #setState;
12
+
13
+ constructor({
14
+ callback,
15
+ id,
16
+ registry,
17
+ resolver,
18
+ setState
19
+ }) {
20
+ this.#callback = callback;
21
+ this.#id = id;
22
+ this.#registry = registry;
23
+ this.#resolver = resolver;
24
+ this.#setState = setState;
25
+ }
26
+
27
+ async signPayload(payload) {
28
+ return new Promise((resolve, reject) => {
29
+ // limit size of the transaction
30
+ const isQrHashed = payload.method.length > 5000;
31
+ const wrapper = this.#registry.createType('ExtrinsicPayload', payload, {
32
+ version: payload.version
33
+ });
34
+ const qrPayload = isQrHashed ? blake2AsU8a(wrapper.toU8a(true)) : wrapper.toU8a();
35
+
36
+ const resolver = result => {
37
+ this.#resolver();
38
+ resolve(result);
39
+ };
40
+
41
+ this.#setState({
42
+ reject: reject,
43
+ resolve: resolver,
44
+ status: ExternalRequestPromiseStatus.PENDING,
45
+ createdAt: new Date().getTime()
46
+ });
47
+ this.#callback({
48
+ qrState: {
49
+ isQrHashed,
50
+ qrAddress: payload.address,
51
+ qrPayload: u8aToHex(qrPayload),
52
+ qrId: this.#id,
53
+ isEthereum: false
54
+ }
55
+ });
56
+ });
57
+ }
58
+
59
+ }
@@ -0,0 +1,26 @@
1
+ export interface QrState {
2
+ isQrHashed: boolean;
3
+ qrAddress: string;
4
+ qrPayload: `0x${string}`;
5
+ qrId: string;
6
+ isEthereum: boolean;
7
+ }
8
+ export interface Web3TransactionBase {
9
+ to: string;
10
+ gasPrice: number;
11
+ gasLimit: number;
12
+ nonce: number;
13
+ chainId: number;
14
+ data: string;
15
+ value: number;
16
+ }
17
+ export interface Web3Transaction extends Web3TransactionBase {
18
+ from: string;
19
+ }
20
+ export interface LedgerState {
21
+ ledgerPayload: `0x${string}`;
22
+ ledgerId: string;
23
+ }
24
+ export interface ExternalState {
25
+ externalId: string;
26
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { ExternalRequestPromise } from '@subwallet/extension-base/background/KoniTypes';
2
+ import { QrState, Web3Transaction } from '@subwallet/extension-base/signers/types';
3
+ import { SignerResult } from '@polkadot/api/types';
4
+ interface CallbackProps {
5
+ qrState: QrState;
6
+ }
7
+ interface QrSignerProps {
8
+ callback: (state: CallbackProps) => void;
9
+ id: string;
10
+ setState: (promise: ExternalRequestPromise) => void;
11
+ resolver: () => void;
12
+ }
13
+ export default class QrSigner {
14
+ #private;
15
+ constructor({ callback, id, resolver, setState }: QrSignerProps);
16
+ signTransaction(tx: Web3Transaction): Promise<SignerResult>;
17
+ }
18
+ export {};
@@ -0,0 +1,52 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { ExternalRequestPromiseStatus } from '@subwallet/extension-base/background/KoniTypes';
4
+ import RLP from 'rlp';
5
+ import { u8aToHex } from '@polkadot/util';
6
+ export default class QrSigner {
7
+ #callback;
8
+ #id;
9
+ #resolver;
10
+ #setState;
11
+
12
+ constructor({
13
+ callback,
14
+ id,
15
+ resolver,
16
+ setState
17
+ }) {
18
+ this.#callback = callback;
19
+ this.#id = id;
20
+ this.#resolver = resolver;
21
+ this.#setState = setState;
22
+ }
23
+
24
+ async signTransaction(tx) {
25
+ return new Promise((resolve, reject) => {
26
+ const data = [tx.nonce, tx.gasPrice, tx.gasLimit, tx.to, tx.value, tx.data, tx.chainId, new Uint8Array([0x00]), new Uint8Array([0x00])];
27
+ const qrPayload = RLP.encode(data);
28
+
29
+ const resolver = result => {
30
+ this.#resolver();
31
+ resolve(result);
32
+ };
33
+
34
+ this.#setState({
35
+ reject: reject,
36
+ resolve: resolver,
37
+ status: ExternalRequestPromiseStatus.PENDING,
38
+ createdAt: new Date().getTime()
39
+ });
40
+ this.#callback({
41
+ qrState: {
42
+ isQrHashed: false,
43
+ qrAddress: tx.from,
44
+ qrPayload: u8aToHex(qrPayload),
45
+ qrId: this.#id,
46
+ isEthereum: true
47
+ }
48
+ });
49
+ });
50
+ }
51
+
52
+ }