@vechain/sdk-aws-kms-adapter
Version:
This module implements the VeChain abstract signer so it is integrated with AWS KMS
2 lines • 5.95 kB
JavaScript
'use strict';var clientKms=require('@aws-sdk/client-kms'),sdkErrors=require('@vechain/sdk-errors'),sdkNetwork=require('@vechain/sdk-network'),utils=require('@noble/curves/abstract/utils'),secp256k1=require('@noble/curves/secp256k1'),sdkCore=require('@vechain/sdk-core'),asn1js=require('asn1js'),viem=require('viem');var d=class g extends sdkNetwork.VeChainAbstractSigner{kmsVeChainProvider;kmsVeChainGasPayerProvider;kmsVeChainGasPayerServiceUrl;constructor(i,e){if(super(i),this.provider!==void 0){if(!(this.provider instanceof s))throw new sdkErrors.JSONRPCInvalidParams("KMSVeChainSigner.constructor","The provider must be an instance of KMSVeChainProvider.",{provider:i});this.kmsVeChainProvider=this.provider;}if(e!==void 0)if(e.provider!==void 0&&e.provider instanceof s)this.kmsVeChainGasPayerProvider=e.provider;else if(e.url!==void 0)this.kmsVeChainGasPayerServiceUrl=e.url;else throw new sdkErrors.JSONRPCInvalidParams("KMSVeChainSigner.constructor","The gasPayer object is not well formed, either provider or url should be provided.",{gasPayer:e})}connect(i){try{return new g(i)}catch(e){throw new sdkErrors.SignerMethodError("KMSVeChainSigner.connect","The signer could not be connected to the provider.",{provider:i},e)}}decodePublicKey(i){let e=new asn1js.Sequence({value:[new asn1js.Sequence({value:[new asn1js.ObjectIdentifier]}),new asn1js.BitString({name:"objectIdentifier"})]}),r=asn1js.verifySchema(i,e);if(!r.verified)throw new sdkErrors.SignerMethodError("KMSVeChainSigner.decodePublicKey",`Failed to parse the encoded public key: ${r.result.error}`,{parsed:r});let n=r.result.objectIdentifier.valueBlock.valueHex;return new Uint8Array(n)}async getDecodedPublicKey(i=this.kmsVeChainProvider){if(i===void 0)throw new sdkErrors.JSONRPCInvalidParams("KMSVeChainSigner.getDecodedPublicKey","Thor provider is not found into the signer. Please attach a Provider to your signer instance.",{});let e=await i.getPublicKey();return this.decodePublicKey(e)}async getAddress(i=false){try{let e=i?this.kmsVeChainGasPayerProvider:this.kmsVeChainProvider,r=await this.getDecodedPublicKey(e);return sdkCore.Address.ofPublicKey(r).toString()}catch(e){throw new sdkErrors.SignerMethodError("KMSVeChainSigner.getAddress","The address could not be retrieved.",{fromGasPayerProvider:i},e)}}async buildVeChainSignatureFromPayload(i,e=this.kmsVeChainProvider){if(e===void 0)throw new sdkErrors.JSONRPCInvalidParams("KMSVeChainSigner.buildVeChainSignatureFromPayload","Thor provider is not found into the signer. Please attach a Provider to your signer instance.",{payload:i});let r=await e.sign(i),n=utils.bytesToHex(r),t=secp256k1.secp256k1.Signature.fromDER(n).normalizeS(),o=await this.getRecoveryBit(t,i,e);return utils.concatBytes(t.toCompactRawBytes(),new Uint8Array([o]))}async getRecoveryBit(i,e,r){let n=await this.getDecodedPublicKey(r),t=viem.toHex(n);for(let o=0n;o<2n;o++)if(await viem.recoverPublicKey({hash:e,signature:{r:viem.toHex(i.r),s:viem.toHex(i.s),v:o}})===t)return Number(o);throw new sdkErrors.SignerMethodError("KMSVeChainSigner.getRecoveryBit","The recovery bit could not be found.",{decodedSignatureWithoutRecoveryBit:i,transactionHash:e})}async concatSignatureIfDelegation(i){let e=i.getTransactionHash().bytes,r=await this.buildVeChainSignatureFromPayload(e);if(this.kmsVeChainGasPayerProvider!==void 0){let n=await this.getDecodedPublicKey(),t=sdkCore.Address.ofPublicKey(n),o=i.getTransactionHash(t).bytes,y=await this.buildVeChainSignatureFromPayload(o,this.kmsVeChainGasPayerProvider);return utils.concatBytes(r,y)}else if(this.kmsVeChainGasPayerServiceUrl!==void 0){let n=await this.getAddress(),t=await sdkNetwork.DelegationHandler({gasPayerServiceUrl:this.kmsVeChainGasPayerServiceUrl}).getDelegationSignatureUsingUrl(i,n,this.provider.thorClient.httpClient);return utils.concatBytes(r,t)}return r}async signTransaction(i){try{let e=await this.populateTransaction(i),r=sdkCore.Transaction.of(e),n=await this.concatSignatureIfDelegation(r);return sdkCore.Hex.of(sdkCore.Transaction.of(e,n).encoded).toString()}catch(e){throw new sdkErrors.SignerMethodError("KMSVeChainSigner.signTransaction","The transaction could not be signed.",{transactionToSign:i},e)}}async sendTransaction(i){try{let e=await this.signTransaction(i);return await this.kmsVeChainProvider?.request({method:sdkNetwork.RPC_METHODS.eth_sendRawTransaction,params:[e]})}catch(e){throw new sdkErrors.SignerMethodError("KMSVeChainSigner.sendTransaction","The transaction could not be sent.",{transactionToSend:i},e)}}async signPayload(i){let e=await this.buildVeChainSignatureFromPayload(i);return e[e.length-1]+=27,sdkCore.Hex.of(e).toString()}};var s=class extends sdkNetwork.VeChainProvider{kmsClient;keyId;signer;constructor(i,e,r=false){super(i,void 0,r),this.keyId=e.keyId,this.kmsClient=e.endpoint!==void 0?new clientKms.KMSClient({region:e.region,endpoint:e.endpoint,credentials:e.credentials}):e.credentials!==void 0?new clientKms.KMSClient({region:e.region,credentials:e.credentials}):new clientKms.KMSClient({region:e.region});}async getSigner(i){return this.signer!==void 0?this.signer:(this.signer=new d(this),await Promise.resolve(this.signer))}async getPublicKey(){let i=new clientKms.GetPublicKeyCommand({KeyId:this.keyId}),e=await this.kmsClient.send(i);if(e.PublicKey===void 0)throw new sdkErrors.ProviderMethodError("KMSVeChainProvider.getPublicKey","The public key could not be retrieved.",{getPublicKeyOutput:e});return e.PublicKey}async sign(i){let e=new clientKms.SignCommand({KeyId:this.keyId,Message:i,SigningAlgorithm:clientKms.SigningAlgorithmSpec.ECDSA_SHA_256,MessageType:clientKms.MessageType.DIGEST}),r=await this.kmsClient.send(e);if(r.Signature===void 0)throw new sdkErrors.ProviderMethodError("KMSVeChainProvider.sign","The signature could not be generated.",{signOutput:r});return r.Signature}};exports.KMSVeChainProvider=s;exports.KMSVeChainSigner=d;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map