@gardenfi/utils 3.1.1-beta.7 → 3.1.1-beta.9

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/dist/index10.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("tough-cookie"),g=require("fetch-cookie"),k=require("./index14.cjs"),f=require("./index15.cjs"),h=require("./index3.cjs"),n=require("./index5.cjs"),m=require("./index25.cjs"),y=require("./index26.cjs"),C=require("./index22.cjs"),T=require("./index27.cjs"),v=require("./index28.cjs"),S=c=>c&&c.__esModule?c:{default:c},p=S(g);class u{constructor(t,i,e){if(this.url=t.endpoint("siwe"),this.walletClient=i,this.domain=(e==null?void 0:e.domain)||"app.garden.finance",this.domain.startsWith("https://")&&(this.domain=this.domain.split("https://")[1]),this.signingStatement=(e==null?void 0:e.signingStatement)??"Garden.fi",this.store=(e==null?void 0:e.store)??(typeof window<"u"?window.localStorage:new k.MemoryStorage),typeof window>"u"){const r=new w.CookieJar;this.fetchWithCookies=p.default(fetch,r)}else this.fetchWithCookies=window.fetch.bind(window)}static fromDigestKey(t,i,e){const r=m.createWalletClient({account:C.privateKeyToAccount(h.add0x(i.digestKey)),transport:y.http(),chain:v.mainnet});return new u(t,r,e)}verifyToken(t,i){try{const e=h.parseJwt(t);if(!e)return n.Ok(!1);const r=Math.floor(Date.now()/1e3)+120;return n.Ok(e.exp>r&&e.user_id.toLowerCase()===i.toLowerCase())}catch{return n.Ok(!1)}}async getToken(){var s;if(!((s=this.walletClient.account)!=null&&s.address))return n.Err("Wallet client does not have an account");const t=this.store.getItem(f.StoreKeys.AUTH_TOKEN);if(t){const o=this.verifyToken(t,this.walletClient.account.address);if(o.ok&&o.val)return n.Ok(t)}const i=await this.signStatement();if(i.error)return n.Err(i.error);let e;try{const a=await(await this.fetchWithCookies(this.url.endpoint("tokens"),{method:"POST",body:JSON.stringify({...i.val}),headers:{"Content-Type":"application/json"},credentials:"include"})).json();if(a.error||!a.result)return n.Err(a.error??"Failed to get token");e=a.result}catch(o){return n.Err("Failed to get token",o)}if(!this.verifyToken(e,this.walletClient.account.address).val)throw new Error("Token verification failed");return this.store.setItem(f.StoreKeys.AUTH_TOKEN,e),n.Ok(e)}async signStatement(){var a;if(!((a=this.walletClient.account)!=null&&a.address))return n.Err("Wallet client does not have a valid account");const t=new Date,i=new Date(t.getTime()+300*1e3);let e;try{const l=await(await this.fetchWithCookies(this.url.endpoint("challenges"),{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include"})).json();if(l.error||!l.result)return n.Err("Failed to get nonce");e=l.result}catch(d){return n.Err("Failed to get nonce",d)}const r=await this.walletClient.getChainId(),s=T.createSiweMessage({domain:this.domain,address:this.walletClient.account.address,statement:this.signingStatement,nonce:e,uri:"https://"+this.domain,version:"1",chainId:r,notBefore:i}),o=await this.walletClient.signMessage({account:this.walletClient.account,message:s});return n.Ok({message:s,signature:o,nonce:e})}async getAuthHeaders(){const t=await this.getToken();return t.ok?n.Ok({Authorization:h.Authorization(t.val)}):n.Err(t.error)}}exports.Siwe=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("tough-cookie"),g=require("fetch-cookie"),k=require("./index14.cjs"),f=require("./index15.cjs"),h=require("./index3.cjs"),n=require("./index5.cjs"),m=require("./index23.cjs"),y=require("./index24.cjs"),C=require("./index22.cjs"),T=require("./index25.cjs"),v=require("./index26.cjs"),S=c=>c&&c.__esModule?c:{default:c},p=S(g);class u{constructor(t,i,e){if(this.url=t.endpoint("siwe"),this.walletClient=i,this.domain=(e==null?void 0:e.domain)||"app.garden.finance",this.domain.startsWith("https://")&&(this.domain=this.domain.split("https://")[1]),this.signingStatement=(e==null?void 0:e.signingStatement)??"Garden.fi",this.store=(e==null?void 0:e.store)??(typeof window<"u"?window.localStorage:new k.MemoryStorage),typeof window>"u"){const r=new w.CookieJar;this.fetchWithCookies=p.default(fetch,r)}else this.fetchWithCookies=window.fetch.bind(window)}static fromDigestKey(t,i,e){const r=m.createWalletClient({account:C.privateKeyToAccount(h.add0x(i.digestKey)),transport:y.http(),chain:v.mainnet});return new u(t,r,e)}verifyToken(t,i){try{const e=h.parseJwt(t);if(!e)return n.Ok(!1);const r=Math.floor(Date.now()/1e3)+120;return n.Ok(e.exp>r&&e.user_id.toLowerCase()===i.toLowerCase())}catch{return n.Ok(!1)}}async getToken(){var s;if(!((s=this.walletClient.account)!=null&&s.address))return n.Err("Wallet client does not have an account");const t=this.store.getItem(f.StoreKeys.AUTH_TOKEN);if(t){const o=this.verifyToken(t,this.walletClient.account.address);if(o.ok&&o.val)return n.Ok(t)}const i=await this.signStatement();if(i.error)return n.Err(i.error);let e;try{const a=await(await this.fetchWithCookies(this.url.endpoint("tokens"),{method:"POST",body:JSON.stringify({...i.val}),headers:{"Content-Type":"application/json"},credentials:"include"})).json();if(a.error||!a.result)return n.Err(a.error??"Failed to get token");e=a.result}catch(o){return n.Err("Failed to get token",o)}if(!this.verifyToken(e,this.walletClient.account.address).val)throw new Error("Token verification failed");return this.store.setItem(f.StoreKeys.AUTH_TOKEN,e),n.Ok(e)}async signStatement(){var a;if(!((a=this.walletClient.account)!=null&&a.address))return n.Err("Wallet client does not have a valid account");const t=new Date,i=new Date(t.getTime()+300*1e3);let e;try{const l=await(await this.fetchWithCookies(this.url.endpoint("challenges"),{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include"})).json();if(l.error||!l.result)return n.Err("Failed to get nonce");e=l.result}catch(d){return n.Err("Failed to get nonce",d)}const r=await this.walletClient.getChainId(),s=T.createSiweMessage({domain:this.domain,address:this.walletClient.account.address,statement:this.signingStatement,nonce:e,uri:"https://"+this.domain,version:"1",chainId:r,notBefore:i}),o=await this.walletClient.signMessage({account:this.walletClient.account,message:s});return n.Ok({message:s,signature:o,nonce:e})}async getAuthHeaders(){const t=await this.getToken();return t.ok?n.Ok({Authorization:h.Authorization(t.val)}):n.Err(t.error)}}exports.Siwe=u;
package/dist/index10.js CHANGED
@@ -4,11 +4,11 @@ import { MemoryStorage as w } from "./index14.js";
4
4
  import { StoreKeys as d } from "./index15.js";
5
5
  import { add0x as g, parseJwt as k, Authorization as p } from "./index3.js";
6
6
  import { Ok as s, Err as r } from "./index5.js";
7
- import { createWalletClient as y } from "./index25.js";
8
- import { http as C } from "./index26.js";
7
+ import { createWalletClient as y } from "./index23.js";
8
+ import { http as C } from "./index24.js";
9
9
  import { privateKeyToAccount as T } from "./index22.js";
10
- import { createSiweMessage as v } from "./index27.js";
11
- import { mainnet as S } from "./index28.js";
10
+ import { createSiweMessage as v } from "./index25.js";
11
+ import { mainnet as S } from "./index26.js";
12
12
  class f {
13
13
  constructor(e, n, t) {
14
14
  if (this.url = e.endpoint("siwe"), this.walletClient = n, this.domain = (t == null ? void 0 : t.domain) || "app.garden.finance", this.domain.startsWith("https://") && (this.domain = this.domain.split("https://")[1]), this.signingStatement = (t == null ? void 0 : t.signingStatement) ?? "Garden.fi", this.store = (t == null ? void 0 : t.store) ?? (typeof window < "u" ? window.localStorage : new w()), typeof window > "u") {
package/dist/index17.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./index23.cjs"),u=require("./index24.cjs");class l{static async _postWithFallback(a,t){let r="";for(const o of a)try{const s=await fetch(o,{method:"POST",...t});if(s.status>=500){r=await(s.text()||s.json());continue}return await this.parse(s)}catch(s){r=n(s);continue}throw new Error(r||"All APIs failed")}static async postWithFallback(a,t){return await c(t).retry(()=>this._postWithFallback(a,t))}static async _getWithFallback(a,t){let r="";for(const o of a)try{const s=await fetch(o,t);if(s.status>=500){r=await(s.text()||s.json());continue}return await this.parse(s)}catch(s){r=n(s);continue}throw new Error(r||"All APIs failed")}static async getWithFallback(a,t){return await c(t).retry(()=>this._getWithFallback(a,t))}static async _get(a,t){return await this.parse(await fetch(a,t))}static async get(a,t){return await c(t).retry(()=>this._get(a,t))}static async _post(a,t){return await this.parse(await fetch(a,{method:"POST",...t}))}static async post(a,t){return await c(t).retry(()=>this._post(a,t))}static async _patch(a,t){return await this.parse(await fetch(a,{method:"PATCH",...t}))}static async patch(a,t){return await c(t).retry(()=>this._patch(a,t))}static async parse(a){const t=await a.text();if(a.status>=200&&a.status<300)return u.safeParseJson(t);throw new Error(t)}}function n(e){return(e==null?void 0:e.message)||(e==null?void 0:e.toString())||"unknown error"}const c=e=>new h.Retry((e==null?void 0:e.retryCount)??2,(e==null?void 0:e.retryDelay)??1e3,e==null?void 0:e.onRetry);exports.Fetcher=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./index27.cjs"),u=require("./index28.cjs");class l{static async _postWithFallback(a,t){let r="";for(const o of a)try{const s=await fetch(o,{method:"POST",...t});if(s.status>=500){r=await(s.text()||s.json());continue}return await this.parse(s)}catch(s){r=n(s);continue}throw new Error(r||"All APIs failed")}static async postWithFallback(a,t){return await c(t).retry(()=>this._postWithFallback(a,t))}static async _getWithFallback(a,t){let r="";for(const o of a)try{const s=await fetch(o,t);if(s.status>=500){r=await(s.text()||s.json());continue}return await this.parse(s)}catch(s){r=n(s);continue}throw new Error(r||"All APIs failed")}static async getWithFallback(a,t){return await c(t).retry(()=>this._getWithFallback(a,t))}static async _get(a,t){return await this.parse(await fetch(a,t))}static async get(a,t){return await c(t).retry(()=>this._get(a,t))}static async _post(a,t){return await this.parse(await fetch(a,{method:"POST",...t}))}static async post(a,t){return await c(t).retry(()=>this._post(a,t))}static async _patch(a,t){return await this.parse(await fetch(a,{method:"PATCH",...t}))}static async patch(a,t){return await c(t).retry(()=>this._patch(a,t))}static async parse(a){const t=await a.text();if(a.status>=200&&a.status<300)return u.safeParseJson(t);throw new Error(t)}}function n(e){return(e==null?void 0:e.message)||(e==null?void 0:e.toString())||"unknown error"}const c=e=>new h.Retry((e==null?void 0:e.retryCount)??2,(e==null?void 0:e.retryDelay)??1e3,e==null?void 0:e.onRetry);exports.Fetcher=l;
package/dist/index17.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Retry as n } from "./index23.js";
2
- import { safeParseJson as u } from "./index24.js";
1
+ import { Retry as n } from "./index27.js";
2
+ import { safeParseJson as u } from "./index28.js";
3
3
  class y {
4
4
  static async _postWithFallback(a, t) {
5
5
  let r = "";
package/dist/index23.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./index3.cjs");class a{constructor(r,t,e){this.maxRetries=Math.max(r,0),this.delay=t,this.onRetry=e}async retry(r){let t=0,e;for(;t<this.maxRetries+1;)try{return await r()}catch(i){if(this.onRetry&&!this.onRetry(i))throw i;t++,e=i,await s.sleep(this.delay*t)}throw e}}exports.Retry=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./index156.cjs"),c=require("./index158.cjs");function r(e){const{key:t="wallet",name:l="Wallet Client",transport:n}=e;return i.createClient({...e,key:t,name:l,transport:n,type:"walletClient"}).extend(c.walletActions)}exports.createWalletClient=r;
package/dist/index23.js CHANGED
@@ -1,32 +1,15 @@
1
- import { sleep as s } from "./index3.js";
2
- class o {
3
- /**
4
- * @param {number} maxRetries - The maximum number of retries, if less < 0 then it is set to 0
5
- * @param {number} delay - The delay between retries
6
- * @param {(error: any) => boolean} [onRetry] - A callback that receives the error. If it returns false, retries are aborted.
7
- */
8
- constructor(e, t, r) {
9
- this.maxRetries = Math.max(e, 0), this.delay = t, this.onRetry = r;
10
- }
11
- /**
12
- * Retries a function until it succeeds or the max number of retries is reached
13
- *
14
- * @param {() => Promise<T>} fn - The function to retry
15
- * @return {Promise<T>} a Promise that resolves to the result of the function
16
- */
17
- async retry(e) {
18
- let t = 0, r;
19
- for (; t < this.maxRetries + 1; )
20
- try {
21
- return await e();
22
- } catch (i) {
23
- if (this.onRetry && !this.onRetry(i))
24
- throw i;
25
- t++, r = i, await s(this.delay * t);
26
- }
27
- throw r;
28
- }
1
+ import { createClient as i } from "./index156.js";
2
+ import { walletActions as o } from "./index158.js";
3
+ function m(t) {
4
+ const { key: e = "wallet", name: l = "Wallet Client", transport: n } = t;
5
+ return i({
6
+ ...t,
7
+ key: e,
8
+ name: l,
9
+ transport: n,
10
+ type: "walletClient"
11
+ }).extend(o);
29
12
  }
30
13
  export {
31
- o as Retry
14
+ m as createWalletClient
32
15
  };
package/dist/index24.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=e=>{try{return JSON.parse(e)}catch{return e}};exports.safeParseJson=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("./index161.cjs"),E=require("./index162.cjs"),H=require("./index66.cjs"),U=require("./index163.cjs"),_=require("./index159.cjs");function k(v,r={}){const{batch:o,fetchFn:l,fetchOptions:u,key:h="http",methods:q,name:d="HTTP JSON-RPC",onFetchRequest:y,onFetchResponse:f,retryDelay:R,raw:w}=r;return({chain:n,retryCount:S,timeout:m})=>{const{batchSize:C=1e3,wait:b=0}=typeof o=="object"?o:{},T=r.retryCount??S,c=m??r.timeout??1e4,e=n==null?void 0:n.rpcUrls.default.http[0];if(!e)throw new E.UrlRequiredError;const a=U.getHttpRpcClient(e,{fetchFn:l,fetchOptions:u,onRequest:y,onResponse:f,timeout:c});return _.createTransport({key:h,methods:q,name:d,async request({method:B,params:F}){const i={method:B,params:F},{schedule:O}=H.createBatchScheduler({id:e,wait:b,shouldSplitBatch(t){return t.length>C},fn:t=>a.request({body:t}),sort:(t,g)=>t.id-g.id}),P=async t=>o?O(t):[await a.request({body:t})],[{error:s,result:p}]=await P(i);if(w)return{error:s,result:p};if(s)throw new j.RpcRequestError({body:i,error:s,url:e});return p},retryCount:T,retryDelay:R,timeout:c,type:"http"},{fetchOptions:u,url:e})}}exports.http=k;
package/dist/index24.js CHANGED
@@ -1,10 +1,61 @@
1
- const t = (r) => {
2
- try {
3
- return JSON.parse(r);
4
- } catch {
5
- return r;
6
- }
7
- };
1
+ import { RpcRequestError as P } from "./index161.js";
2
+ import { UrlRequiredError as U } from "./index162.js";
3
+ import { createBatchScheduler as _ } from "./index66.js";
4
+ import { getHttpRpcClient as j } from "./index163.js";
5
+ import { createTransport as k } from "./index159.js";
6
+ function v(x, r = {}) {
7
+ const { batch: o, fetchFn: h, fetchOptions: u, key: m = "http", methods: a, name: f = "HTTP JSON-RPC", onFetchRequest: y, onFetchResponse: d, retryDelay: R, raw: w } = r;
8
+ return ({ chain: n, retryCount: q, timeout: C }) => {
9
+ const { batchSize: S = 1e3, wait: b = 0 } = typeof o == "object" ? o : {}, F = r.retryCount ?? q, c = C ?? r.timeout ?? 1e4, e = n == null ? void 0 : n.rpcUrls.default.http[0];
10
+ if (!e)
11
+ throw new U();
12
+ const p = j(e, {
13
+ fetchFn: h,
14
+ fetchOptions: u,
15
+ onRequest: y,
16
+ onResponse: d,
17
+ timeout: c
18
+ });
19
+ return k({
20
+ key: m,
21
+ methods: a,
22
+ name: f,
23
+ async request({ method: T, params: B }) {
24
+ const i = { method: T, params: B }, { schedule: E } = _({
25
+ id: e,
26
+ wait: b,
27
+ shouldSplitBatch(t) {
28
+ return t.length > S;
29
+ },
30
+ fn: (t) => p.request({
31
+ body: t
32
+ }),
33
+ sort: (t, O) => t.id - O.id
34
+ }), H = async (t) => o ? E(t) : [
35
+ await p.request({
36
+ body: t
37
+ })
38
+ ], [{ error: s, result: l }] = await H(i);
39
+ if (w)
40
+ return { error: s, result: l };
41
+ if (s)
42
+ throw new P({
43
+ body: i,
44
+ error: s,
45
+ url: e
46
+ });
47
+ return l;
48
+ },
49
+ retryCount: F,
50
+ retryDelay: R,
51
+ timeout: c,
52
+ type: "http"
53
+ }, {
54
+ fetchOptions: u,
55
+ url: e
56
+ });
57
+ };
58
+ }
8
59
  export {
9
- t as safeParseJson
60
+ v as http
10
61
  };
package/dist/index25.cjs CHANGED
@@ -1 +1,16 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./index156.cjs"),c=require("./index158.cjs");function r(e){const{key:t="wallet",name:l="Wallet Client",transport:n}=e;return i.createClient({...e,key:t,name:l,transport:n,type:"walletClient"}).extend(c.walletActions)}exports.createWalletClient=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index248.cjs"),M=require("./index44.cjs"),h=require("./index249.cjs");function R(r){const{chainId:o,domain:s,expirationTime:l,issuedAt:m=new Date,nonce:a,notBefore:f,requestId:w,resources:g,scheme:i,uri:c,version:d}=r;{if(o!==Math.floor(o))throw new e.SiweInvalidMessageFieldError({field:"chainId",metaMessages:["- Chain ID must be a EIP-155 chain ID.","- See https://eips.ethereum.org/EIPS/eip-155","",`Provided value: ${o}`]});if(!(E.test(s)||F.test(s)||b.test(s)))throw new e.SiweInvalidMessageFieldError({field:"domain",metaMessages:["- Domain must be an RFC 3986 authority.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${s}`]});if(!A.test(a))throw new e.SiweInvalidMessageFieldError({field:"nonce",metaMessages:["- Nonce must be at least 8 characters.","- Nonce must be alphanumeric.","",`Provided value: ${a}`]});if(!h.isUri(c))throw new e.SiweInvalidMessageFieldError({field:"uri",metaMessages:["- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${c}`]});if(d!=="1")throw new e.SiweInvalidMessageFieldError({field:"version",metaMessages:["- Version must be '1'.","",`Provided value: ${d}`]});if(i&&!P.test(i))throw new e.SiweInvalidMessageFieldError({field:"scheme",metaMessages:["- Scheme must be an RFC 3986 URI scheme.","- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1","",`Provided value: ${i}`]});const t=r.statement;if(t!=null&&t.includes(`
2
+ `))throw new e.SiweInvalidMessageFieldError({field:"statement",metaMessages:["- Statement must not include '\\n'.","",`Provided value: ${t}`]})}const $=M.getAddress(r.address),v=i?`${i}://${s}`:s,I=r.statement?`${r.statement}
3
+ `:"",S=`${v} wants you to sign in with your Ethereum account:
4
+ ${$}
5
+
6
+ ${I}`;let n=`URI: ${c}
7
+ Version: ${d}
8
+ Chain ID: ${o}
9
+ Nonce: ${a}
10
+ Issued At: ${m.toISOString()}`;if(l&&(n+=`
11
+ Expiration Time: ${l.toISOString()}`),f&&(n+=`
12
+ Not Before: ${f.toISOString()}`),w&&(n+=`
13
+ Request ID: ${w}`),g){let t=`
14
+ Resources:`;for(const u of g){if(!h.isUri(u))throw new e.SiweInvalidMessageFieldError({field:"resources",metaMessages:["- Every resource must be a RFC 3986 URI.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${u}`]});t+=`
15
+ - ${u}`}n+=t}return`${S}
16
+ ${n}`}const E=/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/,F=/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/,b=/^localhost(:[0-9]{1,5})?$/,A=/^[a-zA-Z0-9]{8,}$/,P=/^([a-zA-Z][a-zA-Z0-9+-.]*)$/;exports.createSiweMessage=R;
package/dist/index25.js CHANGED
@@ -1,15 +1,116 @@
1
- import { createClient as i } from "./index156.js";
2
- import { walletActions as o } from "./index158.js";
3
- function m(t) {
4
- const { key: e = "wallet", name: l = "Wallet Client", transport: n } = t;
5
- return i({
6
- ...t,
7
- key: e,
8
- name: l,
9
- transport: n,
10
- type: "walletClient"
11
- }).extend(o);
1
+ import { SiweInvalidMessageFieldError as e } from "./index248.js";
2
+ import { getAddress as S } from "./index44.js";
3
+ import { isUri as $ } from "./index249.js";
4
+ function C(n) {
5
+ const { chainId: i, domain: s, expirationTime: u, issuedAt: g = /* @__PURE__ */ new Date(), nonce: a, notBefore: m, requestId: h, resources: w, scheme: o, uri: c, version: f } = n;
6
+ {
7
+ if (i !== Math.floor(i))
8
+ throw new e({
9
+ field: "chainId",
10
+ metaMessages: [
11
+ "- Chain ID must be a EIP-155 chain ID.",
12
+ "- See https://eips.ethereum.org/EIPS/eip-155",
13
+ "",
14
+ `Provided value: ${i}`
15
+ ]
16
+ });
17
+ if (!(p.test(s) || M.test(s) || x.test(s)))
18
+ throw new e({
19
+ field: "domain",
20
+ metaMessages: [
21
+ "- Domain must be an RFC 3986 authority.",
22
+ "- See https://www.rfc-editor.org/rfc/rfc3986",
23
+ "",
24
+ `Provided value: ${s}`
25
+ ]
26
+ });
27
+ if (!A.test(a))
28
+ throw new e({
29
+ field: "nonce",
30
+ metaMessages: [
31
+ "- Nonce must be at least 8 characters.",
32
+ "- Nonce must be alphanumeric.",
33
+ "",
34
+ `Provided value: ${a}`
35
+ ]
36
+ });
37
+ if (!$(c))
38
+ throw new e({
39
+ field: "uri",
40
+ metaMessages: [
41
+ "- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.",
42
+ "- See https://www.rfc-editor.org/rfc/rfc3986",
43
+ "",
44
+ `Provided value: ${c}`
45
+ ]
46
+ });
47
+ if (f !== "1")
48
+ throw new e({
49
+ field: "version",
50
+ metaMessages: [
51
+ "- Version must be '1'.",
52
+ "",
53
+ `Provided value: ${f}`
54
+ ]
55
+ });
56
+ if (o && !P.test(o))
57
+ throw new e({
58
+ field: "scheme",
59
+ metaMessages: [
60
+ "- Scheme must be an RFC 3986 URI scheme.",
61
+ "- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1",
62
+ "",
63
+ `Provided value: ${o}`
64
+ ]
65
+ });
66
+ const t = n.statement;
67
+ if (t != null && t.includes(`
68
+ `))
69
+ throw new e({
70
+ field: "statement",
71
+ metaMessages: [
72
+ "- Statement must not include '\\n'.",
73
+ "",
74
+ `Provided value: ${t}`
75
+ ]
76
+ });
77
+ }
78
+ const l = S(n.address), v = o ? `${o}://${s}` : s, I = n.statement ? `${n.statement}
79
+ ` : "", R = `${v} wants you to sign in with your Ethereum account:
80
+ ${l}
81
+
82
+ ${I}`;
83
+ let r = `URI: ${c}
84
+ Version: ${f}
85
+ Chain ID: ${i}
86
+ Nonce: ${a}
87
+ Issued At: ${g.toISOString()}`;
88
+ if (u && (r += `
89
+ Expiration Time: ${u.toISOString()}`), m && (r += `
90
+ Not Before: ${m.toISOString()}`), h && (r += `
91
+ Request ID: ${h}`), w) {
92
+ let t = `
93
+ Resources:`;
94
+ for (const d of w) {
95
+ if (!$(d))
96
+ throw new e({
97
+ field: "resources",
98
+ metaMessages: [
99
+ "- Every resource must be a RFC 3986 URI.",
100
+ "- See https://www.rfc-editor.org/rfc/rfc3986",
101
+ "",
102
+ `Provided value: ${d}`
103
+ ]
104
+ });
105
+ t += `
106
+ - ${d}`;
107
+ }
108
+ r += t;
109
+ }
110
+ return `${R}
111
+ ${r}`;
12
112
  }
113
+ const p = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/, M = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/, x = /^localhost(:[0-9]{1,5})?$/, A = /^[a-zA-Z0-9]{8,}$/, P = /^([a-zA-Z][a-zA-Z0-9+-.]*)$/;
13
114
  export {
14
- m as createWalletClient
115
+ C as createSiweMessage
15
116
  };
package/dist/index26.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("./index161.cjs"),E=require("./index162.cjs"),H=require("./index66.cjs"),U=require("./index163.cjs"),_=require("./index159.cjs");function k(v,r={}){const{batch:o,fetchFn:l,fetchOptions:u,key:h="http",methods:q,name:d="HTTP JSON-RPC",onFetchRequest:y,onFetchResponse:f,retryDelay:R,raw:w}=r;return({chain:n,retryCount:S,timeout:m})=>{const{batchSize:C=1e3,wait:b=0}=typeof o=="object"?o:{},T=r.retryCount??S,c=m??r.timeout??1e4,e=n==null?void 0:n.rpcUrls.default.http[0];if(!e)throw new E.UrlRequiredError;const a=U.getHttpRpcClient(e,{fetchFn:l,fetchOptions:u,onRequest:y,onResponse:f,timeout:c});return _.createTransport({key:h,methods:q,name:d,async request({method:B,params:F}){const i={method:B,params:F},{schedule:O}=H.createBatchScheduler({id:e,wait:b,shouldSplitBatch(t){return t.length>C},fn:t=>a.request({body:t}),sort:(t,g)=>t.id-g.id}),P=async t=>o?O(t):[await a.request({body:t})],[{error:s,result:p}]=await P(i);if(w)return{error:s,result:p};if(s)throw new j.RpcRequestError({body:i,error:s,url:e});return p},retryCount:T,retryDelay:R,timeout:c,type:"http"},{fetchOptions:u,url:e})}}exports.http=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index202.cjs"),t=e.defineChain({id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},blockTime:12e3,rpcUrls:{default:{http:["https://eth.merkle.io"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io",apiUrl:"https://api.etherscan.io/api"}},contracts:{ensUniversalResolver:{address:"0xeeeeeeee14d718c2b47d9923deab1335e144eeee",blockCreated:23085558},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}});exports.mainnet=t;
package/dist/index26.js CHANGED
@@ -1,61 +1,32 @@
1
- import { RpcRequestError as P } from "./index161.js";
2
- import { UrlRequiredError as U } from "./index162.js";
3
- import { createBatchScheduler as _ } from "./index66.js";
4
- import { getHttpRpcClient as j } from "./index163.js";
5
- import { createTransport as k } from "./index159.js";
6
- function v(x, r = {}) {
7
- const { batch: o, fetchFn: h, fetchOptions: u, key: m = "http", methods: a, name: f = "HTTP JSON-RPC", onFetchRequest: y, onFetchResponse: d, retryDelay: R, raw: w } = r;
8
- return ({ chain: n, retryCount: q, timeout: C }) => {
9
- const { batchSize: S = 1e3, wait: b = 0 } = typeof o == "object" ? o : {}, F = r.retryCount ?? q, c = C ?? r.timeout ?? 1e4, e = n == null ? void 0 : n.rpcUrls.default.http[0];
10
- if (!e)
11
- throw new U();
12
- const p = j(e, {
13
- fetchFn: h,
14
- fetchOptions: u,
15
- onRequest: y,
16
- onResponse: d,
17
- timeout: c
18
- });
19
- return k({
20
- key: m,
21
- methods: a,
22
- name: f,
23
- async request({ method: T, params: B }) {
24
- const i = { method: T, params: B }, { schedule: E } = _({
25
- id: e,
26
- wait: b,
27
- shouldSplitBatch(t) {
28
- return t.length > S;
29
- },
30
- fn: (t) => p.request({
31
- body: t
32
- }),
33
- sort: (t, O) => t.id - O.id
34
- }), H = async (t) => o ? E(t) : [
35
- await p.request({
36
- body: t
37
- })
38
- ], [{ error: s, result: l }] = await H(i);
39
- if (w)
40
- return { error: s, result: l };
41
- if (s)
42
- throw new P({
43
- body: i,
44
- error: s,
45
- url: e
46
- });
47
- return l;
48
- },
49
- retryCount: F,
50
- retryDelay: R,
51
- timeout: c,
52
- type: "http"
53
- }, {
54
- fetchOptions: u,
55
- url: e
56
- });
57
- };
58
- }
1
+ import { defineChain as e } from "./index202.js";
2
+ const t = /* @__PURE__ */ e({
3
+ id: 1,
4
+ name: "Ethereum",
5
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
6
+ blockTime: 12e3,
7
+ rpcUrls: {
8
+ default: {
9
+ http: ["https://eth.merkle.io"]
10
+ }
11
+ },
12
+ blockExplorers: {
13
+ default: {
14
+ name: "Etherscan",
15
+ url: "https://etherscan.io",
16
+ apiUrl: "https://api.etherscan.io/api"
17
+ }
18
+ },
19
+ contracts: {
20
+ ensUniversalResolver: {
21
+ address: "0xeeeeeeee14d718c2b47d9923deab1335e144eeee",
22
+ blockCreated: 23085558
23
+ },
24
+ multicall3: {
25
+ address: "0xca11bde05977b3631167028862be2a173976ca11",
26
+ blockCreated: 14353601
27
+ }
28
+ }
29
+ });
59
30
  export {
60
- v as http
31
+ t as mainnet
61
32
  };
package/dist/index27.cjs CHANGED
@@ -1,16 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index248.cjs"),M=require("./index44.cjs"),h=require("./index249.cjs");function R(r){const{chainId:o,domain:s,expirationTime:l,issuedAt:m=new Date,nonce:a,notBefore:f,requestId:w,resources:g,scheme:i,uri:c,version:d}=r;{if(o!==Math.floor(o))throw new e.SiweInvalidMessageFieldError({field:"chainId",metaMessages:["- Chain ID must be a EIP-155 chain ID.","- See https://eips.ethereum.org/EIPS/eip-155","",`Provided value: ${o}`]});if(!(E.test(s)||F.test(s)||b.test(s)))throw new e.SiweInvalidMessageFieldError({field:"domain",metaMessages:["- Domain must be an RFC 3986 authority.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${s}`]});if(!A.test(a))throw new e.SiweInvalidMessageFieldError({field:"nonce",metaMessages:["- Nonce must be at least 8 characters.","- Nonce must be alphanumeric.","",`Provided value: ${a}`]});if(!h.isUri(c))throw new e.SiweInvalidMessageFieldError({field:"uri",metaMessages:["- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${c}`]});if(d!=="1")throw new e.SiweInvalidMessageFieldError({field:"version",metaMessages:["- Version must be '1'.","",`Provided value: ${d}`]});if(i&&!P.test(i))throw new e.SiweInvalidMessageFieldError({field:"scheme",metaMessages:["- Scheme must be an RFC 3986 URI scheme.","- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1","",`Provided value: ${i}`]});const t=r.statement;if(t!=null&&t.includes(`
2
- `))throw new e.SiweInvalidMessageFieldError({field:"statement",metaMessages:["- Statement must not include '\\n'.","",`Provided value: ${t}`]})}const $=M.getAddress(r.address),v=i?`${i}://${s}`:s,I=r.statement?`${r.statement}
3
- `:"",S=`${v} wants you to sign in with your Ethereum account:
4
- ${$}
5
-
6
- ${I}`;let n=`URI: ${c}
7
- Version: ${d}
8
- Chain ID: ${o}
9
- Nonce: ${a}
10
- Issued At: ${m.toISOString()}`;if(l&&(n+=`
11
- Expiration Time: ${l.toISOString()}`),f&&(n+=`
12
- Not Before: ${f.toISOString()}`),w&&(n+=`
13
- Request ID: ${w}`),g){let t=`
14
- Resources:`;for(const u of g){if(!h.isUri(u))throw new e.SiweInvalidMessageFieldError({field:"resources",metaMessages:["- Every resource must be a RFC 3986 URI.","- See https://www.rfc-editor.org/rfc/rfc3986","",`Provided value: ${u}`]});t+=`
15
- - ${u}`}n+=t}return`${S}
16
- ${n}`}const E=/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/,F=/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/,b=/^localhost(:[0-9]{1,5})?$/,A=/^[a-zA-Z0-9]{8,}$/,P=/^([a-zA-Z][a-zA-Z0-9+-.]*)$/;exports.createSiweMessage=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./index3.cjs");class a{constructor(r,t,e){this.maxRetries=Math.max(r,0),this.delay=t,this.onRetry=e}async retry(r){let t=0,e;for(;t<this.maxRetries+1;)try{return await r()}catch(i){if(this.onRetry&&!this.onRetry(i))throw i;t++,e=i,await s.sleep(this.delay*t)}throw e}}exports.Retry=a;
package/dist/index27.js CHANGED
@@ -1,116 +1,32 @@
1
- import { SiweInvalidMessageFieldError as e } from "./index248.js";
2
- import { getAddress as S } from "./index44.js";
3
- import { isUri as $ } from "./index249.js";
4
- function C(n) {
5
- const { chainId: i, domain: s, expirationTime: u, issuedAt: g = /* @__PURE__ */ new Date(), nonce: a, notBefore: m, requestId: h, resources: w, scheme: o, uri: c, version: f } = n;
6
- {
7
- if (i !== Math.floor(i))
8
- throw new e({
9
- field: "chainId",
10
- metaMessages: [
11
- "- Chain ID must be a EIP-155 chain ID.",
12
- "- See https://eips.ethereum.org/EIPS/eip-155",
13
- "",
14
- `Provided value: ${i}`
15
- ]
16
- });
17
- if (!(p.test(s) || M.test(s) || x.test(s)))
18
- throw new e({
19
- field: "domain",
20
- metaMessages: [
21
- "- Domain must be an RFC 3986 authority.",
22
- "- See https://www.rfc-editor.org/rfc/rfc3986",
23
- "",
24
- `Provided value: ${s}`
25
- ]
26
- });
27
- if (!A.test(a))
28
- throw new e({
29
- field: "nonce",
30
- metaMessages: [
31
- "- Nonce must be at least 8 characters.",
32
- "- Nonce must be alphanumeric.",
33
- "",
34
- `Provided value: ${a}`
35
- ]
36
- });
37
- if (!$(c))
38
- throw new e({
39
- field: "uri",
40
- metaMessages: [
41
- "- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.",
42
- "- See https://www.rfc-editor.org/rfc/rfc3986",
43
- "",
44
- `Provided value: ${c}`
45
- ]
46
- });
47
- if (f !== "1")
48
- throw new e({
49
- field: "version",
50
- metaMessages: [
51
- "- Version must be '1'.",
52
- "",
53
- `Provided value: ${f}`
54
- ]
55
- });
56
- if (o && !P.test(o))
57
- throw new e({
58
- field: "scheme",
59
- metaMessages: [
60
- "- Scheme must be an RFC 3986 URI scheme.",
61
- "- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1",
62
- "",
63
- `Provided value: ${o}`
64
- ]
65
- });
66
- const t = n.statement;
67
- if (t != null && t.includes(`
68
- `))
69
- throw new e({
70
- field: "statement",
71
- metaMessages: [
72
- "- Statement must not include '\\n'.",
73
- "",
74
- `Provided value: ${t}`
75
- ]
76
- });
1
+ import { sleep as s } from "./index3.js";
2
+ class o {
3
+ /**
4
+ * @param {number} maxRetries - The maximum number of retries, if less < 0 then it is set to 0
5
+ * @param {number} delay - The delay between retries
6
+ * @param {(error: any) => boolean} [onRetry] - A callback that receives the error. If it returns false, retries are aborted.
7
+ */
8
+ constructor(e, t, r) {
9
+ this.maxRetries = Math.max(e, 0), this.delay = t, this.onRetry = r;
77
10
  }
78
- const l = S(n.address), v = o ? `${o}://${s}` : s, I = n.statement ? `${n.statement}
79
- ` : "", R = `${v} wants you to sign in with your Ethereum account:
80
- ${l}
81
-
82
- ${I}`;
83
- let r = `URI: ${c}
84
- Version: ${f}
85
- Chain ID: ${i}
86
- Nonce: ${a}
87
- Issued At: ${g.toISOString()}`;
88
- if (u && (r += `
89
- Expiration Time: ${u.toISOString()}`), m && (r += `
90
- Not Before: ${m.toISOString()}`), h && (r += `
91
- Request ID: ${h}`), w) {
92
- let t = `
93
- Resources:`;
94
- for (const d of w) {
95
- if (!$(d))
96
- throw new e({
97
- field: "resources",
98
- metaMessages: [
99
- "- Every resource must be a RFC 3986 URI.",
100
- "- See https://www.rfc-editor.org/rfc/rfc3986",
101
- "",
102
- `Provided value: ${d}`
103
- ]
104
- });
105
- t += `
106
- - ${d}`;
107
- }
108
- r += t;
11
+ /**
12
+ * Retries a function until it succeeds or the max number of retries is reached
13
+ *
14
+ * @param {() => Promise<T>} fn - The function to retry
15
+ * @return {Promise<T>} a Promise that resolves to the result of the function
16
+ */
17
+ async retry(e) {
18
+ let t = 0, r;
19
+ for (; t < this.maxRetries + 1; )
20
+ try {
21
+ return await e();
22
+ } catch (i) {
23
+ if (this.onRetry && !this.onRetry(i))
24
+ throw i;
25
+ t++, r = i, await s(this.delay * t);
26
+ }
27
+ throw r;
109
28
  }
110
- return `${R}
111
- ${r}`;
112
29
  }
113
- const p = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/, M = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/, x = /^localhost(:[0-9]{1,5})?$/, A = /^[a-zA-Z0-9]{8,}$/, P = /^([a-zA-Z][a-zA-Z0-9+-.]*)$/;
114
30
  export {
115
- C as createSiweMessage
31
+ o as Retry
116
32
  };
package/dist/index28.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index202.cjs"),t=e.defineChain({id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},blockTime:12e3,rpcUrls:{default:{http:["https://eth.merkle.io"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io",apiUrl:"https://api.etherscan.io/api"}},contracts:{ensUniversalResolver:{address:"0xeeeeeeee14d718c2b47d9923deab1335e144eeee",blockCreated:23085558},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}});exports.mainnet=t;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=e=>{try{return JSON.parse(e)}catch{return e}};exports.safeParseJson=r;
package/dist/index28.js CHANGED
@@ -1,32 +1,10 @@
1
- import { defineChain as e } from "./index202.js";
2
- const t = /* @__PURE__ */ e({
3
- id: 1,
4
- name: "Ethereum",
5
- nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
6
- blockTime: 12e3,
7
- rpcUrls: {
8
- default: {
9
- http: ["https://eth.merkle.io"]
10
- }
11
- },
12
- blockExplorers: {
13
- default: {
14
- name: "Etherscan",
15
- url: "https://etherscan.io",
16
- apiUrl: "https://api.etherscan.io/api"
17
- }
18
- },
19
- contracts: {
20
- ensUniversalResolver: {
21
- address: "0xeeeeeeee14d718c2b47d9923deab1335e144eeee",
22
- blockCreated: 23085558
23
- },
24
- multicall3: {
25
- address: "0xca11bde05977b3631167028862be2a173976ca11",
26
- blockCreated: 14353601
27
- }
1
+ const t = (r) => {
2
+ try {
3
+ return JSON.parse(r);
4
+ } catch {
5
+ return r;
28
6
  }
29
- });
7
+ };
30
8
  export {
31
- t as mainnet
9
+ t as safeParseJson
32
10
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gardenfi/utils",
3
- "version": "3.1.1-beta.7",
3
+ "version": "3.1.1-beta.9",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "vite build",