@bitgo-beta/sdk-coin-sol 7.6.4-beta.708 → 7.6.4-beta.709
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/message.d.ts +10 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -1
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +129 -1
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
- package/dist/cjs/src/sol.d.ts.map +1 -1
- package/dist/cjs/src/sol.js +22 -2
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
- package/dist/cjs/test/unit/sol.js +77 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +10 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -1
- package/dist/esm/lib/serialization/codecs/v1/message.js +129 -2
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
- package/dist/esm/sol.d.ts.map +1 -1
- package/dist/esm/sol.js +22 -2
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decodeV1Message.d.ts","sourceRoot":"","sources":["../../../../../test/unit/serialization/decodeV1Message.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("should");
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const message_1 = require("../../../src/lib/serialization/codecs/v1/message");
|
|
6
|
+
const config_1 = require("../../../src/lib/serialization/codecs/v1/config");
|
|
7
|
+
const A = '3h1zGmCwsRJn5kU4LdYD8QfUoXjW8YqZcZsRsYxVvNpq';
|
|
8
|
+
const B = '9xQeWvGcCvsftH8sN4jWQcBpkT2yLdMfZqNpVxKjRwSb';
|
|
9
|
+
const BLOCKHASH = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
10
|
+
function sampleMessage() {
|
|
11
|
+
const config = (0, config_1.encodeConfigMaskAndValues)({
|
|
12
|
+
computeUnitLimit: 200000,
|
|
13
|
+
heapSize: 32768,
|
|
14
|
+
loadedAccountsDataSizeLimit: 65536,
|
|
15
|
+
priorityFee: 5000,
|
|
16
|
+
});
|
|
17
|
+
return (0, message_1.encodeV1Message)({
|
|
18
|
+
header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
|
|
19
|
+
configMask: config.mask,
|
|
20
|
+
configValues: config.values,
|
|
21
|
+
blockhash: BLOCKHASH,
|
|
22
|
+
staticAccounts: [A, B],
|
|
23
|
+
compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1, 2, 3]) }],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
describe('decodeV1Message', () => {
|
|
27
|
+
it('round-trips an encoded v1 message', () => {
|
|
28
|
+
const bytes = sampleMessage();
|
|
29
|
+
const decoded = (0, message_1.decodeV1Message)(bytes);
|
|
30
|
+
decoded.header.numSignerAccounts.should.equal(1);
|
|
31
|
+
decoded.header.numReadonlySignerAccounts.should.equal(0);
|
|
32
|
+
decoded.header.numReadonlyNonSignerAccounts.should.equal(1);
|
|
33
|
+
decoded.configMask.should.equal(0b11 | 0b100 | 0b1000 | 0b10000);
|
|
34
|
+
decoded.configValues.should.eql([
|
|
35
|
+
{ kind: 'u64', value: 5000n },
|
|
36
|
+
{ kind: 'u32', value: 200000 },
|
|
37
|
+
{ kind: 'u32', value: 65536 },
|
|
38
|
+
{ kind: 'u32', value: 32768 },
|
|
39
|
+
]);
|
|
40
|
+
decoded.blockhash.should.equal(BLOCKHASH);
|
|
41
|
+
decoded.staticAccounts.should.eql([A, B]);
|
|
42
|
+
decoded.compiledInstructions.should.eql([
|
|
43
|
+
{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1, 2, 3]) },
|
|
44
|
+
]);
|
|
45
|
+
decoded.byteLength.should.equal(bytes.length);
|
|
46
|
+
});
|
|
47
|
+
it('rejects an unknown config mask bit', () => {
|
|
48
|
+
const bytes = sampleMessage();
|
|
49
|
+
bytes[4] = 0xff;
|
|
50
|
+
(() => (0, message_1.decodeV1Message)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /Unknown config mask/ });
|
|
51
|
+
});
|
|
52
|
+
it('rejects an out-of-range program index', () => {
|
|
53
|
+
const bytes = sampleMessage();
|
|
54
|
+
const programIdxByte = 42 + 2 * 32 + 4 + 8 + 4 + 4;
|
|
55
|
+
bytes[programIdxByte] = 0xff;
|
|
56
|
+
(() => (0, message_1.decodeV1Message)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /program index/ });
|
|
57
|
+
});
|
|
58
|
+
it('rejects a truncated message', () => {
|
|
59
|
+
const bytes = sampleMessage();
|
|
60
|
+
(() => (0, message_1.decodeV1Message)(bytes.subarray(0, bytes.length - 1))).should.throw(sdk_core_1.BuildTransactionError);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlVjFNZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3NlcmlhbGl6YXRpb24vZGVjb2RlVjFNZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0JBQWdCO0FBQ2hCLG1EQUE2RDtBQUM3RCw4RUFBb0c7QUFDcEcsNEVBQTRGO0FBRTVGLE1BQU0sQ0FBQyxHQUFHLDhDQUE4QyxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxHQUFHLDhDQUE4QyxDQUFDO0FBQ3pELE1BQU0sU0FBUyxHQUFHLDhDQUE4QyxDQUFDO0FBRWpFLFNBQVMsYUFBYTtJQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFBLGtDQUF5QixFQUFDO1FBQ3ZDLGdCQUFnQixFQUFFLE1BQU87UUFDekIsUUFBUSxFQUFFLEtBQU07UUFDaEIsMkJBQTJCLEVBQUUsS0FBTTtRQUNuQyxXQUFXLEVBQUUsSUFBSztLQUNuQixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUEseUJBQWUsRUFBQztRQUNyQixNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLENBQUMsRUFBRTtRQUMvRixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDdkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFFBQVEs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QUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUM5QixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEseUJBQWUsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFxQixDQUFDLENBQUM7SUFDbkcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlY29kZVYxTWVzc2FnZSwgZW5jb2RlVjFNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvZGVjcy92MS9tZXNzYWdlJztcbmltcG9ydCB7IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL2NvbmZpZyc7XG5cbmNvbnN0IEEgPSAnM2gxekdtQ3dzUkpuNWtVNExkWUQ4UWZVb1hqVzhZcVpjWnNSc1l4VnZOcHEnO1xuY29uc3QgQiA9ICc5eFFlV3ZHY0N2c2Z0SDhzTjRqV1FjQnBrVDJ5TGRNZlpxTnBWeEtqUndTYic7XG5jb25zdCBCTE9DS0hBU0ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG5mdW5jdGlvbiBzYW1wbGVNZXNzYWdlKCk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBjb25maWcgPSBlbmNvZGVDb25maWdNYXNrQW5kVmFsdWVzKHtcbiAgICBjb21wdXRlVW5pdExpbWl0OiAyMDBfMDAwLFxuICAgIGhlYXBTaXplOiAzMl83NjgsXG4gICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiA2NV81MzYsXG4gICAgcHJpb3JpdHlGZWU6IDVfMDAwLFxuICB9KTtcbiAgcmV0dXJuIGVuY29kZVYxTWVzc2FnZSh7XG4gICAgaGVhZGVyOiB7IG51bVNpZ25lckFjY291bnRzOiAxLCBudW1SZWFkb25seVNpZ25lckFjY291bnRzOiAwLCBudW1SZWFkb25seU5vblNpZ25lckFjY291bnRzOiAxIH0sXG4gICAgY29uZmlnTWFzazogY29uZmlnLm1hc2ssXG4gICAgY29uZmlnVmFsdWVzOiBjb25maWcudmFsdWVzLFxuICAgIGJsb2NraGFzaDogQkxPQ0tIQVNILFxuICAgIHN0YXRpY0FjY291bnRzOiBbQSwgQl0sXG4gICAgY29tcGlsZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1BZGRyZXNzSW5kZXg6IDEsIGFjY291bnRJbmRpY2VzOiBbMCwgMV0sIGRhdGE6IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzXSkgfV0sXG4gIH0pO1xufVxuXG5kZXNjcmliZSgnZGVjb2RlVjFNZXNzYWdlJywgKCkgPT4ge1xuICBpdCgncm91bmQtdHJpcHMgYW4gZW5jb2RlZCB2MSBtZXNzYWdlJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gc2FtcGxlTWVzc2FnZSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UoYnl0ZXMpO1xuICAgIGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBkZWNvZGVkLmhlYWRlci5udW1SZWFkb25seVNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgwKTtcbiAgICBkZWNvZGVkLmhlYWRlci5udW1SZWFkb25seU5vblNpZ25lckFjY291bnRzLnNob3VsZC5lcXVhbCgxKTtcbiAgICBkZWNvZGVkLmNvbmZpZ01hc2suc2hvdWxkLmVxdWFsKDBiMTEgfCAwYjEwMCB8IDBiMTAwMCB8IDBiMTAwMDApO1xuICAgIGRlY29kZWQuY29uZmlnVmFsdWVzLnNob3VsZC5lcWwoW1xuICAgICAgeyBraW5kOiAndTY0JywgdmFsdWU6IDVfMDAwbiB9LFxuICAgICAgeyBraW5kOiAndTMyJywgdmFsdWU6IDIwMF8wMDAgfSxcbiAgICAgIHsga2luZDogJ3UzMicsIHZhbHVlOiA2NV81MzYgfSxcbiAgICAgIHsga2luZDogJ3UzMicsIHZhbHVlOiAzMl83NjggfSxcbiAgICBdKTtcbiAgICBkZWNvZGVkLmJsb2NraGFzaC5zaG91bGQuZXF1YWwoQkxPQ0tIQVNIKTtcbiAgICBkZWNvZGVkLnN0YXRpY0FjY291bnRzLnNob3VsZC5lcWwoW0EsIEJdKTtcbiAgICBkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLnNob3VsZC5lcWwoW1xuICAgICAgeyBwcm9ncmFtQWRkcmVzc0luZGV4OiAxLCBhY2NvdW50SW5kaWNlczogWzAsIDFdLCBkYXRhOiBuZXcgVWludDhBcnJheShbMSwgMiwgM10pIH0sXG4gICAgXSk7XG4gICAgZGVjb2RlZC5ieXRlTGVuZ3RoLnNob3VsZC5lcXVhbChieXRlcy5sZW5ndGgpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhbiB1bmtub3duIGNvbmZpZyBtYXNrIGJpdCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBieXRlc1s0XSA9IDB4ZmY7XG4gICAgKCgpID0+IGRlY29kZVYxTWVzc2FnZShieXRlcykpLnNob3VsZC50aHJvdyhCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIHsgbWVzc2FnZTogL1Vua25vd24gY29uZmlnIG1hc2svIH0pO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhbiBvdXQtb2YtcmFuZ2UgcHJvZ3JhbSBpbmRleCcsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCBwcm9ncmFtSWR4Qnl0ZSA9IDQyICsgMiAqIDMyICsgNCArIDggKyA0ICsgNDtcbiAgICBieXRlc1twcm9ncmFtSWR4Qnl0ZV0gPSAweGZmO1xuICAgICgoKSA9PiBkZWNvZGVWMU1lc3NhZ2UoYnl0ZXMpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC9wcm9ncmFtIGluZGV4LyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSB0cnVuY2F0ZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICAoKCkgPT4gZGVjb2RlVjFNZXNzYWdlKGJ5dGVzLnN1YmFycmF5KDAsIGJ5dGVzLmxlbmd0aCAtIDEpKSkuc2hvdWxkLnRocm93KEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseWireTransaction.d.ts","sourceRoot":"","sources":["../../../../../test/unit/serialization/parseWireTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
require("should");
|
|
7
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
8
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
9
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
10
|
+
const parseWireTransaction_1 = require("../../../src/lib/serialization/parseWireTransaction");
|
|
11
|
+
const message_1 = require("../../../src/lib/serialization/codecs/v1/message");
|
|
12
|
+
const config_1 = require("../../../src/lib/serialization/codecs/v1/config");
|
|
13
|
+
const wire_transaction_1 = require("../../../src/lib/serialization/wire-transaction");
|
|
14
|
+
const BLOCKHASH = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
15
|
+
const kp = tweetnacl_1.default.sign.keyPair();
|
|
16
|
+
const A = bs58_1.default.encode(kp.publicKey);
|
|
17
|
+
const B = bs58_1.default.encode(tweetnacl_1.default.sign.keyPair().publicKey);
|
|
18
|
+
function sampleMessage() {
|
|
19
|
+
const config = (0, config_1.encodeConfigMaskAndValues)({
|
|
20
|
+
computeUnitLimit: 200000,
|
|
21
|
+
heapSize: null,
|
|
22
|
+
loadedAccountsDataSizeLimit: null,
|
|
23
|
+
priorityFee: 5000,
|
|
24
|
+
});
|
|
25
|
+
return (0, message_1.encodeV1Message)({
|
|
26
|
+
header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
|
|
27
|
+
configMask: config.mask,
|
|
28
|
+
configValues: config.values,
|
|
29
|
+
blockhash: BLOCKHASH,
|
|
30
|
+
staticAccounts: [A, B],
|
|
31
|
+
compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1]) }],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function sign(messageBytes) {
|
|
35
|
+
return [tweetnacl_1.default.sign.detached(messageBytes, kp.secretKey)];
|
|
36
|
+
}
|
|
37
|
+
describe('parseWireTransaction', () => {
|
|
38
|
+
it('splits a signed v1 transaction into message + signatures + signer pubkeys', () => {
|
|
39
|
+
const messageBytes = sampleMessage();
|
|
40
|
+
const signatures = sign(messageBytes);
|
|
41
|
+
const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, signatures);
|
|
42
|
+
const parsed = (0, parseWireTransaction_1.parseWireTransaction)(wire);
|
|
43
|
+
parsed.messageBytes.should.eql(messageBytes);
|
|
44
|
+
parsed.signatures.length.should.equal(1);
|
|
45
|
+
parsed.signatures[0].should.eql(signatures[0]);
|
|
46
|
+
parsed.signerPublicKeys.should.eql([A]);
|
|
47
|
+
});
|
|
48
|
+
it('rejects a wire tx whose tail is not the expected number of signatures', () => {
|
|
49
|
+
const messageBytes = sampleMessage();
|
|
50
|
+
const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
|
|
51
|
+
const truncated = wire.subarray(0, wire.length - 1);
|
|
52
|
+
(() => (0, parseWireTransaction_1.parseWireTransaction)(truncated)).should.throw(sdk_core_1.BuildTransactionError);
|
|
53
|
+
});
|
|
54
|
+
it('rejects a non-v1 wire tx', () => {
|
|
55
|
+
const bytes = new Uint8Array([0x00, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
56
|
+
(() => (0, parseWireTransaction_1.parseWireTransaction)(bytes)).should.throw(sdk_core_1.BuildTransactionError, { message: /version prefix/ });
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('validateRawTransactionV1', () => {
|
|
60
|
+
it('accepts a fully signed, valid v1 transaction', () => {
|
|
61
|
+
const messageBytes = sampleMessage();
|
|
62
|
+
const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
|
|
63
|
+
(() => (0, parseWireTransaction_1.validateRawTransactionV1)(wire)).should.not.throw();
|
|
64
|
+
});
|
|
65
|
+
it('rejects a tampered signature', () => {
|
|
66
|
+
const messageBytes = sampleMessage();
|
|
67
|
+
const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, sign(messageBytes));
|
|
68
|
+
const tampered = new Uint8Array(wire);
|
|
69
|
+
tampered[tampered.length - 1] ^= 0xff;
|
|
70
|
+
(() => (0, parseWireTransaction_1.validateRawTransactionV1)(tampered)).should.throw(sdk_core_1.BuildTransactionError, { message: /verification failed/ });
|
|
71
|
+
});
|
|
72
|
+
it('rejects when a required signature is missing', () => {
|
|
73
|
+
const config = (0, config_1.encodeConfigMaskAndValues)({
|
|
74
|
+
computeUnitLimit: 200000,
|
|
75
|
+
heapSize: null,
|
|
76
|
+
loadedAccountsDataSizeLimit: null,
|
|
77
|
+
priorityFee: 5000,
|
|
78
|
+
});
|
|
79
|
+
const msg = (0, message_1.encodeV1Message)({
|
|
80
|
+
header: { numSignerAccounts: 1, numReadonlySignerAccounts: 0, numReadonlyNonSignerAccounts: 1 },
|
|
81
|
+
configMask: config.mask,
|
|
82
|
+
configValues: config.values,
|
|
83
|
+
blockhash: BLOCKHASH,
|
|
84
|
+
staticAccounts: [A, B],
|
|
85
|
+
compiledInstructions: [{ programAddressIndex: 1, accountIndices: [0, 1], data: new Uint8Array([1]) }],
|
|
86
|
+
});
|
|
87
|
+
(() => (0, parseWireTransaction_1.validateRawTransactionV1)(msg)).should.throw(sdk_core_1.BuildTransactionError, { message: /signature bytes/ });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VXaXJlVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvc2VyaWFsaXphdGlvbi9wYXJzZVdpcmVUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtCQUFnQjtBQUNoQiwwREFBNkI7QUFDN0IsZ0RBQXdCO0FBQ3hCLG1EQUE2RDtBQUM3RCw4RkFBcUg7QUFDckgsOEVBQW1GO0FBQ25GLDRFQUE0RjtBQUM1RixzRkFBMkY7QUFFM0YsTUFBTSxTQUFTLEdBQUcsOENBQThDLENBQUM7QUFDakUsTUFBTSxFQUFFLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEMsTUFBTSxDQUFDLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVyRCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBQSxrQ0FBeUIsRUFBQztRQUN2QyxnQkFBZ0IsRUFBRSxNQUFPO1FBQ3pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsMkJBQTJCLEVBQUUsSUFBSTtRQUNqQyxXQUFXLEVBQUUsSUFBSztLQUNuQixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUEseUJBQWUsRUFBQztRQUNyQixNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLENBQUMsRUFBRTtRQUMvRixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDdkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFB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QU07WUFDM0IsU0FBUyxFQUFFLFNBQVM7WUFDcEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixvQkFBb0IsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEcsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLCtDQUF3QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2hvdWxkJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IHBhcnNlV2lyZVRyYW5zYWN0aW9uLCB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vcGFyc2VXaXJlVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZW5jb2RlVjFNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvZGVjcy92MS9tZXNzYWdlJztcbmltcG9ydCB7IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL2NvbmZpZyc7XG5pbXBvcnQgeyBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3NlcmlhbGl6YXRpb24vd2lyZS10cmFuc2FjdGlvbic7XG5cbmNvbnN0IEJMT0NLSEFTSCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5jb25zdCBrcCA9IG5hY2wuc2lnbi5rZXlQYWlyKCk7XG5jb25zdCBBID0gYnM1OC5lbmNvZGUoa3AucHVibGljS2V5KTtcbmNvbnN0IEIgPSBiczU4LmVuY29kZShuYWNsLnNpZ24ua2V5UGFpcigpLnB1YmxpY0tleSk7XG5cbmZ1bmN0aW9uIHNhbXBsZU1lc3NhZ2UoKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbmZpZyA9IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMoe1xuICAgIGNvbXB1dGVVbml0TGltaXQ6IDIwMF8wMDAsXG4gICAgaGVhcFNpemU6IG51bGwsXG4gICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBudWxsLFxuICAgIHByaW9yaXR5RmVlOiA1XzAwMCxcbiAgfSk7XG4gIHJldHVybiBlbmNvZGVWMU1lc3NhZ2Uoe1xuICAgIGhlYWRlcjogeyBudW1TaWduZXJBY2NvdW50czogMSwgbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50czogMCwgbnVtUmVhZG9ubHlOb25TaWduZXJBY2NvdW50czogMSB9LFxuICAgIGNvbmZpZ01hc2s6IGNvbmZpZy5tYXNrLFxuICAgIGNvbmZpZ1ZhbHVlczogY29uZmlnLnZhbHVlcyxcbiAgICBibG9ja2hhc2g6IEJMT0NLSEFTSCxcbiAgICBzdGF0aWNBY2NvdW50czogW0EsIEJdLFxuICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBbeyBwcm9ncmFtQWRkcmVzc0luZGV4OiAxLCBhY2NvdW50SW5kaWNlczogWzAsIDFdLCBkYXRhOiBuZXcgVWludDhBcnJheShbMV0pIH1dLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2lnbihtZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICByZXR1cm4gW25hY2wuc2lnbi5kZXRhY2hlZChtZXNzYWdlQnl0ZXMsIGtwLnNlY3JldEtleSldO1xufVxuXG5kZXNjcmliZSgncGFyc2VXaXJlVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGl0KCdzcGxpdHMgYSBzaWduZWQgdjEgdHJhbnNhY3Rpb24gaW50byBtZXNzYWdlICsgc2lnbmF0dXJlcyArIHNpZ25lciBwdWJrZXlzJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVzID0gc2lnbihtZXNzYWdlQnl0ZXMpO1xuICAgIGNvbnN0IHdpcmUgPSBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obWVzc2FnZUJ5dGVzLCBzaWduYXR1cmVzKTtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVdpcmVUcmFuc2FjdGlvbih3aXJlKTtcbiAgICBwYXJzZWQubWVzc2FnZUJ5dGVzLnNob3VsZC5lcWwobWVzc2FnZUJ5dGVzKTtcbiAgICBwYXJzZWQuc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHBhcnNlZC5zaWduYXR1cmVzWzBdLnNob3VsZC5lcWwoc2lnbmF0dXJlc1swXSk7XG4gICAgcGFyc2VkLnNpZ25lclB1YmxpY0tleXMuc2hvdWxkLmVxbChbQV0pO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHdpcmUgdHggd2hvc2UgdGFpbCBpcyBub3QgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IHNhbXBsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCB3aXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgc2lnbihtZXNzYWdlQnl0ZXMpKTtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSB3aXJlLnN1YmFycmF5KDAsIHdpcmUubGVuZ3RoIC0gMSk7XG4gICAgKCgpID0+IHBhcnNlV2lyZVRyYW5zYWN0aW9uKHRydW5jYXRlZCkpLnNob3VsZC50aHJvdyhCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIG5vbi12MSB3aXJlIHR4JywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKTtcbiAgICAoKCkgPT4gcGFyc2VXaXJlVHJhbnNhY3Rpb24oYnl0ZXMpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC92ZXJzaW9uIHByZWZpeC8gfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGEgZnVsbHkgc2lnbmVkLCB2YWxpZCB2MSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBzYW1wbGVNZXNzYWdlKCk7XG4gICAgY29uc3Qgd2lyZSA9IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXMsIHNpZ24obWVzc2FnZUJ5dGVzKSk7XG4gICAgKCgpID0+IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb25WMSh3aXJlKSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHRhbXBlcmVkIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBzYW1wbGVNZXNzYWdlKCk7XG4gICAgY29uc3Qgd2lyZSA9IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbihtZXNzYWdlQnl0ZXMsIHNpZ24obWVzc2FnZUJ5dGVzKSk7XG4gICAgY29uc3QgdGFtcGVyZWQgPSBuZXcgVWludDhBcnJheSh3aXJlKTtcbiAgICB0YW1wZXJlZFt0YW1wZXJlZC5sZW5ndGggLSAxXSBePSAweGZmO1xuICAgICgoKSA9PiB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uVjEodGFtcGVyZWQpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC92ZXJpZmljYXRpb24gZmFpbGVkLyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgd2hlbiBhIHJlcXVpcmVkIHNpZ25hdHVyZSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuY29kZUNvbmZpZ01hc2tBbmRWYWx1ZXMoe1xuICAgICAgY29tcHV0ZVVuaXRMaW1pdDogMjAwXzAwMCxcbiAgICAgIGhlYXBTaXplOiBudWxsLFxuICAgICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBudWxsLFxuICAgICAgcHJpb3JpdHlGZWU6IDVfMDAwLFxuICAgIH0pO1xuICAgIGNvbnN0IG1zZyA9IGVuY29kZVYxTWVzc2FnZSh7XG4gICAgICBoZWFkZXI6IHsgbnVtU2lnbmVyQWNjb3VudHM6IDEsIG51bVJlYWRvbmx5U2lnbmVyQWNjb3VudHM6IDAsIG51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHM6IDEgfSxcbiAgICAgIGNvbmZpZ01hc2s6IGNvbmZpZy5tYXNrLFxuICAgICAgY29uZmlnVmFsdWVzOiBjb25maWcudmFsdWVzLFxuICAgICAgYmxvY2toYXNoOiBCTE9DS0hBU0gsXG4gICAgICBzdGF0aWNBY2NvdW50czogW0EsIEJdLFxuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1BZGRyZXNzSW5kZXg6IDEsIGFjY291bnRJbmRpY2VzOiBbMCwgMV0sIGRhdGE6IG5ldyBVaW50OEFycmF5KFsxXSkgfV0sXG4gICAgfSk7XG4gICAgKCgpID0+IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb25WMShtc2cpKS5zaG91bGQudGhyb3coQnVpbGRUcmFuc2FjdGlvbkVycm9yLCB7IG1lc3NhZ2U6IC9zaWduYXR1cmUgYnl0ZXMvIH0pO1xuICB9KTtcbn0pO1xuIl19
|