myria-core-sdk
Version:
Latest version SDK
124 lines • 11.4 kB
JavaScript
const StarkwareLib = require("@starkware-industries/starkware-crypto-utils");
const keyDerivation = StarkwareLib.keyDerivation;
export class SignatureTxManager {
constructor() { }
/**
* Get stark public key by wallet signature
* @param signature
* s
*/
getStarkPublicKey(signature) {
const privateKeyFromSignature = keyDerivation.getPrivateKeyFromEthSignature(signature);
return keyDerivation.privateToStarkKey(privateKeyFromSignature);
}
/**
* Get private stark key from the signature
* @param signature
* s
*/
getPrivateStarkKey(signature) {
const privateStarkKeyInternal = keyDerivation.getPrivateKeyFromEthSignature(signature);
// console.log('Private stark key internal => ', privateStarkKeyInternal)
return privateStarkKeyInternal;
}
generateStarkSignature(myriaPrivateStarkKey, msgHash) {
// console.log('generateStarkSignature ===> ');
const keyPair = StarkwareLib.ec.keyFromPrivate(myriaPrivateStarkKey, "hex");
const publicStarkKey = StarkwareLib.ec.keyFromPublic(keyPair.getPublic(true, "hex"), "hex");
// console.log('publicStarkKey ===> ', publicStarkKey);
const pureStarkSignature = StarkwareLib.sign(keyPair, msgHash);
// console.log('pureStarkSignature ===> ', pureStarkSignature);
const verify = StarkwareLib.verify(publicStarkKey, msgHash, pureStarkSignature);
if (!verify) {
throw new Error("Stark signature generate error - please recheck the data");
}
const starkSignature = {
r: `0x${pureStarkSignature.r.toJSON()}`,
s: `0x${pureStarkSignature.s.toJSON()}`,
};
return starkSignature;
}
async generateStarkSignatureForTransfer(payload) {
let msgHash;
let starkSignature;
console.log('generateStarkSignatureForTransfer');
console.log('TransferCommonParams ==> ', payload);
if (!payload.myriaPrivateStarkKey) {
throw new Error('[generateStarkSignatureForTransfer] Myria private stark key is required');
}
try {
msgHash = StarkwareLib.getTransferMsgHash(payload.quantizedAmount, payload.nonce, payload.senderVaultId, payload.assetId, payload.receiverVaultId, payload.receiverPublicKey, payload.expirationTimestamp);
if (msgHash) {
starkSignature = await this.generateStarkSignature(payload.myriaPrivateStarkKey, msgHash);
}
else {
throw new Error("Signing message failed!");
}
}
catch (err) {
console.log("Error -> ", err);
}
return starkSignature;
}
async generateFullPayloadForBulkTransfer(senderWalletAddress, tokenType, requestSignableTransferredParams, myriaPrivateStarkKey) {
if (!myriaPrivateStarkKey) {
throw new Error("Cant execute the operation due to missing myria private stark key");
}
const fullTransferPayload = [];
console.log('generateFullPayloadForBulkTransfer');
try {
// Transfer for first items for cache the stark private key
console.time("GenerateSignatureExecute");
const allTransferredItems = requestSignableTransferredParams.items;
if (allTransferredItems.length > 0) {
const transformedTransactions = await Promise.all(allTransferredItems.map(async (item) => {
console.log('generateFullPayloadForBulkTransfer [item] => ', item);
return this._buildAndTransformSignaturePayloadForTransfer(item, senderWalletAddress, requestSignableTransferredParams.senderPublicKey, tokenType, myriaPrivateStarkKey);
}));
fullTransferPayload.push(...transformedTransactions);
console.timeEnd("GenerateSignatureExecute");
}
}
catch (err) {
throw new Error("Error exception for signature building " + JSON.stringify(err));
}
console.log("fullTransferPayload -> ", fullTransferPayload);
return fullTransferPayload;
}
async _buildAndTransformSignaturePayloadForTransfer(data, senderWalletAddress, senderPublicKey, tokenType, myriaPrivateStarkKey) {
const transferredToken = {
senderVaultId: Number(data.senderVaultId),
senderPublicKey: senderPublicKey,
senderWalletAddress,
receiverVaultId: Number(data.receiverVaultId),
receiverPublicKey: data.receiverPublicKey,
assetId: data.token,
quantizedAmount: data.quantizedAmount,
tokenType: tokenType,
expirationTimestamp: data.expirationTimestamp,
nonce: data.nonce,
myriaPrivateStarkKey: myriaPrivateStarkKey,
};
console.log('_buildAndTransformSignaturePayloadForTransfer');
console.log('transferredToken ==> ', transferredToken);
const transferredSignature = await this.generateStarkSignatureForTransfer(transferredToken);
if (!transferredSignature) {
throw new Error("Signature is generated failure");
}
const fullTransferredPayload = {
senderVaultId: Number(data.senderVaultId),
senderPublicKey: senderPublicKey,
receiverVaultId: Number(data.receiverVaultId),
receiverPublicKey: data.receiverPublicKey,
token: data.token,
quantizedAmount: data.quantizedAmount,
nonce: data.nonce,
expirationTimestamp: data.expirationTimestamp,
signature: transferredSignature,
receiverWalletAddress: data.receiverWalletAddress,
senderWalletAddress: data.senderWalletAddress,
};
return fullTransferredPayload;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmF0dXJlVHhNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvU2lnbmF0dXJlVHhNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUM7QUFFakQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixnQkFBZSxDQUFDO0lBRWhCOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxTQUFpQjtRQUN4QyxNQUFNLHVCQUF1QixHQUMzQixhQUFhLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsT0FBTyxhQUFhLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLFNBQWlCO1FBQ3pDLE1BQU0sdUJBQXVCLEdBQzNCLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCx5RUFBeUU7UUFDekUsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRU0sc0JBQXNCLENBQzNCLG9CQUE0QixFQUM1QixPQUFXO1FBR1gsK0NBQStDO1FBQy9DLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUM1QyxvQkFBb0IsRUFDcEIsS0FBSyxDQUNOLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FDbEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQzlCLEtBQUssQ0FDTixDQUFDO1FBQ0YsdURBQXVEO1FBR3ZELE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0Qs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