signet.js 0.0.10-beta6 → 0.0.10-beta7
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/browser/index.browser.cjs +2 -2
- package/browser/index.browser.cjs.map +1 -1
- package/browser/index.browser.js +2 -2
- package/browser/index.browser.js.map +1 -1
- package/node/index.node.cjs +2 -2
- package/node/index.node.cjs.map +1 -1
- package/node/index.node.js +2 -2
- package/node/index.node.js.map +1 -1
- package/package.json +1 -1
- package/types/index.d.cts +375 -60
- package/types/index.d.ts +375 -60
package/node/index.node.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {base58}from'@scure/base';import {ec}from'elliptic';import {sha3_256}from'js-sha3';import {keccak256,concatHex,numberToHex,getAddress,serializeTransaction,parseTransaction,toBytes,hashMessage,hashTypedData,encodeAbiParameters,hexToBigInt,concat,pad,isAddress,withRetry,createPublicClient,http,padHex,recoverAddress,encodeFunctionData}from'viem';import*as C from'bitcoinjs-lib';import qt from'coinselect';import {encodeSecp256k1Pubkey}from'@cosmjs/amino';import {sha256,ripemd160}from'@cosmjs/crypto';import {fromHex,toBase64,fromBase64}from'@cosmjs/encoding';import {Registry,encodePubkey,makeAuthInfoBytes,makeSignDoc,makeSignBytes}from'@cosmjs/proto-signing';import {calculateFee,GasPrice,StargateClient}from'@cosmjs/stargate';import {bech32}from'bech32';import {SignMode}from'cosmjs-types/cosmos/tx/signing/v1beta1/signing';import {TxRaw}from'cosmjs-types/cosmos/tx/v1beta1/tx';import {chains,assets}from'chain-registry';import {Contract,Connection,Account}from'@near-js/accounts';import {KeyPair}from'@near-js/crypto';import {InMemoryKeyStore}from'@near-js/keystores';import oe from'bn.js';import {actionCreators}from'@near-js/transactions';import {connect,utils,transactions}from'near-api-js';import {getTransactionLastResult}from'near-api-js/lib/providers';import'viem/chains';var Ut=Object.defineProperty;var y=(r,t)=>{for(var e in t)Ut(r,e,{get:t[e],enumerable:true});};var Tt={};y(Tt,{CHAINS:()=>g,CONTRACT_ADDRESSES:()=>at,ENVS:()=>l,KDF_CHAIN_IDS:()=>b,ROOT_PUBLIC_KEYS:()=>rt});var l={TESTNET_DEV:"TESTNET_DEV",TESTNET:"TESTNET",MAINNET:"MAINNET",SOLANA_STUB:"SOLANA_STUB"},g={ETHEREUM:"ETHEREUM",NEAR:"NEAR",SOLANA:"SOLANA"},rt={[l.TESTNET_DEV]:"secp256k1:54hU5wcCmVUPFWLDALXMh1fFToZsVXrx9BbTbHzSfQq1Kd1rJZi52iPa4QQxo6s5TgjWqgpY8HamYuUDzG6fAaUq",[l.TESTNET]:"secp256k1:3Ww8iFjqTHufye5aRGUvrQqETegR4gVUcW8FX5xzscaN9ENhpkffojsxJwi6N1RbbHMTxYa9UyKeqK3fsMuwxjR5",[l.MAINNET]:"secp256k1:4tY4qMzusmgX5wYdG35663Y3Qar3CTbpApotwk9ZKLoF79XA4DjG8XoByaKdNHKQX9Lz5hd7iJqsWdTKyA7dKa6Z",[l.SOLANA_STUB]:"secp256k1:2aXyFojLFqE4jtWTVwyGRrJoik8UfBCx2AU7VALhDPAnNjnGYEtwHgiaHxu8S5tvbLnzSoojQAGeJcxz9YHa32cs"},b={[g.ETHEREUM]:"0x1",[g.NEAR]:"0x18d",[g.SOLANA]:"0x800001f5"},at={[g.NEAR]:{[l.TESTNET_DEV]:"dev.sig-net.testnet",[l.TESTNET]:"v1.sig-net.testnet",[l.MAINNET]:"v1.sig-net.near"},[g.ETHEREUM]:{[l.TESTNET_DEV]:"0x69C6b28Fdc74618817fa380De29a653060e14009",[l.TESTNET]:"0x83458E8Bf8206131Fe5c05127007FA164c0948A2",[l.MAINNET]:"0xf8bdC0612361a1E49a8E01423d4C0cFc5dF4791A"},[g.SOLANA]:{[l.SOLANA_STUB]:"4uvZW8K4g4jBg7dzPNbb9XDxJLFBK7V6iC76uofmYvEU"}};var Ct={};y(Ct,{cryptography:()=>m});var m={};y(m,{compressPubKey:()=>Ft,deriveChildPublicKey:()=>Ot,najToUncompressedPubKeySEC1:()=>x,toRSV:()=>Ht});var Ht=r=>{if("big_r"in r&&typeof r.big_r=="object"&&"affine_point"in r.big_r&&"s"in r&&typeof r.s=="object"&&"scalar"in r.s)return {r:r.big_r.affine_point.substring(2),s:r.s.scalar,v:r.recovery_id+27};if("big_r"in r&&typeof r.big_r=="string"&&"s"in r&&typeof r.s=="string")return {r:r.big_r.substring(2),s:r.s,v:r.recovery_id+27};if("bigR"in r&&"x"in r.bigR&&"s"in r&&typeof r.s=="bigint")return {r:r.bigR.x.toString(16).padStart(64,"0"),s:r.s.toString(16).padStart(64,"0"),v:r.recoveryId+27};throw new Error("Invalid signature format")},Ft=r=>{let t=r.slice(2);if(t.length!==128)throw new Error("Invalid uncompressed public key length");let e=t.slice(0,64),n=t.slice(64);return (parseInt(n.slice(-1),16)%2===0?"02":"03")+e},x=r=>{let t=base58.decode(r.split(":")[1]);return `04${Buffer.from(t).toString("hex")}`};function Ot(r,t,e="",n){let a=new ec("secp256k1"),s=`sig.network v1.0.0 epsilon derivation,${n},${t},${e}`,o="";if(n===b.ETHEREUM)o=keccak256(Buffer.from(s)).slice(2);else if(n===b.NEAR)o=sha3_256(s);else if(n===b.SOLANA)o=keccak256(Buffer.from(s)).slice(2);else throw new Error("Invalid chain ID");let c=r.substring(2,66),p=r.substring(66),u=a.curve.point(c,p),d=a.g.mul(o),S=u.add(d),f=S.getX().toString("hex").padStart(64,"0"),k=S.getY().toString("hex").padStart(64,"0");return `04${f}${k}`}var D={};y(D,{ChainAdapter:()=>h,btc:()=>U,cosmos:()=>M,evm:()=>N});var h=class{};var N={};y(N,{EVM:()=>q,fetchEVMFeeProperties:()=>$});async function $(r,t){let[e,n]=await Promise.all([r.estimateGas(t),r.estimateFeesPerGas()]),a=n.maxFeePerGas??BigInt(1e10),i=n.maxPriorityFeePerGas??BigInt(1e10);return {gas:e,maxFeePerGas:a,maxPriorityFeePerGas:i}}var q=class extends h{constructor({publicClient:t,contract:e}){super(),this.contract=e,this.client=t;}async attachGasAndNonce(t){let e=await $(this.client,t),n=await this.client.getTransactionCount({address:t.from}),{from:a,...i}=t;return {...e,nonce:n,chainId:Number(await this.client.getChainId()),type:"eip1559",...i}}transformRSVSignature(t){return {r:`0x${t.r}`,s:`0x${t.s}`,yParity:t.v-27}}assembleSignature(t){let{r:e,s:n,yParity:a}=this.transformRSVSignature(t);if(a===void 0)throw new Error("Missing yParity");return concatHex([e,n,numberToHex(a+27,{size:1})])}async deriveAddressAndPublicKey(t,e){let n=await this.contract.getDerivedPublicKey({path:e,predecessor:t});if(!n)throw new Error("Failed to get derived public key");let a=n.startsWith("04")?n.slice(2):n,i=keccak256(Buffer.from(a,"hex"));return {address:getAddress(`0x${i.slice(-40)}`),publicKey:n}}async getBalance(t){return {balance:await this.client.getBalance({address:t}),decimals:18}}serializeTransaction(t){return serializeTransaction(t)}deserializeTransaction(t){return parseTransaction(t)}async prepareTransactionForSigning(t){let e=await this.attachGasAndNonce(t),n=serializeTransaction(e),a=toBytes(keccak256(n));return {transaction:e,hashesToSign:[Array.from(a)]}}async prepareMessageForSigning(t){return {hashToSign:Array.from(toBytes(hashMessage(t)))}}async prepareTypedDataForSigning(t){return {hashToSign:Array.from(toBytes(hashTypedData(t)))}}async prepareUserOpForSigning(t,e,n){let a=n??await this.client.getChainId(),i=e||"0x0000000071727De22E5E9d8BAf0edAc6f37da032",s=encodeAbiParameters([{type:"bytes32"},{type:"address"},{type:"uint256"}],[keccak256(encodeAbiParameters([{type:"address"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"},{type:"bytes32"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"}],[t.sender,hexToBigInt(t.nonce),keccak256("factory"in t&&"factoryData"in t&&t.factory&&t.factoryData?concat([t.factory,t.factoryData]):"initCode"in t?t.initCode:"0x"),keccak256(t.callData),concat([pad(t.verificationGasLimit,{size:16}),pad(t.callGasLimit,{size:16})]),hexToBigInt(t.preVerificationGas),concat([pad(t.maxPriorityFeePerGas,{size:16}),pad(t.maxFeePerGas,{size:16})]),keccak256("paymaster"in t&&t.paymaster&&isAddress(t.paymaster)?concat([t.paymaster,pad(t.paymasterVerificationGasLimit,{size:16}),pad(t.paymasterPostOpGasLimit,{size:16}),t.paymasterData]):"paymasterAndData"in t?t.paymasterAndData:"0x")])),i,BigInt(a)]),o=keccak256(s);return {userOp:t,hashToSign:Array.from(toBytes(hashMessage({raw:o})))}}finalizeTransactionSigning({transaction:t,rsvSignatures:e}){let n=this.transformRSVSignature(e[0]);return serializeTransaction(t,n)}finalizeMessageSigning({rsvSignature:t}){return this.assembleSignature(t)}finalizeTypedDataSigning({rsvSignature:t}){return this.assembleSignature(t)}finalizeUserOpSigning({userOp:t,rsvSignature:e}){let{r:n,s:a,yParity:i}=this.transformRSVSignature(e);if(i===void 0)throw new Error("Missing yParity");return {...t,signature:concatHex(["0x00",n,a,numberToHex(Number(i+27),{size:1})])}}async broadcastTx(t){try{return await this.client.sendRawTransaction({serializedTransaction:t})}catch(e){throw console.error("Transaction broadcast failed:",e),new Error("Failed to broadcast transaction.")}}};var U={};y(U,{BTCRpcAdapter:()=>E,BTCRpcAdapters:()=>W,Bitcoin:()=>X});function st(r){switch(r.toLowerCase()){case "mainnet":return C.networks.bitcoin;case "testnet":return C.networks.testnet;case "regtest":return C.networks.regtest;default:throw new Error(`Unknown Bitcoin network: ${r}`)}}var X=class r extends h{static{this.SATOSHIS_PER_BTC=1e8;}constructor({network:t,contract:e,btcRpcAdapter:n}){super(),this.network=t,this.btcRpcAdapter=n,this.contract=e;}static toBTC(t){return t/r.SATOSHIS_PER_BTC}static toSatoshi(t){return Math.round(t*r.SATOSHIS_PER_BTC)}async fetchTransaction(t){let e=await this.btcRpcAdapter.getTransaction(t),n=new C.Transaction;return e.vout.forEach(a=>{let i=Buffer.from(a.scriptpubkey,"hex");n.addOutput(i,Number(a.value));}),n}static transformRSVSignature(t){let e=t.r.padStart(64,"0"),n=t.s.padStart(64,"0"),a=Buffer.from(e+n,"hex");if(a.length!==64)throw new Error("Invalid signature length.");return a}async createPSBT({transactionRequest:t}){let{inputs:e,outputs:n}=t.inputs&&t.outputs?t:await this.btcRpcAdapter.selectUTXOs(t.from,[{address:t.to,value:parseFloat(t.value)}]),a=new C.Psbt({network:st(this.network)});return await Promise.all(e.map(async i=>{if(!i.scriptPubKey){let o=(await this.fetchTransaction(i.txid)).outs[i.vout];i.scriptPubKey=o.script;}a.addInput({hash:i.txid,index:i.vout,witnessUtxo:{script:i.scriptPubKey,value:i.value}});})),n.forEach(i=>{"address"in i?a.addOutput({address:i.address,value:i.value}):"script"in i?a.addOutput({script:i.script,value:i.value}):t.from!==void 0&&a.addOutput({value:Number(i.value),address:t.from});}),a}async getBalance(t){return {balance:BigInt(await this.btcRpcAdapter.getBalance(t)),decimals:8}}async deriveAddressAndPublicKey(t,e){let n=await this.contract.getDerivedPublicKey({path:e,predecessor:t});if(!n)throw new Error("Failed to get derived public key");let a=m.compressPubKey(n),i=Buffer.from(a,"hex"),s=st(this.network),o=C.payments.p2wpkh({pubkey:i,network:s}),{address:c}=o;if(!c)throw new Error("Failed to generate Bitcoin address");return {address:c,publicKey:a}}serializeTransaction(t){return JSON.stringify({psbt:t.psbt.toHex(),publicKey:t.publicKey})}deserializeTransaction(t){let e=JSON.parse(t);return {psbt:C.Psbt.fromHex(e.psbt),publicKey:e.publicKey}}async prepareTransactionForSigning(t){let e=Buffer.from(t.publicKey,"hex"),n=await this.createPSBT({transactionRequest:t}),a=n.toHex(),i=[],s=o=>({publicKey:e,sign:c=>(i[o]=Array.from(c),Buffer.alloc(64))});for(let o=0;o<n.inputCount;o++)n.signInput(o,s(o));return {transaction:{psbt:C.Psbt.fromHex(a),publicKey:t.publicKey},hashesToSign:i}}finalizeTransactionSigning({transaction:{psbt:t,publicKey:e},rsvSignatures:n}){let a=Buffer.from(e,"hex"),i=s=>({publicKey:a,sign:()=>{let o=n[s];return r.transformRSVSignature(o)}});for(let s=0;s<t.inputCount;s++)t.signInput(s,i(s));return t.finalizeAllInputs(),t.extractTransaction().toHex()}async broadcastTx(t){return await this.btcRpcAdapter.broadcastTransaction(t)}};var E=class{};var _=class extends E{constructor(t){super(),this.providerUrl=t;}async fetchFeeRate(t=6){let n=await(await fetch(`${this.providerUrl}/v1/fees/recommended`)).json();return t<=1?n.fastestFee:t<=3?n.halfHourFee:t<=6?n.hourFee:n.economyFee}async fetchUTXOs(t){try{return await(await fetch(`${this.providerUrl}/address/${t}/utxo`)).json()}catch(e){return console.error("Failed to fetch UTXOs:",e),[]}}async selectUTXOs(t,e,n=6){let a=await this.fetchUTXOs(t),i=await this.fetchFeeRate(n),s=qt(a,e,Math.ceil(i+1));if(!s.inputs||!s.outputs)throw new Error("Invalid transaction: coinselect failed to find a suitable set of inputs and outputs. This could be due to insufficient funds, or no inputs being available that meet the criteria.");return {inputs:s.inputs,outputs:s.outputs}}async broadcastTransaction(t){let e=await fetch(`${this.providerUrl}/tx`,{method:"POST",body:t});if(e.ok)return await e.text();throw new Error(`Failed to broadcast transaction: ${await e.text()}`)}async getBalance(t){let n=await(await fetch(`${this.providerUrl}/address/${t}`)).json();return n.chain_stats.funded_txo_sum-n.chain_stats.spent_txo_sum}async getTransaction(t){return await(await fetch(`${this.providerUrl}/tx/${t}`)).json()}};var W={Mempool:_};var M={};y(M,{Cosmos:()=>J});var vt=async r=>{let t=chains.find(d=>d.chain_id===r);if(!t)throw new Error(`Chain info not found for chainId: ${r}`);let{bech32_prefix:e,chain_id:n}=t,a=t.staking?.staking_tokens?.[0]?.denom,i=t.apis?.rpc?.[0]?.address,s=t.apis?.rest?.[0]?.address,o=t.fees?.fee_tokens?.[0]?.average_gas_price;if(!e||!a||!i||!s||!n||o===void 0)throw new Error(`Missing required chain information for ${t.chain_name}`);let p=assets.find(d=>d.chain_name===t.chain_name)?.assets.find(d=>d.base===a),u=p?.denom_units.find(d=>d.denom===p.display)?.exponent;if(u===void 0)throw new Error(`Could not find decimals for ${a} on chain ${t.chain_name}`);return {prefix:e,denom:a,rpcUrl:i,restUrl:s,expectedChainId:n,gasPrice:o,decimals:u}};var J=class extends h{constructor({chainId:t,contract:e,endpoints:n}){super(),this.contract=e,this.registry=new Registry,this.chainId=t,this.endpoints=n;}transformRSVSignature(t){return new Uint8Array([...fromHex(t.r),...fromHex(t.s)])}async getChainInfo(){return {...await vt(this.chainId),...this.endpoints}}async getBalance(t){try{let{restUrl:e,denom:n,decimals:a}=await this.getChainInfo(),i=await fetch(`${e}/cosmos/bank/v1beta1/balances/${t}`);if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);let c=(await i.json()).balances.find(p=>p.denom===n)?.amount??"0";return {balance:BigInt(c),decimals:a}}catch(e){throw console.error("Failed to fetch Cosmos balance:",e),new Error("Failed to fetch Cosmos balance")}}async deriveAddressAndPublicKey(t,e){let{prefix:n}=await this.getChainInfo(),a=await this.contract.getDerivedPublicKey({path:e,predecessor:t});if(!a)throw new Error("Failed to get derived public key");let i=m.compressPubKey(a),s=sha256(fromHex(i)),o=ripemd160(s);return {address:bech32.encode(n,bech32.toWords(o)),publicKey:i}}serializeTransaction(t){let e=TxRaw.encode(t).finish();return toBase64(e)}deserializeTransaction(t){return TxRaw.decode(fromBase64(t))}async prepareTransactionForSigning(t){let{denom:e,rpcUrl:n,gasPrice:a}=await this.getChainInfo(),i=fromHex(t.publicKey),s=t.gas||2e5,o=calculateFee(s,GasPrice.fromString(`${a}${e}`)),p=await(await StargateClient.connect(n)).getAccount(t.address);if(!p)throw new Error(`Account ${t.address} does not exist on chain`);let{accountNumber:u,sequence:d}=p,S={typeUrl:"/cosmos.tx.v1beta1.TxBody",value:{messages:t.messages,memo:t.memo||""}},f=this.registry.encode(S),k=encodePubkey(encodeSecp256k1Pubkey(i)),O=makeAuthInfoBytes([{pubkey:k,sequence:d}],o.amount,Number(o.gas),void 0,void 0,SignMode.SIGN_MODE_DIRECT),et=makeSignDoc(f,O,this.chainId,u),nt=makeSignBytes(et),z=Array.from(sha256(nt));return {transaction:TxRaw.fromPartial({bodyBytes:f,authInfoBytes:O,signatures:[]}),hashesToSign:[z]}}finalizeTransactionSigning({transaction:t,rsvSignatures:e}){t.signatures=e.map(a=>this.transformRSVSignature(a));let n=TxRaw.encode(t).finish();return Buffer.from(n).toString("hex")}async broadcastTx(t){try{let{rpcUrl:e}=await this.getChainInfo(),n=await StargateClient.connect(e),a=fromHex(t),i=await n.broadcastTx(a);if(i.code!==0)throw new Error(`Broadcast error: ${i.rawLog}`);return i.transactionHash}catch(e){throw console.error("Transaction broadcast failed:",e),new Error("Failed to broadcast transaction.")}}};var _t={};y(_t,{ChainSignatureContract:()=>w,evm:()=>ht,near:()=>mt});var ot=class{},w=class extends ot{};var mt={};y(mt,{ChainSignatureContract:()=>T,utils:()=>ve});var yt={};y(yt,{keypair:()=>dt});var dt={};y(dt,{BTCTransaction:()=>Ee,CosmosTransaction:()=>Ae,EVMTransaction:()=>Pe});var Q=new oe("300000000000000"),H="dontcare";var I=async({networkId:r,accountId:t=H,keypair:e=KeyPair.fromRandom("ed25519")})=>{let n=new InMemoryKeyStore;await n.setKey(r,t,e);let a=Connection.fromConfig({networkId:r,provider:{type:"JsonRpcProvider",args:{url:{testnet:"https://rpc.testnet.near.org",mainnet:"https://rpc.mainnet.near.org"}[r]}},signer:{type:"InMemorySigner",keyStore:n}});return new Account(a,t)};var Z=(r,t)=>{let e=Object.entries(at[t]).find(([n,a])=>a.toLowerCase()===r.toLowerCase())?.[0];if(e)return rt[e]};var ut={};y(ut,{mpcPayloadsToChainSigTransaction:()=>he,responseToMpcSignature:()=>ct,sendTransactionUntil:()=>pt});var he=async({networkId:r,contractId:t,hashesToSign:e,path:n})=>{let i=await new T({networkId:r,contractId:t}).getCurrentSignatureDeposit();return {receiverId:t,actions:e.map(s=>({type:"FunctionCall",params:{methodName:"sign",args:{request:{payload:Array.from(s),path:n,key_version:0}},gas:Q.div(new oe(e.length)).toString(),deposit:i?.toString()||"1"}}))}},ct=({response:r})=>{let t=getTransactionLastResult(r);if(t)return m.toRSV(t)},pt=async({accountId:r,keypair:t,networkId:e,receiverId:n,actions:a,nonce:i,options:s={until:"EXECUTED_OPTIMISTIC",retryCount:3,delay:5e3,nodeUrl:e==="testnet"?"https://test.rpc.fastnear.com":"https://free.rpc.fastnear.com"}})=>{let o=new InMemoryKeyStore;await o.setKey(e,r,t);let c=await connect({networkId:e,keyStore:o,nodeUrl:s.nodeUrl}),{signer:p}=c.connection,u=await p.getPublicKey(r,c.connection.networkId),d=await c.connection.provider.query(`access_key/${r}/${u.toString()}`,""),S=utils.serialize.base_decode(d.block_hash),f=transactions.createTransaction(r,u,n,i??++d.nonce,a,S),k=utils.serialize.serialize(transactions.SCHEMA.Transaction,f),O=await p.signMessage(k,r,c.connection.networkId),et=new transactions.SignedTransaction({transaction:f,signature:new transactions.Signature({keyType:f.publicKey.keyType,data:O.signature})}),{transaction:nt}=await c.connection.provider.sendTransactionUntil(et,"INCLUDED_FINAL"),z=nt.hash;if(!z)throw new Error("No transaction hash found");return await withRetry(async()=>{let bt=await c.connection.provider.txStatus(z,r,s.until);if(bt)return bt;throw new Error("Transaction not found")},{retryCount:s.retryCount,delay:s.delay})};var T=class extends w{constructor({networkId:t,contractId:e,accountId:n=H,keypair:a=KeyPair.fromRandom("ed25519"),rootPublicKey:i,sendTransactionOptions:s}){super(),this.networkId=t,this.contractId=e,this.accountId=n,this.keypair=a,this.sendTransactionOptions=s,this.rootPublicKey=i||Z(this.contractId,g.NEAR);}async getContract(){let t=await I({networkId:this.networkId,accountId:this.accountId,keypair:this.keypair});return new Contract(t,this.contractId,{viewMethods:["public_key","experimental_signature_deposit","derived_public_key"],changeMethods:[],useLocalViewExecution:false})}async getCurrentSignatureDeposit(){let t=await this.getContract();return new oe((await t.experimental_signature_deposit()).toLocaleString("fullwide",{useGrouping:false}))}async getDerivedPublicKey(t){if(this.rootPublicKey)return m.deriveChildPublicKey(await this.getPublicKey(),t.predecessor.toLowerCase(),t.path,b.NEAR);{let n=await(await this.getContract()).derived_public_key(t);return x(n)}}async getPublicKey(){if(this.rootPublicKey)return x(this.rootPublicKey);{let e=await(await this.getContract()).public_key();return x(e)}}async sign(t,e){this.requireAccount();let n=await this.getCurrentSignatureDeposit(),a=await pt({accountId:this.accountId,keypair:this.keypair,networkId:this.networkId,receiverId:this.contractId,actions:[actionCreators.functionCall("sign",{request:t},BigInt(Q.toString()),BigInt(n.toString()))],nonce:e?.nonce,options:this.sendTransactionOptions}),i=ct({response:a});if(!i)throw new Error("Transaction failed");return i}requireAccount(){if(this.accountId===H)throw new Error("A valid account ID and keypair are required for change methods. Please instantiate a new contract with valid credentials.")}};var Pe=async(r,t)=>{try{let e=await I({networkId:r.nearAuthentication.networkId,accountId:r.nearAuthentication.accountId,keypair:t}),n=new T({networkId:r.nearAuthentication.networkId,contractId:r.chainConfig.contract,accountId:e.accountId,keypair:t}),a=new N.EVM({publicClient:createPublicClient({transport:http(r.chainConfig.providerUrl)}),contract:n}),{transaction:i,hashesToSign:s}=await a.prepareTransactionForSigning(r.transaction),o=await n.sign({payload:s[0],path:r.derivationPath,key_version:0}),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:[o]});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(e){return console.error(e),{success:false,errorMessage:e instanceof Error?e.message:String(e)}}},Ee=async(r,t)=>{try{let e=await I({networkId:r.nearAuthentication.networkId,accountId:r.nearAuthentication.accountId,keypair:t}),n=new T({networkId:r.nearAuthentication.networkId,contractId:r.chainConfig.contract,accountId:e.accountId,keypair:t}),a=new U.Bitcoin({btcRpcAdapter:new W.Mempool(r.chainConfig.providerUrl),contract:n,network:r.chainConfig.network}),{transaction:i,hashesToSign:s}=await a.prepareTransactionForSigning(r.transaction),o=await Promise.all(s.map(async u=>await n.sign({payload:u,path:r.derivationPath,key_version:0}))),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:o});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(e){return {success:false,errorMessage:e instanceof Error?e.message:String(e)}}},Ae=async(r,t)=>{try{let e=await I({networkId:r.nearAuthentication.networkId,accountId:r.nearAuthentication.accountId,keypair:t}),n=new T({networkId:r.nearAuthentication.networkId,contractId:r.chainConfig.contract,accountId:e.accountId,keypair:t}),a=new M.Cosmos({contract:n,chainId:r.chainConfig.chainId}),{transaction:i,hashesToSign:s}=await a.prepareTransactionForSigning(r.transaction),o=await Promise.all(s.map(async u=>await n.sign({payload:u,path:r.derivationPath,key_version:0}))),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:o});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(e){return console.error(e),{success:false,errorMessage:e instanceof Error?e.message:String(e)}}};var ve={transaction:ut,signAndSend:yt};var ht={};y(ht,{ChainSignatureContract:()=>ft,utils:()=>Ue});var lt={};y(lt,{abi:()=>A});var A=[{inputs:[{internalType:"address",name:"_mpc_network",type:"address"},{internalType:"uint256",name:"_signatureDeposit",type:"uint256"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"AccessControlBadConfirmation",type:"error"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"bytes32",name:"neededRole",type:"bytes32"}],name:"AccessControlUnauthorizedAccount",type:"error"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"bytes32",name:"previousAdminRole",type:"bytes32"},{indexed:true,internalType:"bytes32",name:"newAdminRole",type:"bytes32"}],name:"RoleAdminChanged",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"address",name:"account",type:"address"},{indexed:true,internalType:"address",name:"sender",type:"address"}],name:"RoleGranted",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"address",name:"account",type:"address"},{indexed:true,internalType:"address",name:"sender",type:"address"}],name:"RoleRevoked",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"requestId",type:"bytes32"},{indexed:false,internalType:"address",name:"responder",type:"address"},{indexed:false,internalType:"string",name:"error",type:"string"}],name:"SignatureError",type:"event"},{anonymous:false,inputs:[{indexed:false,internalType:"address",name:"sender",type:"address"},{indexed:false,internalType:"bytes32",name:"payload",type:"bytes32"},{indexed:false,internalType:"uint32",name:"keyVersion",type:"uint32"},{indexed:false,internalType:"uint256",name:"deposit",type:"uint256"},{indexed:false,internalType:"uint256",name:"chainId",type:"uint256"},{indexed:false,internalType:"string",name:"path",type:"string"},{indexed:false,internalType:"string",name:"algo",type:"string"},{indexed:false,internalType:"string",name:"dest",type:"string"},{indexed:false,internalType:"string",name:"params",type:"string"}],name:"SignatureRequested",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"requestId",type:"bytes32"},{indexed:false,internalType:"address",name:"responder",type:"address"},{components:[{components:[{internalType:"uint256",name:"x",type:"uint256"},{internalType:"uint256",name:"y",type:"uint256"}],internalType:"struct ChainSignatures.AffinePoint",name:"bigR",type:"tuple"},{internalType:"uint256",name:"s",type:"uint256"},{internalType:"uint8",name:"recoveryId",type:"uint8"}],indexed:false,internalType:"struct ChainSignatures.Signature",name:"signature",type:"tuple"}],name:"SignatureResponded",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"address",name:"owner",type:"address"},{indexed:false,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[],name:"DEFAULT_ADMIN_ROLE",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"}],name:"getRoleAdmin",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"getSignatureDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"grantRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"hasRole",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"callerConfirmation",type:"address"}],name:"renounceRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"requestId",type:"bytes32"},{components:[{components:[{internalType:"uint256",name:"x",type:"uint256"},{internalType:"uint256",name:"y",type:"uint256"}],internalType:"struct ChainSignatures.AffinePoint",name:"bigR",type:"tuple"},{internalType:"uint256",name:"s",type:"uint256"},{internalType:"uint8",name:"recoveryId",type:"uint8"}],internalType:"struct ChainSignatures.Signature",name:"signature",type:"tuple"}],internalType:"struct ChainSignatures.Response[]",name:"_responses",type:"tuple[]"}],name:"respond",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"requestId",type:"bytes32"},{internalType:"string",name:"errorMessage",type:"string"}],internalType:"struct ChainSignatures.ErrorResponse[]",name:"_errors",type:"tuple[]"}],name:"respondError",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"revokeRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"setSignatureDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"payload",type:"bytes32"},{internalType:"string",name:"path",type:"string"},{internalType:"uint32",name:"keyVersion",type:"uint32"},{internalType:"string",name:"algo",type:"string"},{internalType:"string",name:"dest",type:"string"},{internalType:"string",name:"params",type:"string"}],internalType:"struct ChainSignatures.SignRequest",name:"_request",type:"tuple"}],name:"sign",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_receiver",type:"address"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"}];var gt={};y(gt,{ChainSignatureError:()=>R,SignatureContractError:()=>K,SignatureNotFoundError:()=>B,SigningError:()=>F});var R=class extends Error{constructor(t,e,n){super(t),this.name="ChainSignatureError",this.requestId=e,this.receipt=n;}},B=class extends R{constructor(t,e){super("Signature not found after maximum retries",t,e),this.name="SignatureNotFoundError";}},K=class extends R{constructor(t,e,n){super(`Signature error: ${t}`,e,n),this.name="SignatureContractError",this.errorCode=t;}},F=class extends R{constructor(t,e,n){super("Error signing request",t,e),this.name="SigningError",this.originalError=n;}};var kt=r=>{let t=encodeAbiParameters([{type:"address"},{type:"bytes"},{type:"string"},{type:"uint32"},{type:"uint256"},{type:"string"},{type:"string"},{type:"string"}],[r.address,r.payload,r.path,Number(r.keyVersion),r.chainId,r.algo,r.dest,r.params]);return keccak256(t)};var ft=class extends w{constructor(t){super(),this.publicClient=t.publicClient,this.walletClient=t.walletClient,this.contractAddress=t.contractAddress;let e=t.rootPublicKey||Z(this.contractAddress,g.ETHEREUM);if(!e)throw new Error("Invalid public key, please provide a valid root public key or contract address");this.rootPublicKey=e;}async getCurrentSignatureDeposit(){let t=await this.publicClient.readContract({address:this.contractAddress,abi:A,functionName:"getSignatureDeposit"});return new oe(t.toString())}async getDerivedPublicKey(t){return m.deriveChildPublicKey(await this.getPublicKey(),t.predecessor.toLowerCase(),t.path,b.ETHEREUM)}async getPublicKey(){return x(this.rootPublicKey)}async getLatestKeyVersion(){let t=await this.publicClient.readContract({address:this.contractAddress,abi:A,functionName:"latestKeyVersion"});return Number(t)}async sign(t,e={sign:{algo:"",dest:"",params:""},retry:{delay:5e3,retryCount:12}}){if(!this.walletClient.account?.sign)throw new Error("Wallet client signer required for signing operations");let n=await this.getSignRequestParams(t,e.sign),a=this.getRequestId(t,e.sign),i=await this.walletClient.sendTransaction({account:this.walletClient.account,to:n.target,data:n.data,value:n.value,chain:this.walletClient.chain}),s=await this.publicClient.waitForTransactionReceipt({hash:i});try{let o=await this.pollForRequestId({requestId:a,payload:t.payload,path:t.path,fromBlock:s.blockNumber,options:e.retry});if(!o)throw new B(a,s);if(o.hasOwnProperty("error"))throw new K(o.error,a,s);return o}catch(o){throw o instanceof B||o instanceof K?o:new F(a,s,o instanceof Error?o:void 0)}}async pollForRequestId({requestId:t,payload:e,path:n,fromBlock:a,options:i}){let s=i?.delay??5e3,o=i?.retryCount??12,c=await withRetry(async()=>{let p=await this.getSignatureFromEvents(t,a);if(p){let u=concat([padHex(`0x${p.r}`,{size:32}),padHex(`0x${p.s}`,{size:32}),`0x${p.v.toString(16)}`]),d=await recoverAddress({hash:new Uint8Array(e),signature:u}),S=new D.evm.EVM({publicClient:this.publicClient,contract:this}),{address:f}=await S.deriveAddressAndPublicKey(this.walletClient.account?.address,n);if(d.toLowerCase()!==f.toLowerCase())throw new Error("Signature not found yet");return p}else throw new Error("Signature not found yet")},{delay:s,retryCount:o,shouldRetry:({count:p,error:u})=>(console.log(`Retrying get signature: ${p}/${o}`),u.message==="Signature not found yet")});return c||this.getErrorFromEvents(t,a)}async getSignRequestParams(t,e={algo:"",dest:"",params:""}){let n={payload:`0x${Buffer.from(t.payload).toString("hex")}`,path:t.path,keyVersion:t.key_version,algo:e.algo??"",dest:e.dest??"",params:e.params??""};return {target:this.contractAddress,data:encodeFunctionData({abi:A,functionName:"sign",args:[n]}),value:BigInt((await this.getCurrentSignatureDeposit()).toString())}}getRequestId(t,e={algo:"",dest:"",params:""}){if(!this.walletClient.account)throw new Error("Wallet client account required to compute requestId");return kt({payload:`0x${Buffer.from(t.payload).toString("hex")}`,path:t.path,keyVersion:t.key_version,algo:e.algo??"",dest:e.dest??"",params:e.params??"",address:this.walletClient.account.address,chainId:this.publicClient.chain?.id?BigInt(this.publicClient.chain.id):0n})}async getErrorFromEvents(t,e){let n=await this.publicClient.getContractEvents({address:this.contractAddress,abi:A,eventName:"SignatureError",args:{requestId:t},fromBlock:e,toBlock:"latest"});if(n.length>0){let{args:a}=n[n.length-1];return a}}async getSignatureFromEvents(t,e){let n=await this.publicClient.getContractEvents({address:this.contractAddress,abi:A,eventName:"SignatureResponded",args:{requestId:t},fromBlock:e,toBlock:"latest"});if(n.length>0){let{args:a}=n[n.length-1];return m.toRSV(a.signature)}}};var Ue={ChainSignaturesContractABI:lt,errors:gt};
|
|
2
|
-
export{
|
|
1
|
+
import {base58}from'@scure/base';import {ec}from'elliptic';import {sha3_256}from'js-sha3';import {keccak256,concatHex,numberToHex,getAddress,serializeTransaction,parseTransaction,toBytes,hashMessage,hashTypedData,encodeAbiParameters,hexToBigInt,concat,pad,isAddress,withRetry,createPublicClient,http,padHex,recoverAddress,encodeFunctionData,parseAbiParameters}from'viem';import*as P from'bitcoinjs-lib';import it from'coinselect';import {encodeSecp256k1Pubkey}from'@cosmjs/amino';import {sha256,ripemd160}from'@cosmjs/crypto';import {fromHex,toBase64,fromBase64}from'@cosmjs/encoding';import {Registry,encodePubkey,makeAuthInfoBytes,makeSignDoc,makeSignBytes}from'@cosmjs/proto-signing';import {calculateFee,GasPrice,StargateClient}from'@cosmjs/stargate';import {bech32}from'bech32';import {SignMode}from'cosmjs-types/cosmos/tx/signing/v1beta1/signing';import {TxRaw}from'cosmjs-types/cosmos/tx/v1beta1/tx';import {chains,assets}from'chain-registry';import {Contract,Connection,Account}from'@near-js/accounts';import {KeyPair}from'@near-js/crypto';import {InMemoryKeyStore}from'@near-js/keystores';import Tt from'bn.js';import {actionCreators}from'@near-js/transactions';import {connect,utils,transactions}from'near-api-js';import {getTransactionLastResult}from'near-api-js/lib/providers';import'viem/chains';import {Program}from'@coral-xyz/anchor';import {PublicKey}from'@solana/web3.js';var Xe=Object.defineProperty;var m=(n,e)=>{for(var t in e)Xe(n,t,{get:e[t],enumerable:true});};var Re={};m(Re,{CHAINS:()=>g,CONTRACT_ADDRESSES:()=>ce,ENVS:()=>h,KDF_CHAIN_IDS:()=>f,ROOT_PUBLIC_KEYS:()=>oe});var h={TESTNET_DEV:"TESTNET_DEV",TESTNET:"TESTNET",MAINNET:"MAINNET",SOLANA_STUB:"SOLANA_STUB"},g={ETHEREUM:"ETHEREUM",NEAR:"NEAR",SOLANA:"SOLANA"},oe={[h.TESTNET_DEV]:"secp256k1:54hU5wcCmVUPFWLDALXMh1fFToZsVXrx9BbTbHzSfQq1Kd1rJZi52iPa4QQxo6s5TgjWqgpY8HamYuUDzG6fAaUq",[h.TESTNET]:"secp256k1:3Ww8iFjqTHufye5aRGUvrQqETegR4gVUcW8FX5xzscaN9ENhpkffojsxJwi6N1RbbHMTxYa9UyKeqK3fsMuwxjR5",[h.MAINNET]:"secp256k1:4tY4qMzusmgX5wYdG35663Y3Qar3CTbpApotwk9ZKLoF79XA4DjG8XoByaKdNHKQX9Lz5hd7iJqsWdTKyA7dKa6Z",[h.SOLANA_STUB]:"secp256k1:2aXyFojLFqE4jtWTVwyGRrJoik8UfBCx2AU7VALhDPAnNjnGYEtwHgiaHxu8S5tvbLnzSoojQAGeJcxz9YHa32cs"},f={[g.ETHEREUM]:"0x1",[g.NEAR]:"0x18d",[g.SOLANA]:"0x800001f5"},ce={[g.NEAR]:{[h.TESTNET_DEV]:"dev.sig-net.testnet",[h.TESTNET]:"v1.sig-net.testnet",[h.MAINNET]:"v1.sig-net.near"},[g.ETHEREUM]:{[h.TESTNET_DEV]:"0x69C6b28Fdc74618817fa380De29a653060e14009",[h.TESTNET]:"0x83458E8Bf8206131Fe5c05127007FA164c0948A2",[h.MAINNET]:"0xf8bdC0612361a1E49a8E01423d4C0cFc5dF4791A"},[g.SOLANA]:{[h.SOLANA_STUB]:"4uvZW8K4g4jBg7dzPNbb9XDxJLFBK7V6iC76uofmYvEU"}};var ke={};m(ke,{cryptography:()=>y});var y={};m(y,{compressPubKey:()=>Ze,deriveChildPublicKey:()=>et,najToUncompressedPubKeySEC1:()=>w,toRSV:()=>Qe});var Qe=n=>{if("big_r"in n&&typeof n.big_r=="object"&&"affine_point"in n.big_r&&"s"in n&&typeof n.s=="object"&&"scalar"in n.s)return {r:n.big_r.affine_point.substring(2),s:n.s.scalar,v:n.recovery_id+27};if("big_r"in n&&typeof n.big_r=="string"&&"s"in n&&typeof n.s=="string")return {r:n.big_r.substring(2),s:n.s,v:n.recovery_id+27};if("bigR"in n&&"x"in n.bigR&&"s"in n&&typeof n.s=="bigint")return {r:n.bigR.x.toString(16).padStart(64,"0"),s:n.s.toString(16).padStart(64,"0"),v:n.recoveryId+27};throw new Error("Invalid signature format")},Ze=n=>{let e=n.slice(2);if(e.length!==128)throw new Error("Invalid uncompressed public key length");let t=e.slice(0,64),r=e.slice(64);return (parseInt(r.slice(-1),16)%2===0?"02":"03")+t},w=n=>{let e=base58.decode(n.split(":")[1]);return `04${Buffer.from(e).toString("hex")}`};function et(n,e,t="",r){let a=new ec("secp256k1"),o=`sig.network v1.0.0 epsilon derivation,${r},${e},${t}`,s="";if(r===f.ETHEREUM)s=keccak256(Buffer.from(o)).slice(2);else if(r===f.NEAR)s=sha3_256(o);else if(r===f.SOLANA)s=keccak256(Buffer.from(o)).slice(2);else throw new Error("Invalid chain ID");let c=n.substring(2,66),p=n.substring(66),u=a.curve.point(c,p),d=a.g.mul(s),b=u.add(d),l=b.getX().toString("hex").padStart(64,"0"),E=b.getY().toString("hex").padStart(64,"0");return `04${l}${E}`}var A={};m(A,{ChainAdapter:()=>S,btc:()=>O,cosmos:()=>$,evm:()=>H});var S=class{};var H={};m(H,{EVM:()=>J,fetchEVMFeeProperties:()=>X});async function X(n,e){let[t,r]=await Promise.all([n.estimateGas(e),n.estimateFeesPerGas()]),a=r.maxFeePerGas??BigInt(1e10),i=r.maxPriorityFeePerGas??BigInt(1e10);return {gas:t,maxFeePerGas:a,maxPriorityFeePerGas:i}}var J=class extends S{constructor({publicClient:e,contract:t}){super(),this.contract=t,this.client=e;}async attachGasAndNonce(e){let t=await X(this.client,e),r=await this.client.getTransactionCount({address:e.from}),{from:a,...i}=e;return {...t,nonce:r,chainId:Number(await this.client.getChainId()),type:"eip1559",...i}}transformRSVSignature(e){return {r:`0x${e.r}`,s:`0x${e.s}`,yParity:e.v-27}}assembleSignature(e){let{r:t,s:r,yParity:a}=this.transformRSVSignature(e);if(a===void 0)throw new Error("Missing yParity");return concatHex([t,r,numberToHex(a+27,{size:1})])}async deriveAddressAndPublicKey(e,t){let r=await this.contract.getDerivedPublicKey({path:t,predecessor:e});if(!r)throw new Error("Failed to get derived public key");let a=r.startsWith("04")?r.slice(2):r,i=keccak256(Buffer.from(a,"hex"));return {address:getAddress(`0x${i.slice(-40)}`),publicKey:r}}async getBalance(e){return {balance:await this.client.getBalance({address:e}),decimals:18}}serializeTransaction(e){return serializeTransaction(e)}deserializeTransaction(e){return parseTransaction(e)}async prepareTransactionForSigning(e){let t=await this.attachGasAndNonce(e),r=serializeTransaction(t),a=toBytes(keccak256(r));return {transaction:t,hashesToSign:[Array.from(a)]}}async prepareMessageForSigning(e){return {hashToSign:Array.from(toBytes(hashMessage(e)))}}async prepareTypedDataForSigning(e){return {hashToSign:Array.from(toBytes(hashTypedData(e)))}}async prepareUserOpForSigning(e,t,r){let a=r??await this.client.getChainId(),i=t||"0x0000000071727De22E5E9d8BAf0edAc6f37da032",o=encodeAbiParameters([{type:"bytes32"},{type:"address"},{type:"uint256"}],[keccak256(encodeAbiParameters([{type:"address"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"},{type:"bytes32"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"}],[e.sender,hexToBigInt(e.nonce),keccak256("factory"in e&&"factoryData"in e&&e.factory&&e.factoryData?concat([e.factory,e.factoryData]):"initCode"in e?e.initCode:"0x"),keccak256(e.callData),concat([pad(e.verificationGasLimit,{size:16}),pad(e.callGasLimit,{size:16})]),hexToBigInt(e.preVerificationGas),concat([pad(e.maxPriorityFeePerGas,{size:16}),pad(e.maxFeePerGas,{size:16})]),keccak256("paymaster"in e&&e.paymaster&&isAddress(e.paymaster)?concat([e.paymaster,pad(e.paymasterVerificationGasLimit,{size:16}),pad(e.paymasterPostOpGasLimit,{size:16}),e.paymasterData]):"paymasterAndData"in e?e.paymasterAndData:"0x")])),i,BigInt(a)]),s=keccak256(o);return {userOp:e,hashToSign:Array.from(toBytes(hashMessage({raw:s})))}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){let r=this.transformRSVSignature(t[0]);return serializeTransaction(e,r)}finalizeMessageSigning({rsvSignature:e}){return this.assembleSignature(e)}finalizeTypedDataSigning({rsvSignature:e}){return this.assembleSignature(e)}finalizeUserOpSigning({userOp:e,rsvSignature:t}){let{r,s:a,yParity:i}=this.transformRSVSignature(t);if(i===void 0)throw new Error("Missing yParity");return {...e,signature:concatHex(["0x00",r,a,numberToHex(Number(i+27),{size:1})])}}async broadcastTx(e){try{return await this.client.sendRawTransaction({serializedTransaction:e})}catch(t){throw console.error("Transaction broadcast failed:",t),new Error("Failed to broadcast transaction.")}}};var O={};m(O,{BTCRpcAdapter:()=>I,BTCRpcAdapters:()=>ee,Bitcoin:()=>Z});function ue(n){switch(n.toLowerCase()){case "mainnet":return P.networks.bitcoin;case "testnet":return P.networks.testnet;case "regtest":return P.networks.regtest;default:throw new Error(`Unknown Bitcoin network: ${n}`)}}var Z=class n extends S{static{this.SATOSHIS_PER_BTC=1e8;}constructor({network:e,contract:t,btcRpcAdapter:r}){super(),this.network=e,this.btcRpcAdapter=r,this.contract=t;}static toBTC(e){return e/n.SATOSHIS_PER_BTC}static toSatoshi(e){return Math.round(e*n.SATOSHIS_PER_BTC)}async fetchTransaction(e){let t=await this.btcRpcAdapter.getTransaction(e),r=new P.Transaction;return t.vout.forEach(a=>{let i=Buffer.from(a.scriptpubkey,"hex");r.addOutput(i,Number(a.value));}),r}static transformRSVSignature(e){let t=e.r.padStart(64,"0"),r=e.s.padStart(64,"0"),a=Buffer.from(t+r,"hex");if(a.length!==64)throw new Error("Invalid signature length.");return a}async createPSBT({transactionRequest:e}){let{inputs:t,outputs:r}=e.inputs&&e.outputs?e:await this.btcRpcAdapter.selectUTXOs(e.from,[{address:e.to,value:parseFloat(e.value)}]),a=new P.Psbt({network:ue(this.network)});return await Promise.all(t.map(async i=>{if(!i.scriptPubKey){let s=(await this.fetchTransaction(i.txid)).outs[i.vout];i.scriptPubKey=s.script;}a.addInput({hash:i.txid,index:i.vout,witnessUtxo:{script:i.scriptPubKey,value:i.value}});})),r.forEach(i=>{"address"in i?a.addOutput({address:i.address,value:i.value}):"script"in i?a.addOutput({script:i.script,value:i.value}):e.from!==void 0&&a.addOutput({value:Number(i.value),address:e.from});}),a}async getBalance(e){return {balance:BigInt(await this.btcRpcAdapter.getBalance(e)),decimals:8}}async deriveAddressAndPublicKey(e,t){let r=await this.contract.getDerivedPublicKey({path:t,predecessor:e});if(!r)throw new Error("Failed to get derived public key");let a=y.compressPubKey(r),i=Buffer.from(a,"hex"),o=ue(this.network),s=P.payments.p2wpkh({pubkey:i,network:o}),{address:c}=s;if(!c)throw new Error("Failed to generate Bitcoin address");return {address:c,publicKey:a}}serializeTransaction(e){return JSON.stringify({psbt:e.psbt.toHex(),publicKey:e.publicKey})}deserializeTransaction(e){let t=JSON.parse(e);return {psbt:P.Psbt.fromHex(t.psbt),publicKey:t.publicKey}}async prepareTransactionForSigning(e){let t=Buffer.from(e.publicKey,"hex"),r=await this.createPSBT({transactionRequest:e}),a=r.toHex(),i=[],o=s=>({publicKey:t,sign:c=>(i[s]=Array.from(c),Buffer.alloc(64))});for(let s=0;s<r.inputCount;s++)r.signInput(s,o(s));return {transaction:{psbt:P.Psbt.fromHex(a),publicKey:e.publicKey},hashesToSign:i}}finalizeTransactionSigning({transaction:{psbt:e,publicKey:t},rsvSignatures:r}){let a=Buffer.from(t,"hex"),i=o=>({publicKey:a,sign:()=>{let s=r[o];return n.transformRSVSignature(s)}});for(let o=0;o<e.inputCount;o++)e.signInput(o,i(o));return e.finalizeAllInputs(),e.extractTransaction().toHex()}async broadcastTx(e){return await this.btcRpcAdapter.broadcastTransaction(e)}};var I=class{};var F=class extends I{constructor(e){super(),this.providerUrl=e;}async fetchFeeRate(e=6){let r=await(await fetch(`${this.providerUrl}/v1/fees/recommended`)).json();return e<=1?r.fastestFee:e<=3?r.halfHourFee:e<=6?r.hourFee:r.economyFee}async fetchUTXOs(e){try{return await(await fetch(`${this.providerUrl}/address/${e}/utxo`)).json()}catch(t){return console.error("Failed to fetch UTXOs:",t),[]}}async selectUTXOs(e,t,r=6){let a=await this.fetchUTXOs(e),i=await this.fetchFeeRate(r),o=it(a,t,Math.ceil(i+1));if(!o.inputs||!o.outputs)throw new Error("Invalid transaction: coinselect failed to find a suitable set of inputs and outputs. This could be due to insufficient funds, or no inputs being available that meet the criteria.");return {inputs:o.inputs,outputs:o.outputs}}async broadcastTransaction(e){let t=await fetch(`${this.providerUrl}/tx`,{method:"POST",body:e});if(t.ok)return await t.text();throw new Error(`Failed to broadcast transaction: ${await t.text()}`)}async getBalance(e){let r=await(await fetch(`${this.providerUrl}/address/${e}`)).json();return r.chain_stats.funded_txo_sum-r.chain_stats.spent_txo_sum}async getTransaction(e){return await(await fetch(`${this.providerUrl}/tx/${e}`)).json()}};var ee={Mempool:F};var $={};m($,{Cosmos:()=>re});var De=async n=>{let e=chains.find(d=>d.chain_id===n);if(!e)throw new Error(`Chain info not found for chainId: ${n}`);let{bech32_prefix:t,chain_id:r}=e,a=e.staking?.staking_tokens?.[0]?.denom,i=e.apis?.rpc?.[0]?.address,o=e.apis?.rest?.[0]?.address,s=e.fees?.fee_tokens?.[0]?.average_gas_price;if(!t||!a||!i||!o||!r||s===void 0)throw new Error(`Missing required chain information for ${e.chain_name}`);let p=assets.find(d=>d.chain_name===e.chain_name)?.assets.find(d=>d.base===a),u=p?.denom_units.find(d=>d.denom===p.display)?.exponent;if(u===void 0)throw new Error(`Could not find decimals for ${a} on chain ${e.chain_name}`);return {prefix:t,denom:a,rpcUrl:i,restUrl:o,expectedChainId:r,gasPrice:s,decimals:u}};var re=class extends S{constructor({chainId:e,contract:t,endpoints:r}){super(),this.contract=t,this.registry=new Registry,this.chainId=e,this.endpoints=r;}transformRSVSignature(e){return new Uint8Array([...fromHex(e.r),...fromHex(e.s)])}async getChainInfo(){return {...await De(this.chainId),...this.endpoints}}async getBalance(e){try{let{restUrl:t,denom:r,decimals:a}=await this.getChainInfo(),i=await fetch(`${t}/cosmos/bank/v1beta1/balances/${e}`);if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);let c=(await i.json()).balances.find(p=>p.denom===r)?.amount??"0";return {balance:BigInt(c),decimals:a}}catch(t){throw console.error("Failed to fetch Cosmos balance:",t),new Error("Failed to fetch Cosmos balance")}}async deriveAddressAndPublicKey(e,t){let{prefix:r}=await this.getChainInfo(),a=await this.contract.getDerivedPublicKey({path:t,predecessor:e});if(!a)throw new Error("Failed to get derived public key");let i=y.compressPubKey(a),o=sha256(fromHex(i)),s=ripemd160(o);return {address:bech32.encode(r,bech32.toWords(s)),publicKey:i}}serializeTransaction(e){let t=TxRaw.encode(e).finish();return toBase64(t)}deserializeTransaction(e){return TxRaw.decode(fromBase64(e))}async prepareTransactionForSigning(e){let{denom:t,rpcUrl:r,gasPrice:a}=await this.getChainInfo(),i=fromHex(e.publicKey),o=e.gas||2e5,s=calculateFee(o,GasPrice.fromString(`${a}${t}`)),p=await(await StargateClient.connect(r)).getAccount(e.address);if(!p)throw new Error(`Account ${e.address} does not exist on chain`);let{accountNumber:u,sequence:d}=p,b={typeUrl:"/cosmos.tx.v1beta1.TxBody",value:{messages:e.messages,memo:e.memo||""}},l=this.registry.encode(b),E=encodePubkey(encodeSecp256k1Pubkey(i)),M=makeAuthInfoBytes([{pubkey:E,sequence:d}],s.amount,Number(s.gas),void 0,void 0,SignMode.SIGN_MODE_DIRECT),ie=makeSignDoc(l,M,this.chainId,u),se=makeSignBytes(ie),G=Array.from(sha256(se));return {transaction:TxRaw.fromPartial({bodyBytes:l,authInfoBytes:M,signatures:[]}),hashesToSign:[G]}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){e.signatures=t.map(a=>this.transformRSVSignature(a));let r=TxRaw.encode(e).finish();return Buffer.from(r).toString("hex")}async broadcastTx(e){try{let{rpcUrl:t}=await this.getChainInfo(),r=await StargateClient.connect(t),a=fromHex(e),i=await r.broadcastTx(a);if(i.code!==0)throw new Error(`Broadcast error: ${i.rawLog}`);return i.transactionHash}catch(t){throw console.error("Transaction broadcast failed:",t),new Error("Failed to broadcast transaction.")}}};var Ge={};m(Ge,{ChainSignatureContract:()=>T,evm:()=>we,near:()=>fe,solana:()=>Ie});var de=class{},T=class extends de{};var fe={};m(fe,{ChainSignatureContract:()=>C,utils:()=>Ft});var he={};m(he,{keypair:()=>le});var le={};m(le,{BTCTransaction:()=>Mt,CosmosTransaction:()=>Ht,EVMTransaction:()=>Dt});var ne=new Tt("300000000000000"),L="dontcare";var k=async({networkId:n,accountId:e=L,keypair:t=KeyPair.fromRandom("ed25519")})=>{let r=new InMemoryKeyStore;await r.setKey(n,e,t);let a=Connection.fromConfig({networkId:n,provider:{type:"JsonRpcProvider",args:{url:{testnet:"https://rpc.testnet.near.org",mainnet:"https://rpc.mainnet.near.org"}[n]}},signer:{type:"InMemorySigner",keyStore:r}});return new Account(a,e)};var _=(n,e)=>{let t=Object.entries(ce[e]).find(([r,a])=>a.toLowerCase()===n.toLowerCase())?.[0];if(t)return oe[t]};var ge={};m(ge,{mpcPayloadsToChainSigTransaction:()=>Kt,responseToMpcSignature:()=>me,sendTransactionUntil:()=>ye});var Kt=async({networkId:n,contractId:e,hashesToSign:t,path:r})=>{let i=await new C({networkId:n,contractId:e}).getCurrentSignatureDeposit();return {receiverId:e,actions:t.map(o=>({type:"FunctionCall",params:{methodName:"sign",args:{request:{payload:Array.from(o),path:r,key_version:0}},gas:ne.div(new Tt(t.length)).toString(),deposit:i?.toString()||"1"}}))}},me=({response:n})=>{let e=getTransactionLastResult(n);if(e)return y.toRSV(e)},ye=async({accountId:n,keypair:e,networkId:t,receiverId:r,actions:a,nonce:i,options:o={until:"EXECUTED_OPTIMISTIC",retryCount:3,delay:5e3,nodeUrl:t==="testnet"?"https://test.rpc.fastnear.com":"https://free.rpc.fastnear.com"}})=>{let s=new InMemoryKeyStore;await s.setKey(t,n,e);let c=await connect({networkId:t,keyStore:s,nodeUrl:o.nodeUrl}),{signer:p}=c.connection,u=await p.getPublicKey(n,c.connection.networkId),d=await c.connection.provider.query(`access_key/${n}/${u.toString()}`,""),b=utils.serialize.base_decode(d.block_hash),l=transactions.createTransaction(n,u,r,i??++d.nonce,a,b),E=utils.serialize.serialize(transactions.SCHEMA.Transaction,l),M=await p.signMessage(E,n,c.connection.networkId),ie=new transactions.SignedTransaction({transaction:l,signature:new transactions.Signature({keyType:l.publicKey.keyType,data:M.signature})}),{transaction:se}=await c.connection.provider.sendTransactionUntil(ie,"INCLUDED_FINAL"),G=se.hash;if(!G)throw new Error("No transaction hash found");return await withRetry(async()=>{let Ae=await c.connection.provider.txStatus(G,n,o.until);if(Ae)return Ae;throw new Error("Transaction not found")},{retryCount:o.retryCount,delay:o.delay})};var C=class extends T{constructor({networkId:e,contractId:t,accountId:r=L,keypair:a=KeyPair.fromRandom("ed25519"),rootPublicKey:i,sendTransactionOptions:o}){super(),this.networkId=e,this.contractId=t,this.accountId=r,this.keypair=a,this.sendTransactionOptions=o,this.rootPublicKey=i||_(this.contractId,g.NEAR);}async getContract(){let e=await k({networkId:this.networkId,accountId:this.accountId,keypair:this.keypair});return new Contract(e,this.contractId,{viewMethods:["public_key","experimental_signature_deposit","derived_public_key"],changeMethods:[],useLocalViewExecution:false})}async getCurrentSignatureDeposit(){let e=await this.getContract();return new Tt((await e.experimental_signature_deposit()).toLocaleString("fullwide",{useGrouping:false}))}async getDerivedPublicKey(e){if(this.rootPublicKey)return y.deriveChildPublicKey(await this.getPublicKey(),e.predecessor.toLowerCase(),e.path,f.NEAR);{let r=await(await this.getContract()).derived_public_key(e);return w(r)}}async getPublicKey(){if(this.rootPublicKey)return w(this.rootPublicKey);{let t=await(await this.getContract()).public_key();return w(t)}}async sign(e,t){this.requireAccount();let r=await this.getCurrentSignatureDeposit(),a=await ye({accountId:this.accountId,keypair:this.keypair,networkId:this.networkId,receiverId:this.contractId,actions:[actionCreators.functionCall("sign",{request:e},BigInt(ne.toString()),BigInt(r.toString()))],nonce:t?.nonce,options:this.sendTransactionOptions}),i=me({response:a});if(!i)throw new Error("Transaction failed");return i}requireAccount(){if(this.accountId===L)throw new Error("A valid account ID and keypair are required for change methods. Please instantiate a new contract with valid credentials.")}};var Dt=async(n,e)=>{try{let t=await k({networkId:n.nearAuthentication.networkId,accountId:n.nearAuthentication.accountId,keypair:e}),r=new C({networkId:n.nearAuthentication.networkId,contractId:n.chainConfig.contract,accountId:t.accountId,keypair:e}),a=new H.EVM({publicClient:createPublicClient({transport:http(n.chainConfig.providerUrl)}),contract:r}),{transaction:i,hashesToSign:o}=await a.prepareTransactionForSigning(n.transaction),s=await r.sign({payload:o[0],path:n.derivationPath,key_version:0}),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:[s]});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(t){return console.error(t),{success:false,errorMessage:t instanceof Error?t.message:String(t)}}},Mt=async(n,e)=>{try{let t=await k({networkId:n.nearAuthentication.networkId,accountId:n.nearAuthentication.accountId,keypair:e}),r=new C({networkId:n.nearAuthentication.networkId,contractId:n.chainConfig.contract,accountId:t.accountId,keypair:e}),a=new O.Bitcoin({btcRpcAdapter:new ee.Mempool(n.chainConfig.providerUrl),contract:r,network:n.chainConfig.network}),{transaction:i,hashesToSign:o}=await a.prepareTransactionForSigning(n.transaction),s=await Promise.all(o.map(async u=>await r.sign({payload:u,path:n.derivationPath,key_version:0}))),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:s});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(t){return {success:false,errorMessage:t instanceof Error?t.message:String(t)}}},Ht=async(n,e)=>{try{let t=await k({networkId:n.nearAuthentication.networkId,accountId:n.nearAuthentication.accountId,keypair:e}),r=new C({networkId:n.nearAuthentication.networkId,contractId:n.chainConfig.contract,accountId:t.accountId,keypair:e}),a=new $.Cosmos({contract:r,chainId:n.chainConfig.chainId}),{transaction:i,hashesToSign:o}=await a.prepareTransactionForSigning(n.transaction),s=await Promise.all(o.map(async u=>await r.sign({payload:u,path:n.derivationPath,key_version:0}))),c=a.finalizeTransactionSigning({transaction:i,rsvSignatures:s});return {transactionHash:await a.broadcastTx(c),success:!0}}catch(t){return console.error(t),{success:false,errorMessage:t instanceof Error?t.message:String(t)}}};var Ft={transaction:ge,signAndSend:he};var we={};m(we,{ChainSignatureContract:()=>Te,utils:()=>Xt});var be={};m(be,{abi:()=>R});var R=[{inputs:[{internalType:"address",name:"_mpc_network",type:"address"},{internalType:"uint256",name:"_signatureDeposit",type:"uint256"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"AccessControlBadConfirmation",type:"error"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"bytes32",name:"neededRole",type:"bytes32"}],name:"AccessControlUnauthorizedAccount",type:"error"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"bytes32",name:"previousAdminRole",type:"bytes32"},{indexed:true,internalType:"bytes32",name:"newAdminRole",type:"bytes32"}],name:"RoleAdminChanged",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"address",name:"account",type:"address"},{indexed:true,internalType:"address",name:"sender",type:"address"}],name:"RoleGranted",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"role",type:"bytes32"},{indexed:true,internalType:"address",name:"account",type:"address"},{indexed:true,internalType:"address",name:"sender",type:"address"}],name:"RoleRevoked",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"requestId",type:"bytes32"},{indexed:false,internalType:"address",name:"responder",type:"address"},{indexed:false,internalType:"string",name:"error",type:"string"}],name:"SignatureError",type:"event"},{anonymous:false,inputs:[{indexed:false,internalType:"address",name:"sender",type:"address"},{indexed:false,internalType:"bytes32",name:"payload",type:"bytes32"},{indexed:false,internalType:"uint32",name:"keyVersion",type:"uint32"},{indexed:false,internalType:"uint256",name:"deposit",type:"uint256"},{indexed:false,internalType:"uint256",name:"chainId",type:"uint256"},{indexed:false,internalType:"string",name:"path",type:"string"},{indexed:false,internalType:"string",name:"algo",type:"string"},{indexed:false,internalType:"string",name:"dest",type:"string"},{indexed:false,internalType:"string",name:"params",type:"string"}],name:"SignatureRequested",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"bytes32",name:"requestId",type:"bytes32"},{indexed:false,internalType:"address",name:"responder",type:"address"},{components:[{components:[{internalType:"uint256",name:"x",type:"uint256"},{internalType:"uint256",name:"y",type:"uint256"}],internalType:"struct ChainSignatures.AffinePoint",name:"bigR",type:"tuple"},{internalType:"uint256",name:"s",type:"uint256"},{internalType:"uint8",name:"recoveryId",type:"uint8"}],indexed:false,internalType:"struct ChainSignatures.Signature",name:"signature",type:"tuple"}],name:"SignatureResponded",type:"event"},{anonymous:false,inputs:[{indexed:true,internalType:"address",name:"owner",type:"address"},{indexed:false,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{inputs:[],name:"DEFAULT_ADMIN_ROLE",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"}],name:"getRoleAdmin",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"getSignatureDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"grantRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"hasRole",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"callerConfirmation",type:"address"}],name:"renounceRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"requestId",type:"bytes32"},{components:[{components:[{internalType:"uint256",name:"x",type:"uint256"},{internalType:"uint256",name:"y",type:"uint256"}],internalType:"struct ChainSignatures.AffinePoint",name:"bigR",type:"tuple"},{internalType:"uint256",name:"s",type:"uint256"},{internalType:"uint8",name:"recoveryId",type:"uint8"}],internalType:"struct ChainSignatures.Signature",name:"signature",type:"tuple"}],internalType:"struct ChainSignatures.Response[]",name:"_responses",type:"tuple[]"}],name:"respond",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"requestId",type:"bytes32"},{internalType:"string",name:"errorMessage",type:"string"}],internalType:"struct ChainSignatures.ErrorResponse[]",name:"_errors",type:"tuple[]"}],name:"respondError",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"role",type:"bytes32"},{internalType:"address",name:"account",type:"address"}],name:"revokeRole",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_amount",type:"uint256"}],name:"setSignatureDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"bytes32",name:"payload",type:"bytes32"},{internalType:"string",name:"path",type:"string"},{internalType:"uint32",name:"keyVersion",type:"uint32"},{internalType:"string",name:"algo",type:"string"},{internalType:"string",name:"dest",type:"string"},{internalType:"string",name:"params",type:"string"}],internalType:"struct ChainSignatures.SignRequest",name:"_request",type:"tuple"}],name:"sign",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_amount",type:"uint256"},{internalType:"address",name:"_receiver",type:"address"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"}];var Se={};m(Se,{ChainSignatureError:()=>B,SignatureContractError:()=>U,SignatureNotFoundError:()=>N,SigningError:()=>z});var B=class extends Error{constructor(e,t,r){super(e),this.name="ChainSignatureError",this.requestId=t,this.receipt=r;}},N=class extends B{constructor(e,t){super("Signature not found after maximum retries",e,t),this.name="SignatureNotFoundError";}},U=class extends B{constructor(e,t,r){super(`Signature error: ${e}`,t,r),this.name="SignatureContractError",this.errorCode=e;}},z=class extends B{constructor(e,t,r){super("Error signing request",e,t),this.name="SigningError",this.originalError=r;}};var qe=n=>{let e=encodeAbiParameters([{type:"address"},{type:"bytes"},{type:"string"},{type:"uint32"},{type:"uint256"},{type:"string"},{type:"string"},{type:"string"}],[n.address,n.payload,n.path,Number(n.keyVersion),n.chainId,n.algo,n.dest,n.params]);return keccak256(e)};var Te=class extends T{constructor(e){super(),this.publicClient=e.publicClient,this.walletClient=e.walletClient,this.contractAddress=e.contractAddress;let t=e.rootPublicKey||_(this.contractAddress,g.ETHEREUM);if(!t)throw new Error("Invalid public key, please provide a valid root public key or contract address");this.rootPublicKey=t;}async getCurrentSignatureDeposit(){let e=await this.publicClient.readContract({address:this.contractAddress,abi:R,functionName:"getSignatureDeposit"});return new Tt(e.toString())}async getDerivedPublicKey(e){return y.deriveChildPublicKey(await this.getPublicKey(),e.predecessor.toLowerCase(),e.path,f.ETHEREUM)}async getPublicKey(){return w(this.rootPublicKey)}async getLatestKeyVersion(){let e=await this.publicClient.readContract({address:this.contractAddress,abi:R,functionName:"latestKeyVersion"});return Number(e)}async sign(e,t={sign:{algo:"",dest:"",params:""},retry:{delay:5e3,retryCount:12}}){if(!this.walletClient.account?.sign)throw new Error("Wallet client signer required for signing operations");let r=await this.getSignRequestParams(e,t.sign),a=this.getRequestId(e,t.sign),i=await this.walletClient.sendTransaction({account:this.walletClient.account,to:r.target,data:r.data,value:r.value,chain:this.walletClient.chain}),o=await this.publicClient.waitForTransactionReceipt({hash:i});try{let s=await this.pollForRequestId({requestId:a,payload:e.payload,path:e.path,fromBlock:o.blockNumber,options:t.retry});if(!s)throw new N(a,o);if(s.hasOwnProperty("error"))throw new U(s.error,a,o);return s}catch(s){throw s instanceof N||s instanceof U?s:new z(a,o,s instanceof Error?s:void 0)}}async pollForRequestId({requestId:e,payload:t,path:r,fromBlock:a,options:i}){let o=i?.delay??5e3,s=i?.retryCount??12,c=await withRetry(async()=>{let p=await this.getSignatureFromEvents(e,a);if(p){let u=concat([padHex(`0x${p.r}`,{size:32}),padHex(`0x${p.s}`,{size:32}),`0x${p.v.toString(16)}`]),d=await recoverAddress({hash:new Uint8Array(t),signature:u}),b=new A.evm.EVM({publicClient:this.publicClient,contract:this}),{address:l}=await b.deriveAddressAndPublicKey(this.walletClient.account?.address,r);if(d.toLowerCase()!==l.toLowerCase())throw new Error("Signature not found yet");return p}else throw new Error("Signature not found yet")},{delay:o,retryCount:s,shouldRetry:({count:p,error:u})=>(console.log(`Retrying get signature: ${p}/${s}`),u.message==="Signature not found yet")});return c||this.getErrorFromEvents(e,a)}async getSignRequestParams(e,t={algo:"",dest:"",params:""}){let r={payload:`0x${Buffer.from(e.payload).toString("hex")}`,path:e.path,keyVersion:e.key_version,algo:t.algo??"",dest:t.dest??"",params:t.params??""};return {target:this.contractAddress,data:encodeFunctionData({abi:R,functionName:"sign",args:[r]}),value:BigInt((await this.getCurrentSignatureDeposit()).toString())}}getRequestId(e,t={algo:"",dest:"",params:""}){if(!this.walletClient.account)throw new Error("Wallet client account required to compute requestId");return qe({payload:`0x${Buffer.from(e.payload).toString("hex")}`,path:e.path,keyVersion:e.key_version,algo:t.algo??"",dest:t.dest??"",params:t.params??"",address:this.walletClient.account.address,chainId:this.publicClient.chain?.id?BigInt(this.publicClient.chain.id):0n})}async getErrorFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:R,eventName:"SignatureError",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:a}=r[r.length-1];return a}}async getSignatureFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:R,eventName:"SignatureResponded",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:a}=r[r.length-1];return y.toRSV(a.signature)}}};var Xt={ChainSignaturesContractABI:be,errors:Se};var Ie={};m(Ie,{ChainSignatureContract:()=>ve,utils:()=>mr});var Ce={};m(Ce,{accounts:()=>Qt,address:()=>Wt,default:()=>Pe,errors:()=>er,events:()=>Zt,instructions:()=>Jt,metadata:()=>Yt,types:()=>tr});var Wt="4uvZW8K4g4jBg7dzPNbb9XDxJLFBK7V6iC76uofmYvEU",Yt={name:"chain_signatures_project",version:"0.1.0",spec:"0.1.0",description:"Created with Anchor"},Jt=[{name:"initialize",discriminator:[175,175,109,31,13,152,155,237],accounts:[{name:"program_state",writable:true,pda:{seeds:[{kind:"const",value:[112,114,111,103,114,97,109,45,115,116,97,116,101]}]}},{name:"admin",writable:true,signer:true},{name:"system_program",address:"11111111111111111111111111111111"}],args:[{name:"signature_deposit",type:"u64"}]},{name:"respond",discriminator:[72,65,227,97,42,255,147,12],accounts:[{name:"responder",signer:true}],args:[{name:"request_ids",type:{vec:{array:["u8",32]}}},{name:"signatures",type:{vec:{defined:{name:"Signature"}}}}]},{name:"respond_error",discriminator:[3,170,41,132,72,184,252,69],accounts:[{name:"responder",signer:true}],args:[{name:"request_ids",type:{vec:{array:["u8",32]}}},{name:"errors",type:{vec:"string"}}]},{name:"sign",discriminator:[5,221,155,46,237,91,28,236],accounts:[{name:"program_state",writable:true,pda:{seeds:[{kind:"const",value:[112,114,111,103,114,97,109,45,115,116,97,116,101]}]}},{name:"requester",writable:true,signer:true},{name:"fee_payer",writable:true,signer:true,optional:true},{name:"system_program",address:"11111111111111111111111111111111"}],args:[{name:"payload",type:{array:["u8",32]}},{name:"key_version",type:"u32"},{name:"path",type:"string"},{name:"algo",type:"string"},{name:"dest",type:"string"},{name:"params",type:"string"}]},{name:"update_deposit",discriminator:[126,116,15,164,238,179,155,59],accounts:[{name:"program_state",writable:true,pda:{seeds:[{kind:"const",value:[112,114,111,103,114,97,109,45,115,116,97,116,101]}]}},{name:"admin",writable:true,signer:true,relations:["program_state"]},{name:"system_program",address:"11111111111111111111111111111111"}],args:[{name:"new_deposit",type:"u64"}]},{name:"withdraw_funds",discriminator:[241,36,29,111,208,31,104,217],accounts:[{name:"program_state",writable:true,pda:{seeds:[{kind:"const",value:[112,114,111,103,114,97,109,45,115,116,97,116,101]}]}},{name:"admin",writable:true,signer:true,relations:["program_state"]},{name:"recipient",docs:["function by checking it is not the zero address."],writable:true},{name:"system_program",address:"11111111111111111111111111111111"}],args:[{name:"amount",type:"u64"}]}],Qt=[{name:"ProgramState",discriminator:[77,209,137,229,149,67,167,230]}],Zt=[{name:"DepositUpdatedEvent",discriminator:[215,193,53,27,221,101,249,108]},{name:"FundsWithdrawnEvent",discriminator:[86,232,194,4,211,69,172,202]},{name:"SignatureErrorEvent",discriminator:[42,28,210,105,9,196,189,51]},{name:"SignatureRequestedEvent",discriminator:[171,129,105,91,154,49,160,34]},{name:"SignatureRespondedEvent",discriminator:[118,146,248,151,194,93,18,86]}],er=[{code:6e3,name:"InsufficientDeposit",msg:"Insufficient deposit amount"},{code:6001,name:"InvalidInputLength",msg:"Arrays must have the same length"},{code:6002,name:"Unauthorized",msg:"Unauthorized access"},{code:6003,name:"InsufficientFunds",msg:"Insufficient funds for withdrawal"},{code:6004,name:"InvalidRecipient",msg:"Invalid recipient address"}],tr=[{name:"AffinePoint",type:{kind:"struct",fields:[{name:"x",type:{array:["u8",32]}},{name:"y",type:{array:["u8",32]}}]}},{name:"DepositUpdatedEvent",type:{kind:"struct",fields:[{name:"old_deposit",type:"u64"},{name:"new_deposit",type:"u64"}]}},{name:"FundsWithdrawnEvent",type:{kind:"struct",fields:[{name:"amount",type:"u64"},{name:"recipient",type:"pubkey"}]}},{name:"ProgramState",type:{kind:"struct",fields:[{name:"admin",type:"pubkey"},{name:"signature_deposit",type:"u64"}]}},{name:"Signature",type:{kind:"struct",fields:[{name:"big_r",type:{defined:{name:"AffinePoint"}}},{name:"s",type:{array:["u8",32]}},{name:"recovery_id",type:"u8"}]}},{name:"SignatureErrorEvent",type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"responder",type:"pubkey"},{name:"error",type:"string"}]}},{name:"SignatureRequestedEvent",type:{kind:"struct",fields:[{name:"sender",type:"pubkey"},{name:"payload",type:{array:["u8",32]}},{name:"key_version",type:"u32"},{name:"deposit",type:"u64"},{name:"chain_id",type:"u64"},{name:"path",type:"string"},{name:"algo",type:"string"},{name:"dest",type:"string"},{name:"params",type:"string"},{name:"fee_payer",type:{option:"pubkey"}}]}},{name:"SignatureRespondedEvent",type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"responder",type:"pubkey"},{name:"signature",type:{defined:{name:"Signature"}}}]}}],Pe={address:Wt,metadata:Yt,instructions:Jt,accounts:Qt,events:Zt,errors:er,types:tr};var Ee={};m(Ee,{ResponseError:()=>xe,SignatureContractError:()=>D,SignatureNotFoundError:()=>V,SigningError:()=>j});var V=class extends Error{constructor(e,t){let r=e?`Signature not found for request ID: ${e}`:"Signature not found";super(r),this.name="SignatureNotFoundError",this.requestId=e,this.hash=t?.hash;}},D=class extends Error{constructor(e,t,r){super(e),this.name="SignatureContractError",this.requestId=t,this.hash=r?.hash;}},j=class extends Error{constructor(e,t,r){super(`Signing error for request ID: ${e}`),this.name="SigningError",this.requestId=e,this.hash=t?.hash,this.originalError=r;}},xe=class extends Error{constructor(e){super(e),this.name="ResponseError";}};function Le({address:n,payload:e,path:t,keyVersion:r,algo:a,dest:i,params:o}){let s="0x"+Buffer.from(e).toString("hex"),c=encodeAbiParameters(parseAbiParameters("string, bytes, string, uint32, uint256, string, string, string"),[n,s,t,r,0n,a,i,o]);return keccak256(c)}var ve=class extends T{constructor(e){super(),this.provider=e.provider,this.programId=typeof e.programId=="string"?new PublicKey(e.programId):e.programId,this.program=new Program({...Pe,address:this.programId.toString()},this.provider);let t=e.rootPublicKey||_(this.programId.toString(),g.SOLANA);if(!t)throw new Error("Invalid public key, please provide a valid root public key or program ID");this.rootPublicKey=t;}get connection(){return this.provider.connection}async getCurrentSignatureDeposit(){try{let e=await this.getProgramStatePDA(),t=await this.program.account.programState.fetch(e);return new Tt(t.signatureDeposit.toString())}catch(e){throw new Error(`Failed to get signature deposit: ${e}`)}}async getProgramStatePDA(){let[e]=PublicKey.findProgramAddressSync([Buffer.from("program-state")],this.programId);return e}async getDerivedPublicKey(e){return y.deriveChildPublicKey(await this.getPublicKey(),e.predecessor,e.path,f.SOLANA)}async getPublicKey(){return w(this.rootPublicKey)}async sign(e,t={sign:{algo:"",dest:"",params:""},retry:{delay:5e3,retryCount:12}}){let r=this.provider.wallet,a=e.feePayer||r,i=this.getRequestId(e,t.sign),o=await this.program.methods.sign(Array.from(e.payload),e.key_version,e.path,t.sign?.algo||"",t.sign?.dest||"",t.sign?.params||"").accounts({requester:r.publicKey,feePayer:a.publicKey}).rpc();try{let s=await this.pollForRequestId({requestId:i,payload:e.payload,path:e.path,options:t.retry});if(!s)throw new V(i,{hash:o});if("error"in s)throw new D(s.error,i,{hash:o});return s}catch(s){throw s instanceof V||s instanceof D?s:new j(i,{hash:o},s instanceof Error?s:void 0)}}async pollForRequestId({requestId:e,payload:t,path:r,options:a}){let i=a?.delay??5e3,o=a?.retryCount??12,s,c;if(await withRetry(async()=>{let p=await this.getSignatureFromEvents(e);if(p){let d=concat([padHex(`0x${p.r}`,{size:32}),padHex(`0x${p.s}`,{size:32}),`0x${p.v.toString(16)}`]),b=this.provider.publicKey.toString(),l=new A.evm.EVM({publicClient:createPublicClient({transport:http()}),contract:this}),{address:E}=await l.deriveAddressAndPublicKey(b,r);if((await recoverAddress({hash:new Uint8Array(t),signature:d})).toLowerCase()!==E.toLowerCase())throw new Error("Signature not found yet");return s=p,p}let u=await this.getErrorFromEvents(e);if(u)return c=u,u;throw new Error("Signature not found yet")},{delay:i,retryCount:o,shouldRetry:({count:p,error:u})=>(console.log(`Retrying get signature: ${p}/${o}`),u.message==="Signature not found yet")}),s)return s;if(c)return c}getRequestId(e,t={algo:"",dest:"",params:""}){let r=this.provider.publicKey.toString();return Le({payload:e.payload,path:e.path,keyVersion:e.key_version,algo:t.algo||"",dest:t.dest||"",params:t.params||"",address:r})}async getErrorFromEvents(e){return new Promise(t=>{let r=setTimeout(()=>t(void 0),1e3),a=this.program.addEventListener("signatureErrorEvent",i=>{"0x"+Buffer.from(i.requestId).toString("hex")===e&&(clearTimeout(r),this.program.removeEventListener(a),t({requestId:i.requestId,responder:i.responder,error:i.error}));});setTimeout(()=>{this.program.removeEventListener(a);},1e3);})}async getSignatureFromEvents(e){return new Promise(t=>{let r=setTimeout(()=>t(void 0),1e3),a=this.program.addEventListener("signatureRespondedEvent",i=>{if("0x"+Buffer.from(i.requestId).toString("hex")===e){clearTimeout(r),this.program.removeEventListener(a);let s=i.signature,c=Buffer.from(s.bigR.x).toString("hex"),p=Buffer.from(s.s).toString("hex"),u=s.recoveryId,d={r:c,s:p,v:u+27};t(d);}});setTimeout(()=>{this.program.removeEventListener(a);},1e3);})}};var mr={ChainSignaturesContractIdl:Ce,errors:Ee};
|
|
2
|
+
export{A as chainAdapters,Re as constants,Ge as contracts,ke as utils};//# sourceMappingURL=index.node.js.map
|
|
3
3
|
//# sourceMappingURL=index.node.js.map
|