UNPKG

myria-core-sdk

Version:

Latest version SDK

124 lines 11.4 kB
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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