PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/abstract-eth/dist/test/unit/messages
Просмотр файла: abstractEthMessagesTests.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.testEthMessageSigning = testEthMessageSigning;
const sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const should_1 = __importDefault(require("should"));
const coinConfig = statics_1.coins.get('eth');
function testEthMessageSigning(testConfig) {
const { messageType, messageClass, tests, signedTest } = testConfig;
describe(`${messageType} - Message Type`, () => {
it('should have the correct message type', () => {
const msgInstance = new messageClass({
...signedTest.input,
coinConfig,
});
msgInstance.getType().should.equal(messageType);
});
});
describe(`${messageType} - Signable Payload Generation`, () => {
Object.entries(tests).map(([key, { input, expected }]) => {
it(`should generate the correct signable payload for message '${key}'`, async () => {
const message = new messageClass({
...input,
coinConfig,
});
const signablePayload = await message.getSignablePayload();
signablePayload.toString('hex').should.equal(expected.expectedSignableHex);
if (input.metadata) {
should_1.default.deepEqual(message.getMetadata(), input.metadata);
}
else {
should_1.default.deepEqual(message.getMetadata(), {});
}
});
});
});
describe(`${messageType} - Maintaining Signers and Signatures`, () => {
const { payload, signature, signer } = signedTest.input;
it('should be created with the correct signatures and signers', () => {
const message = new messageClass({
coinConfig,
payload,
signatures: [signature],
signers: [signer],
});
message.getSignatures().should.containEql(signature);
message.getSigners().should.containEql(signer);
});
it('should maintain signatures and signers correctly', () => {
const message = new messageClass({
coinConfig,
payload,
signatures: [signature],
signers: [signer],
});
message.addSignature({
publicKey: { pub: 'pub1' },
signature: Buffer.from('new-signature'),
});
message.addSigner('new-signer');
message.getSignatures().should.containEql({
publicKey: { pub: 'pub1' },
signature: Buffer.from('new-signature'),
});
message.getSigners().should.containEql('new-signer');
// Test replacing all
message.setSignatures([
{
publicKey: { pub: 'pub2' },
signature: Buffer.from('replaced-signature'),
},
]);
message.setSigners(['replaced-signer']);
message.getSignatures().should.deepEqual([
{
publicKey: { pub: 'pub2' },
signature: Buffer.from('replaced-signature'),
},
]);
message.getSigners().should.deepEqual(['replaced-signer']);
});
});
describe(`${messageType} - Broadcast Format`, () => {
const { payload, signature, signer } = signedTest.input;
const { expectedSignableBase64 } = signedTest.expected;
it('should convert to broadcast format correctly', async () => {
const message = new messageClass({
coinConfig,
payload,
signatures: [signature],
signers: [signer],
});
const broadcastFormat = await message.toBroadcastFormat();
const expectedSerializedSignatures = (0, sdk_core_1.serializeSignatures)([signature]);
broadcastFormat.type.should.equal(messageType);
broadcastFormat.payload.should.equal(message.getPayload());
broadcastFormat.serializedSignatures?.should.deepEqual(expectedSerializedSignatures);
broadcastFormat.signers?.should.deepEqual([signer]);
broadcastFormat.signablePayload?.should.equal(expectedSignableBase64);
if (broadcastFormat.metadata) {
broadcastFormat.metadata.should.deepEqual(message.getMetadata());
}
else {
should_1.default.deepEqual(message.getMetadata(), {});
}
});
it('should convert to broadcast string correctly', async () => {
const message = new messageClass({
coinConfig,
payload,
signatures: [signature],
signers: [signer],
});
const broadcastHex = await message.toBroadcastString();
const broadcastString = Buffer.from(broadcastHex, 'hex').toString();
const parsedBroadcast = JSON.parse(broadcastString);
const expectedSerializedSignatures = (0, sdk_core_1.serializeSignatures)([signature]);
parsedBroadcast.type.should.equal(messageType);
parsedBroadcast.payload.should.equal(message.getPayload());
parsedBroadcast.serializedSignatures.should.deepEqual(expectedSerializedSignatures);
parsedBroadcast.signers.should.deepEqual([signer]);
parsedBroadcast.metadata.should.deepEqual(message.getMetadata());
});
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFdGhNZXNzYWdlc1Rlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L21lc3NhZ2VzL2Fic3RyYWN0RXRoTWVzc2FnZXNUZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU9BLHNEQXVJQztBQTlJRCw4Q0FBc0Q7QUFDdEQsNENBQXVDO0FBQ3ZDLG9EQUE0QjtBQUc1QixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXBDLFNBQWdCLHFCQUFxQixDQUFDLFVBQTZCO0lBQ2pFLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFcEUsUUFBUSxDQUFDLEdBQUcsV0FBVyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDN0MsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FBQztnQkFDbkMsR0FBRyxVQUFVLENBQUMsS0FBSztnQkFDbkIsVUFBVTthQUNYLENBQUMsQ0FBQztZQUNILFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsR0FBRyxXQUFXLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2RCxFQUFFLENBQUMsNkRBQTZELEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNqRixNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVks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QUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3BGLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkQsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2VyaWFsaXplU2lnbmF0dXJlcyB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE1lc3NhZ2VUZXN0Q29uZmlnIH0gZnJvbSAnLi9hYnN0cmFjdEV0aE1lc3NhZ2VUZXN0VHlwZXMnO1xuXG5jb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCdldGgnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFdGhNZXNzYWdlU2lnbmluZyh0ZXN0Q29uZmlnOiBNZXNzYWdlVGVzdENvbmZpZyk6IHZvaWQge1xuICBjb25zdCB7IG1lc3NhZ2VUeXBlLCBtZXNzYWdlQ2xhc3MsIHRlc3RzLCBzaWduZWRUZXN0IH0gPSB0ZXN0Q29uZmlnO1xuXG4gIGRlc2NyaWJlKGAke21lc3NhZ2VUeXBlfSAtIE1lc3NhZ2UgVHlwZWAsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgbWVzc2FnZSB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbXNnSW5zdGFuY2UgPSBuZXcgbWVzc2FnZUNsYXNzKHtcbiAgICAgICAgLi4uc2lnbmVkVGVzdC5pbnB1dCxcbiAgICAgICAgY29pbkNvbmZpZyxcbiAgICAgIH0pO1xuICAgICAgbXNnSW5zdGFuY2UuZ2V0VHlwZSgpLnNob3VsZC5lcXVhbChtZXNzYWdlVHlwZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKGAke21lc3NhZ2VUeXBlfSAtIFNpZ25hYmxlIFBheWxvYWQgR2VuZXJhdGlvbmAsICgpID0+IHtcbiAgICBPYmplY3QuZW50cmllcyh0ZXN0cykubWFwKChba2V5LCB7IGlucHV0LCBleHBlY3RlZCB9XSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBnZW5lcmF0ZSB0aGUgY29ycmVjdCBzaWduYWJsZSBwYXlsb2FkIGZvciBtZXNzYWdlICcke2tleX0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IG1lc3NhZ2VDbGFzcyh7XG4gICAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgICAgY29pbkNvbmZpZyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gYXdhaXQgbWVzc2FnZS5nZXRTaWduYWJsZVBheWxvYWQoKTtcbiAgICAgICAgc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoZXhwZWN0ZWQuZXhwZWN0ZWRTaWduYWJsZUhleCk7XG5cbiAgICAgICAgaWYgKGlucHV0Lm1ldGFkYXRhKSB7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChtZXNzYWdlLmdldE1ldGFkYXRhKCksIGlucHV0Lm1ldGFkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKSwge30pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoYCR7bWVzc2FnZVR5cGV9IC0gTWFpbnRhaW5pbmcgU2lnbmVycyBhbmQgU2lnbmF0dXJlc2AsICgpID0+IHtcbiAgICBjb25zdCB7IHBheWxvYWQsIHNpZ25hdHVyZSwgc2lnbmVyIH0gPSBzaWduZWRUZXN0LmlucHV0O1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBjcmVhdGVkIHdpdGggdGhlIGNvcnJlY3Qgc2lnbmF0dXJlcyBhbmQgc2lnbmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgbWVzc2FnZUNsYXNzKHtcbiAgICAgICAgY29pbkNvbmZpZyxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICAgIHNpZ25lcnM6IFtzaWduZXJdLFxuICAgICAgfSk7XG5cbiAgICAgIG1lc3NhZ2UuZ2V0U2lnbmF0dXJlcygpLnNob3VsZC5jb250YWluRXFsKHNpZ25hdHVyZSk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25lcnMoKS5zaG91bGQuY29udGFpbkVxbChzaWduZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYWludGFpbiBzaWduYXR1cmVzIGFuZCBzaWduZXJzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgbWVzc2FnZUNsYXNzKHtcbiAgICAgICAgY29pbkNvbmZpZyxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICAgIHNpZ25lcnM6IFtzaWduZXJdLFxuICAgICAgfSk7XG5cbiAgICAgIG1lc3NhZ2UuYWRkU2lnbmF0dXJlKHtcbiAgICAgICAgcHVibGljS2V5OiB7IHB1YjogJ3B1YjEnIH0sXG4gICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20oJ25ldy1zaWduYXR1cmUnKSxcbiAgICAgIH0pO1xuICAgICAgbWVzc2FnZS5hZGRTaWduZXIoJ25ldy1zaWduZXInKTtcblxuICAgICAgbWVzc2FnZS5nZXRTaWduYXR1cmVzKCkuc2hvdWxkLmNvbnRhaW5FcWwoe1xuICAgICAgICBwdWJsaWNLZXk6IHsgcHViOiAncHViMScgfSxcbiAgICAgICAgc2lnbmF0dXJlOiBCdWZmZXIuZnJvbSgnbmV3LXNpZ25hdHVyZScpLFxuICAgICAgfSk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25lcnMoKS5zaG91bGQuY29udGFpbkVxbCgnbmV3LXNpZ25lcicpO1xuXG4gICAgICAvLyBUZXN0IHJlcGxhY2luZyBhbGxcbiAgICAgIG1lc3NhZ2Uuc2V0U2lnbmF0dXJlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHsgcHViOiAncHViMicgfSxcbiAgICAgICAgICBzaWduYXR1cmU6IEJ1ZmZlci5mcm9tKCdyZXBsYWNlZC1zaWduYXR1cmUnKSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgbWVzc2FnZS5zZXRTaWduZXJzKFsncmVwbGFjZWQtc2lnbmVyJ10pO1xuXG4gICAgICBtZXNzYWdlLmdldFNpZ25hdHVyZXMoKS5zaG91bGQuZGVlcEVxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHB1YmxpY0tleTogeyBwdWI6ICdwdWIyJyB9LFxuICAgICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20oJ3JlcGxhY2VkLXNpZ25hdHVyZScpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBtZXNzYWdlLmdldFNpZ25lcnMoKS5zaG91bGQuZGVlcEVxdWFsKFsncmVwbGFjZWQtc2lnbmVyJ10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShgJHttZXNzYWdlVHlwZX0gLSBCcm9hZGNhc3QgRm9ybWF0YCwgKCkgPT4ge1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc2lnbmF0dXJlLCBzaWduZXIgfSA9IHNpZ25lZFRlc3QuaW5wdXQ7XG4gICAgY29uc3QgeyBleHBlY3RlZFNpZ25hYmxlQmFzZTY0IH0gPSBzaWduZWRUZXN0LmV4cGVjdGVkO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHRvIGJyb2FkY2FzdCBmb3JtYXQgY29ycmVjdGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBtZXNzYWdlQ2xhc3Moe1xuICAgICAgICBjb2luQ29uZmlnLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBzaWduYXR1cmVzOiBbc2lnbmF0dXJlXSxcbiAgICAgICAgc2lnbmVyczogW3NpZ25lcl0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYnJvYWRjYXN0Rm9ybWF0ID0gYXdhaXQgbWVzc2FnZS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTZXJpYWxpemVkU2lnbmF0dXJlcyA9IHNlcmlhbGl6ZVNpZ25hdHVyZXMoW3NpZ25hdHVyZV0pO1xuXG4gICAgICBicm9hZGNhc3RGb3JtYXQudHlwZS5zaG91bGQuZXF1YWwobWVzc2FnZVR5cGUpO1xuICAgICAgYnJvYWRjYXN0Rm9ybWF0LnBheWxvYWQuc2hvdWxkLmVxdWFsKG1lc3NhZ2UuZ2V0UGF5bG9hZCgpKTtcbiAgICAgIGJyb2FkY2FzdEZvcm1hdC5zZXJpYWxpemVkU2lnbmF0dXJlcz8uc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZFNlcmlhbGl6ZWRTaWduYXR1cmVzKTtcbiAgICAgIGJyb2FkY2FzdEZvcm1hdC5zaWduZXJzPy5zaG91bGQuZGVlcEVxdWFsKFtzaWduZXJdKTtcbiAgICAgIGJyb2FkY2FzdEZvcm1hdC5zaWduYWJsZVBheWxvYWQ/LnNob3VsZC5lcXVhbChleHBlY3RlZFNpZ25hYmxlQmFzZTY0KTtcblxuICAgICAgaWYgKGJyb2FkY2FzdEZvcm1hdC5tZXRhZGF0YSkge1xuICAgICAgICBicm9hZGNhc3RGb3JtYXQubWV0YWRhdGEuc2hvdWxkLmRlZXBFcXVhbChtZXNzYWdlLmdldE1ldGFkYXRhKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChtZXNzYWdlLmdldE1ldGFkYXRhKCksIHt9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCB0byBicm9hZGNhc3Qgc3RyaW5nIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgbWVzc2FnZUNsYXNzKHtcbiAgICAgICAgY29pbkNvbmZpZyxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICAgIHNpZ25lcnM6IFtzaWduZXJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJyb2FkY2FzdEhleCA9IGF3YWl0IG1lc3NhZ2UudG9Ccm9hZGNhc3RTdHJpbmcoKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFN0cmluZyA9IEJ1ZmZlci5mcm9tKGJyb2FkY2FzdEhleCwgJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBwYXJzZWRCcm9hZGNhc3QgPSBKU09OLnBhcnNlKGJyb2FkY2FzdFN0cmluZyk7XG4gICAgICBjb25zdCBleHBlY3RlZFNlcmlhbGl6ZWRTaWduYXR1cmVzID0gc2VyaWFsaXplU2lnbmF0dXJlcyhbc2lnbmF0dXJlXSk7XG5cbiAgICAgIHBhcnNlZEJyb2FkY2FzdC50eXBlLnNob3VsZC5lcXVhbChtZXNzYWdlVHlwZSk7XG4gICAgICBwYXJzZWRCcm9hZGNhc3QucGF5bG9hZC5zaG91bGQuZXF1YWwobWVzc2FnZS5nZXRQYXlsb2FkKCkpO1xuICAgICAgcGFyc2VkQnJvYWRjYXN0LnNlcmlhbGl6ZWRTaWduYXR1cmVzLnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWRTZXJpYWxpemVkU2lnbmF0dXJlcyk7XG4gICAgICBwYXJzZWRCcm9hZGNhc3Quc2lnbmVycy5zaG91bGQuZGVlcEVxdWFsKFtzaWduZXJdKTtcbiAgICAgIHBhcnNlZEJyb2FkY2FzdC5tZXRhZGF0YS5zaG91bGQuZGVlcEVxdWFsKG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!