Skip to content

Commit 7f62721

Browse files
authored
Merge pull request #183 from KeystoneHQ/feat/avax
Feat/avax
2 parents 280ebaa + 79f5b3b commit 7f62721

File tree

7 files changed

+7397
-9030
lines changed

7 files changed

+7397
-9030
lines changed
Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,44 @@
11
// @ts-nocheck
22

3-
import { StellarSignRequest, SignType, AvalancheSignRequest } from "../src";
4-
import { CryptoKeypath, PathComponent } from "../src";
5-
import * as uuid from "uuid";
3+
import { AvalancheSignRequest, AvalancheSignature } from "../src";
64

75
describe("avalanche-sign-request", () => {
86
it("test should generate avalanche-sign-reqeust", () => {
97
const avalancheData = Buffer.from(
108
"00000000000000000001ed5f38341e436e5d46e2bb00b45d62ae97d1b050c64bc634ae10626739e35c4b0000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000007000000000089544000000000000000000000000100000001512e7191685398f00663e12197a3d8f6012d9ea300000001db720ad6707915cc4751fb7e5491a3af74e127a1d81817abe9438590c0833fe10000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000050000000000989680000000010000000000000000",
119
"hex"
1210
);
11+
const mfp = "1250B6BC";
12+
const xpub =
13+
"xpub661MyMwAqRbcFFDMuFiGQmA1EqWxxgDLdtNvxxiucf9qkfoVrvwgnYyshxWoewWtkZ1aLhKoVDrpeDvn1YRqxX2szhGKi3UiSEv1hYRMF8q";
14+
const walletIndex = 0;
1315

14-
const avalancheSignRequest =
15-
AvalancheSignRequest.constructAvalancheRequest(avalancheData);
16+
const avalancheSignRequest = AvalancheSignRequest.constructAvalancheRequest(
17+
avalancheData,
18+
mfp,
19+
xpub,
20+
walletIndex
21+
);
22+
23+
const request = AvalancheSignRequest.fromDataItem(
24+
avalancheSignRequest.toDataItem()
25+
);
26+
27+
expect(request.getSignData().toString("hex")).toBe(
28+
"00000000000000000001ed5f38341e436e5d46e2bb00b45d62ae97d1b050c64bc634ae10626739e35c4b0000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000007000000000089544000000000000000000000000100000001512e7191685398f00663e12197a3d8f6012d9ea300000001db720ad6707915cc4751fb7e5491a3af74e127a1d81817abe9438590c0833fe10000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000050000000000989680000000010000000000000000"
29+
);
30+
});
31+
32+
it("test parse signature", () => {
33+
const cbor = Buffer.from(
34+
"a201501a79a2072e114014837e792e003384c10258418d1b6e955f1b2a94aed0b2c29939d68bae89fce2d436cc814efc4731f4a43e8e78ae46e3fdd58e7e0f7c5fa7876239fe7ab0adb6a75c09a07132b741be62612000",
35+
"hex"
36+
);
37+
38+
const signature = AvalancheSignature.fromCBOR(cbor);
1639

17-
expect(avalancheSignRequest.toUR().cbor.toString("hex")).toBe(
18-
"58de00000000000000000001ed5f38341e436e5d46e2bb00b45d62ae97d1b050c64bc634ae10626739e35c4b0000000121e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff00000007000000000089544000000000000000000000000100000001512e7191685398f00663e12197a3d8f6012d9ea300000001db720ad6707915cc4751fb7e5491a3af74e127a1d81817abe9438590c0833fe10000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000050000000000989680000000010000000000000000"
40+
expect(signature.getSignature().toString("hex")).toBe(
41+
"8d1b6e955f1b2a94aed0b2c29939d68bae89fce2d436cc814efc4731f4a43e8e78ae46e3fdd58e7e0f7c5fa7876239fe7ab0adb6a75c09a07132b741be62612000"
1942
);
2043
});
2144
});

packages/ur-registry-avalanche/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@keystonehq/bc-ur-registry-avalanche",
3-
"version": "0.0.2",
3+
"version": "0.0.4",
44
"description": "bc-ur-registry extension for Avalanche",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,104 @@
1-
import { DataItem, RegistryItem } from "@keystonehq/bc-ur-registry";
1+
import {
2+
DataItem,
3+
RegistryItem,
4+
extend,
5+
DataItemMap,
6+
} from "@keystonehq/bc-ur-registry";
27
import { ExtendedRegistryTypes } from "./RegistryType";
38
import * as uuid from "uuid";
49

10+
const { RegistryTypes } = extend;
11+
512
type signRequestProps = {
613
requestId?: Buffer;
714
data: Buffer;
15+
mfp: Buffer;
16+
xpub: string;
17+
walletIndex: number;
818
};
919

20+
enum Keys {
21+
requestId = 1,
22+
signData = 2,
23+
mfp = 3,
24+
xpub = 6,
25+
walletIndex = 7,
26+
}
27+
1028
export class AvalancheSignRequest extends RegistryItem {
1129
private requestId?: Buffer;
1230
private data: Buffer;
31+
private mfp: Buffer;
32+
private xpub: string;
33+
private walletIndex: number;
1334

1435
getRegistryType = () => ExtendedRegistryTypes.AVALANCHE_SIGN_REQUEST;
1536

1637
constructor(args: signRequestProps) {
1738
super();
1839
this.requestId = args.requestId;
1940
this.data = args.data;
41+
this.mfp = args.mfp;
42+
this.xpub = args.xpub;
43+
this.walletIndex = args.walletIndex;
2044
}
2145

2246
public getRequestId = () => this.requestId;
2347
public getSignData = () => this.data;
2448

2549
public toDataItem = () => {
26-
return new DataItem(this.data);
50+
const map: DataItemMap = {};
51+
if (this.requestId) {
52+
map[Keys.requestId] = new DataItem(
53+
this.requestId,
54+
RegistryTypes.UUID.getTag()
55+
);
56+
}
57+
58+
map[Keys.signData] = Buffer.from(this.data);
59+
map[Keys.mfp] = this.mfp.readUInt32BE(0);
60+
map[Keys.xpub] = this.xpub;
61+
map[Keys.walletIndex] = Number(this.walletIndex);
62+
63+
return new DataItem(map);
64+
};
65+
66+
public static fromDataItem = (dataItem: DataItem) => {
67+
const map = dataItem.getData();
68+
const masterFingerprint = Buffer.alloc(4);
69+
const _masterFingerprint = map[Keys.mfp];
70+
masterFingerprint.writeUInt32BE(_masterFingerprint, 0);
71+
const requestId = map[Keys.requestId]
72+
? map[Keys.requestId].getData()
73+
: undefined;
74+
const data = map[Keys.signData];
75+
const xpub = map[Keys.xpub];
76+
const walletIndex = map[Keys.signData];
77+
78+
return new AvalancheSignRequest({
79+
requestId,
80+
data,
81+
xpub,
82+
walletIndex,
83+
mfp: masterFingerprint,
84+
});
2785
};
2886

29-
public static constructAvalancheRequest(data: Buffer, uuidString?: string) {
87+
public static constructAvalancheRequest(
88+
data: Buffer,
89+
mfp: string,
90+
xpub: string,
91+
walletIndex: number,
92+
uuidString?: string
93+
) {
3094
return new AvalancheSignRequest({
3195
data,
3296
requestId: uuidString
3397
? Buffer.from(uuid.parse(uuidString) as Uint8Array)
3498
: undefined,
99+
mfp: Buffer.from(mfp, "hex"),
100+
xpub,
101+
walletIndex,
35102
});
36103
}
37104
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import {
2+
extend,
3+
DataItem,
4+
RegistryItem,
5+
DataItemMap,
6+
} from "@keystonehq/bc-ur-registry";
7+
import { ExtendedRegistryTypes } from "./RegistryType";
8+
9+
const { RegistryTypes, decodeToDataItem } = extend;
10+
11+
enum Keys {
12+
requestId = 1,
13+
signature,
14+
}
15+
16+
export class AvalancheSignature extends RegistryItem {
17+
private requestId?: Buffer;
18+
private signature: Buffer;
19+
20+
getRegistryType = () => ExtendedRegistryTypes.AVALANCHE_SIGNATURE;
21+
22+
constructor(signature: Buffer, requestId?: Buffer) {
23+
super();
24+
this.signature = signature;
25+
this.requestId = requestId;
26+
}
27+
28+
public getRequestId = () => this.requestId;
29+
public getSignature = () => this.signature;
30+
31+
public toDataItem = () => {
32+
const map: DataItemMap = {};
33+
if (this.requestId) {
34+
map[Keys.requestId] = new DataItem(
35+
this.requestId,
36+
RegistryTypes.UUID.getTag()
37+
);
38+
}
39+
map[Keys.signature] = this.signature;
40+
return new DataItem(map);
41+
};
42+
43+
public static fromDataItem = (dataItem: DataItem) => {
44+
const map = dataItem.getData();
45+
const signature = map[Keys.signature];
46+
47+
return new AvalancheSignature(signature);
48+
};
49+
50+
public static fromCBOR = (_cborPayload: Buffer) => {
51+
const dataItem = decodeToDataItem(_cborPayload);
52+
return AvalancheSignature.fromDataItem(dataItem);
53+
};
54+
}

packages/ur-registry-avalanche/src/RegistryType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ import { RegistryType } from "@keystonehq/bc-ur-registry";
22

33
export const ExtendedRegistryTypes = {
44
AVALANCHE_SIGN_REQUEST: new RegistryType("avax-sign-request", 8301),
5+
AVALANCHE_SIGNATURE: new RegistryType("avax-signature", 8302),
56
};

packages/ur-registry-avalanche/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ patchTags(
99
);
1010

1111
export { AvalancheSignRequest } from "./AvalancheSignRequest";
12+
export { AvalancheSignature } from "./AvalancheSignature";

0 commit comments

Comments
 (0)