signet.js 0.0.12-beta.13 → 0.0.12-beta.17
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 +67 -2
- package/browser/index.browser.cjs.map +1 -1
- package/browser/index.browser.js +67 -2
- package/browser/index.browser.js.map +1 -1
- package/node/index.node.cjs +67 -2
- package/node/index.node.cjs.map +1 -1
- package/node/index.node.js +67 -2
- package/node/index.node.js.map +1 -1
- package/package.json +5 -1
- package/types/index.d.cts +619 -28
- package/types/index.d.ts +619 -28
|
@@ -1,3 +1,68 @@
|
|
|
1
|
-
'use strict';var base=require('@scure/base'),Fe=require('elliptic'),viem=require('viem'),T=require('bitcoinjs-lib'),Je=require('coinselect'),amino=require('@cosmjs/amino'),crypto=require('@cosmjs/crypto'),encoding=require('@cosmjs/encoding'),protoSigning=require('@cosmjs/proto-signing'),stargate=require('@cosmjs/stargate'),bech32=require('bech32'),signing_js=require('cosmjs-types/cosmos/tx/signing/v1beta1/signing.js'),tx_js=require('cosmjs-types/cosmos/tx/v1beta1/tx.js'),chainRegistry=require('chain-registry'),yt=require('bn.js');require('viem/chains');var me=require('@coral-xyz/anchor'),web3_js=require('@solana/web3.js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Fe__default=/*#__PURE__*/_interopDefault(Fe);var T__namespace=/*#__PURE__*/_interopNamespace(T);var Je__default=/*#__PURE__*/_interopDefault(Je);var yt__default=/*#__PURE__*/_interopDefault(yt);var me__namespace=/*#__PURE__*/_interopNamespace(me);var De=Object.defineProperty;var g=(s,e)=>{for(var t in e)De(s,t,{get:e[t],enumerable:true});};var he={};g(he,{CHAINS:()=>b,CONTRACT_ADDRESSES:()=>J,ENVS:()=>f,KDF_CHAIN_IDS:()=>S,ROOT_PUBLIC_KEYS:()=>Y});var f={TESTNET_DEV:"TESTNET_DEV",TESTNET:"TESTNET",MAINNET:"MAINNET"},b={ETHEREUM:"ETHEREUM",SOLANA:"SOLANA"},Y={[f.TESTNET_DEV]:"secp256k1:54hU5wcCmVUPFWLDALXMh1fFToZsVXrx9BbTbHzSfQq1Kd1rJZi52iPa4QQxo6s5TgjWqgpY8HamYuUDzG6fAaUq",[f.TESTNET]:"secp256k1:3Ww8iFjqTHufye5aRGUvrQqETegR4gVUcW8FX5xzscaN9ENhpkffojsxJwi6N1RbbHMTxYa9UyKeqK3fsMuwxjR5",[f.MAINNET]:"secp256k1:4tY4qMzusmgX5wYdG35663Y3Qar3CTbpApotwk9ZKLoF79XA4DjG8XoByaKdNHKQX9Lz5hd7iJqsWdTKyA7dKa6Z"},S={[b.ETHEREUM]:"0x1",[b.SOLANA]:"0x800001f5"},J={[b.ETHEREUM]:{[f.TESTNET_DEV]:"0x69C6b28Fdc74618817fa380De29a653060e14009",[f.TESTNET]:"0x83458E8Bf8206131Fe5c05127007FA164c0948A2",[f.MAINNET]:"0xf8bdC0612361a1E49a8E01423d4C0cFc5dF4791A"},[b.SOLANA]:{[f.TESTNET_DEV]:"BtGZEs9ZJX3hAQuY5er8iyWrGsrPRZYupEtVSS129XKo",[f.TESTNET]:"JazJogTrTb6cCjPGKCBv19JvfqJqG5sxF5FiUKSZov1",[f.MAINNET]:""}};var Se={};g(Se,{cryptography:()=>l});var l={};g(l,{compressPubKey:()=>ze,deriveChildPublicKey:()=>je,najToUncompressedPubKeySEC1:()=>U,toRSV:()=>Le,verifyRecoveredAddress:()=>N});var{ec:$e}=Fe__default.default,Le=s=>{if("bigR"in s&&"x"in s.bigR&&"s"in s&&typeof s.s=="bigint")return {r:s.bigR.x.toString(16).padStart(64,"0"),s:s.s.toString(16).padStart(64,"0"),v:s.recoveryId+27};throw new Error("Invalid signature format")},ze=s=>{let e=s.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},U=s=>{let e=base.base58.decode(s.split(":")[1]);return `04${Buffer.from(e).toString("hex")}`};function je(s,e,t="",r){let n=new $e("secp256k1"),i=`sig.network v1.0.0 epsilon derivation,${r},${e},${t}`,o="";if(r===S.ETHEREUM)o=viem.keccak256(Buffer.from(i)).slice(2);else if(r===S.SOLANA)o=viem.keccak256(Buffer.from(i)).slice(2);else throw new Error("Invalid chain ID");let p=s.substring(2,66),c=s.substring(66),d=n.curve.point(p,c),m=n.g.mul(o),y=d.add(m),u=y.getX().toString("hex").padStart(64,"0"),P=y.getY().toString("hex").padStart(64,"0");return `04${u}${P}`}async function N(s,e,t,r,n){try{let a=new q.evm.EVM({publicClient:viem.createPublicClient({transport:viem.http("https://dontcare.com")}),contract:n}),{address:i}=await a.deriveAddressAndPublicKey(t,r);return (await viem.recoverAddress({hash:new Uint8Array(e),signature:{r:`0x${s.r}`,s:`0x${s.s}`,yParity:s.v}})).toLowerCase()===i.toLowerCase()}catch(a){return console.error("Signature verification failed:",a),false}}var q={};g(q,{ChainAdapter:()=>h,btc:()=>te,cosmos:()=>re,evm:()=>Q});var h=class{};var Q={};g(Q,{EVM:()=>L,fetchEVMFeeProperties:()=>H});async function H(s,e){let[t,r]=await Promise.all([s.estimateGas(e),s.estimateFeesPerGas()]),n=r.maxFeePerGas??BigInt(1e10),a=r.maxPriorityFeePerGas??BigInt(1e10);return {gas:t,maxFeePerGas:n,maxPriorityFeePerGas:a}}var L=class extends h{constructor({publicClient:e,contract:t}){super(),this.contract=t,this.client=e;}async attachGasAndNonce(e){let t=await H(this.client,e),r=await this.client.getTransactionCount({address:e.from}),{from:n,...a}=e;return {...t,nonce:r,chainId:Number(await this.client.getChainId()),type:"eip1559",...a}}transformRSVSignature(e){return {r:`0x${e.r}`,s:`0x${e.s}`,yParity:e.v-27}}assembleSignature(e){let{r:t,s:r,yParity:n}=this.transformRSVSignature(e);if(n===void 0)throw new Error("Missing yParity");return viem.concatHex([t,r,viem.numberToHex(n+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 n=r.startsWith("04")?r.slice(2):r,a=viem.keccak256(Buffer.from(n,"hex"));return {address:viem.getAddress(`0x${a.slice(-40)}`),publicKey:r}}async getBalance(e){return {balance:await this.client.getBalance({address:e}),decimals:18}}serializeTransaction(e){return viem.serializeTransaction(e)}deserializeTransaction(e){return viem.parseTransaction(e)}async prepareTransactionForSigning(e){let t=await this.attachGasAndNonce(e),r=viem.serializeTransaction(t),n=viem.toBytes(viem.keccak256(r));return {transaction:t,hashesToSign:[Array.from(n)]}}async prepareMessageForSigning(e){return {hashToSign:Array.from(viem.toBytes(viem.hashMessage(e)))}}async prepareTypedDataForSigning(e){return {hashToSign:Array.from(viem.toBytes(viem.hashTypedData(e)))}}async prepareUserOpForSigning(e,t,r){let n=r??await this.client.getChainId(),a=t||"0x0000000071727De22E5E9d8BAf0edAc6f37da032",i=viem.encodeAbiParameters([{type:"bytes32"},{type:"address"},{type:"uint256"}],[viem.keccak256(viem.encodeAbiParameters([{type:"address"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"},{type:"bytes32"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"}],[e.sender,viem.hexToBigInt(e.nonce),viem.keccak256("factory"in e&&"factoryData"in e&&e.factory&&e.factoryData?viem.concat([e.factory,e.factoryData]):"initCode"in e?e.initCode:"0x"),viem.keccak256(e.callData),viem.concat([viem.pad(e.verificationGasLimit,{size:16}),viem.pad(e.callGasLimit,{size:16})]),viem.hexToBigInt(e.preVerificationGas),viem.concat([viem.pad(e.maxPriorityFeePerGas,{size:16}),viem.pad(e.maxFeePerGas,{size:16})]),viem.keccak256("paymaster"in e&&e.paymaster&&viem.isAddress(e.paymaster)?viem.concat([e.paymaster,viem.pad(e.paymasterVerificationGasLimit,{size:16}),viem.pad(e.paymasterPostOpGasLimit,{size:16}),e.paymasterData]):"paymasterAndData"in e?e.paymasterAndData:"0x")])),a,BigInt(n)]),o=viem.keccak256(i);return {userOp:e,hashToSign:Array.from(viem.toBytes(viem.hashMessage({raw:o})))}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){let r=this.transformRSVSignature(t[0]);return viem.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:n,yParity:a}=this.transformRSVSignature(t);if(a===void 0)throw new Error("Missing yParity");return {...e,signature:viem.concatHex(["0x00",r,n,viem.numberToHex(Number(a+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 te={};g(te,{BTCRpcAdapter:()=>w,BTCRpcAdapters:()=>xe,Bitcoin:()=>j});function ee(s){switch(s.toLowerCase()){case "mainnet":return T__namespace.networks.bitcoin;case "testnet":return T__namespace.networks.testnet;case "regtest":return T__namespace.networks.regtest;default:throw new Error(`Unknown Bitcoin network: ${s}`)}}var j=class s extends h{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/s.SATOSHIS_PER_BTC}static toSatoshi(e){return Math.round(e*s.SATOSHIS_PER_BTC)}async fetchTransaction(e){let t=await this.btcRpcAdapter.getTransaction(e),r=new T__namespace.Transaction;return t.vout.forEach(n=>{let a=Buffer.from(n.scriptpubkey,"hex");r.addOutput(a,Number(n.value));}),r}static transformRSVSignature(e){let t=e.r.padStart(64,"0"),r=e.s.padStart(64,"0"),n=Buffer.from(t+r,"hex");if(n.length!==64)throw new Error("Invalid signature length.");return n}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)}]),n=new T__namespace.Psbt({network:ee(this.network)});return await Promise.all(t.map(async a=>{if(!a.scriptPubKey){let o=(await this.fetchTransaction(a.txid)).outs[a.vout];a.scriptPubKey=o.script;}n.addInput({hash:a.txid,index:a.vout,witnessUtxo:{script:a.scriptPubKey,value:a.value}});})),r.forEach(a=>{"address"in a?n.addOutput({address:a.address,value:a.value}):"script"in a?n.addOutput({script:a.script,value:a.value}):e.from!==void 0&&n.addOutput({value:Number(a.value),address:e.from});}),n}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 n=l.compressPubKey(r),a=Buffer.from(n,"hex"),i=ee(this.network),o=T__namespace.payments.p2wpkh({pubkey:a,network:i}),{address:p}=o;if(!p)throw new Error("Failed to generate Bitcoin address");return {address:p,publicKey:n}}serializeTransaction(e){return JSON.stringify({psbt:e.psbt.toHex(),publicKey:e.publicKey})}deserializeTransaction(e){let t=JSON.parse(e);return {psbt:T__namespace.Psbt.fromHex(t.psbt),publicKey:t.publicKey}}async prepareTransactionForSigning(e){let t=Buffer.from(e.publicKey,"hex"),r=await this.createPSBT({transactionRequest:e}),n=r.toHex(),a=[],i=o=>({publicKey:t,sign:p=>(a[o]=Array.from(p),Buffer.alloc(64))});for(let o=0;o<r.inputCount;o++)r.signInput(o,i(o));return {transaction:{psbt:T__namespace.Psbt.fromHex(n),publicKey:e.publicKey},hashesToSign:a}}finalizeTransactionSigning({transaction:{psbt:e,publicKey:t},rsvSignatures:r}){let n=Buffer.from(t,"hex"),a=i=>({publicKey:n,sign:()=>{let o=r[i];return s.transformRSVSignature(o)}});for(let i=0;i<e.inputCount;i++)e.signInput(i,a(i));return e.finalizeAllInputs(),e.extractTransaction().toHex()}async broadcastTx(e){return await this.btcRpcAdapter.broadcastTransaction(e)}};var w=class{};var V=class extends w{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 n=await this.fetchUTXOs(e),a=await this.fetchFeeRate(r),i=Je__default.default(n,t,Math.ceil(a+1));if(!i.inputs||!i.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:i.inputs,outputs:i.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 xe={Mempool:V};var re={};g(re,{Cosmos:()=>W});var Pe=async s=>{let e=chainRegistry.chains.find(m=>m.chain_id===s);if(!e)throw new Error(`Chain info not found for chainId: ${s}`);let{bech32_prefix:t,chain_id:r}=e,n=e.staking?.staking_tokens?.[0]?.denom,a=e.apis?.rpc?.[0]?.address,i=e.apis?.rest?.[0]?.address,o=e.fees?.fee_tokens?.[0]?.average_gas_price;if(!t||!n||!a||!i||!r||o===void 0)throw new Error(`Missing required chain information for ${e.chain_name}`);let c=chainRegistry.assets.find(m=>m.chain_name===e.chain_name)?.assets.find(m=>m.base===n),d=c?.denom_units.find(m=>m.denom===c.display)?.exponent;if(d===void 0)throw new Error(`Could not find decimals for ${n} on chain ${e.chain_name}`);return {prefix:t,denom:n,rpcUrl:a,restUrl:i,expectedChainId:r,gasPrice:o,decimals:d}};var W=class extends h{constructor({chainId:e,contract:t,endpoints:r}){super(),this.contract=t,this.registry=new protoSigning.Registry,this.chainId=e,this.endpoints=r;}transformRSVSignature(e){return new Uint8Array([...encoding.fromHex(e.r),...encoding.fromHex(e.s)])}async getChainInfo(){return {...await Pe(this.chainId),...this.endpoints}}async getBalance(e){try{let{restUrl:t,denom:r,decimals:n}=await this.getChainInfo(),a=await fetch(`${t}/cosmos/bank/v1beta1/balances/${e}`);if(!a.ok)throw new Error(`HTTP error! status: ${a.status}`);let p=(await a.json()).balances.find(c=>c.denom===r)?.amount??"0";return {balance:BigInt(p),decimals:n}}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(),n=await this.contract.getDerivedPublicKey({path:t,predecessor:e});if(!n)throw new Error("Failed to get derived public key");let a=l.compressPubKey(n),i=crypto.sha256(encoding.fromHex(a)),o=crypto.ripemd160(i);return {address:bech32.bech32.encode(r,bech32.bech32.toWords(o)),publicKey:a}}serializeTransaction(e){let t=tx_js.TxRaw.encode(e).finish();return encoding.toBase64(t)}deserializeTransaction(e){return tx_js.TxRaw.decode(encoding.fromBase64(e))}async prepareTransactionForSigning(e){let{denom:t,rpcUrl:r,gasPrice:n}=await this.getChainInfo(),a=encoding.fromHex(e.publicKey),i=e.gas||2e5,o=stargate.calculateFee(i,stargate.GasPrice.fromString(`${n}${t}`)),c=await(await stargate.StargateClient.connect(r)).getAccount(e.address);if(!c)throw new Error(`Account ${e.address} does not exist on chain`);let{accountNumber:d,sequence:m}=c,y={typeUrl:"/cosmos.tx.v1beta1.TxBody",value:{messages:e.messages,memo:e.memo||""}},u=this.registry.encode(y),P=protoSigning.encodePubkey(amino.encodeSecp256k1Pubkey(a)),fe=protoSigning.makeAuthInfoBytes([{pubkey:P,sequence:m}],o.amount,Number(o.gas),void 0,void 0,signing_js.SignMode.SIGN_MODE_DIRECT),Ue=protoSigning.makeSignDoc(u,fe,this.chainId,d),Ne=protoSigning.makeSignBytes(Ue),Ve=Array.from(crypto.sha256(Ne));return {transaction:tx_js.TxRaw.fromPartial({bodyBytes:u,authInfoBytes:fe,signatures:[]}),hashesToSign:[Ve]}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){e.signatures=t.map(n=>this.transformRSVSignature(n));let r=tx_js.TxRaw.encode(e).finish();return Buffer.from(r).toString("hex")}async broadcastTx(e){try{let{rpcUrl:t}=await this.getChainInfo(),r=await stargate.StargateClient.connect(t),n=encoding.fromHex(e),a=await r.broadcastTx(n);if(a.code!==0)throw new Error(`Broadcast error: ${a.rawLog}`);return a.transactionHash}catch(t){throw console.error("Transaction broadcast failed:",t),new Error("Failed to broadcast transaction.")}}};var _e={};g(_e,{ChainSignatureContract:()=>v,evm:()=>oe,solana:()=>le});var ne=class{},v=class extends ne{};var oe={};g(oe,{ChainSignatureContract:()=>se,utils:()=>ht});var ae={};g(ae,{abi:()=>x});var x=[{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 ie={};g(ie,{ChainSignatureError:()=>I,SignatureContractError:()=>B,SignatureNotFoundError:()=>A,SigningError:()=>M});var I=class extends Error{constructor(e,t,r){super(e),this.name="ChainSignatureError",this.requestId=t,this.receipt=r;}},A=class extends I{constructor(e,t){super("Signature not found after maximum retries",e,t),this.name="SignatureNotFoundError";}},B=class extends I{constructor(e,t,r){super(`Signature error: ${e}`,t,r),this.name="SignatureContractError",this.errorCode=e;}},M=class extends I{constructor(e,t,r){super("Error signing request",e,t),this.name="SigningError",this.originalError=r;}};var X=(s,e)=>{let t=Object.entries(J[e]).find(([r,n])=>n.toLowerCase()===s.toLowerCase())?.[0];if(t)return Y[t]};var Be=s=>{let e=viem.encodeAbiParameters([{type:"address"},{type:"bytes"},{type:"string"},{type:"uint32"},{type:"uint256"},{type:"string"},{type:"string"},{type:"string"}],[s.address,s.payload,s.path,Number(s.keyVersion),s.chainId,s.algo,s.dest,s.params]);return viem.keccak256(e)};var se=class extends v{constructor(e){super(),this.publicClient=e.publicClient,this.walletClient=e.walletClient,this.contractAddress=e.contractAddress;let t=e.rootPublicKey||X(this.contractAddress,b.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:x,functionName:"getSignatureDeposit"});return new yt__default.default(e.toString())}async getDerivedPublicKey(e){return l.deriveChildPublicKey(await this.getPublicKey(),e.predecessor.toLowerCase(),e.path,S.ETHEREUM)}async getPublicKey(){return U(this.rootPublicKey)}async getLatestKeyVersion(){let e=await this.publicClient.readContract({address:this.contractAddress,abi:x,functionName:"latestKeyVersion"});return Number(e)}async createSignatureRequest(e,t={sign:{algo:"",dest:"",params:""}}){if(!this.walletClient?.account)throw new Error("Wallet client required for signing operations");let r=await this.getSignRequestParams(e,t.sign),n=this.getRequestId(e,t.sign);return {txHash:await this.walletClient.sendTransaction({...t.transaction,account:this.walletClient.account,to:r.target,data:r.data,value:r.value,chain:this.walletClient.chain}),requestId:n}}async sign(e,t={sign:{algo:"",dest:"",params:""},retry:{delay:5e3,retryCount:12}}){let{txHash:r,requestId:n}=await this.createSignatureRequest(e,t),a=await this.publicClient.waitForTransactionReceipt({hash:r});try{let i=await this.pollForRequestId({requestId:n,payload:e.payload,path:e.path,fromBlock:a.blockNumber,options:t.retry});if(!i)throw new A(n,a);if("error"in i)throw new B(i.error,n,a);return i}catch(i){throw i instanceof A||i instanceof B?i:new M(n,a,i instanceof Error?i:void 0)}}async pollForRequestId({requestId:e,payload:t,path:r,fromBlock:n,options:a}){let i=a?.delay??5e3,o=a?.retryCount??12,p=await viem.withRetry(async()=>{let c=await this.getSignatureFromEvents(e,n);if(c){if(!await N(c,t,this.walletClient.account?.address,r,this))throw new Error("Signature not found yet");return c}else throw new Error("Signature not found yet")},{delay:i,retryCount:o,shouldRetry:({count:c,error:d})=>(console.log(`Retrying get signature: ${c}/${o}`),d.message==="Signature not found yet")});return p||await this.getErrorFromEvents(e,n)}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:viem.encodeFunctionData({abi:x,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");if(!this.publicClient.chain?.id)throw new Error("Public client chain required to compute requestId");return Be({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:BigInt(this.publicClient.chain.id)})}async getErrorFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:x,eventName:"SignatureError",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:n}=r[r.length-1];return n}}async getSignatureFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:x,eventName:"SignatureResponded",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:n}=r[r.length-1];return l.toRSV(n.signature)}}};var ht={ChainSignaturesContractABI:ae,errors:ie};var le={};g(le,{ChainSignatureContract:()=>ye,utils:()=>_t});var pe={};g(pe,{ResponseError:()=>ce,SignatureContractError:()=>k,SignatureNotFoundError:()=>K,SigningError:()=>_});var K=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;}},k=class extends Error{constructor(e,t,r){super(e),this.name="SignatureContractError",this.requestId=t,this.hash=r?.hash;}},_=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;}},ce=class extends Error{constructor(e){super(e),this.name="ResponseError";}};var de={};g(de,{accounts:()=>vt,address:()=>bt,default:()=>ue,errors:()=>Ct,events:()=>Et,instructions:()=>Tt,metadata:()=>St,types:()=>wt});var bt="4uvZW8K4g4jBg7dzPNbb9XDxJLFBK7V6iC76uofmYvEU",St={name:"chain_signatures_project",version:"0.1.0",spec:"0.1.0",description:"Created with Anchor"},Tt=[{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"}]}],vt=[{name:"ProgramState",discriminator:[77,209,137,229,149,67,167,230]}],Et=[{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]}],Ct=[{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"}],wt=[{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"}}}]}}],ue={address:bt,metadata:St,instructions:Tt,accounts:vt,events:Et,errors:Ct,types:wt};var xt=Buffer.from([228,69,165,46,81,203,154,29]),F=class{static async parseCpiEvents(e,t,r,n){let a=[];try{let i=await e.getParsedTransaction(t,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!i?.meta?.innerInstructions)return a;for(let o of i.meta.innerInstructions)for(let p of o.instructions){if(!("programId"in p)||!("data"in p)||p.programId.toString()!==r)continue;let c=this.parseInstruction(p.data,n);c&&a.push(c);}}catch{}return a}static parseInstruction(e,t){try{let r=me__namespace.utils.bytes.bs58.decode(e);if(r.length<16)return null;let n=r.subarray(0,8);if(Buffer.compare(n,xt)!==0)return null;let a=r.subarray(8,16);if(!t.idl.events?.find(c=>{let d=Buffer.from(c.discriminator);return Buffer.compare(a,d)===0}))return null;let o=r.subarray(8);return t.coder.events.decode(me__namespace.utils.bytes.base64.encode(o))}catch{return null}}static subscribeToCpiEvents(e,t,r){return e.onLogs(t.programId,(n,a)=>{n.err||(async()=>{let i=await this.parseCpiEvents(e,n.signature,t.programId.toString(),t);for(let o of i){let p=r.get(o.name);if(p)try{await p(o.data,a.slot);}catch{}}})();},"confirmed")}};function Ke({address:s,payload:e,path:t,keyVersion:r,algo:n,dest:a,params:i}){let o="0x"+Buffer.from(e).toString("hex"),p=viem.encodeAbiParameters(viem.parseAbiParameters("string, bytes, string, uint32, uint256, string, string, string"),[s,o,t,r,0n,n,a,i]);return viem.keccak256(p)}var ye=class extends v{constructor(e){super(),this.provider=e.provider,this.requesterAddress=e.config?.requesterAddress??this.provider.wallet.publicKey.toString(),this.programId=typeof e.programId=="string"?new web3_js.PublicKey(e.programId):e.programId;let t=e.config?.idl||ue;this.program=new me.Program({...t,address:this.programId.toString()},this.provider);let r=e.config?.rootPublicKey||X(this.programId.toString(),b.SOLANA);if(!r)throw new Error("Invalid public key, please provide a valid root public key or program ID");this.rootPublicKey=r;}get connection(){return this.provider.connection}async getCurrentSignatureDeposit(){try{let e=await this.getProgramStatePDA(),t=await this.program.account.programState.fetch(e);return new yt__default.default(t.signatureDeposit.toString())}catch(e){throw new Error(`Failed to get signature deposit: ${e instanceof Error?e.message:String(e)}`)}}async getProgramStatePDA(){let[e]=web3_js.PublicKey.findProgramAddressSync([Buffer.from("program-state")],this.programId);return e}async getDerivedPublicKey(e){return l.deriveChildPublicKey(await this.getPublicKey(),e.predecessor,e.path,S.SOLANA)}async getPublicKey(){return U(this.rootPublicKey)}async getSignRequestInstruction(e,t){let r=[{pubkey:web3_js.PublicKey.findProgramAddressSync([Buffer.from("__event_authority")],this.program.programId)[0],isWritable:false,isSigner:false},{pubkey:this.program.programId,isWritable:false,isSigner:false}];return 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:this.requesterAddress,feePayer:this.provider.wallet.publicKey}).remainingAccounts([...r,...t?.remainingAccounts??[]]).instruction()}async sign(e,t){let r=t?.sign?.algo??"",n=t?.sign?.dest??"",a=t?.sign?.params??"",i=t?.retry?.delay??5e3,o=t?.retry?.retryCount??12;if(t?.remainingAccounts?.filter(u=>u.isSigner)?.some(u=>!t?.remainingSigners?.some(P=>P.publicKey.equals(u.pubkey))))throw new Error("All accounts marked as signers must have a corresponding signer");let c=this.getRequestId(e,{algo:r,dest:n,params:a}),d=await this.getSignRequestInstruction(e,{sign:{algo:r,dest:n,params:a},remainingAccounts:t?.remainingAccounts}),m=new web3_js.Transaction().add(d);m.feePayer=this.provider.wallet.publicKey;let y=await this.sendAndConfirmWithoutWebSocket(m,t?.remainingSigners);try{let u=await this.pollForRequestId({requestId:c,payload:e.payload,path:e.path,afterSignature:y,options:{delay:i,retryCount:o}});if(!u)throw new K(c,{hash:y});if("error"in u)throw new k(u.error,c,{hash:y});if(!await N(u,e.payload,this.requesterAddress,e.path,this))throw new _(c,{hash:y},new Error("Signature verification failed: recovered address does not match expected address"));return u}catch(u){throw u instanceof K||u instanceof k?u:new _(c,{hash:y},u instanceof Error?u:void 0)}}async sendAndConfirmWithoutWebSocket(e,t){let{blockhash:r}=await this.provider.connection.getLatestBlockhash("confirmed");e.recentBlockhash=r,e=await this.provider.wallet.signTransaction(e),t&&t.length>0&&e.partialSign(...t);let n=await this.provider.connection.sendRawTransaction(e.serialize(),{skipPreflight:false,preflightCommitment:"processed",maxRetries:3}),a=Date.now(),i=3e4;for(;Date.now()-a<i;){let o=await this.provider.connection.getSignatureStatus(n);if(o.value?.err)throw new Error(`Transaction failed: ${JSON.stringify(o.value.err)}`);if(o.value?.confirmationStatus==="confirmed"||o.value?.confirmationStatus==="finalized")return n;await new Promise(p=>setTimeout(p,2e3));}throw new web3_js.TransactionExpiredTimeoutError(n,i/1e3)}async pollForRequestId({requestId:e,payload:t,path:r,afterSignature:n,options:a}){let i=a?.delay??5e3,o=a?.retryCount??12,p=n;for(let c=0;c<o;c++){try{let d=await this.connection.getSignaturesForAddress(this.programId,{until:p,limit:50},"confirmed");d.length>0&&(p=d[d.length-1].signature);for(let m of d){let y=await this.connection.getParsedTransaction(m.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(y?.meta?.logMessages){let u=await this.parseLogsForEvents(y.meta.logMessages,e,m.signature);if(u)return u}}}catch(d){console.error("Error checking for events:",d);}c<o-1&&(console.log(`Retrying get signature: ${c+1}/${o}`),await new Promise(d=>setTimeout(d,i)));}}async parseLogsForEvents(e,t,r){let n=await F.parseCpiEvents(this.connection,r,this.programId.toString(),this.program);for(let i of n){let o=this.mapEventToResult(i.name,(i.name==="signatureRespondedEvent",i.data),t);if(o)return o}let a=new me.EventParser(this.program.programId,this.program.coder);for(let i of a.parseLogs(e)){if(!i)continue;let o=this.mapEventToResult(i.name,(i.name==="signatureRespondedEvent",i.data),t);if(o)return o}}mapEventToResult(e,t,r){let n="0x"+Buffer.from(t.requestId).toString("hex");if(e==="signatureRespondedEvent"&&n===r){let a=t;return {r:Buffer.from(a.signature.bigR.x).toString("hex"),s:Buffer.from(a.signature.s).toString("hex"),v:a.signature.recoveryId+27}}if(e==="signatureErrorEvent"&&n===r)return {requestId:n,error:t.error}}getRequestId(e,t={algo:"",dest:"",params:""}){return Ke({payload:e.payload,path:e.path,keyVersion:e.key_version,algo:t.algo||"",dest:t.dest||"",params:t.params||"",address:this.requesterAddress})}async subscribeToEvents(e){let t="confirmed",r=new Map;if(e.onSignatureResponded){let o=e.onSignatureResponded;r.set("signatureRespondedEvent",async(p,c)=>{await o(p,c);});}if(e.onSignatureError){let o=e.onSignatureError;r.set("signatureErrorEvent",async(p,c)=>{await o(p,c);});}let n=F.subscribeToCpiEvents(this.connection,this.program,r),a=new me.EventParser(this.program.programId,this.program.coder),i=this.connection.onLogs(this.program.programId,(o,p)=>{if(!o.err){for(let c of a.parseLogs(o.logs))if(c){if(c.name==="signatureRespondedEvent"){let d=e.onSignatureResponded;d&&d(c.data,p.slot);}if(c.name==="signatureErrorEvent"){let d=e.onSignatureError;d&&d(c.data,p.slot);}}}},t);return async()=>{await this.connection.removeOnLogsListener(i),await this.connection.removeOnLogsListener(n);}}};var _t={ChainSignaturesContractIdl:de,errors:pe};
|
|
2
|
-
|
|
1
|
+
'use strict';var base=require('@scure/base'),Me=require('elliptic'),viem=require('viem'),T=require('bitcoinjs-lib'),Qe=require('coinselect'),amino=require('@cosmjs/amino'),crypto=require('@cosmjs/crypto'),encoding=require('@cosmjs/encoding'),protoSigning=require('@cosmjs/proto-signing'),stargate=require('@cosmjs/stargate'),bech32=require('bech32'),signing_js=require('cosmjs-types/cosmos/tx/signing/v1beta1/signing.js'),tx_js=require('cosmjs-types/cosmos/tx/v1beta1/tx.js'),chainRegistry=require('chain-registry'),ht=require('bn.js');require('viem/chains');var me=require('@coral-xyz/anchor'),web3_js=require('@solana/web3.js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Me__default=/*#__PURE__*/_interopDefault(Me);var T__namespace=/*#__PURE__*/_interopNamespace(T);var Qe__default=/*#__PURE__*/_interopDefault(Qe);var ht__default=/*#__PURE__*/_interopDefault(ht);var me__namespace=/*#__PURE__*/_interopNamespace(me);var De=Object.defineProperty;var g=(o,e)=>{for(var t in e)De(o,t,{get:e[t],enumerable:true});};var fe={};g(fe,{CHAINS:()=>b,CONTRACT_ADDRESSES:()=>J,ENVS:()=>h,KDF_CHAIN_IDS:()=>S,ROOT_PUBLIC_KEYS:()=>Y});var h={TESTNET_DEV:"TESTNET_DEV",TESTNET:"TESTNET",MAINNET:"MAINNET"},b={ETHEREUM:"ETHEREUM",SOLANA:"SOLANA"},Y={[h.TESTNET_DEV]:"secp256k1:54hU5wcCmVUPFWLDALXMh1fFToZsVXrx9BbTbHzSfQq1Kd1rJZi52iPa4QQxo6s5TgjWqgpY8HamYuUDzG6fAaUq",[h.TESTNET]:"secp256k1:3Ww8iFjqTHufye5aRGUvrQqETegR4gVUcW8FX5xzscaN9ENhpkffojsxJwi6N1RbbHMTxYa9UyKeqK3fsMuwxjR5",[h.MAINNET]:"secp256k1:4tY4qMzusmgX5wYdG35663Y3Qar3CTbpApotwk9ZKLoF79XA4DjG8XoByaKdNHKQX9Lz5hd7iJqsWdTKyA7dKa6Z"},S={[b.ETHEREUM]:"eip155:1",[b.SOLANA]:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"},J={[b.ETHEREUM]:{[h.TESTNET_DEV]:"0x69C6b28Fdc74618817fa380De29a653060e14009",[h.TESTNET]:"0x83458E8Bf8206131Fe5c05127007FA164c0948A2",[h.MAINNET]:"0xf8bdC0612361a1E49a8E01423d4C0cFc5dF4791A"},[b.SOLANA]:{[h.TESTNET_DEV]:"SigDuEPNeDjh3oJv7MUraPN7zaTFomS6ZWfpXwjUg4B",[h.TESTNET]:"SigTVbfRK9LsXWpSv9KgpabrQcFKr5hDdUwMhYsXyKg",[h.MAINNET]:"SigMcRMjKfnC7RDG5q4yUMZM1s5KJ9oYTPP4NmJRDRw"}};var Se={};g(Se,{cryptography:()=>l});var l={};g(l,{compressPubKey:()=>Le,deriveChildPublicKey:()=>We,najToUncompressedPubKeySEC1:()=>U,toRSV:()=>$e,verifyRecoveredAddress:()=>N});var{ec:Oe}=Me__default.default,$e=o=>{if("bigR"in o&&"x"in o.bigR&&"s"in o&&typeof o.s=="bigint")return {r:o.bigR.x.toString(16).padStart(64,"0"),s:o.s.toString(16).padStart(64,"0"),v:o.recoveryId+27};throw new Error("Invalid signature format")},Le=o=>{let e=o.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},U=o=>{let e=base.base58.decode(o.split(":")[1]);return `04${Buffer.from(e).toString("hex")}`},je="sig.network v1.0.0 epsilon derivation",Ge="sig.network v2.0.0 epsilon derivation";function We(o,e,t="",r,n){let a=new Oe("secp256k1"),i=n<=0?`${je},${r},${e},${t}`:`${Ge}:${r}:${e}:${t}`,s="";if(r===S.ETHEREUM)s=viem.keccak256(Buffer.from(i)).slice(2);else if(r===S.SOLANA)s=viem.keccak256(Buffer.from(i)).slice(2);else throw new Error("Invalid chain ID");let p=o.substring(2,66),c=o.substring(66),d=a.curve.point(p,c),m=a.g.mul(s),y=d.add(m),u=y.getX().toString("hex").padStart(64,"0"),x=y.getY().toString("hex").padStart(64,"0");return `04${u}${x}`}async function N(o,e,t,r,n,a){try{let i=new F.evm.EVM({publicClient:viem.createPublicClient({transport:viem.http("https://dontcare.com")}),contract:n}),{address:s}=await i.deriveAddressAndPublicKey(t,r,a);return (await viem.recoverAddress({hash:new Uint8Array(e),signature:{r:`0x${o.r}`,s:`0x${o.s}`,yParity:o.v}})).toLowerCase()===s.toLowerCase()}catch(i){return console.error("Signature verification failed:",i),false}}var F={};g(F,{ChainAdapter:()=>f,btc:()=>te,cosmos:()=>re,evm:()=>Q});var f=class{};var Q={};g(Q,{EVM:()=>$,fetchEVMFeeProperties:()=>H});async function H(o,e){let[t,r]=await Promise.all([o.estimateGas(e),o.estimateFeesPerGas()]),n=r.maxFeePerGas??BigInt(1e10),a=r.maxPriorityFeePerGas??BigInt(1e10);return {gas:t,maxFeePerGas:n,maxPriorityFeePerGas:a}}var $=class extends f{constructor({publicClient:e,contract:t}){super(),this.contract=t,this.client=e;}async attachGasAndNonce(e){let t=await H(this.client,e),r=await this.client.getTransactionCount({address:e.from}),{from:n,...a}=e;return {...t,nonce:r,chainId:Number(await this.client.getChainId()),type:"eip1559",...a}}transformRSVSignature(e){return {r:`0x${e.r}`,s:`0x${e.s}`,yParity:e.v-27}}assembleSignature(e){let{r:t,s:r,yParity:n}=this.transformRSVSignature(e);if(n===void 0)throw new Error("Missing yParity");return viem.concatHex([t,r,viem.numberToHex(n+27,{size:1})])}async deriveAddressAndPublicKey(e,t,r){let n=await this.contract.getDerivedPublicKey({path:t,predecessor:e,keyVersion:r});if(!n)throw new Error("Failed to get derived public key");let a=n.startsWith("04")?n.slice(2):n,i=viem.keccak256(Buffer.from(a,"hex"));return {address:viem.getAddress(`0x${i.slice(-40)}`),publicKey:n}}async getBalance(e){return {balance:await this.client.getBalance({address:e}),decimals:18}}serializeTransaction(e){return viem.serializeTransaction(e)}deserializeTransaction(e){return viem.parseTransaction(e)}async prepareTransactionForSigning(e){let t=await this.attachGasAndNonce(e),r=viem.serializeTransaction(t),n=viem.toBytes(viem.keccak256(r));return {transaction:t,hashesToSign:[Array.from(n)]}}async prepareMessageForSigning(e){return {hashToSign:Array.from(viem.toBytes(viem.hashMessage(e)))}}async prepareTypedDataForSigning(e){return {hashToSign:Array.from(viem.toBytes(viem.hashTypedData(e)))}}async prepareUserOpForSigning(e,t,r){let n=r??await this.client.getChainId(),a=t||"0x0000000071727De22E5E9d8BAf0edAc6f37da032",i=viem.encodeAbiParameters([{type:"bytes32"},{type:"address"},{type:"uint256"}],[viem.keccak256(viem.encodeAbiParameters([{type:"address"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"},{type:"bytes32"},{type:"uint256"},{type:"bytes32"},{type:"bytes32"}],[e.sender,viem.hexToBigInt(e.nonce),viem.keccak256("factory"in e&&"factoryData"in e&&e.factory&&e.factoryData?viem.concat([e.factory,e.factoryData]):"initCode"in e?e.initCode:"0x"),viem.keccak256(e.callData),viem.concat([viem.pad(e.verificationGasLimit,{size:16}),viem.pad(e.callGasLimit,{size:16})]),viem.hexToBigInt(e.preVerificationGas),viem.concat([viem.pad(e.maxPriorityFeePerGas,{size:16}),viem.pad(e.maxFeePerGas,{size:16})]),viem.keccak256("paymaster"in e&&e.paymaster&&viem.isAddress(e.paymaster)?viem.concat([e.paymaster,viem.pad(e.paymasterVerificationGasLimit,{size:16}),viem.pad(e.paymasterPostOpGasLimit,{size:16}),e.paymasterData]):"paymasterAndData"in e?e.paymasterAndData:"0x")])),a,BigInt(n)]),s=viem.keccak256(i);return {userOp:e,hashToSign:Array.from(viem.toBytes(viem.hashMessage({raw:s})))}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){let r=this.transformRSVSignature(t[0]);return viem.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:n,yParity:a}=this.transformRSVSignature(t);if(a===void 0)throw new Error("Missing yParity");return {...e,signature:viem.concatHex(["0x00",r,n,viem.numberToHex(Number(a+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 te={};g(te,{BTCRpcAdapter:()=>C,BTCRpcAdapters:()=>Pe,Bitcoin:()=>j});function ee(o){switch(o.toLowerCase()){case "mainnet":return T__namespace.networks.bitcoin;case "testnet":return T__namespace.networks.testnet;case "regtest":return T__namespace.networks.regtest;default:throw new Error(`Unknown Bitcoin network: ${o}`)}}var j=class o extends f{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/o.SATOSHIS_PER_BTC}static toSatoshi(e){return Math.round(e*o.SATOSHIS_PER_BTC)}async fetchTransaction(e){let t=await this.btcRpcAdapter.getTransaction(e),r=new T__namespace.Transaction;return t.vout.forEach(n=>{let a=Buffer.from(n.scriptpubkey,"hex");r.addOutput(a,Number(n.value));}),r}static transformRSVSignature(e){let t=e.r.padStart(64,"0"),r=e.s.padStart(64,"0"),n=Buffer.from(t+r,"hex");if(n.length!==64)throw new Error("Invalid signature length.");return n}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)}]),n=new T__namespace.Psbt({network:ee(this.network)});return await Promise.all(t.map(async a=>{if(!a.scriptPubKey){let s=(await this.fetchTransaction(a.txid)).outs[a.vout];a.scriptPubKey=s.script;}n.addInput({hash:a.txid,index:a.vout,witnessUtxo:{script:a.scriptPubKey,value:a.value}});})),r.forEach(a=>{"address"in a?n.addOutput({address:a.address,value:a.value}):"script"in a?n.addOutput({script:a.script,value:a.value}):e.from!==void 0&&n.addOutput({value:Number(a.value),address:e.from});}),n}async getBalance(e){return {balance:BigInt(await this.btcRpcAdapter.getBalance(e)),decimals:8}}async deriveAddressAndPublicKey(e,t,r){let n=await this.contract.getDerivedPublicKey({path:t,predecessor:e,keyVersion:r});if(!n)throw new Error("Failed to get derived public key");let a=l.compressPubKey(n),i=Buffer.from(a,"hex"),s=ee(this.network),p=T__namespace.payments.p2wpkh({pubkey:i,network:s}),{address:c}=p;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:T__namespace.Psbt.fromHex(t.psbt),publicKey:t.publicKey}}async prepareTransactionForSigning(e){let t=Buffer.from(e.publicKey,"hex"),r=await this.createPSBT({transactionRequest:e}),n=r.toHex(),a=[],i=s=>({publicKey:t,sign:p=>(a[s]=Array.from(p),Buffer.alloc(64))});for(let s=0;s<r.inputCount;s++)r.signInput(s,i(s));return {transaction:{psbt:T__namespace.Psbt.fromHex(n),publicKey:e.publicKey},hashesToSign:a}}finalizeTransactionSigning({transaction:{psbt:e,publicKey:t},rsvSignatures:r}){let n=Buffer.from(t,"hex"),a=i=>({publicKey:n,sign:()=>{let s=r[i];return o.transformRSVSignature(s)}});for(let i=0;i<e.inputCount;i++)e.signInput(i,a(i));return e.finalizeAllInputs(),e.extractTransaction().toHex()}async broadcastTx(e){return await this.btcRpcAdapter.broadcastTransaction(e)}};var C=class{};var V=class extends C{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 n=await this.fetchUTXOs(e),a=await this.fetchFeeRate(r),i=Qe__default.default(n,t,Math.ceil(a+1));if(!i.inputs||!i.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:i.inputs,outputs:i.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 Pe={Mempool:V};var re={};g(re,{Cosmos:()=>W});var xe=async o=>{let e=chainRegistry.chains.find(m=>m.chain_id===o);if(!e)throw new Error(`Chain info not found for chainId: ${o}`);let{bech32_prefix:t,chain_id:r}=e,n=e.staking?.staking_tokens?.[0]?.denom,a=e.apis?.rpc?.[0]?.address,i=e.apis?.rest?.[0]?.address,s=e.fees?.fee_tokens?.[0]?.average_gas_price;if(!t||!n||!a||!i||!r||s===void 0)throw new Error(`Missing required chain information for ${e.chain_name}`);let c=chainRegistry.assets.find(m=>m.chain_name===e.chain_name)?.assets.find(m=>m.base===n),d=c?.denom_units.find(m=>m.denom===c.display)?.exponent;if(d===void 0)throw new Error(`Could not find decimals for ${n} on chain ${e.chain_name}`);return {prefix:t,denom:n,rpcUrl:a,restUrl:i,expectedChainId:r,gasPrice:s,decimals:d}};var W=class extends f{constructor({chainId:e,contract:t,endpoints:r}){super(),this.contract=t,this.registry=new protoSigning.Registry,this.chainId=e,this.endpoints=r;}transformRSVSignature(e){return new Uint8Array([...encoding.fromHex(e.r),...encoding.fromHex(e.s)])}async getChainInfo(){return {...await xe(this.chainId),...this.endpoints}}async getBalance(e){try{let{restUrl:t,denom:r,decimals:n}=await this.getChainInfo(),a=await fetch(`${t}/cosmos/bank/v1beta1/balances/${e}`);if(!a.ok)throw new Error(`HTTP error! status: ${a.status}`);let p=(await a.json()).balances.find(c=>c.denom===r)?.amount??"0";return {balance:BigInt(p),decimals:n}}catch(t){throw console.error("Failed to fetch Cosmos balance:",t),new Error("Failed to fetch Cosmos balance")}}async deriveAddressAndPublicKey(e,t,r){let{prefix:n}=await this.getChainInfo(),a=await this.contract.getDerivedPublicKey({path:t,predecessor:e,keyVersion:r});if(!a)throw new Error("Failed to get derived public key");let i=l.compressPubKey(a),s=crypto.sha256(encoding.fromHex(i)),p=crypto.ripemd160(s);return {address:bech32.bech32.encode(n,bech32.bech32.toWords(p)),publicKey:i}}serializeTransaction(e){let t=tx_js.TxRaw.encode(e).finish();return encoding.toBase64(t)}deserializeTransaction(e){return tx_js.TxRaw.decode(encoding.fromBase64(e))}async prepareTransactionForSigning(e){let{denom:t,rpcUrl:r,gasPrice:n}=await this.getChainInfo(),a=encoding.fromHex(e.publicKey),i=e.gas||2e5,s=stargate.calculateFee(i,stargate.GasPrice.fromString(`${n}${t}`)),c=await(await stargate.StargateClient.connect(r)).getAccount(e.address);if(!c)throw new Error(`Account ${e.address} does not exist on chain`);let{accountNumber:d,sequence:m}=c,y={typeUrl:"/cosmos.tx.v1beta1.TxBody",value:{messages:e.messages,memo:e.memo||""}},u=this.registry.encode(y),x=protoSigning.encodePubkey(amino.encodeSecp256k1Pubkey(a)),he=protoSigning.makeAuthInfoBytes([{pubkey:x,sequence:m}],s.amount,Number(s.gas),void 0,void 0,signing_js.SignMode.SIGN_MODE_DIRECT),Ue=protoSigning.makeSignDoc(u,he,this.chainId,d),Ne=protoSigning.makeSignBytes(Ue),Ve=Array.from(crypto.sha256(Ne));return {transaction:tx_js.TxRaw.fromPartial({bodyBytes:u,authInfoBytes:he,signatures:[]}),hashesToSign:[Ve]}}finalizeTransactionSigning({transaction:e,rsvSignatures:t}){e.signatures=t.map(n=>this.transformRSVSignature(n));let r=tx_js.TxRaw.encode(e).finish();return Buffer.from(r).toString("hex")}async broadcastTx(e){try{let{rpcUrl:t}=await this.getChainInfo(),r=await stargate.StargateClient.connect(t),n=encoding.fromHex(e),a=await r.broadcastTx(n);if(a.code!==0)throw new Error(`Broadcast error: ${a.rawLog}`);return a.transactionHash}catch(t){throw console.error("Transaction broadcast failed:",t),new Error("Failed to broadcast transaction.")}}};var Ke={};g(Ke,{ChainSignatureContract:()=>v,evm:()=>oe,solana:()=>le});var ne=class{},v=class extends ne{};var oe={};g(oe,{ChainSignatureContract:()=>se,utils:()=>St});var ae={};g(ae,{abi:()=>P});var P=[{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 ie={};g(ie,{ChainSignatureError:()=>I,SignatureContractError:()=>_,SignatureNotFoundError:()=>A,SigningError:()=>q});var I=class extends Error{constructor(e,t,r){super(e),this.name="ChainSignatureError",this.requestId=t,this.receipt=r;}},A=class extends I{constructor(e,t){super("Signature not found after maximum retries",e,t),this.name="SignatureNotFoundError";}},_=class extends I{constructor(e,t,r){super(`Signature error: ${e}`,t,r),this.name="SignatureContractError",this.errorCode=e;}},q=class extends I{constructor(e,t,r){super("Error signing request",e,t),this.name="SigningError",this.originalError=r;}};var X=(o,e)=>{let t=Object.entries(J[e]).find(([r,n])=>n.toLowerCase()===o.toLowerCase())?.[0];if(t)return Y[t]};var _e=o=>{let e=viem.encodeAbiParameters([{type:"address"},{type:"bytes"},{type:"string"},{type:"uint32"},{type:"uint256"},{type:"string"},{type:"string"},{type:"string"}],[o.address,o.payload,o.path,Number(o.keyVersion),o.chainId,o.algo,o.dest,o.params]);return viem.keccak256(e)};var se=class extends v{constructor(e){super(),this.publicClient=e.publicClient,this.walletClient=e.walletClient,this.contractAddress=e.contractAddress;let t=e.rootPublicKey||X(this.contractAddress,b.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:P,functionName:"getSignatureDeposit"});return new ht__default.default(e.toString())}async getDerivedPublicKey(e){return l.deriveChildPublicKey(await this.getPublicKey(),e.predecessor.toLowerCase(),e.path,S.ETHEREUM,e.keyVersion)}async getPublicKey(){return U(this.rootPublicKey)}async getLatestKeyVersion(){let e=await this.publicClient.readContract({address:this.contractAddress,abi:P,functionName:"latestKeyVersion"});return Number(e)}async createSignatureRequest(e,t={sign:{algo:"",dest:"",params:""}}){if(!this.walletClient?.account)throw new Error("Wallet client required for signing operations");let r=await this.getSignRequestParams(e,t.sign),n=this.getRequestId(e,t.sign);return {txHash:await this.walletClient.sendTransaction({...t.transaction,account:this.walletClient.account,to:r.target,data:r.data,value:r.value,chain:this.walletClient.chain}),requestId:n}}async sign(e,t={sign:{algo:"",dest:"",params:""},retry:{delay:5e3,retryCount:12}}){let{txHash:r,requestId:n}=await this.createSignatureRequest(e,t),a=await this.publicClient.waitForTransactionReceipt({hash:r});try{let i=await this.pollForRequestId({requestId:n,payload:e.payload,path:e.path,keyVersion:e.key_version,fromBlock:a.blockNumber,options:t.retry});if(!i)throw new A(n,a);if("error"in i)throw new _(i.error,n,a);return i}catch(i){throw i instanceof A||i instanceof _?i:new q(n,a,i instanceof Error?i:void 0)}}async pollForRequestId({requestId:e,payload:t,path:r,keyVersion:n,fromBlock:a,options:i}){let s=i?.delay??5e3,p=i?.retryCount??12,c=await viem.withRetry(async()=>{let d=await this.getSignatureFromEvents(e,a);if(d){if(!await N(d,t,this.walletClient.account?.address,r,this,n))throw new Error("Signature not found yet");return d}else throw new Error("Signature not found yet")},{delay:s,retryCount:p,shouldRetry:({count:d,error:m})=>(console.log(`Retrying get signature: ${d}/${p}`),m.message==="Signature not found yet")});return c||await 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:viem.encodeFunctionData({abi:P,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");if(!this.publicClient.chain?.id)throw new Error("Public client chain required to compute requestId");return _e({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:BigInt(this.publicClient.chain.id)})}async getErrorFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:P,eventName:"SignatureError",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:n}=r[r.length-1];return n}}async getSignatureFromEvents(e,t){let r=await this.publicClient.getContractEvents({address:this.contractAddress,abi:P,eventName:"SignatureResponded",args:{requestId:e},fromBlock:t,toBlock:"latest"});if(r.length>0){let{args:n}=r[r.length-1];return l.toRSV(n.signature)}}};var St={ChainSignaturesContractABI:ae,errors:ie};var le={};g(le,{ChainSignatureContract:()=>ye,utils:()=>Nt});var pe={};g(pe,{ResponseError:()=>ce,SignatureContractError:()=>B,SignatureNotFoundError:()=>k,SigningError:()=>K});var k=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;}},B=class extends Error{constructor(e,t,r){super(e),this.name="SignatureContractError",this.requestId=t,this.hash=r?.hash;}},K=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;}},ce=class extends Error{constructor(e){super(e),this.name="ResponseError";}};var de={};g(de,{accounts:()=>Et,address:()=>Tt,default:()=>ue,errors:()=>Pt,events:()=>Ct,instructions:()=>wt,metadata:()=>vt,types:()=>xt});var Tt="H5tHfpYoEnarrrzcV7sWBcZhiKMvL2aRpUYvb1ydWkwS",vt={name:"chain_signatures",version:"0.4.0",spec:"0.1.0",description:"Chain signatures program for cross-chain signing on Solana",repository:"https://github.com/sig-net/signet-solana-program"},wt=[{name:"get_signature_deposit",docs:[`* @dev Function to get the current signature deposit amount.
|
|
2
|
+
* @return The current signature deposit amount.`],discriminator:[45,243,86,86,58,57,172,253],accounts:[{name:"program_state",pda:{seeds:[{kind:"const",value:[112,114,111,103,114,97,109,45,115,116,97,116,101]}]}}],args:[],returns:"u64"},{name:"initialize",docs:[`* @dev Function to initialize the program state.
|
|
3
|
+
* @param signature_deposit The deposit required for signature requests.
|
|
4
|
+
* @param chain_id The CAIP-2 chain identifier.`],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:"chain_id",type:"string"}]},{name:"respond",docs:[`* @dev Function to respond to signature requests.
|
|
5
|
+
* @param request_ids The array of request IDs.
|
|
6
|
+
* @param signatures The array of signature responses.
|
|
7
|
+
* @notice When multiple entries reuse a request id, events emit in canonical signature order (PSBT-style).`],discriminator:[72,65,227,97,42,255,147,12],accounts:[{name:"responder",signer:true},{name:"event_authority",pda:{seeds:[{kind:"const",value:[95,95,101,118,101,110,116,95,97,117,116,104,111,114,105,116,121]}]}},{name:"program"}],args:[{name:"request_ids",type:{vec:{array:["u8",32]}}},{name:"signatures",type:{vec:{defined:{name:"Signature"}}}}]},{name:"respond_bidirectional",docs:[`* @dev Function to finalize bidirectional flow
|
|
8
|
+
* @param request_id The ID of the signature request to respond to
|
|
9
|
+
* @param serialized_output output of the previously executed transaction
|
|
10
|
+
* @param signature ECDSA signature of the serialized output and request_id (keccak256(request_id.concat(serialized_output)))`],discriminator:[138,0,45,246,236,211,109,81],accounts:[{name:"responder",signer:true}],args:[{name:"request_id",type:{array:["u8",32]}},{name:"serialized_output",type:"bytes"},{name:"signature",type:{defined:{name:"Signature"}}}]},{name:"respond_error",docs:[`* @dev Function to emit signature generation errors.
|
|
11
|
+
* @param errors The array of signature generation errors.`],discriminator:[3,170,41,132,72,184,252,69],accounts:[{name:"responder",signer:true}],args:[{name:"errors",type:{vec:{defined:{name:"ErrorResponse"}}}}]},{name:"sign",docs:[`* @dev Function to request a signature.
|
|
12
|
+
* @param payload The payload to be signed.
|
|
13
|
+
* @param key_version The version of the key used for signing.
|
|
14
|
+
* @param path The derivation path for the user account.
|
|
15
|
+
* @param algo The algorithm used for signing.
|
|
16
|
+
* @param dest The response destination.
|
|
17
|
+
* @param params Additional parameters.`],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"},{name:"event_authority",pda:{seeds:[{kind:"const",value:[95,95,101,118,101,110,116,95,97,117,116,104,111,114,105,116,121]}]}},{name:"program"}],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:"sign_bidirectional",docs:[`* @dev Function to initiate bidirectional flow
|
|
18
|
+
* @param serialized_transaction transaction to be signed
|
|
19
|
+
* @param caip2_id chain identifier
|
|
20
|
+
* @param key_version The version of the key used for signing.
|
|
21
|
+
* @param path The derivation path for the user account.
|
|
22
|
+
* @param algo The algorithm used for signing.
|
|
23
|
+
* @param dest The response destination.
|
|
24
|
+
* @param params Additional parameters.
|
|
25
|
+
* @param program_id Program ID to callback after execution (not yet enabled).
|
|
26
|
+
* @param output_deserialization_schema schema for transaction output deserialization
|
|
27
|
+
* @param respond_serialization_schema serialization schema for respond_bidirectional payload`],discriminator:[21,104,182,213,189,143,219,48],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"},{name:"instructions",optional:true},{name:"event_authority",pda:{seeds:[{kind:"const",value:[95,95,101,118,101,110,116,95,97,117,116,104,111,114,105,116,121]}]}},{name:"program"}],args:[{name:"serialized_transaction",type:"bytes"},{name:"caip2_id",type:"string"},{name:"key_version",type:"u32"},{name:"path",type:"string"},{name:"algo",type:"string"},{name:"dest",type:"string"},{name:"params",type:"string"},{name:"program_id",type:"pubkey"},{name:"output_deserialization_schema",type:"bytes"},{name:"respond_serialization_schema",type:"bytes"}]},{name:"update_deposit",docs:[`* @dev Function to set the signature deposit amount.
|
|
28
|
+
* @param new_deposit The new deposit amount.`],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",docs:[`* @dev Function to withdraw funds from the program.
|
|
29
|
+
* @param amount The amount to withdraw.`],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"}]}],Et=[{name:"ProgramState",discriminator:[77,209,137,229,149,67,167,230]}],Ct=[{name:"DepositUpdatedEvent",discriminator:[215,193,53,27,221,101,249,108]},{name:"FundsWithdrawnEvent",discriminator:[86,232,194,4,211,69,172,202]},{name:"RespondBidirectionalEvent",discriminator:[195,195,28,1,102,100,189,234]},{name:"SignBidirectionalEvent",discriminator:[135,205,217,152,96,187,11,124]},{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]}],Pt=[{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"},{code:6005,name:"InvalidTransaction",msg:"Invalid transaction data"},{code:6006,name:"MissingInstructionSysvar",msg:"Missing instruction sysvar"}],xt=[{name:"AffinePoint",type:{kind:"struct",fields:[{name:"x",type:{array:["u8",32]}},{name:"y",type:{array:["u8",32]}}]}},{name:"DepositUpdatedEvent",docs:[`* @dev Emitted when the deposit amount is updated.
|
|
30
|
+
* @param old_deposit The previous deposit amount.
|
|
31
|
+
* @param new_deposit The new deposit amount.`],type:{kind:"struct",fields:[{name:"old_deposit",type:"u64"},{name:"new_deposit",type:"u64"}]}},{name:"ErrorResponse",type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"error_message",type:"string"}]}},{name:"FundsWithdrawnEvent",docs:[`* @dev Emitted when a withdrawal is made.
|
|
32
|
+
* @param amount The amount withdrawn.
|
|
33
|
+
* @param recipient The address of the recipient.`],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:"chain_id",type:"string"}]}},{name:"RespondBidirectionalEvent",docs:[`* @dev Emitted when a read response is received.
|
|
34
|
+
* @param request_id The ID of the request. Must be calculated off-chain.
|
|
35
|
+
* @param responder The address of the responder.
|
|
36
|
+
* @param serialized_output The serialized output.
|
|
37
|
+
* @param signature The signature.`],type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"responder",type:"pubkey"},{name:"serialized_output",type:"bytes"},{name:"signature",type:{defined:{name:"Signature"}}}]}},{name:"SignBidirectionalEvent",docs:[`* @dev Emitted when a sign_bidirectional request is made.
|
|
38
|
+
* @param sender The address of the sender.
|
|
39
|
+
* @param serialized_transaction The serialized transaction to be signed.
|
|
40
|
+
* @param caip2_id The SLIP-44 chain ID.
|
|
41
|
+
* @param key_version The version of the key used for signing.
|
|
42
|
+
* @param deposit The deposit amount.
|
|
43
|
+
* @param path The derivation path for the user account.
|
|
44
|
+
* @param algo The algorithm used for signing.
|
|
45
|
+
* @param dest The response destination.
|
|
46
|
+
* @param params Additional parameters.
|
|
47
|
+
* @param program_id Program ID to callback after execution (not yet enabled).
|
|
48
|
+
* @param output_deserialization_schema Schema for transaction output deserialization.
|
|
49
|
+
* @param respond_serialization_schema Serialization schema for respond_bidirectional payload.`],type:{kind:"struct",fields:[{name:"sender",type:"pubkey"},{name:"serialized_transaction",type:"bytes"},{name:"caip2_id",type:"string"},{name:"key_version",type:"u32"},{name:"deposit",type:"u64"},{name:"path",type:"string"},{name:"algo",type:"string"},{name:"dest",type:"string"},{name:"params",type:"string"},{name:"program_id",type:"pubkey"},{name:"output_deserialization_schema",type:"bytes"},{name:"respond_serialization_schema",type:"bytes"}]}},{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",docs:[`* @dev Emitted when a signature error is received.
|
|
50
|
+
* @notice Any address can emit this event. Do not rely on it for business logic.
|
|
51
|
+
* @param request_id The ID of the request. Must be calculated off-chain.
|
|
52
|
+
* @param responder The address of the responder.
|
|
53
|
+
* @param error The error message.`],type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"responder",type:"pubkey"},{name:"error",type:"string"}]}},{name:"SignatureRequestedEvent",docs:[`* @dev Emitted when a signature is requested.
|
|
54
|
+
* @param sender The address of the sender.
|
|
55
|
+
* @param payload The payload to be signed.
|
|
56
|
+
* @param key_version The version of the key used for signing.
|
|
57
|
+
* @param deposit The deposit amount.
|
|
58
|
+
* @param chain_id The CAIP-2 ID of the blockchain.
|
|
59
|
+
* @param path The derivation path for the user account.
|
|
60
|
+
* @param algo The algorithm used for signing.
|
|
61
|
+
* @param dest The response destination.
|
|
62
|
+
* @param params Additional parameters.
|
|
63
|
+
* @param fee_payer Optional fee payer account.`],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:"string"},{name:"path",type:"string"},{name:"algo",type:"string"},{name:"dest",type:"string"},{name:"params",type:"string"},{name:"fee_payer",type:{option:"pubkey"}}]}},{name:"SignatureRespondedEvent",docs:[`* @dev Emitted when a signature response is received.
|
|
64
|
+
* @notice Any address can emit this event. Clients should always verify the validity of the signature.
|
|
65
|
+
* @param request_id The ID of the request. Must be calculated off-chain.
|
|
66
|
+
* @param responder The address of the responder.
|
|
67
|
+
* @param signature The signature response.`],type:{kind:"struct",fields:[{name:"request_id",type:{array:["u8",32]}},{name:"responder",type:"pubkey"},{name:"signature",type:{defined:{name:"Signature"}}}]}}],ue={address:Tt,metadata:vt,instructions:wt,accounts:Et,events:Ct,errors:Pt,types:xt};var Rt=Buffer.from([228,69,165,46,81,203,154,29]),M=class{static async parseCpiEvents(e,t,r,n){let a=[];try{let i=await e.getParsedTransaction(t,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!i?.meta?.innerInstructions)return a;for(let s of i.meta.innerInstructions)for(let p of s.instructions){if(!("programId"in p)||!("data"in p)||p.programId.toString()!==r)continue;let c=this.parseInstruction(p.data,n);c&&a.push(c);}}catch{}return a}static parseInstruction(e,t){try{let r=me__namespace.utils.bytes.bs58.decode(e);if(r.length<16)return null;let n=r.subarray(0,8);if(Buffer.compare(n,Rt)!==0)return null;let a=r.subarray(8,16);if(!t.idl.events?.find(c=>{let d=Buffer.from(c.discriminator);return Buffer.compare(a,d)===0}))return null;let s=r.subarray(8);return t.coder.events.decode(me__namespace.utils.bytes.base64.encode(s))}catch{return null}}static subscribeToCpiEvents(e,t,r){return e.onLogs(t.programId,(n,a)=>{n.err||(async()=>{let i=await this.parseCpiEvents(e,n.signature,t.programId.toString(),t);for(let s of i){let p=r.get(s.name);if(p)try{await p(s.data,a.slot);}catch{}}})();},"confirmed")}};function ke({address:o,payload:e,path:t,keyVersion:r,chainId:n,algo:a,dest:i,params:s}){let p="0x"+Buffer.from(e).toString("hex"),c=viem.encodeAbiParameters(viem.parseAbiParameters("string, bytes, string, uint32, string, string, string, string"),[o,p,t,r,n,a,i,s]);return viem.keccak256(c)}var ye=class extends v{constructor(e){super(),this.provider=e.provider,this.requesterAddress=e.config?.requesterAddress??this.provider.wallet.publicKey.toString(),this.programId=typeof e.programId=="string"?new web3_js.PublicKey(e.programId):e.programId;let t=e.config?.idl||ue;this.program=new me.Program({...t,address:this.programId.toString()},this.provider);let r=e.config?.rootPublicKey||X(this.programId.toString(),b.SOLANA);if(!r)throw new Error("Invalid public key, please provide a valid root public key or program ID");this.rootPublicKey=r;}get connection(){return this.provider.connection}async getCurrentSignatureDeposit(){try{let e=await this.getProgramStatePDA(),t=await this.program.account.programState.fetch(e);return new ht__default.default(t.signatureDeposit.toString())}catch(e){throw new Error(`Failed to get signature deposit: ${e instanceof Error?e.message:String(e)}`)}}async getProgramStatePDA(){let[e]=web3_js.PublicKey.findProgramAddressSync([Buffer.from("program-state")],this.programId);return e}async getDerivedPublicKey(e){return l.deriveChildPublicKey(await this.getPublicKey(),e.predecessor,e.path,S.SOLANA,e.keyVersion)}async getPublicKey(){return U(this.rootPublicKey)}async getSignRequestInstruction(e,t){let r=[{pubkey:web3_js.PublicKey.findProgramAddressSync([Buffer.from("__event_authority")],this.program.programId)[0],isWritable:false,isSigner:false},{pubkey:this.program.programId,isWritable:false,isSigner:false}];return 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:this.requesterAddress,feePayer:this.provider.wallet.publicKey,program:this.programId}).remainingAccounts([...r,...t?.remainingAccounts??[]]).instruction()}async sign(e,t){let r=t?.sign?.algo??"",n=t?.sign?.dest??"",a=t?.sign?.params??"",i=t?.retry?.delay??5e3,s=t?.retry?.retryCount??12;if(t?.remainingAccounts?.filter(u=>u.isSigner)?.some(u=>!t?.remainingSigners?.some(x=>x.publicKey.equals(u.pubkey))))throw new Error("All accounts marked as signers must have a corresponding signer");let c=this.getRequestId(e,{algo:r,dest:n,params:a}),d=await this.getSignRequestInstruction(e,{sign:{algo:r,dest:n,params:a},remainingAccounts:t?.remainingAccounts}),m=new web3_js.Transaction().add(d);m.feePayer=this.provider.wallet.publicKey;let y=await this.sendAndConfirmWithoutWebSocket(m,t?.remainingSigners);try{let u=await this.pollForRequestId({requestId:c,payload:e.payload,path:e.path,afterSignature:y,options:{delay:i,retryCount:s}});if(!u)throw new k(c,{hash:y});if("error"in u)throw new B(u.error,c,{hash:y});if(!await N(u,e.payload,this.requesterAddress,e.path,this,e.key_version))throw new K(c,{hash:y},new Error("Signature verification failed: recovered address does not match expected address"));return u}catch(u){throw u instanceof k||u instanceof B?u:new K(c,{hash:y},u instanceof Error?u:void 0)}}async sendAndConfirmWithoutWebSocket(e,t){let{blockhash:r}=await this.provider.connection.getLatestBlockhash("confirmed");e.recentBlockhash=r,e=await this.provider.wallet.signTransaction(e),t&&t.length>0&&e.partialSign(...t);let n=await this.provider.connection.sendRawTransaction(e.serialize(),{skipPreflight:false,preflightCommitment:"processed",maxRetries:3}),a=Date.now(),i=3e4;for(;Date.now()-a<i;){let s=await this.provider.connection.getSignatureStatus(n);if(s.value?.err)throw new Error(`Transaction failed: ${JSON.stringify(s.value.err)}`);if(s.value?.confirmationStatus==="confirmed"||s.value?.confirmationStatus==="finalized")return n;await new Promise(p=>setTimeout(p,2e3));}throw new web3_js.TransactionExpiredTimeoutError(n,i/1e3)}async pollForRequestId({requestId:e,payload:t,path:r,afterSignature:n,options:a}){let i=a?.delay??5e3,s=a?.retryCount??12,p=n;for(let c=0;c<s;c++){try{let d=await this.connection.getSignaturesForAddress(this.programId,{until:p,limit:50},"confirmed");d.length>0&&(p=d[d.length-1].signature);for(let m of d){let y=await this.connection.getParsedTransaction(m.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(y?.meta?.logMessages){let u=await this.parseLogsForEvents(y.meta.logMessages,e,m.signature);if(u)return u}}}catch(d){console.error("Error checking for events:",d);}c<s-1&&(console.log(`Retrying get signature: ${c+1}/${s}`),await new Promise(d=>setTimeout(d,i)));}}async parseLogsForEvents(e,t,r){let n=await M.parseCpiEvents(this.connection,r,this.programId.toString(),this.program);for(let i of n){let s=this.mapEventToResult(i.name,(i.name==="signatureRespondedEvent",i.data),t);if(s)return s}let a=new me.EventParser(this.program.programId,this.program.coder);for(let i of a.parseLogs(e)){if(!i)continue;let s=this.mapEventToResult(i.name,(i.name==="signatureRespondedEvent",i.data),t);if(s)return s}}mapEventToResult(e,t,r){let n="0x"+Buffer.from(t.requestId).toString("hex");if(e==="signatureRespondedEvent"&&n===r){let a=t;return {r:Buffer.from(a.signature.bigR.x).toString("hex"),s:Buffer.from(a.signature.s).toString("hex"),v:a.signature.recoveryId+27}}if(e==="signatureErrorEvent"&&n===r)return {requestId:n,error:t.error}}getRequestId(e,t={algo:"",dest:"",params:""}){return ke({payload:e.payload,path:e.path,keyVersion:e.key_version,algo:t.algo||"",dest:t.dest||"",params:t.params||"",address:this.requesterAddress,chainId:S.SOLANA})}async subscribeToEvents(e){let t="confirmed",r=new Map;if(e.onSignatureResponded){let s=e.onSignatureResponded;r.set("signatureRespondedEvent",async(p,c)=>{await s(p,c);});}if(e.onSignatureError){let s=e.onSignatureError;r.set("signatureErrorEvent",async(p,c)=>{await s(p,c);});}let n=M.subscribeToCpiEvents(this.connection,this.program,r),a=new me.EventParser(this.program.programId,this.program.coder),i=this.connection.onLogs(this.program.programId,(s,p)=>{if(!s.err){for(let c of a.parseLogs(s.logs))if(c){if(c.name==="signatureRespondedEvent"){let d=e.onSignatureResponded;d&&d(c.data,p.slot);}if(c.name==="signatureErrorEvent"){let d=e.onSignatureError;d&&d(c.data,p.slot);}}}},t);return async()=>{await this.connection.removeOnLogsListener(i),await this.connection.removeOnLogsListener(n);}}};var Nt={ChainSignaturesContractIdl:de,errors:pe};exports.chainAdapters=F;exports.constants=fe;exports.contracts=Ke;exports.utils=Se;//# sourceMappingURL=index.browser.cjs.map
|
|
3
68
|
//# sourceMappingURL=index.browser.cjs.map
|