@bitgo-beta/sdk-coin-sol 7.6.4-beta.702 → 7.6.4-beta.704
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.
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +17 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +68 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +17 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/message.js +61 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/wire-transaction.js +48 -0
- package/package.json +7 -7
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1 (SIMD-0296/0385) transaction config codec: bit mask + value encoding.
|
|
3
|
+
*/
|
|
4
|
+
export declare const PRIORITY_FEE_BITS = 3;
|
|
5
|
+
export declare const COMPUTE_UNIT_LIMIT_BIT = 4;
|
|
6
|
+
export declare const LOADED_ACCOUNTS_DATA_SIZE_LIMIT_BIT = 8;
|
|
7
|
+
export declare const HEAP_SIZE_BIT = 16;
|
|
8
|
+
export type ConfigValue = {
|
|
9
|
+
kind: 'u32' | 'u64';
|
|
10
|
+
value: number | bigint;
|
|
11
|
+
};
|
|
12
|
+
export declare function encodeConfigMaskAndValues(config: {
|
|
13
|
+
computeUnitLimit: number | null;
|
|
14
|
+
heapSize: number | null;
|
|
15
|
+
loadedAccountsDataSizeLimit: number | null;
|
|
16
|
+
priorityFee: number | null;
|
|
17
|
+
}): {
|
|
18
|
+
mask: number;
|
|
19
|
+
values: ConfigValue[];
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/serialization/codecs/v1/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,iBAAiB,IAAO,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAQ,CAAC;AAC5C,eAAO,MAAM,mCAAmC,IAAS,CAAC;AAC1D,eAAO,MAAM,aAAa,KAAU,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAE1E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAoB1C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v1 (SIMD-0296/0385) transaction config codec: bit mask + value encoding.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HEAP_SIZE_BIT = exports.LOADED_ACCOUNTS_DATA_SIZE_LIMIT_BIT = exports.COMPUTE_UNIT_LIMIT_BIT = exports.PRIORITY_FEE_BITS = void 0;
|
|
7
|
+
exports.encodeConfigMaskAndValues = encodeConfigMaskAndValues;
|
|
8
|
+
// Transaction config mask bits (mirror @solana/transaction-messages).
|
|
9
|
+
exports.PRIORITY_FEE_BITS = 0b11;
|
|
10
|
+
exports.COMPUTE_UNIT_LIMIT_BIT = 0b100;
|
|
11
|
+
exports.LOADED_ACCOUNTS_DATA_SIZE_LIMIT_BIT = 0b1000;
|
|
12
|
+
exports.HEAP_SIZE_BIT = 0b10000;
|
|
13
|
+
function encodeConfigMaskAndValues(config) {
|
|
14
|
+
let mask = 0;
|
|
15
|
+
const values = [];
|
|
16
|
+
if (config.priorityFee !== null) {
|
|
17
|
+
mask |= exports.PRIORITY_FEE_BITS;
|
|
18
|
+
values.push({ kind: 'u64', value: BigInt(config.priorityFee) });
|
|
19
|
+
}
|
|
20
|
+
if (config.computeUnitLimit !== null) {
|
|
21
|
+
mask |= exports.COMPUTE_UNIT_LIMIT_BIT;
|
|
22
|
+
values.push({ kind: 'u32', value: config.computeUnitLimit });
|
|
23
|
+
}
|
|
24
|
+
if (config.loadedAccountsDataSizeLimit !== null) {
|
|
25
|
+
mask |= exports.LOADED_ACCOUNTS_DATA_SIZE_LIMIT_BIT;
|
|
26
|
+
values.push({ kind: 'u32', value: config.loadedAccountsDataSizeLimit });
|
|
27
|
+
}
|
|
28
|
+
if (config.heapSize !== null) {
|
|
29
|
+
mask |= exports.HEAP_SIZE_BIT;
|
|
30
|
+
values.push({ kind: 'u32', value: config.heapSize });
|
|
31
|
+
}
|
|
32
|
+
return { mask, values };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvZGVjcy92MS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7QUFVSCw4REF5QkM7QUFqQ0Qsc0VBQXNFO0FBQ3pELFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFFBQUEsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFFBQUEsbUNBQW1DLEdBQUcsTUFBTSxDQUFDO0FBQzdDLFFBQUEsYUFBYSxHQUFHLE9BQU8sQ0FBQztBQUlyQyxTQUFnQix5QkFBeUIsQ0FBQyxNQUt6QztJQUNDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSx5QkFBaUIsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSw4QkFBc0IsQ0FBQztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsMkJBQTJCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEQsSUFBSSxJQUFJLDJDQUFtQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLHFCQUFhLENBQUM7UUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHYxIChTSU1ELTAyOTYvMDM4NSkgdHJhbnNhY3Rpb24gY29uZmlnIGNvZGVjOiBiaXQgbWFzayArIHZhbHVlIGVuY29kaW5nLlxuICovXG5cbi8vIFRyYW5zYWN0aW9uIGNvbmZpZyBtYXNrIGJpdHMgKG1pcnJvciBAc29sYW5hL3RyYW5zYWN0aW9uLW1lc3NhZ2VzKS5cbmV4cG9ydCBjb25zdCBQUklPUklUWV9GRUVfQklUUyA9IDBiMTE7XG5leHBvcnQgY29uc3QgQ09NUFVURV9VTklUX0xJTUlUX0JJVCA9IDBiMTAwO1xuZXhwb3J0IGNvbnN0IExPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfTElNSVRfQklUID0gMGIxMDAwO1xuZXhwb3J0IGNvbnN0IEhFQVBfU0laRV9CSVQgPSAwYjEwMDAwO1xuXG5leHBvcnQgdHlwZSBDb25maWdWYWx1ZSA9IHsga2luZDogJ3UzMicgfCAndTY0JzsgdmFsdWU6IG51bWJlciB8IGJpZ2ludCB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ29uZmlnTWFza0FuZFZhbHVlcyhjb25maWc6IHtcbiAgY29tcHV0ZVVuaXRMaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgaGVhcFNpemU6IG51bWJlciB8IG51bGw7XG4gIGxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpb3JpdHlGZWU6IG51bWJlciB8IG51bGw7XG59KTogeyBtYXNrOiBudW1iZXI7IHZhbHVlczogQ29uZmlnVmFsdWVbXSB9IHtcbiAgbGV0IG1hc2sgPSAwO1xuICBjb25zdCB2YWx1ZXM6IENvbmZpZ1ZhbHVlW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5wcmlvcml0eUZlZSAhPT0gbnVsbCkge1xuICAgIG1hc2sgfD0gUFJJT1JJVFlfRkVFX0JJVFM7XG4gICAgdmFsdWVzLnB1c2goeyBraW5kOiAndTY0JywgdmFsdWU6IEJpZ0ludChjb25maWcucHJpb3JpdHlGZWUpIH0pO1xuICB9XG4gIGlmIChjb25maWcuY29tcHV0ZVVuaXRMaW1pdCAhPT0gbnVsbCkge1xuICAgIG1hc2sgfD0gQ09NUFVURV9VTklUX0xJTUlUX0JJVDtcbiAgICB2YWx1ZXMucHVzaCh7IGtpbmQ6ICd1MzInLCB2YWx1ZTogY29uZmlnLmNvbXB1dGVVbml0TGltaXQgfSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5sb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQgIT09IG51bGwpIHtcbiAgICBtYXNrIHw9IExPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfTElNSVRfQklUO1xuICAgIHZhbHVlcy5wdXNoKHsga2luZDogJ3UzMicsIHZhbHVlOiBjb25maWcubG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0IH0pO1xuICB9XG4gIGlmIChjb25maWcuaGVhcFNpemUgIT09IG51bGwpIHtcbiAgICBtYXNrIHw9IEhFQVBfU0laRV9CSVQ7XG4gICAgdmFsdWVzLnB1c2goeyBraW5kOiAndTMyJywgdmFsdWU6IGNvbmZpZy5oZWFwU2l6ZSB9KTtcbiAgfVxuICByZXR1cm4geyBtYXNrLCB2YWx1ZXMgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1 (SIMD-0296/0385) transaction instruction codec: header + payload encoding.
|
|
3
|
+
*/
|
|
4
|
+
export type CompiledInstruction = {
|
|
5
|
+
programAddressIndex: number;
|
|
6
|
+
accountIndices: number[];
|
|
7
|
+
data: Uint8Array;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Encode instruction headers (4 bytes each) then payloads for the given
|
|
11
|
+
* compiled instructions, appending to `buf`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function encodeInstructions(buf: number[], instructions: CompiledInstruction[]): void;
|
|
14
|
+
//# sourceMappingURL=instruction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/serialization/codecs/v1/instruction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;CAClB,CAAC;AASF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAc3F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v1 (SIMD-0296/0385) transaction instruction codec: header + payload encoding.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.encodeInstructions = encodeInstructions;
|
|
7
|
+
function pushU8(buf, v) {
|
|
8
|
+
buf.push(v & 0xff);
|
|
9
|
+
}
|
|
10
|
+
function pushU16LE(buf, v) {
|
|
11
|
+
buf.push(v & 0xff, (v >>> 8) & 0xff);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Encode instruction headers (4 bytes each) then payloads for the given
|
|
15
|
+
* compiled instructions, appending to `buf`.
|
|
16
|
+
*/
|
|
17
|
+
function encodeInstructions(buf, instructions) {
|
|
18
|
+
for (const instruction of instructions) {
|
|
19
|
+
pushU8(buf, instruction.programAddressIndex);
|
|
20
|
+
pushU8(buf, instruction.accountIndices.length);
|
|
21
|
+
pushU16LE(buf, instruction.data.length);
|
|
22
|
+
}
|
|
23
|
+
for (const instruction of instructions) {
|
|
24
|
+
for (const idx of instruction.accountIndices) {
|
|
25
|
+
pushU8(buf, idx);
|
|
26
|
+
}
|
|
27
|
+
for (const b of instruction.data) {
|
|
28
|
+
pushU8(buf, b);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL2luc3RydWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFtQkgsZ0RBY0M7QUF6QkQsU0FBUyxNQUFNLENBQUMsR0FBYSxFQUFFLENBQVM7SUFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUNELFNBQVMsU0FBUyxDQUFDLEdBQWEsRUFBRSxDQUFTO0lBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsR0FBYSxFQUFFLFlBQW1DO0lBQ25GLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsU0FBUyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2MSAoU0lNRC0wMjk2LzAzODUpIHRyYW5zYWN0aW9uIGluc3RydWN0aW9uIGNvZGVjOiBoZWFkZXIgKyBwYXlsb2FkIGVuY29kaW5nLlxuICovXG5cbmV4cG9ydCB0eXBlIENvbXBpbGVkSW5zdHJ1Y3Rpb24gPSB7XG4gIHByb2dyYW1BZGRyZXNzSW5kZXg6IG51bWJlcjtcbiAgYWNjb3VudEluZGljZXM6IG51bWJlcltdO1xuICBkYXRhOiBVaW50OEFycmF5O1xufTtcblxuZnVuY3Rpb24gcHVzaFU4KGJ1ZjogbnVtYmVyW10sIHY6IG51bWJlcikge1xuICBidWYucHVzaCh2ICYgMHhmZik7XG59XG5mdW5jdGlvbiBwdXNoVTE2TEUoYnVmOiBudW1iZXJbXSwgdjogbnVtYmVyKSB7XG4gIGJ1Zi5wdXNoKHYgJiAweGZmLCAodiA+Pj4gOCkgJiAweGZmKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgaW5zdHJ1Y3Rpb24gaGVhZGVycyAoNCBieXRlcyBlYWNoKSB0aGVuIHBheWxvYWRzIGZvciB0aGUgZ2l2ZW5cbiAqIGNvbXBpbGVkIGluc3RydWN0aW9ucywgYXBwZW5kaW5nIHRvIGBidWZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlSW5zdHJ1Y3Rpb25zKGJ1ZjogbnVtYmVyW10sIGluc3RydWN0aW9uczogQ29tcGlsZWRJbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgcHVzaFU4KGJ1ZiwgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUFkZHJlc3NJbmRleCk7XG4gICAgcHVzaFU4KGJ1ZiwgaW5zdHJ1Y3Rpb24uYWNjb3VudEluZGljZXMubGVuZ3RoKTtcbiAgICBwdXNoVTE2TEUoYnVmLCBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCk7XG4gIH1cbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGlkeCBvZiBpbnN0cnVjdGlvbi5hY2NvdW50SW5kaWNlcykge1xuICAgICAgcHVzaFU4KGJ1ZiwgaWR4KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBiIG9mIGluc3RydWN0aW9uLmRhdGEpIHtcbiAgICAgIHB1c2hVOChidWYsIGIpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { encodeConfigMaskAndValues, ConfigValue } from './config';
|
|
2
|
+
import { CompiledInstruction } from './instruction';
|
|
3
|
+
export type V1MessageHeader = {
|
|
4
|
+
numSignerAccounts: number;
|
|
5
|
+
numReadonlySignerAccounts: number;
|
|
6
|
+
numReadonlyNonSignerAccounts: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function encodeV1Message(args: {
|
|
9
|
+
header: V1MessageHeader;
|
|
10
|
+
configMask: number;
|
|
11
|
+
configValues: ConfigValue[];
|
|
12
|
+
blockhash: string;
|
|
13
|
+
staticAccounts: string[];
|
|
14
|
+
compiledInstructions: CompiledInstruction[];
|
|
15
|
+
}): Uint8Array;
|
|
16
|
+
export { encodeConfigMaskAndValues };
|
|
17
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/serialization/codecs/v1/message.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAsB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAuBxE,MAAM,MAAM,eAAe,GAAG;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB,EAAE,MAAM,CAAC;IAClC,4BAA4B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;CAC7C,GAAG,UAAU,CA+Bb;AAED,OAAO,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.encodeConfigMaskAndValues = void 0;
|
|
7
|
+
exports.encodeV1Message = encodeV1Message;
|
|
8
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
9
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
10
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
Object.defineProperty(exports, "encodeConfigMaskAndValues", { enumerable: true, get: function () { return config_1.encodeConfigMaskAndValues; } });
|
|
13
|
+
const instruction_1 = require("./instruction");
|
|
14
|
+
/**
|
|
15
|
+
* v1 (SIMD-0296/0385) transaction message wire encoder.
|
|
16
|
+
*
|
|
17
|
+
* Layout: [version: 0x81][header: 3 x u8][configMask: u32 LE][blockhash: 32]
|
|
18
|
+
* [numInstructions: u8][numStaticAccounts: u8]
|
|
19
|
+
* [staticAccounts: 32 x n][configValues: per mask]
|
|
20
|
+
* [instructionHeaders: 4 x n][instructionPayloads: per instruction]
|
|
21
|
+
*/
|
|
22
|
+
function pushU8(buf, v) {
|
|
23
|
+
buf.push(v & 0xff);
|
|
24
|
+
}
|
|
25
|
+
function pushU32LE(buf, v) {
|
|
26
|
+
buf.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);
|
|
27
|
+
}
|
|
28
|
+
function pushU64LE(buf, v) {
|
|
29
|
+
for (let i = 0; i < 8; i++) {
|
|
30
|
+
buf.push(Number((v >> BigInt(8 * i)) & 0xffn));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function encodeV1Message(args) {
|
|
34
|
+
const { header, configMask, configValues, blockhash, staticAccounts, compiledInstructions } = args;
|
|
35
|
+
let blockhashBytes;
|
|
36
|
+
try {
|
|
37
|
+
blockhashBytes = bs58_1.default.decode(blockhash);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new sdk_core_1.BuildTransactionError('Invalid recent blockhash');
|
|
41
|
+
}
|
|
42
|
+
if (blockhashBytes.length !== 32) {
|
|
43
|
+
throw new sdk_core_1.BuildTransactionError('Invalid recent blockhash');
|
|
44
|
+
}
|
|
45
|
+
const buf = [];
|
|
46
|
+
pushU8(buf, 0x81); // version
|
|
47
|
+
pushU8(buf, header.numSignerAccounts);
|
|
48
|
+
pushU8(buf, header.numReadonlySignerAccounts);
|
|
49
|
+
pushU8(buf, header.numReadonlyNonSignerAccounts);
|
|
50
|
+
pushU32LE(buf, configMask);
|
|
51
|
+
for (const b of blockhashBytes)
|
|
52
|
+
pushU8(buf, b);
|
|
53
|
+
pushU8(buf, compiledInstructions.length);
|
|
54
|
+
pushU8(buf, staticAccounts.length);
|
|
55
|
+
for (const account of staticAccounts) {
|
|
56
|
+
for (const b of new web3_js_1.PublicKey(account).toBytes())
|
|
57
|
+
pushU8(buf, b);
|
|
58
|
+
}
|
|
59
|
+
for (const value of configValues) {
|
|
60
|
+
if (value.kind === 'u64')
|
|
61
|
+
pushU64LE(buf, value.value);
|
|
62
|
+
else
|
|
63
|
+
pushU32LE(buf, value.value);
|
|
64
|
+
}
|
|
65
|
+
(0, instruction_1.encodeInstructions)(buf, compiledInstructions);
|
|
66
|
+
return new Uint8Array(buf);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VyaWFsaXphdGlvbi9jb2RlY3MvdjEvbWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQ0EsMENBc0NDO0FBdkVELGdEQUF3QjtBQUN4Qiw2Q0FBNEM7QUFDNUMsbURBQTZEO0FBQzdELHFDQUFrRTtBQXNFekQsMEdBdEVBLGtDQUF5QixPQXNFQTtBQXJFbEMsK0NBQXdFO0FBRXhFOzs7Ozs7O0dBT0c7QUFFSCxTQUFTLE1BQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBUztJQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBQ0QsU0FBUyxTQUFTLENBQUMsR0FBYSxFQUFFLENBQVM7SUFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUNELFNBQVMsU0FBUyxDQUFDLEdBQWEsRUFBRSxDQUFTO0lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0FBQ0gsQ0FBQztBQVFELFNBQWdCLGVBQWUsQ0FBQyxJQU8vQjtJQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRW5HLElBQUksY0FBMEIsQ0FBQztJQUMvQixJQUFJLENBQUM7UUFDSCxjQUFjLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVO0lBQzdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM5QyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2pELFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxjQUFjO1FBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxNQUFNLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLEtBQUssTUFBTSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSztZQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQWUsQ0FBQyxDQUFDOztZQUMzRCxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBQSxnQ0FBa0IsRUFBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM5QyxPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IFB1YmxpY0tleSB9IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlbmNvZGVDb25maWdNYXNrQW5kVmFsdWVzLCBDb25maWdWYWx1ZSB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGVuY29kZUluc3RydWN0aW9ucywgQ29tcGlsZWRJbnN0cnVjdGlvbiB9IGZyb20gJy4vaW5zdHJ1Y3Rpb24nO1xuXG4vKipcbiAqIHYxIChTSU1ELTAyOTYvMDM4NSkgdHJhbnNhY3Rpb24gbWVzc2FnZSB3aXJlIGVuY29kZXIuXG4gKlxuICogTGF5b3V0OiBbdmVyc2lvbjogMHg4MV1baGVhZGVyOiAzIHggdThdW2NvbmZpZ01hc2s6IHUzMiBMRV1bYmxvY2toYXNoOiAzMl1cbiAqICAgW251bUluc3RydWN0aW9uczogdThdW251bVN0YXRpY0FjY291bnRzOiB1OF1cbiAqICAgW3N0YXRpY0FjY291bnRzOiAzMiB4IG5dW2NvbmZpZ1ZhbHVlczogcGVyIG1hc2tdXG4gKiAgIFtpbnN0cnVjdGlvbkhlYWRlcnM6IDQgeCBuXVtpbnN0cnVjdGlvblBheWxvYWRzOiBwZXIgaW5zdHJ1Y3Rpb25dXG4gKi9cblxuZnVuY3Rpb24gcHVzaFU4KGJ1ZjogbnVtYmVyW10sIHY6IG51bWJlcikge1xuICBidWYucHVzaCh2ICYgMHhmZik7XG59XG5mdW5jdGlvbiBwdXNoVTMyTEUoYnVmOiBudW1iZXJbXSwgdjogbnVtYmVyKSB7XG4gIGJ1Zi5wdXNoKHYgJiAweGZmLCAodiA+Pj4gOCkgJiAweGZmLCAodiA+Pj4gMTYpICYgMHhmZiwgKHYgPj4+IDI0KSAmIDB4ZmYpO1xufVxuZnVuY3Rpb24gcHVzaFU2NExFKGJ1ZjogbnVtYmVyW10sIHY6IGJpZ2ludCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgIGJ1Zi5wdXNoKE51bWJlcigodiA+PiBCaWdJbnQoOCAqIGkpKSAmIDB4ZmZuKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVjFNZXNzYWdlSGVhZGVyID0ge1xuICBudW1TaWduZXJBY2NvdW50czogbnVtYmVyO1xuICBudW1SZWFkb25seVNpZ25lckFjY291bnRzOiBudW1iZXI7XG4gIG51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVWMU1lc3NhZ2UoYXJnczoge1xuICBoZWFkZXI6IFYxTWVzc2FnZUhlYWRlcjtcbiAgY29uZmlnTWFzazogbnVtYmVyO1xuICBjb25maWdWYWx1ZXM6IENvbmZpZ1ZhbHVlW107XG4gIGJsb2NraGFzaDogc3RyaW5nO1xuICBzdGF0aWNBY2NvdW50czogc3RyaW5nW107XG4gIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBDb21waWxlZEluc3RydWN0aW9uW107XG59KTogVWludDhBcnJheSB7XG4gIGNvbnN0IHsgaGVhZGVyLCBjb25maWdNYXNrLCBjb25maWdWYWx1ZXMsIGJsb2NraGFzaCwgc3RhdGljQWNjb3VudHMsIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zIH0gPSBhcmdzO1xuXG4gIGxldCBibG9ja2hhc2hCeXRlczogVWludDhBcnJheTtcbiAgdHJ5IHtcbiAgICBibG9ja2hhc2hCeXRlcyA9IGJzNTguZGVjb2RlKGJsb2NraGFzaCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmVjZW50IGJsb2NraGFzaCcpO1xuICB9XG4gIGlmIChibG9ja2hhc2hCeXRlcy5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByZWNlbnQgYmxvY2toYXNoJyk7XG4gIH1cblxuICBjb25zdCBidWY6IG51bWJlcltdID0gW107XG4gIHB1c2hVOChidWYsIDB4ODEpOyAvLyB2ZXJzaW9uXG4gIHB1c2hVOChidWYsIGhlYWRlci5udW1TaWduZXJBY2NvdW50cyk7XG4gIHB1c2hVOChidWYsIGhlYWRlci5udW1SZWFkb25seVNpZ25lckFjY291bnRzKTtcbiAgcHVzaFU4KGJ1ZiwgaGVhZGVyLm51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHMpO1xuICBwdXNoVTMyTEUoYnVmLCBjb25maWdNYXNrKTtcbiAgZm9yIChjb25zdCBiIG9mIGJsb2NraGFzaEJ5dGVzKSBwdXNoVTgoYnVmLCBiKTtcbiAgcHVzaFU4KGJ1ZiwgY29tcGlsZWRJbnN0cnVjdGlvbnMubGVuZ3RoKTtcbiAgcHVzaFU4KGJ1Ziwgc3RhdGljQWNjb3VudHMubGVuZ3RoKTtcbiAgZm9yIChjb25zdCBhY2NvdW50IG9mIHN0YXRpY0FjY291bnRzKSB7XG4gICAgZm9yIChjb25zdCBiIG9mIG5ldyBQdWJsaWNLZXkoYWNjb3VudCkudG9CeXRlcygpKSBwdXNoVTgoYnVmLCBiKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNvbmZpZ1ZhbHVlcykge1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAndTY0JykgcHVzaFU2NExFKGJ1ZiwgdmFsdWUudmFsdWUgYXMgYmlnaW50KTtcbiAgICBlbHNlIHB1c2hVMzJMRShidWYsIHZhbHVlLnZhbHVlIGFzIG51bWJlcik7XG4gIH1cbiAgZW5jb2RlSW5zdHJ1Y3Rpb25zKGJ1ZiwgY29tcGlsZWRJbnN0cnVjdGlvbnMpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbn1cblxuZXhwb3J0IHsgZW5jb2RlQ29uZmlnTWFza0FuZFZhbHVlcyB9O1xuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PublicKey, TransactionInstruction } from '@solana/web3.js';
|
|
2
|
+
/** Supported Solana transaction versions. Only 1 (SIMD-0296/0385) is implemented. */
|
|
3
|
+
export type TransactionVersion = 0 | 1;
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for a v1 transaction, mirroring the shared sdk-core type.
|
|
6
|
+
* All values are optional (null = unset); priorityFee is total lamports.
|
|
7
|
+
*/
|
|
8
|
+
export interface TransactionConfig {
|
|
9
|
+
computeUnitLimit: number | null;
|
|
10
|
+
heapSize: number | null;
|
|
11
|
+
loadedAccountsDataSizeLimit: number | null;
|
|
12
|
+
priorityFee: number | null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Compile a Solana transaction message and return its wire bytes.
|
|
16
|
+
*
|
|
17
|
+
* Version-aware: only `version: 1` (SIMD-0296/0385) is implemented; other
|
|
18
|
+
* versions throw a clear unsupported-version error until they are added.
|
|
19
|
+
*
|
|
20
|
+
* @param args - version, instructions, fee payer, recent blockhash, and config
|
|
21
|
+
* @returns the serialized message bytes (v1 starts with the 0x81 version prefix)
|
|
22
|
+
*/
|
|
23
|
+
export declare function compileTransactionMessage(args: {
|
|
24
|
+
version: TransactionVersion;
|
|
25
|
+
instructions: TransactionInstruction[];
|
|
26
|
+
feePayer: PublicKey;
|
|
27
|
+
recentBlockhash: string;
|
|
28
|
+
transactionConfig: TransactionConfig;
|
|
29
|
+
}): Uint8Array;
|
|
30
|
+
//# sourceMappingURL=compileTransactionMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compileTransactionMessage.d.ts","sourceRoot":"","sources":["../../../../../src/lib/serialization/compileTransactionMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAKpE,qFAAqF;AACrF,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAoLD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,GAAG,UAAU,CAqDb"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compileTransactionMessage = compileTransactionMessage;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const message_1 = require("./codecs/v1/message");
|
|
6
|
+
const config_1 = require("./codecs/v1/config");
|
|
7
|
+
// AccountRole bit values (mirror @solana/instructions).
|
|
8
|
+
const READONLY = 0;
|
|
9
|
+
const WRITABLE = 1;
|
|
10
|
+
const READONLY_SIGNER = 2;
|
|
11
|
+
const WRITABLE_SIGNER = 3;
|
|
12
|
+
const COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';
|
|
13
|
+
const SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR = 2;
|
|
14
|
+
const SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR = 3;
|
|
15
|
+
const MICRO_LAMPORTS_PER_LAMPORT = 1000000;
|
|
16
|
+
const MAX_ACCOUNTS = 64;
|
|
17
|
+
const MAX_SIGNERS = 12;
|
|
18
|
+
const MAX_INSTRUCTIONS = 64;
|
|
19
|
+
const MAX_ACCOUNTS_PER_INSTRUCTION = 255;
|
|
20
|
+
const isSigner = (role) => (role & READONLY_SIGNER) !== 0;
|
|
21
|
+
const isWritable = (role) => (role & WRITABLE) !== 0;
|
|
22
|
+
// Address ordering comparator matches @solana/addresses getAddressComparator.
|
|
23
|
+
const addressComparator = new Intl.Collator('en', {
|
|
24
|
+
caseFirst: 'lower',
|
|
25
|
+
ignorePunctuation: false,
|
|
26
|
+
localeMatcher: 'best fit',
|
|
27
|
+
numeric: false,
|
|
28
|
+
sensitivity: 'variant',
|
|
29
|
+
usage: 'sort',
|
|
30
|
+
}).compare;
|
|
31
|
+
function readU32LE(data, offset) {
|
|
32
|
+
return data[offset] | (data[offset + 1] << 8) | (data[offset + 2] << 16) | (data[offset + 3] << 24);
|
|
33
|
+
}
|
|
34
|
+
function readU64LE(data, offset) {
|
|
35
|
+
let value = 0;
|
|
36
|
+
for (let i = 0; i < 8; i++) {
|
|
37
|
+
value += Number(data[offset + i]) * Math.pow(2, 8 * i);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Strip ComputeBudget instructions (SetComputeUnitLimit / SetComputeUnitPrice)
|
|
43
|
+
* and fold their values into the transaction config when still unset.
|
|
44
|
+
*/
|
|
45
|
+
function stripComputeBudgetInstructions(instructions, transactionConfig) {
|
|
46
|
+
const filtered = [];
|
|
47
|
+
const config = { ...transactionConfig };
|
|
48
|
+
for (const instruction of instructions) {
|
|
49
|
+
const isComputeBudget = instruction.programId.toBase58() === COMPUTE_BUDGET_PROGRAM_ID;
|
|
50
|
+
const discriminator = instruction.data?.[0];
|
|
51
|
+
if (isComputeBudget && discriminator === SET_COMPUTE_UNIT_LIMIT_DISCRIMINATOR) {
|
|
52
|
+
if (config.computeUnitLimit === null) {
|
|
53
|
+
config.computeUnitLimit = readU32LE(instruction.data, 1);
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (isComputeBudget && discriminator === SET_COMPUTE_UNIT_PRICE_DISCRIMINATOR) {
|
|
58
|
+
if (config.priorityFee === null && config.computeUnitLimit !== null) {
|
|
59
|
+
const microLamports = readU64LE(instruction.data, 1);
|
|
60
|
+
config.priorityFee = Math.ceil((microLamports * config.computeUnitLimit) / MICRO_LAMPORTS_PER_LAMPORT);
|
|
61
|
+
}
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
filtered.push(instruction);
|
|
65
|
+
}
|
|
66
|
+
return { instructions: filtered, config };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Collect + order accounts exactly as @solana/transaction-messages does:
|
|
70
|
+
* fee payer first (WRITABLE_SIGNER), then static accounts sorted by
|
|
71
|
+
* (isSigner, isWritable, base58 collator). Duplicate addresses merge roles.
|
|
72
|
+
* Enforces the kit's invoked-program rules.
|
|
73
|
+
*/
|
|
74
|
+
function collectOrderedAccounts(feePayer, instructions) {
|
|
75
|
+
const feePayerAddress = feePayer.toBase58();
|
|
76
|
+
const map = new Map();
|
|
77
|
+
const metaByAddress = new Map();
|
|
78
|
+
const invokedPrograms = new Set();
|
|
79
|
+
map.set(feePayerAddress, WRITABLE_SIGNER);
|
|
80
|
+
metaByAddress.set(feePayerAddress, { address: feePayerAddress, role: WRITABLE_SIGNER });
|
|
81
|
+
const upsert = (address, role, isInvokedProgram) => {
|
|
82
|
+
if (address === feePayerAddress) {
|
|
83
|
+
if (isInvokedProgram) {
|
|
84
|
+
throw new sdk_core_1.BuildTransactionError(`Invoked program ${address} cannot pay fees`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (isInvokedProgram && isWritable(role)) {
|
|
88
|
+
throw new sdk_core_1.BuildTransactionError(`Invoked program ${address} must not be writable`);
|
|
89
|
+
}
|
|
90
|
+
const current = map.get(address);
|
|
91
|
+
if (current !== undefined) {
|
|
92
|
+
const merged = (current | role);
|
|
93
|
+
if (isInvokedProgram && isWritable(merged)) {
|
|
94
|
+
throw new sdk_core_1.BuildTransactionError(`Invoked program ${address} must not be writable`);
|
|
95
|
+
}
|
|
96
|
+
map.set(address, merged);
|
|
97
|
+
metaByAddress.set(address, { address, role: merged });
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
map.set(address, role);
|
|
101
|
+
metaByAddress.set(address, { address, role });
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
for (const instruction of instructions) {
|
|
105
|
+
const programAddress = instruction.programId.toBase58();
|
|
106
|
+
invokedPrograms.add(programAddress);
|
|
107
|
+
upsert(programAddress, READONLY, true);
|
|
108
|
+
for (const key of instruction.keys) {
|
|
109
|
+
upsert(key.pubkey.toBase58(), key.isSigner ? (key.isWritable ? WRITABLE_SIGNER : READONLY_SIGNER) : key.isWritable ? WRITABLE : READONLY, invokedPrograms.has(key.pubkey.toBase58()));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const ordered = [...metaByAddress.values()];
|
|
113
|
+
ordered.sort((a, b) => {
|
|
114
|
+
const aFee = a.address === feePayerAddress ? -1 : 0;
|
|
115
|
+
const bFee = b.address === feePayerAddress ? -1 : 0;
|
|
116
|
+
if (aFee !== bFee)
|
|
117
|
+
return aFee - bFee;
|
|
118
|
+
const aSigner = isSigner(a.role) ? -1 : 0;
|
|
119
|
+
const bSigner = isSigner(b.role) ? -1 : 0;
|
|
120
|
+
if (aSigner !== bSigner)
|
|
121
|
+
return aSigner - bSigner;
|
|
122
|
+
const aWritable = isWritable(a.role) ? -1 : 0;
|
|
123
|
+
const bWritable = isWritable(b.role) ? -1 : 0;
|
|
124
|
+
if (aWritable !== bWritable)
|
|
125
|
+
return aWritable - bWritable;
|
|
126
|
+
return addressComparator(a.address, b.address);
|
|
127
|
+
});
|
|
128
|
+
return ordered;
|
|
129
|
+
}
|
|
130
|
+
function computeHeader(orderedAccounts) {
|
|
131
|
+
let numSignerAccounts = 0;
|
|
132
|
+
let numReadonlySignerAccounts = 0;
|
|
133
|
+
let numReadonlyNonSignerAccounts = 0;
|
|
134
|
+
for (const account of orderedAccounts) {
|
|
135
|
+
if (isSigner(account.role)) {
|
|
136
|
+
numSignerAccounts++;
|
|
137
|
+
if (!isWritable(account.role)) {
|
|
138
|
+
numReadonlySignerAccounts++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (!isWritable(account.role)) {
|
|
142
|
+
numReadonlyNonSignerAccounts++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { numSignerAccounts, numReadonlySignerAccounts, numReadonlyNonSignerAccounts };
|
|
146
|
+
}
|
|
147
|
+
function compileInstructions(instructions, orderedAccounts) {
|
|
148
|
+
const accountIndex = new Map();
|
|
149
|
+
orderedAccounts.forEach((account, index) => accountIndex.set(account.address, index));
|
|
150
|
+
return instructions.map((instruction) => ({
|
|
151
|
+
programAddressIndex: accountIndex.get(instruction.programId.toBase58()),
|
|
152
|
+
accountIndices: instruction.keys.map((k) => accountIndex.get(k.pubkey.toBase58())),
|
|
153
|
+
data: instruction.data ?? new Uint8Array(),
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Compile a Solana transaction message and return its wire bytes.
|
|
158
|
+
*
|
|
159
|
+
* Version-aware: only `version: 1` (SIMD-0296/0385) is implemented; other
|
|
160
|
+
* versions throw a clear unsupported-version error until they are added.
|
|
161
|
+
*
|
|
162
|
+
* @param args - version, instructions, fee payer, recent blockhash, and config
|
|
163
|
+
* @returns the serialized message bytes (v1 starts with the 0x81 version prefix)
|
|
164
|
+
*/
|
|
165
|
+
function compileTransactionMessage(args) {
|
|
166
|
+
const { version, instructions, feePayer, recentBlockhash, transactionConfig } = args;
|
|
167
|
+
if (version !== 1) {
|
|
168
|
+
throw new sdk_core_1.BuildTransactionError(`Unsupported transaction version: ${version}. Only version 1 is implemented.`);
|
|
169
|
+
}
|
|
170
|
+
if (!instructions || instructions.length === 0) {
|
|
171
|
+
throw new sdk_core_1.BuildTransactionError('At least one instruction is required to compile a v1 transaction');
|
|
172
|
+
}
|
|
173
|
+
if (!transactionConfig) {
|
|
174
|
+
throw new sdk_core_1.BuildTransactionError('transactionConfig is required to compile a v1 transaction');
|
|
175
|
+
}
|
|
176
|
+
const { instructions: filteredInstructions, config } = stripComputeBudgetInstructions(instructions, transactionConfig);
|
|
177
|
+
const orderedAccounts = collectOrderedAccounts(feePayer, filteredInstructions);
|
|
178
|
+
if (orderedAccounts.length > MAX_ACCOUNTS) {
|
|
179
|
+
throw new sdk_core_1.BuildTransactionError(`Too many accounts in v1 transaction: ${orderedAccounts.length} (max ${MAX_ACCOUNTS})`);
|
|
180
|
+
}
|
|
181
|
+
const numSigners = orderedAccounts.filter((a) => isSigner(a.role)).length;
|
|
182
|
+
if (numSigners > MAX_SIGNERS) {
|
|
183
|
+
throw new sdk_core_1.BuildTransactionError(`Too many signers in v1 transaction: ${numSigners} (max ${MAX_SIGNERS})`);
|
|
184
|
+
}
|
|
185
|
+
if (filteredInstructions.length > MAX_INSTRUCTIONS) {
|
|
186
|
+
throw new sdk_core_1.BuildTransactionError(`Too many instructions in v1 transaction: ${filteredInstructions.length} (max ${MAX_INSTRUCTIONS})`);
|
|
187
|
+
}
|
|
188
|
+
for (let i = 0; i < filteredInstructions.length; i++) {
|
|
189
|
+
if (filteredInstructions[i].keys.length > MAX_ACCOUNTS_PER_INSTRUCTION) {
|
|
190
|
+
throw new sdk_core_1.BuildTransactionError(`Too many accounts in instruction ${i}: ${filteredInstructions[i].keys.length} (max ${MAX_ACCOUNTS_PER_INSTRUCTION})`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const header = computeHeader(orderedAccounts);
|
|
194
|
+
const { mask, values } = (0, config_1.encodeConfigMaskAndValues)(config);
|
|
195
|
+
const compiledInstructions = compileInstructions(filteredInstructions, orderedAccounts);
|
|
196
|
+
return (0, message_1.encodeV1Message)({
|
|
197
|
+
header,
|
|
198
|
+
configMask: mask,
|
|
199
|
+
configValues: values,
|
|
200
|
+
blockhash: recentBlockhash,
|
|
201
|
+
staticAccounts: orderedAccounts.map((account) => account.address),
|
|
202
|
+
compiledInstructions,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VyaWFsaXphdGlvbi9jb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK01BLDhEQTJEQztBQTFRRCxtREFBNkQ7QUFFN0QsaURBQXVFO0FBQ3ZFLCtDQUErRDtBQWlCL0Qsd0RBQXdEO0FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNuQixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDbkIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQixNQUFNLHlCQUF5QixHQUFHLDZDQUE2QyxDQUFDO0FBQ2hGLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sMEJBQTBCLEdBQUcsT0FBUyxDQUFDO0FBRTdDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFFekMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzRSxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXRFLDhFQUE4RTtBQUM5RSxNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7SUFDaEQsU0FBUyxFQUFFLE9BQU87SUFDbEIsaUJBQWlC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LENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNqRSxvQkFBb0I7S0FDckIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFB1YmxpY0tleSwgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB9IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBlbmNvZGVWMU1lc3NhZ2UsIFYxTWVzc2FnZUhlYWRlciB9IGZyb20gJy4vY29kZWNzL3YxL21lc3NhZ2UnO1xuaW1wb3J0IHsgZW5jb2RlQ29uZmlnTWFza0FuZFZhbHVlcyB9IGZyb20gJy4vY29kZWNzL3YxL2NvbmZpZyc7XG5pbXBvcnQgeyBDb21waWxlZEluc3RydWN0aW9uIH0gZnJvbSAnLi9jb2RlY3MvdjEvaW5zdHJ1Y3Rpb24nO1xuXG4vKiogU3VwcG9ydGVkIFNvbGFuYSB0cmFuc2FjdGlvbiB2ZXJzaW9ucy4gT25seSAxIChTSU1ELTAyOTYvMDM4NSkgaXMgaW1wbGVtZW50ZWQuICovXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvblZlcnNpb24gPSAwIHwgMTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHYxIHRyYW5zYWN0aW9uLCBtaXJyb3JpbmcgdGhlIHNoYXJlZCBzZGstY29yZSB0eXBlLlxuICogQWxsIHZhbHVlcyBhcmUgb3B0aW9uYWwgKG51bGwgPSB1bnNldCk7IHByaW9yaXR5RmVlIGlzIHRvdGFsIGxhbXBvcnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ29uZmlnIHtcbiAgY29tcHV0ZVVuaXRMaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgaGVhcFNpemU6IG51bWJlciB8IG51bGw7XG4gIGxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpb3JpdHlGZWU6IG51bWJlciB8IG51bGw7IC8vIGxhbXBvcnRzICh0b3RhbClcbn1cblxuLy8gQWNjb3VudFJvbGUgYml0IHZhbHVlcyAobWlycm9yIEBzb2xhbmEvaW5zdHJ1Y3Rpb25zKS5cbmNvbnN0IFJFQURPTkxZID0gMDtcbmNvbnN0IFdSSVRBQkxFID0gMTtcbmNvbnN0IFJFQURPTkxZX1NJR05FUiA9IDI7XG5jb25zdCBXUklUQUJMRV9TSUdORVIgPSAzO1xuXG5jb25zdCBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lEID0gJ0NvbXB1dGVCdWRnZXQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnO1xuY29uc3QgU0VUX0NPTVBVVEVfVU5JVF9MSU1JVF9ESVNDUklNSU5BVE9SID0gMjtcbmNvbnN0IFNFVF9DT01QVVRFX1VOSVRfUFJJQ0VfRElTQ1JJTUlOQVRPUiA9IDM7XG5jb25zdCBNSUNST19MQU1QT1JUU19QRVJfTEFNUE9SVCA9IDFfMDAwXzAwMDtcblxuY29uc3QgTUFYX0FDQ09VTlRTID0gNjQ7XG5jb25zdCBNQVhfU0lHTkVSUyA9IDEyO1xuY29uc3QgTUFYX0lOU1RSVUNUSU9OUyA9IDY0O1xuY29uc3QgTUFYX0FDQ09VTlRTX1BFUl9JTlNUUlVDVElPTiA9IDI1NTtcblxuY29uc3QgaXNTaWduZXIgPSAocm9sZTogbnVtYmVyKTogYm9vbGVhbiA9PiAocm9sZSAmIFJFQURPTkxZX1NJR05FUikgIT09IDA7XG5jb25zdCBpc1dyaXRhYmxlID0gKHJvbGU6IG51bWJlcik6IGJvb2xlYW4gPT4gKHJvbGUgJiBXUklUQUJMRSkgIT09IDA7XG5cbi8vIEFkZHJlc3Mgb3JkZXJpbmcgY29tcGFyYXRvciBtYXRjaGVzIEBzb2xhbmEvYWRkcmVzc2VzIGdldEFkZHJlc3NDb21wYXJhdG9yLlxuY29uc3QgYWRkcmVzc0NvbXBhcmF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcignZW4nLCB7XG4gIGNhc2VGaXJzdDogJ2xvd2VyJyxcbiAgaWdub3JlUHVuY3R1YXRpb246IGZhbHNlLFxuICBsb2NhbGVNYXRjaGVyOiAnYmVzdCBmaXQnLFxuICBudW1lcmljOiBmYWxzZSxcbiAgc2Vuc2l0aXZpdHk6ICd2YXJpYW50JyxcbiAgdXNhZ2U6ICdzb3J0Jyxcbn0pLmNvbXBhcmU7XG5cbnR5cGUgQWNjb3VudE1ldGEgPSB7IGFkZHJlc3M6IHN0cmluZzsgcm9sZTogbnVtYmVyIH07XG5cbmZ1bmN0aW9uIHJlYWRVMzJMRShkYXRhOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBkYXRhW29mZnNldF0gfCAoZGF0YVtvZmZzZXQgKyAxXSA8PCA4KSB8IChkYXRhW29mZnNldCArIDJdIDw8IDE2KSB8IChkYXRhW29mZnNldCArIDNdIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFU2NExFKGRhdGE6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHZhbHVlID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICB2YWx1ZSArPSBOdW1iZXIoZGF0YVtvZmZzZXQgKyBpXSkgKiBNYXRoLnBvdygyLCA4ICogaSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFN0cmlwIENvbXB1dGVCdWRnZXQgaW5zdHJ1Y3Rpb25zIChTZXRDb21wdXRlVW5pdExpbWl0IC8gU2V0Q29tcHV0ZVVuaXRQcmljZSlcbiAqIGFuZCBmb2xkIHRoZWlyIHZhbHVlcyBpbnRvIHRoZSB0cmFuc2FjdGlvbiBjb25maWcgd2hlbiBzdGlsbCB1bnNldC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgdHJhbnNhY3Rpb25Db25maWc6IFRyYW5zYWN0aW9uQ29uZmlnXG4pOiB7IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdOyBjb25maWc6IFRyYW5zYWN0aW9uQ29uZmlnIH0ge1xuICBjb25zdCBmaWx0ZXJlZDogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG4gIGNvbnN0IGNvbmZpZzogVHJhbnNhY3Rpb25Db25maWcgPSB7IC4uLnRyYW5zYWN0aW9uQ29uZmlnIH07XG5cbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCBpc0NvbXB1dGVCdWRnZXQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9CYXNlNTgoKSA9PT0gQ09NUFVURV9CVURHRVRfUFJPR1JBTV9JRDtcbiAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gaW5zdHJ1Y3Rpb24uZGF0YT8uWzBdO1xuXG4gICAgaWYgKGlzQ29tcHV0ZUJ1ZGdldCAmJiBkaXNjcmltaW5hdG9yID09PSBTRVRfQ09NUFVURV9VTklUX0xJTUlUX0RJU0NSSU1JTkFUT1IpIHtcbiAgICAgIGlmIChjb25maWcuY29tcHV0ZVVuaXRMaW1pdCA9PT0gbnVsbCkge1xuICAgICAgICBjb25maWcuY29tcHV0ZVVuaXRMaW1pdCA9IHJlYWRVMzJMRShpbnN0cnVjdGlvbi5kYXRhLCAxKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXB1dGVCdWRnZXQgJiYgZGlzY3JpbWluYXRvciA9PT0gU0VUX0NPTVBVVEVfVU5JVF9QUklDRV9ESVNDUklNSU5BVE9SKSB7XG4gICAgICBpZiAoY29uZmlnLnByaW9yaXR5RmVlID09PSBudWxsICYmIGNvbmZpZy5jb21wdXRlVW5pdExpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1pY3JvTGFtcG9ydHMgPSByZWFkVTY0TEUoaW5zdHJ1Y3Rpb24uZGF0YSwgMSk7XG4gICAgICAgIGNvbmZpZy5wcmlvcml0eUZlZSA9IE1hdGguY2VpbCgobWljcm9MYW1wb3J0cyAqIGNvbmZpZy5jb21wdXRlVW5pdExpbWl0KSAvIE1JQ1JPX0xBTVBPUlRTX1BFUl9MQU1QT1JUKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZpbHRlcmVkLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIHsgaW5zdHJ1Y3Rpb25zOiBmaWx0ZXJlZCwgY29uZmlnIH07XG59XG5cbi8qKlxuICogQ29sbGVjdCArIG9yZGVyIGFjY291bnRzIGV4YWN0bHkgYXMgQHNvbGFuYS90cmFuc2FjdGlvbi1tZXNzYWdlcyBkb2VzOlxuICogZmVlIHBheWVyIGZpcnN0IChXUklUQUJMRV9TSUdORVIpLCB0aGVuIHN0YXRpYyBhY2NvdW50cyBzb3J0ZWQgYnlcbiAqIChpc1NpZ25lciwgaXNXcml0YWJsZSwgYmFzZTU4IGNvbGxhdG9yKS4gRHVwbGljYXRlIGFkZHJlc3NlcyBtZXJnZSByb2xlcy5cbiAqIEVuZm9yY2VzIHRoZSBraXQncyBpbnZva2VkLXByb2dyYW0gcnVsZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RPcmRlcmVkQWNjb3VudHMoZmVlUGF5ZXI6IFB1YmxpY0tleSwgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBY2NvdW50TWV0YVtdIHtcbiAgY29uc3QgZmVlUGF5ZXJBZGRyZXNzID0gZmVlUGF5ZXIudG9CYXNlNTgoKTtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgbWV0YUJ5QWRkcmVzcyA9IG5ldyBNYXA8c3RyaW5nLCBBY2NvdW50TWV0YT4oKTtcbiAgY29uc3QgaW52b2tlZFByb2dyYW1zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgbWFwLnNldChmZWVQYXllckFkZHJlc3MsIFdSSVRBQkxFX1NJR05FUik7XG4gIG1ldGFCeUFkZHJlc3Muc2V0KGZlZVBheWVyQWRkcmVzcywgeyBhZGRyZXNzOiBmZWVQYXllckFkZHJlc3MsIHJvbGU6IFdSSVRBQkxFX1NJR05FUiB9KTtcblxuICBjb25zdCB1cHNlcnQgPSAoYWRkcmVzczogc3RyaW5nLCByb2xlOiBudW1iZXIsIGlzSW52b2tlZFByb2dyYW06IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoYWRkcmVzcyA9PT0gZmVlUGF5ZXJBZGRyZXNzKSB7XG4gICAgICBpZiAoaXNJbnZva2VkUHJvZ3JhbSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZva2VkIHByb2dyYW0gJHthZGRyZXNzfSBjYW5ub3QgcGF5IGZlZXNgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW52b2tlZFByb2dyYW0gJiYgaXNXcml0YWJsZShyb2xlKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52b2tlZCBwcm9ncmFtICR7YWRkcmVzc30gbXVzdCBub3QgYmUgd3JpdGFibGVgKTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudCA9IG1hcC5nZXQoYWRkcmVzcyk7XG4gICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWVyZ2VkID0gKGN1cnJlbnQgfCByb2xlKSBhcyBudW1iZXI7XG4gICAgICBpZiAoaXNJbnZva2VkUHJvZ3JhbSAmJiBpc1dyaXRhYmxlKG1lcmdlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52b2tlZCBwcm9ncmFtICR7YWRkcmVzc30gbXVzdCBub3QgYmUgd3JpdGFibGVgKTtcbiAgICAgIH1cbiAgICAgIG1hcC5zZXQoYWRkcmVzcywgbWVyZ2VkKTtcbiAgICAgIG1ldGFCeUFkZHJlc3Muc2V0KGFkZHJlc3MsIHsgYWRkcmVzcywgcm9sZTogbWVyZ2VkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuc2V0KGFkZHJlc3MsIHJvbGUpO1xuICAgICAgbWV0YUJ5QWRkcmVzcy5zZXQoYWRkcmVzcywgeyBhZGRyZXNzLCByb2xlIH0pO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHByb2dyYW1BZGRyZXNzID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvQmFzZTU4KCk7XG4gICAgaW52b2tlZFByb2dyYW1zLmFkZChwcm9ncmFtQWRkcmVzcyk7XG4gICAgdXBzZXJ0KHByb2dyYW1BZGRyZXNzLCBSRUFET05MWSwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgaW5zdHJ1Y3Rpb24ua2V5cykge1xuICAgICAgdXBzZXJ0KFxuICAgICAgICBrZXkucHVia2V5LnRvQmFzZTU4KCksXG4gICAgICAgIGtleS5pc1NpZ25lciA/IChrZXkuaXNXcml0YWJsZSA/IFdSSVRBQkxFX1NJR05FUiA6IFJFQURPTkxZX1NJR05FUikgOiBrZXkuaXNXcml0YWJsZSA/IFdSSVRBQkxFIDogUkVBRE9OTFksXG4gICAgICAgIGludm9rZWRQcm9ncmFtcy5oYXMoa2V5LnB1YmtleS50b0Jhc2U1OCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmRlcmVkID0gWy4uLm1ldGFCeUFkZHJlc3MudmFsdWVzKCldO1xuICBvcmRlcmVkLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhRmVlID0gYS5hZGRyZXNzID09PSBmZWVQYXllckFkZHJlc3MgPyAtMSA6IDA7XG4gICAgY29uc3QgYkZlZSA9IGIuYWRkcmVzcyA9PT0gZmVlUGF5ZXJBZGRyZXNzID8gLTEgOiAwO1xuICAgIGlmIChhRmVlICE9PSBiRmVlKSByZXR1cm4gYUZlZSAtIGJGZWU7XG4gICAgY29uc3QgYVNpZ25lciA9IGlzU2lnbmVyKGEucm9sZSkgPyAtMSA6IDA7XG4gICAgY29uc3QgYlNpZ25lciA9IGlzU2lnbmVyKGIucm9sZSkgPyAtMSA6IDA7XG4gICAgaWYgKGFTaWduZXIgIT09IGJTaWduZXIpIHJldHVybiBhU2lnbmVyIC0gYlNpZ25lcjtcbiAgICBjb25zdCBhV3JpdGFibGUgPSBpc1dyaXRhYmxlKGEucm9sZSkgPyAtMSA6IDA7XG4gICAgY29uc3QgYldyaXRhYmxlID0gaXNXcml0YWJsZShiLnJvbGUpID8gLTEgOiAwO1xuICAgIGlmIChhV3JpdGFibGUgIT09IGJXcml0YWJsZSkgcmV0dXJuIGFXcml0YWJsZSAtIGJXcml0YWJsZTtcbiAgICByZXR1cm4gYWRkcmVzc0NvbXBhcmF0b3IoYS5hZGRyZXNzLCBiLmFkZHJlc3MpO1xuICB9KTtcblxuICByZXR1cm4gb3JkZXJlZDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUhlYWRlcihvcmRlcmVkQWNjb3VudHM6IEFjY291bnRNZXRhW10pOiBWMU1lc3NhZ2VIZWFkZXIge1xuICBsZXQgbnVtU2lnbmVyQWNjb3VudHMgPSAwO1xuICBsZXQgbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50cyA9IDA7XG4gIGxldCBudW1SZWFkb25seU5vblNpZ25lckFjY291bnRzID0gMDtcbiAgZm9yIChjb25zdCBhY2NvdW50IG9mIG9yZGVyZWRBY2NvdW50cykge1xuICAgIGlmIChpc1NpZ25lcihhY2NvdW50LnJvbGUpKSB7XG4gICAgICBudW1TaWduZXJBY2NvdW50cysrO1xuICAgICAgaWYgKCFpc1dyaXRhYmxlKGFjY291bnQucm9sZSkpIHtcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50cysrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzV3JpdGFibGUoYWNjb3VudC5yb2xlKSkge1xuICAgICAgbnVtUmVhZG9ubHlOb25TaWduZXJBY2NvdW50cysrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBudW1TaWduZXJBY2NvdW50cywgbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50cywgbnVtUmVhZG9ubHlOb25TaWduZXJBY2NvdW50cyB9O1xufVxuXG5mdW5jdGlvbiBjb21waWxlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgb3JkZXJlZEFjY291bnRzOiBBY2NvdW50TWV0YVtdXG4pOiBDb21waWxlZEluc3RydWN0aW9uW10ge1xuICBjb25zdCBhY2NvdW50SW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBvcmRlcmVkQWNjb3VudHMuZm9yRWFjaCgoYWNjb3VudCwgaW5kZXgpID0+IGFjY291bnRJbmRleC5zZXQoYWNjb3VudC5hZGRyZXNzLCBpbmRleCkpO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gKHtcbiAgICBwcm9ncmFtQWRkcmVzc0luZGV4OiBhY2NvdW50SW5kZXguZ2V0KGluc3RydWN0aW9uLnByb2dyYW1JZC50b0Jhc2U1OCgpKSEsXG4gICAgYWNjb3VudEluZGljZXM6IGluc3RydWN0aW9uLmtleXMubWFwKChrKSA9PiBhY2NvdW50SW5kZXguZ2V0KGsucHVia2V5LnRvQmFzZTU4KCkpISksXG4gICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YSA/PyBuZXcgVWludDhBcnJheSgpLFxuICB9KSk7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIFNvbGFuYSB0cmFuc2FjdGlvbiBtZXNzYWdlIGFuZCByZXR1cm4gaXRzIHdpcmUgYnl0ZXMuXG4gKlxuICogVmVyc2lvbi1hd2FyZTogb25seSBgdmVyc2lvbjogMWAgKFNJTUQtMDI5Ni8wMzg1KSBpcyBpbXBsZW1lbnRlZDsgb3RoZXJcbiAqIHZlcnNpb25zIHRocm93IGEgY2xlYXIgdW5zdXBwb3J0ZWQtdmVyc2lvbiBlcnJvciB1bnRpbCB0aGV5IGFyZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIHZlcnNpb24sIGluc3RydWN0aW9ucywgZmVlIHBheWVyLCByZWNlbnQgYmxvY2toYXNoLCBhbmQgY29uZmlnXG4gKiBAcmV0dXJucyB0aGUgc2VyaWFsaXplZCBtZXNzYWdlIGJ5dGVzICh2MSBzdGFydHMgd2l0aCB0aGUgMHg4MSB2ZXJzaW9uIHByZWZpeClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UoYXJnczoge1xuICB2ZXJzaW9uOiBUcmFuc2FjdGlvblZlcnNpb247XG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdO1xuICBmZWVQYXllcjogUHVibGljS2V5O1xuICByZWNlbnRCbG9ja2hhc2g6IHN0cmluZztcbiAgdHJhbnNhY3Rpb25Db25maWc6IFRyYW5zYWN0aW9uQ29uZmlnO1xufSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB7IHZlcnNpb24sIGluc3RydWN0aW9ucywgZmVlUGF5ZXIsIHJlY2VudEJsb2NraGFzaCwgdHJhbnNhY3Rpb25Db25maWcgfSA9IGFyZ3M7XG5cbiAgaWYgKHZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB2ZXJzaW9uOiAke3ZlcnNpb259LiBPbmx5IHZlcnNpb24gMSBpcyBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuICBpZiAoIWluc3RydWN0aW9ucyB8fCBpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQXQgbGVhc3Qgb25lIGluc3RydWN0aW9uIGlzIHJlcXVpcmVkIHRvIGNvbXBpbGUgYSB2MSB0cmFuc2FjdGlvbicpO1xuICB9XG4gIGlmICghdHJhbnNhY3Rpb25Db25maWcpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCd0cmFuc2FjdGlvbkNvbmZpZyBpcyByZXF1aXJlZCB0byBjb21waWxlIGEgdjEgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zOiBmaWx0ZXJlZEluc3RydWN0aW9ucywgY29uZmlnIH0gPSBzdHJpcENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbnMoXG4gICAgaW5zdHJ1Y3Rpb25zLFxuICAgIHRyYW5zYWN0aW9uQ29uZmlnXG4gICk7XG5cbiAgY29uc3Qgb3JkZXJlZEFjY291bnRzID0gY29sbGVjdE9yZGVyZWRBY2NvdW50cyhmZWVQYXllciwgZmlsdGVyZWRJbnN0cnVjdGlvbnMpO1xuICBpZiAob3JkZXJlZEFjY291bnRzLmxlbmd0aCA+IE1BWF9BQ0NPVU5UUykge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgVG9vIG1hbnkgYWNjb3VudHMgaW4gdjEgdHJhbnNhY3Rpb246ICR7b3JkZXJlZEFjY291bnRzLmxlbmd0aH0gKG1heCAke01BWF9BQ0NPVU5UU30pYFxuICAgICk7XG4gIH1cbiAgY29uc3QgbnVtU2lnbmVycyA9IG9yZGVyZWRBY2NvdW50cy5maWx0ZXIoKGEpID0+IGlzU2lnbmVyKGEucm9sZSkpLmxlbmd0aDtcbiAgaWYgKG51bVNpZ25lcnMgPiBNQVhfU0lHTkVSUykge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYFRvbyBtYW55IHNpZ25lcnMgaW4gdjEgdHJhbnNhY3Rpb246ICR7bnVtU2lnbmVyc30gKG1heCAke01BWF9TSUdORVJTfSlgKTtcbiAgfVxuICBpZiAoZmlsdGVyZWRJbnN0cnVjdGlvbnMubGVuZ3RoID4gTUFYX0lOU1RSVUNUSU9OUykge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgVG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluIHYxIHRyYW5zYWN0aW9uOiAke2ZpbHRlcmVkSW5zdHJ1Y3Rpb25zLmxlbmd0aH0gKG1heCAke01BWF9JTlNUUlVDVElPTlN9KWBcbiAgICApO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRJbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZmlsdGVyZWRJbnN0cnVjdGlvbnNbaV0ua2V5cy5sZW5ndGggPiBNQVhfQUNDT1VOVFNfUEVSX0lOU1RSVUNUSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgVG9vIG1hbnkgYWNjb3VudHMgaW4gaW5zdHJ1Y3Rpb24gJHtpfTogJHtmaWx0ZXJlZEluc3RydWN0aW9uc1tpXS5rZXlzLmxlbmd0aH0gKG1heCAke01BWF9BQ0NPVU5UU19QRVJfSU5TVFJVQ1RJT059KWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gY29tcHV0ZUhlYWRlcihvcmRlcmVkQWNjb3VudHMpO1xuICBjb25zdCB7IG1hc2ssIHZhbHVlcyB9ID0gZW5jb2RlQ29uZmlnTWFza0FuZFZhbHVlcyhjb25maWcpO1xuICBjb25zdCBjb21waWxlZEluc3RydWN0aW9ucyA9IGNvbXBpbGVJbnN0cnVjdGlvbnMoZmlsdGVyZWRJbnN0cnVjdGlvbnMsIG9yZGVyZWRBY2NvdW50cyk7XG5cbiAgcmV0dXJuIGVuY29kZVYxTWVzc2FnZSh7XG4gICAgaGVhZGVyLFxuICAgIGNvbmZpZ01hc2s6IG1hc2ssXG4gICAgY29uZmlnVmFsdWVzOiB2YWx1ZXMsXG4gICAgYmxvY2toYXNoOiByZWNlbnRCbG9ja2hhc2gsXG4gICAgc3RhdGljQWNjb3VudHM6IG9yZGVyZWRBY2NvdW50cy5tYXAoKGFjY291bnQpID0+IGFjY291bnQuYWRkcmVzcyksXG4gICAgY29tcGlsZWRJbnN0cnVjdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble the v1 wire format of a signed transaction.
|
|
3
|
+
*
|
|
4
|
+
* Unlike legacy and v0 transactions, where signatures are prefixed before the
|
|
5
|
+
* message, a v1 transaction places the message first and appends the signatures
|
|
6
|
+
* at the tail with no length prefix; the signature count is derived from the
|
|
7
|
+
* message header's numRequiredSignatures.
|
|
8
|
+
*
|
|
9
|
+
* @param messageBytes - The serialized v1 message bytes (starting with the 0x81 version prefix)
|
|
10
|
+
* @param signatures - The ed25519 signatures over the message bytes, one per required signer
|
|
11
|
+
* @returns The full v1 wire transaction bytes
|
|
12
|
+
*/
|
|
13
|
+
export declare function serializeWireTransaction(messageBytes: Uint8Array, signatures: Uint8Array[]): Uint8Array;
|
|
14
|
+
//# sourceMappingURL=wire-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-transaction.d.ts","sourceRoot":"","sources":["../../../../../src/lib/serialization/wire-transaction.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,UAAU,CA+CvG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeWireTransaction = serializeWireTransaction;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const SIGNATURE_BYTE_LENGTH = 64;
|
|
6
|
+
const V1_VERSION_PREFIX = 0x81;
|
|
7
|
+
const V1_TRANSACTION_SIZE_LIMIT = 4096;
|
|
8
|
+
/**
|
|
9
|
+
* Assemble the v1 wire format of a signed transaction.
|
|
10
|
+
*
|
|
11
|
+
* Unlike legacy and v0 transactions, where signatures are prefixed before the
|
|
12
|
+
* message, a v1 transaction places the message first and appends the signatures
|
|
13
|
+
* at the tail with no length prefix; the signature count is derived from the
|
|
14
|
+
* message header's numRequiredSignatures.
|
|
15
|
+
*
|
|
16
|
+
* @param messageBytes - The serialized v1 message bytes (starting with the 0x81 version prefix)
|
|
17
|
+
* @param signatures - The ed25519 signatures over the message bytes, one per required signer
|
|
18
|
+
* @returns The full v1 wire transaction bytes
|
|
19
|
+
*/
|
|
20
|
+
function serializeWireTransaction(messageBytes, signatures) {
|
|
21
|
+
if (!messageBytes || messageBytes.length === 0) {
|
|
22
|
+
throw new sdk_core_1.BuildTransactionError('messageBytes is required to serialize a v1 transaction');
|
|
23
|
+
}
|
|
24
|
+
if (!signatures || signatures.length === 0) {
|
|
25
|
+
throw new sdk_core_1.BuildTransactionError('At least one signature is required to serialize a v1 transaction');
|
|
26
|
+
}
|
|
27
|
+
for (const signature of signatures) {
|
|
28
|
+
if (signature.length !== SIGNATURE_BYTE_LENGTH) {
|
|
29
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid signature length: expected ${SIGNATURE_BYTE_LENGTH} bytes, got ${signature.length}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (messageBytes[0] !== V1_VERSION_PREFIX) {
|
|
33
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid v1 message: expected version prefix 0x${V1_VERSION_PREFIX.toString(16)}, got 0x${messageBytes[0].toString(16)}`);
|
|
34
|
+
}
|
|
35
|
+
if (messageBytes[1] !== signatures.length) {
|
|
36
|
+
throw new sdk_core_1.BuildTransactionError(`Signature count mismatch: message declares ${messageBytes[1]} required signers but ${signatures.length} were provided`);
|
|
37
|
+
}
|
|
38
|
+
const totalLength = messageBytes.length + signatures.length * SIGNATURE_BYTE_LENGTH;
|
|
39
|
+
if (totalLength > V1_TRANSACTION_SIZE_LIMIT) {
|
|
40
|
+
throw new sdk_core_1.BuildTransactionError(`v1 transaction exceeds the ${V1_TRANSACTION_SIZE_LIMIT}-byte size limit: ${totalLength} bytes`);
|
|
41
|
+
}
|
|
42
|
+
const buffer = new Uint8Array(totalLength);
|
|
43
|
+
buffer.set(messageBytes, 0);
|
|
44
|
+
let offset = messageBytes.length;
|
|
45
|
+
for (const signature of signatures) {
|
|
46
|
+
buffer.set(signature, offset);
|
|
47
|
+
offset += SIGNATURE_BYTE_LENGTH;
|
|
48
|
+
}
|
|
49
|
+
return buffer;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lyZS10cmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VyaWFsaXphdGlvbi93aXJlLXRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLDREQStDQztBQWpFRCxtREFBNkQ7QUFFN0QsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDL0IsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxZQUF3QixFQUFFLFVBQXdCO0lBQ3pGLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsd0RBQXdELENBQUMsQ0FBQztJQUM1RixDQUFDO0lBQ0QsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0Isc0NBQXNDLHFCQUFxQixlQUFlLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FDN0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksZ0NBQXFCLENBQzdCLGlEQUFpRCxpQkFBaUIsQ0FBQyxRQUFRLENBQ3pFLEVBQUUsQ0FDSCxXQUFXLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLGdDQUFxQixDQUM3Qiw4Q0FBOEMsWUFBWSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsVUFBVSxDQUFDLE1BQU0sZ0JBQWdCLENBQ3hILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BGLElBQUksV0FBVyxHQUFHLHlCQUF5QixFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLGdDQUFxQixDQUM3Qiw4QkFBOEIseUJBQXlCLHFCQUFxQixXQUFXLFFBQVEsQ0FDaEcsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1QixJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2pDLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUIsTUFBTSxJQUFJLHFCQUFxQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5jb25zdCBTSUdOQVRVUkVfQllURV9MRU5HVEggPSA2NDtcbmNvbnN0IFYxX1ZFUlNJT05fUFJFRklYID0gMHg4MTtcbmNvbnN0IFYxX1RSQU5TQUNUSU9OX1NJWkVfTElNSVQgPSA0MDk2O1xuXG4vKipcbiAqIEFzc2VtYmxlIHRoZSB2MSB3aXJlIGZvcm1hdCBvZiBhIHNpZ25lZCB0cmFuc2FjdGlvbi5cbiAqXG4gKiBVbmxpa2UgbGVnYWN5IGFuZCB2MCB0cmFuc2FjdGlvbnMsIHdoZXJlIHNpZ25hdHVyZXMgYXJlIHByZWZpeGVkIGJlZm9yZSB0aGVcbiAqIG1lc3NhZ2UsIGEgdjEgdHJhbnNhY3Rpb24gcGxhY2VzIHRoZSBtZXNzYWdlIGZpcnN0IGFuZCBhcHBlbmRzIHRoZSBzaWduYXR1cmVzXG4gKiBhdCB0aGUgdGFpbCB3aXRoIG5vIGxlbmd0aCBwcmVmaXg7IHRoZSBzaWduYXR1cmUgY291bnQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICogbWVzc2FnZSBoZWFkZXIncyBudW1SZXF1aXJlZFNpZ25hdHVyZXMuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2VCeXRlcyAtIFRoZSBzZXJpYWxpemVkIHYxIG1lc3NhZ2UgYnl0ZXMgKHN0YXJ0aW5nIHdpdGggdGhlIDB4ODEgdmVyc2lvbiBwcmVmaXgpXG4gKiBAcGFyYW0gc2lnbmF0dXJlcyAtIFRoZSBlZDI1NTE5IHNpZ25hdHVyZXMgb3ZlciB0aGUgbWVzc2FnZSBieXRlcywgb25lIHBlciByZXF1aXJlZCBzaWduZXJcbiAqIEByZXR1cm5zIFRoZSBmdWxsIHYxIHdpcmUgdHJhbnNhY3Rpb24gYnl0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXksIHNpZ25hdHVyZXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXkge1xuICBpZiAoIW1lc3NhZ2VCeXRlcyB8fCBtZXNzYWdlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignbWVzc2FnZUJ5dGVzIGlzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSBhIHYxIHRyYW5zYWN0aW9uJyk7XG4gIH1cbiAgaWYgKCFzaWduYXR1cmVzIHx8IHNpZ25hdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQXQgbGVhc3Qgb25lIHNpZ25hdHVyZSBpcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB2MSB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzaWduYXR1cmUgb2Ygc2lnbmF0dXJlcykge1xuICAgIGlmIChzaWduYXR1cmUubGVuZ3RoICE9PSBTSUdOQVRVUkVfQllURV9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHNpZ25hdHVyZSBsZW5ndGg6IGV4cGVjdGVkICR7U0lHTkFUVVJFX0JZVEVfTEVOR1RIfSBieXRlcywgZ290ICR7c2lnbmF0dXJlLmxlbmd0aH1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtZXNzYWdlQnl0ZXNbMF0gIT09IFYxX1ZFUlNJT05fUFJFRklYKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgIGBJbnZhbGlkIHYxIG1lc3NhZ2U6IGV4cGVjdGVkIHZlcnNpb24gcHJlZml4IDB4JHtWMV9WRVJTSU9OX1BSRUZJWC50b1N0cmluZyhcbiAgICAgICAgMTZcbiAgICAgICl9LCBnb3QgMHgke21lc3NhZ2VCeXRlc1swXS50b1N0cmluZygxNil9YFxuICAgICk7XG4gIH1cblxuICBpZiAobWVzc2FnZUJ5dGVzWzFdICE9PSBzaWduYXR1cmVzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgU2lnbmF0dXJlIGNvdW50IG1pc21hdGNoOiBtZXNzYWdlIGRlY2xhcmVzICR7bWVzc2FnZUJ5dGVzWzFdfSByZXF1aXJlZCBzaWduZXJzIGJ1dCAke3NpZ25hdHVyZXMubGVuZ3RofSB3ZXJlIHByb3ZpZGVkYFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0b3RhbExlbmd0aCA9IG1lc3NhZ2VCeXRlcy5sZW5ndGggKyBzaWduYXR1cmVzLmxlbmd0aCAqIFNJR05BVFVSRV9CWVRFX0xFTkdUSDtcbiAgaWYgKHRvdGFsTGVuZ3RoID4gVjFfVFJBTlNBQ1RJT05fU0laRV9MSU1JVCkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgdjEgdHJhbnNhY3Rpb24gZXhjZWVkcyB0aGUgJHtWMV9UUkFOU0FDVElPTl9TSVpFX0xJTUlUfS1ieXRlIHNpemUgbGltaXQ6ICR7dG90YWxMZW5ndGh9IGJ5dGVzYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gIGJ1ZmZlci5zZXQobWVzc2FnZUJ5dGVzLCAwKTtcblxuICBsZXQgb2Zmc2V0ID0gbWVzc2FnZUJ5dGVzLmxlbmd0aDtcbiAgZm9yIChjb25zdCBzaWduYXR1cmUgb2Ygc2lnbmF0dXJlcykge1xuICAgIGJ1ZmZlci5zZXQoc2lnbmF0dXJlLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBTSUdOQVRVUkVfQllURV9MRU5HVEg7XG4gIH1cblxuICByZXR1cm4gYnVmZmVyO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionV1.d.ts","sourceRoot":"","sources":["../../../../../test/unit/serialization/transactionV1.ts"],"names":[],"mappings":""}
|