Skip to content

Commit 30b5505

Browse files
authored
Merge pull request #193 from KeystoneHQ/eth-batch-tx
feat: support eth batch transaction
2 parents bd7cdea + b659568 commit 30b5505

File tree

6 files changed

+133
-0
lines changed

6 files changed

+133
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { ETHBatchSignRequest } from "../src/EthBatchSignRequest";
2+
import { EthSignRequest } from "../src/EthSignRequest";
3+
describe("EthBatchSignRequest", () => {
4+
it("should create a new EthBatchSignRequest", () => {
5+
const cbor = Buffer.from("a601d825509b1deb4d3b7d4bad9bdd2b0d7b3dcb6d02584bf849808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000578080800301040105d90130a2018a182cf501f501f500f401f4021a1234567807686d6574616d61736b", 'hex');
6+
const request = EthSignRequest.fromCBOR(cbor);
7+
const ethBatchSignRequest = new ETHBatchSignRequest([request]);
8+
const ur = ethBatchSignRequest.toUREncoder(1000).nextPart();
9+
expect(ur).toBe(
10+
"ur:eth-batch-sign-request/oyadlytaadmeoladtpdagdndcawmgtfrkigrpmndutdnbtkgfssbjnaohdgryagalalnascsgljpnbaelfdibemwaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaelaoxlbjyihjkjyeyaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaehnaehglalalaaxadaaadahtaaddyoeadlecsdwykadykadykaewkadwkaocybgeehfksatisjnihjyhsjnhsjkjekoamykvw"
11+
);
12+
});
13+
});
14+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { ETHBatchSignature } from "../src/EthBatchSignature";
2+
3+
describe("EthBatchSignature", () => {
4+
it("should create a new EthBatchSignature", () => {
5+
const cbor = Buffer.from("a10181d90192a301d825509b1deb4d3b7d4bad9bdd2b0d7b3dcb6d0258416ff1602c5074594261319e77d58697565aeebebac538628434b13c939b9ac7f52d8fb08e7892e26ebcf901bf8c5b38d5900dbc6466b9b9e976287324e92c1aa12403686b657973746f6e65", 'hex');
6+
const ethBatchSignature = ETHBatchSignature.fromCBOR(cbor);
7+
expect(ethBatchSignature.getSignatures().length).toBe(1);
8+
expect(ethBatchSignature.getSignatures()[0].getSignature().toString('hex')).toBe("6ff1602c5074594261319e77d58697565aeebebac538628434b13c939b9ac7f52d8fb08e7892e26ebcf901bf8c5b38d5900dbc6466b9b9e976287324e92c1aa124");
9+
});
10+
});
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import {
2+
extend,
3+
DataItem,
4+
RegistryItem,
5+
DataItemMap,
6+
} from "@keystonehq/bc-ur-registry";
7+
import { ExtendedRegistryTypes } from "./RegistryType";
8+
import { EthSignRequest } from "EthSignRequest";
9+
10+
const { decodeToDataItem, RegistryTypes } = extend;
11+
12+
enum Keys {
13+
requests = 1,
14+
}
15+
16+
export class ETHBatchSignRequest extends RegistryItem {
17+
private requests: EthSignRequest[];
18+
19+
getRegistryType = () => ExtendedRegistryTypes.ETH_BATCH_SIGN_REQUEST;
20+
21+
constructor(args: EthSignRequest[]) {
22+
super();
23+
this.requests = args;
24+
}
25+
26+
public getRequests = () => this.requests;
27+
28+
public toDataItem = () => {
29+
const map: DataItemMap = {};
30+
if (this.requests) {
31+
map[Keys.requests] = this.requests.map((request) => {
32+
const dataItem = request.toDataItem();
33+
dataItem.setTag(request.getRegistryType().getTag());
34+
return dataItem;
35+
});
36+
}
37+
return new DataItem(map);
38+
};
39+
40+
public static fromDataItem = (dataItem: DataItem) => {
41+
const map = dataItem.getData();
42+
const requests = map[Keys.requests].map((request: DataItem) => {
43+
return EthSignRequest.fromDataItem(request);
44+
});
45+
46+
return new ETHBatchSignRequest(requests);
47+
};
48+
49+
public static fromCBOR = (_cborPayload: Buffer) => {
50+
const dataItem = decodeToDataItem(_cborPayload);
51+
return ETHBatchSignRequest.fromDataItem(dataItem);
52+
};
53+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
extend,
3+
DataItem,
4+
RegistryItem,
5+
DataItemMap,
6+
} from "@keystonehq/bc-ur-registry";
7+
import { ExtendedRegistryTypes } from "./RegistryType";
8+
import { ETHSignature } from "./EthSignature";
9+
10+
const { RegistryTypes, decodeToDataItem } = extend;
11+
12+
enum Keys {
13+
signatures = 1,
14+
}
15+
16+
export class ETHBatchSignature extends RegistryItem {
17+
private signatures: ETHSignature[];
18+
19+
getRegistryType = () => ExtendedRegistryTypes.ETH_BATCH_SIGNATURE;
20+
21+
constructor(signatures: ETHSignature[]) {
22+
super();
23+
this.signatures = signatures;
24+
}
25+
26+
public getSignatures = () => this.signatures;
27+
28+
public toDataItem = () => {
29+
const map: DataItemMap = {};
30+
if (this.signatures) {
31+
map[Keys.signatures] = this.signatures.map((signature) => {
32+
const dataItem = signature.toDataItem();
33+
dataItem.setTag(signature.getRegistryType().getTag());
34+
return dataItem;
35+
});
36+
}
37+
return new DataItem(map);
38+
};
39+
40+
public static fromDataItem = (dataItem: DataItem) => {
41+
const map = dataItem.getData();
42+
const signatures = map[Keys.signatures].map((signature: DataItem) => {
43+
return ETHSignature.fromDataItem(signature);
44+
});
45+
return new ETHBatchSignature(signatures);
46+
};
47+
48+
public static fromCBOR = (_cborPayload: Buffer) => {
49+
const dataItem = decodeToDataItem(_cborPayload);
50+
return ETHBatchSignature.fromDataItem(dataItem);
51+
};
52+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ export const ExtendedRegistryTypes = {
44
ETH_SIGN_REQUEST: new RegistryType("eth-sign-request", 401),
55
ETH_SIGNATURE: new RegistryType("eth-signature", 402),
66
ETH_NFT_ITEM: new RegistryType("eth-nft-item", 403),
7+
ETH_BATCH_SIGN_REQUEST: new RegistryType("eth-batch-sign-request", 40404),
8+
ETH_BATCH_SIGNATURE: new RegistryType("eth-batch-signature", 40405),
79
};

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ patchTags(
1111
export { EthSignRequest, DataType } from "./EthSignRequest";
1212
export { ETHSignature } from "./EthSignature";
1313
export { ETHNFTItem } from "./ETHNFTItem";
14+
export { ETHBatchSignRequest } from "./EthBatchSignRequest";
15+
export { ETHBatchSignature } from "./EthBatchSignature";
1416

1517
export { generateAddressFromXpub, findHDPathFromAddress } from "./utlis";

0 commit comments

Comments
 (0)