UNPKG

@avalanche-sdk/client

Version:

A TypeScript SDK for interacting with the Avalanche network through JSON-RPC APIs. This SDK provides a comprehensive set of tools to interact with all Avalanche chains (P-Chain, X-Chain, C-Chain) and various APIs, including wallet functionality for transa

2 lines (1 loc) 12.1 kB
import{Id as e,utils as t,secp256k1 as n,Utxo as r,evm as i}from"@avalabs/avalanchejs";import"viem";function s(e){return function(e,{strict:t=!0}={}){return!!e&&"string"==typeof e&&(t?/^0x[0-9a-fA-F]*$/.test(e):e.startsWith("0x"))}(e,{strict:!1})?Math.ceil((e.length-2)/2):e.length}const a="2.38.6";let o=({docsBaseUrl:e,docsPath:t="",docsSlug:n})=>t?`${e??"https://viem.sh"}${t}${n?`#${n}`:""}`:void 0,c=`viem@${a}`;class u extends Error{constructor(e,t={}){const n=t.cause instanceof u?t.cause.details:t.cause?.message?t.cause.message:t.details,r=t.cause instanceof u&&t.cause.docsPath||t.docsPath,i=o?.({...t,docsPath:r});super([e||"An error occurred.","",...t.metaMessages?[...t.metaMessages,""]:[],...i?[`Docs: ${i}`]:[],...n?[`Details: ${n}`]:[],...c?[`Version: ${c}`]:[]].join("\n"),t.cause?{cause:t.cause}:void 0),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"metaMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"version",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BaseError"}),this.details=n,this.docsPath=r,this.metaMessages=t.metaMessages,this.name=t.name??this.name,this.shortMessage=e,this.version=a}walk(e){return l(this,e)}}function l(e,t){return t?.(e)?e:e&&"object"==typeof e&&"cause"in e&&void 0!==e.cause?l(e.cause,t):t?null:e}class d extends u{constructor({size:e,targetSize:t,type:n}){super(`${n.charAt(0).toUpperCase()}${n.slice(1).toLowerCase()} size (${e}) exceeds padding size (${t}).`,{name:"SizeExceedsPaddingSizeError"})}}function f(e,{dir:t,size:n=32}={}){return"string"==typeof e?function(e,{dir:t,size:n=32}={}){if(null===n)return e;const r=e.replace("0x","");if(r.length>2*n)throw new d({size:Math.ceil(r.length/2),targetSize:n,type:"hex"});return`0x${r["right"===t?"padEnd":"padStart"](2*n,"0")}`}(e,{dir:t,size:n}):function(e,{dir:t,size:n=32}={}){if(null===n)return e;if(e.length>n)throw new d({size:e.length,targetSize:n,type:"bytes"});const r=new Uint8Array(n);for(let i=0;i<n;i++){const s="right"===t;r[s?i:n-i-1]=e[s?i:e.length-i-1]}return r}(e,{dir:t,size:n})}class h extends u{constructor({max:e,min:t,signed:n,size:r,value:i}){super(`Number "${i}" is not in safe ${r?`${8*r}-bit ${n?"signed":"unsigned"} `:""}integer range ${e?`(${t} to ${e})`:`(above ${t})`}`,{name:"IntegerOutOfRangeError"})}}class p extends u{constructor({givenSize:e,maxSize:t}){super(`Size cannot exceed ${t} bytes. Given size: ${e} bytes.`,{name:"SizeOverflowError"})}}function g(e,{size:t}){if(s(e)>t)throw new p({givenSize:s(e),maxSize:t})}function m(e,t={}){return Number(function(e,t={}){const{signed:n}=t;t.size&&g(e,{size:t.size});const r=BigInt(e);if(!n)return r;const i=(e.length-2)/2;return r<=(1n<<8n*BigInt(i)-1n)-1n?r:r-BigInt(`0x${"f".padStart(2*i,"f")}`)-1n}(e,t))}function x(e,t={}){const{signed:n,size:r}=t,i=BigInt(e);let s;r?s=n?(1n<<8n*BigInt(r)-1n)-1n:2n**(8n*BigInt(r))-1n:"number"==typeof e&&(s=BigInt(Number.MAX_SAFE_INTEGER));const a="bigint"==typeof s&&n?-s-1n:0;if(s&&i>s||i<a){const t="bigint"==typeof e?"n":"";throw new h({max:s?`${s}${t}`:void 0,min:`${a}${t}`,signed:n,size:r,value:`${e}${t}`})}const o=`0x${(n&&i<0?(1n<<BigInt(8*r))+BigInt(i):i).toString(16)}`;return r?f(o,{size:r}):o}function b(e){return"string"==typeof e?{address:e,type:"json-rpc"}:e}async function y(e,{address:t,blockTag:n="latest",blockNumber:r}){return m(await e.request({method:"eth_getTransactionCount",params:[t,"bigint"==typeof r?x(r):n]},{dedupe:Boolean(r)}))}async function w(e){return e.request({method:"eth_baseFee",params:[]})}async function v(e,t){return e.request({method:"info.getBlockchainID",params:t})}new e(new Uint8Array(32)),new e(new Uint8Array(32));const I=1,B=2,$=3,z=4,A=5,C=10,P=12345,k={[I]:"avax",[B]:"cascade",[$]:"denali",[z]:"everest",[A]:"fuji",[C]:"testing",[P]:"local"},S=e=>k[e]??"custom",E=async(e,t="AVAX")=>{const{assetID:n}=await async function(e,t){return e.request({method:"avm.getAssetDescription",params:t})}(e.xChainClient,{assetID:t}),{txFee:r,createAssetTxFee:i}=await async function(e){return e.request({method:"avm.getTxFee",params:{}})}(e.xChainClient),{blockchainID:s}=await v(e.infoClient,{alias:"X"}),{blockchainID:a}=await v(e.infoClient,{alias:"P"}),{blockchainID:o}=await v(e.infoClient,{alias:"C"}),{networkID:c}=await async function(e){return e.request({method:"info.getNetworkID",params:{}})}(e.infoClient),u=Number(c),l=await async function(e){const t=await e.request({method:"platform.getFeeConfig",params:{}});return{...t,maxCapacity:BigInt(t.maxCapacity),maxPerSecond:BigInt(t.maxPerSecond),minPrice:BigInt(t.minPrice),targetPerSecond:BigInt(t.targetPerSecond),excessConversionConstant:BigInt(t.excessConversionConstant)}}(e.pChainClient);return Object.freeze({xBlockchainID:s,pBlockchainID:a,cBlockchainID:o,avaxAssetID:n,baseTxFee:BigInt(r),createAssetTxFee:BigInt(i),networkID:u,hrp:S(u),platformFeeConfig:l})},D=2n**256n,T=D-0x1000003d1n,N=D-0x14551231950b75fc4402da1732fc9bebfn,j={a:0n,b:7n},M=e=>K(K(e*e)*e+j.b),q=(e="")=>{throw new Error(e)},O=e=>"bigint"==typeof e,U=e=>"string"==typeof e,F=e=>O(e)&&0n<e&&e<T,V=e=>O(e)&&0n<e&&e<N,R=e=>new Uint8Array(e),H=(e,t)=>((e,t)=>!(e instanceof Uint8Array)||"number"==typeof t&&t>0&&e.length!==t?q("Uint8Array expected"):e)(U(e)?Z(e):R(e),t),K=(e,t=T)=>{let n=e%t;return n>=0n?n:t+n},J=e=>e instanceof X?e:q("Point expected");let Q;class X{constructor(e,t,n){this.px=e,this.py=t,this.pz=n}static fromAffine(e){return new X(e.x,e.y,1n)}static fromHex(e){let t;const n=(e=H(e))[0],r=e.subarray(1),i=ee(r,0,32),s=e.length;if(33===s&&[2,3].includes(n)){F(i)||q("Point hex invalid: x not FE");let e=re(M(i));!(1&~n)!==(1n==(1n&e))&&(e=K(-e)),t=new X(i,e,1n)}return 65===s&&4===n&&(t=new X(i,ee(r,32,64),1n)),t?t.ok():q("Point is not on curve")}static fromPrivateKey(e){return Y.mul(ie(e))}get x(){return this.aff().x}get y(){return this.aff().y}equals(e){const{px:t,py:n,pz:r}=this,{px:i,py:s,pz:a}=J(e),o=K(t*a),c=K(i*r),u=K(n*a),l=K(s*r);return o===c&&u===l}negate(){return new X(this.px,K(-this.py),this.pz)}double(){return this.add(this)}add(e){const{px:t,py:n,pz:r}=this,{px:i,py:s,pz:a}=J(e),{a:o,b:c}=j;let u=0n,l=0n,d=0n;const f=K(3n*c);let h=K(t*i),p=K(n*s),g=K(r*a),m=K(t+n),x=K(i+s);m=K(m*x),x=K(h+p),m=K(m-x),x=K(t+r);let b=K(i+a);return x=K(x*b),b=K(h+g),x=K(x-b),b=K(n+r),u=K(s+a),b=K(b*u),u=K(p+g),b=K(b-u),d=K(o*x),u=K(f*g),d=K(u+d),u=K(p-d),d=K(p+d),l=K(u*d),p=K(h+h),p=K(p+h),g=K(o*g),x=K(f*x),p=K(p+g),g=K(h-g),g=K(o*g),x=K(x+g),h=K(p*x),l=K(l+h),h=K(b*x),u=K(m*u),u=K(u-h),h=K(m*p),d=K(b*d),d=K(d+h),new X(u,l,d)}mul(e,t=!0){if(!t&&0n===e)return _;if(V(e)||q("invalid scalar"),this.equals(Y))return se(e).p;let n=_,r=Y;for(let i=this;e>0n;i=i.double(),e>>=1n)1n&e?n=n.add(i):t&&(r=r.add(i));return n}mulAddQUns(e,t,n){return this.mul(t,!1).add(e.mul(n,!1)).ok()}toAffine(){const{px:e,py:t,pz:n}=this;if(this.equals(_))return{x:0n,y:0n};if(1n===n)return{x:e,y:t};const r=ne(n);return 1n!==K(n*r)&&q("invalid inverse"),{x:K(e*r),y:K(t*r)}}assertValidity(){const{x:e,y:t}=this.aff();return F(e)&&F(t)||q("Point invalid: x or y"),K(t*t)===M(e)?this:q("Point invalid: not on curve")}multiply(e){return this.mul(e)}aff(){return this.toAffine()}ok(){return this.assertValidity()}toHex(e=!0){const{x:t,y:n}=this.aff();return(e?0n==(1n&n)?"02":"03":"04")+te(t)+(e?"":te(n))}toRawBytes(e=!0){return Z(this.toHex(e))}}X.BASE=new X(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,1n),X.ZERO=new X(0n,1n,0n);const{BASE:Y,ZERO:_}=X,L=(e,t)=>e.toString(16).padStart(t,"0"),W=e=>Array.from(e).map(e=>L(e,2)).join(""),Z=e=>{const t=e.length;(!U(e)||t%2)&&q("hex invalid 1");const n=R(t/2);for(let t=0;t<n.length;t++){const r=2*t,i=e.slice(r,r+2),s=Number.parseInt(i,16);(Number.isNaN(s)||s<0)&&q("hex invalid 2"),n[t]=s}return n},G=e=>BigInt("0x"+(W(e)||"0")),ee=(e,t,n)=>G(e.slice(t,n)),te=e=>W((e=>O(e)&&e>=0n&&e<D?Z(L(e,64)):q("bigint expected"))(e)),ne=(e,t=T)=>{(0n===e||t<=0n)&&q("no inverse n="+e+" mod="+t);let n=K(e,t),r=t,i=0n,s=1n;for(;0n!==n;){const e=r%n,t=i-s*(r/n);r=n,n=e,i=s,s=t}return 1n===r?K(i,t):q("no inverse")},re=e=>{let t=1n;for(let n=e,r=(T+1n)/4n;r>0n;r>>=1n)1n&r&&(t=t*n%T),n=n*n%T;return K(t*t)===e?t:q("sqrt invalid")},ie=e=>(O(e)||(e=G(H(e,32))),V(e)?e:q("private key out of range")),se=e=>{const t=Q||(Q=(()=>{const e=[];let t=Y,n=t;for(let r=0;r<33;r++){n=t,e.push(n);for(let r=1;r<128;r++)n=n.add(t),e.push(n);t=n.double()}return e})()),n=(e,t)=>{let n=t.negate();return e?n:t};let r=_,i=Y;const s=BigInt(255),a=BigInt(8);for(let o=0;o<33;o++){const c=128*o;let u=Number(e&s);e>>=a,u>128&&(u-=256,e+=1n);const l=c,d=c+Math.abs(u)-1,f=o%2!=0,h=u<0;0===u?i=i.add(n(f,t[l])):r=r.add(n(h,t[d]))}return{p:r,f:i}};function ae(e,r){const i=X.fromHex(t.strip0x(e)),s=new Uint8Array(i.toRawBytes(!0)),a=n.publicKeyBytesToAddress(s);return t.formatBech32(r,a)}function oe(e){return"string"==typeof e?{evmAccount:b(e)}:e}function ce(e,n){let i;i="string"==typeof e?t.hexToBuffer(e):e;return t.getManagerForVM("EVM").unpack(i,r)}const ue="C";function le(e){return e.includes("-")?t.bech32ToBytes(e):t.bech32ToBytes(`P-${e}`)}function de(e){return e/BigInt(1e9)}function fe(e,t){if(1!==t&&5!==t)throw new Error(`Invalid network ID: ${t}`);switch(e){case"X":return 1===t?"2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM":"2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm";case ue:return 1===t?"2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5":"yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp";case"P":return"11111111111111111111111111111111LpoYY";default:throw new Error(`Invalid chain alias: ${e}`)}}function he(e,n,r,s,a,o=0n){const c=function(e,n,r,s,a,o=0n,c){const u=i.newImportTx(e,n,r,s,a,o,c);return o*t.costCorethTx(u)}(e,n,r,s,a,o);let u=de(c);return 0n===u&&(u=1n),i.newImportTx(e,n,r,s,a,u)}async function pe(e,n){const r=n.context||await E(e),[s,a]=await Promise.all([y(e,{address:`0x${t.strip0x(n.fromAddress)}`}),w(e)]),o=n.exportedOutput.addresses.map(e=>le(e)),c=function(e,t,n,r,s,a,o){let c=de(i.estimateExportCost(e,t,n,r,s,a,o));return 0n===c&&(c=1n),i.newExportTx(e,n,r,s,a,c,o)}(r,BigInt(a),n.exportedOutput.amount,fe(n.destinationChain,r.networkID),t.hexToBuffer(n.fromAddress),o,BigInt(s));return{tx:c,exportTx:c.getTx(),chainAlias:"C"}}async function ge(e,n){const{account:r}=n,i=n.context||await E(e),s=await w(e),a=function(e,t){if(e)return e.map(e=>function(e,t){if(e)return e.startsWith(t)?e:`${t}-${1===e.split("-").length?e:e.split("-")[1]}`}(e,t)).filter(e=>void 0!==e)}(n.fromAddresses,ue)||[];if(0===a.length){const t=oe(r),n=await async function(e,t,n,r){const i=oe(t)?.xpAccount||e.xpAccount,s=oe(t)?.evmAccount||e.account;if(!i||!s){const{xp:t,evm:i}=await async function(e){return e.request({method:"avalanche_getAccountPubKey",params:{}})}(e);return`${n}-${ae(i,r)}`}if(!s.publicKey)throw new Error("EVM public key not found for evm account");return`${n}-${ae(s.publicKey,r)}`}(e,t,ue,i.hrp);a.push(n)}const o=a.map(e=>le(e));let c=n.utxos||[];c.length||(c=(await Promise.all(a.map(async t=>await async function(e,t){const n=t=>async function(e,t){return e.request({method:"avax.getUTXOs",params:t})}(e.cChainClient,t),r=[];let i,s=!1;do{const e=await n({addresses:[t.address],...t.sourceChain?{sourceChain:t.sourceChain}:{},...void 0===i?{}:{startIndex:i}});if(r.push(...e.utxos.map(e=>ce(e))),Number(e.numFetched)>=1024?(s=!0,i={address:e.endIndex.address,utxo:e.endIndex.utxo}):s=!1,r.length>=5e3)break}while(s);return r}(e,{address:t,sourceChain:fe(n.sourceChain,i.networkID)})))).flat());const u=he(i,t.hexToBuffer(n.toAddress),o,c,fe(n.sourceChain,i.networkID),BigInt(s));return{tx:u,importTx:u.getTx(),chainAlias:ue}}export{pe as prepareExportTxn,ge as prepareImportTxn};