@hub3js/evm 0.5.0 → 0.6.0
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/actions.d.ts +2 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/builders.d.ts +2 -0
- package/dist/builders.d.ts.map +1 -1
- package/dist/mod.d.ts +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +3 -3
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/actions.ts +48 -0
- package/src/builders.ts +8 -0
- package/src/mod.ts +8 -1
- package/src/types.ts +20 -0
- package/src/utils.test.ts +24 -0
- package/src/utils.ts +37 -0
package/dist/actions.d.ts
CHANGED
|
@@ -5,4 +5,6 @@ export declare function connect(instance: () => ProviderAPI, options?: ConnectOp
|
|
|
5
5
|
export declare function canEagerConnect(instance: () => ProviderAPI | undefined): CanEagerConnect<EvmActions>;
|
|
6
6
|
export declare function canSwitchNetwork(): FunctionWithContext<EvmActions['canSwitchNetwork'], Context>;
|
|
7
7
|
export declare function getChainId(instance: () => ProviderAPI | undefined): FunctionWithContext<EvmActions['getChainId'], Context>;
|
|
8
|
+
export declare function getAllowance(instance: () => ProviderAPI | undefined): FunctionWithContext<EvmActions['getAllowance'], Context>;
|
|
9
|
+
export declare function getTransactionReceipt(instance: () => ProviderAPI | undefined): FunctionWithContext<EvmActions['getTransactionReceipt'], Context>;
|
|
8
10
|
//# sourceMappingURL=actions.d.ts.map
|
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,mBAAmB,EACpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAYtB,eAAO,MAAM,WAAW,8EAA0B,CAAC;AACnD,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,WAAW,EAC3B,OAAO,CAAC,EAAE,cAAc,GACvB,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CA2DrD;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,GACtC,eAAe,CAAC,UAAU,CAAC,CAsB7B;AACD,wBAAgB,gBAAgB,IAAI,mBAAmB,CACrD,UAAU,CAAC,kBAAkB,CAAC,EAC9B,OAAO,CACR,CAKA;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,GACtC,mBAAmB,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAYxD;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,GACtC,mBAAmB,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAwB1D;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,WAAW,GAAG,SAAS,GACtC,mBAAmB,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC,CAenE"}
|
package/dist/builders.d.ts
CHANGED
|
@@ -6,4 +6,6 @@ export declare const canEagerConnect: () => ActionBuilder<EvmActions, "canEagerC
|
|
|
6
6
|
export declare const canSwitchNetwork: () => ActionBuilder<EvmActions, "canSwitchNetwork">;
|
|
7
7
|
export declare const changeAccountSubscriber: (getInstance: () => ProviderAPI) => ChangeAccountSubscriberBuilder<string[], import("./eip1193.js").EIP1193Provider, EvmActions>;
|
|
8
8
|
export declare const getChainId: () => ActionBuilder<EvmActions, "getChainId">;
|
|
9
|
+
export declare const getAllowance: () => ActionBuilder<EvmActions, "getAllowance">;
|
|
10
|
+
export declare const getTransactionReceipt: () => ActionBuilder<EvmActions, "getTransactionReceipt">;
|
|
9
11
|
//# sourceMappingURL=builders.d.ts.map
|
package/dist/builders.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAUnE,eAAO,MAAM,OAAO,4CAIc,CAAC;AAEnC,eAAO,MAAM,eAAe,oDACyC,CAAC;AACtE,eAAO,MAAM,gBAAgB,qDAC0C,CAAC;AAGxE,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,WAAW,iGAuBhE,CAAC;AAEP,eAAO,MAAM,UAAU,+CACoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAUnE,eAAO,MAAM,OAAO,4CAIc,CAAC;AAEnC,eAAO,MAAM,eAAe,oDACyC,CAAC;AACtE,eAAO,MAAM,gBAAgB,qDAC0C,CAAC;AAGxE,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,WAAW,iGAuBhE,CAAC;AAEP,eAAO,MAAM,UAAU,+CACoC,CAAC;AAE5D,eAAO,MAAM,YAAY,iDACsC,CAAC;AAEhE,eAAO,MAAM,qBAAqB,0DAG/B,CAAC"}
|
package/dist/mod.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export * as and from './and.js';
|
|
|
5
5
|
export * as before from './before.js';
|
|
6
6
|
export * as utils from './utils.js';
|
|
7
7
|
export * as builders from './builders.js';
|
|
8
|
-
export type { EvmActions, ProviderAPI, Chain, ChainId } from './types.js';
|
|
8
|
+
export type { EvmActions, ProviderAPI, Chain, ChainId, AllowanceParams, EvmTransactionReceipt, } from './types.js';
|
|
9
9
|
export * from './constants.js';
|
|
10
10
|
export { isEvmNamespace } from './utils.js';
|
|
11
11
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,YAAY,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,YAAY,EACV,UAAU,EACV,WAAW,EACX,KAAK,EACL,OAAO,EACP,eAAe,EACf,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/mod.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var h=Object.defineProperty;var o=(e,t)=>h(e,"name",{value:t,configurable:!0});var a=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})};var v={};a(v,{canEagerConnect:()=>V,canSwitchNetwork:()=>W,connect:()=>q,getAllowance:()=>G,getChainId:()=>$,getTransactionReceipt:()=>X,recommended:()=>U});import{recommendedActions as j}from"@hub3js/std/actions";var g={};a(g,{encodeAllowanceCallData:()=>l,encodeApproveCallData:()=>F,filterAndGetEvmBlockchainNames:()=>C,formatAccountsToCAIP:()=>u,getAccounts:()=>I,isEvmNamespace:()=>E,isUserRejectionError:()=>T,suggestNetwork:()=>x,switchNetwork:()=>w,switchOrAddNetwork:()=>_});import{getNamespaceFromCaip2ChainId as D}from"@hub3js/std/utils";import{AccountId as O}from"caip";import{evmBlockchains as R}from"rango-types";var d="eip155",Ct="1",_t="10",lt="59144",ht="1088",ft="81457",Et="42220",xt="250",wt="143",Pt="146",gt="80094",vt="8453",Nt="7000",bt="42161",yt="56",St="534352",Dt="43114",Ot="137",Rt="100",Ht="25",Tt="288",kt="1284",Mt="1285",Bt="1666600000",Lt="324";var H=16;function E(e){return D(e)===d}o(E,"isEvmNamespace");async function I(e){let[t,n]=await Promise.all([e.request({method:"eth_requestAccounts"}),e.request({method:"eth_chainId"})]),r=n;return typeof r=="number"&&(r=`0x${Number(n).toString(H)}`),{accounts:t,chainId:r}}o(I,"getAccounts");async function x(e,t){return await e.request({method:"wallet_addEthereumChain",params:[t]})}o(x,"suggestNetwork");async function w(e,t){return await e.request({method:"wallet_switchEthereumChain",params:[{chainId:t}]})}o(w,"switchNetwork");function C(e){return R(e).map(t=>t.name)}o(C,"filterAndGetEvmBlockchainNames");async function _(e,t){try{let n=typeof t=="string"?t:t.chainId;await w(e,n)}catch(n){let r=n;if(typeof t!="string"&&(r.code===4902||!r.code)){await x(e,t);return}throw n}}o(_,"switchOrAddNetwork");var f=4001;function T(e){if(typeof e=="object"&&e!==null){let t=e.code,n=e.cause?.code;return t===f||n===f}return!1}o(T,"isUserRejectionError");function u(e,t){return e.map(n=>O.format({address:n,chainId:{namespace:d,reference:t}}))}o(u,"formatAccountsToCAIP");var P=64,k="0xdd62ed3e",M="0x095ea7b3";function p(e){return e.toLowerCase().replace(/^0x/,"").padStart(P,"0")}o(p,"padAddressToEvmWord");var B=16;function L(e){return BigInt(e).toString(B).padStart(P,"0")}o(L,"padUintToEvmWord");function l(e,t){return`${k}${p(e)}${p(t)}`}o(l,"encodeAllowanceCallData");function F(e,t){return`${M}${p(e)}${L(t)}`}o(F,"encodeApproveCallData");var U=[...j];function q(e,t){return async(n,r)=>{let[,c]=n.state();c("connectArgs",{chain:r});let i=e();if(!i)throw new Error("Do your wallet injected correctly and is evm compatible?");r&&(t?.switchOrAddNetwork?await t.switchOrAddNetwork(i,r):await _(i,r));let s;if(t?.getAccounts?s=await t.getAccounts(i):s=await I(i),!s.accounts||!s.accounts.length)throw new Error("No accounts were returned by the provider. Please make sure your wallet has an active EVM-compatible account selected.");return{accounts:u(s.accounts,s.chainId),network:s.chainId}}}o(q,"connect");function V(e){return async()=>{let t=e();if(!t)throw new Error("Trying to eagerly connect to your EVM wallet, but seems its instance is not available.");try{return!!(await t.request({method:"eth_accounts"})).length}catch{return!1}}}o(V,"canEagerConnect");function W(){return(e,t)=>{let{network:n,supportedChains:r}=t;return C(r).includes(n)}}o(W,"canSwitchNetwork");function $(e){return async()=>{let t=e();if(!t)throw new Error("Trying to get chain id from your EVM wallet, but instance is not available.");return t.request({method:"eth_chainId"})}}o($,"getChainId");function G(e){return async(t,n)=>{let r=e();if(!r)throw new Error("Trying to get allowance from your EVM wallet, but instance is not available.");let c=await r.request({method:"eth_call",params:[{to:n.token,data:l(n.owner,n.spender)},"latest"]});return BigInt(c==="0x"?0:c).toString()}}o(G,"getAllowance");function X(e){return async(t,n)=>{let r=e();if(!r)throw new Error("Trying to get transaction receipt from your EVM wallet, but instance is not available.");return r.request({method:"eth_getTransactionReceipt",params:[n]})}}o(X,"getTransactionReceipt");var N={};a(N,{changeAccountSubscriber:()=>Y,changeChainSubscriber:()=>Z});function Y(e){return m.changeAccountSubscriber(e).build()}o(Y,"changeAccountSubscriber");function Z(e){let t;return[n=>{let r=e();if(!r)throw new Error("Trying to subscribe to your EVM wallet, but seems its instance is not available.");let[,c]=n.state();t=o(async i=>{c("network",i)},"eventCallback"),r.on("chainChanged",t)},()=>{let n=e();t&&n&&n.removeListener("chainChanged",t)}]}o(Z,"changeChainSubscriber");var b={};a(b,{recommended:()=>K});import{afterRecommended as J}from"@hub3js/std/operators";var K=[...J];var y={};a(y,{recommended:()=>Q});import{connectAndUpdateStateForMultiNetworks as z}from"@hub3js/std/operators";var Q=[["connect",z]];var S={};a(S,{recommended:()=>et});import{beforeRecommended as tt}from"@hub3js/std/operators";var et=[...tt];var m={};a(m,{canEagerConnect:()=>st,canSwitchNetwork:()=>at,changeAccountSubscriber:()=>At,connect:()=>it,getAllowance:()=>mt,getChainId:()=>ut,getTransactionReceipt:()=>dt});import{ActionBuilder as A}from"@hub3js/core";import{ChangeAccountSubscriberBuilder as nt}from"@hub3js/std/hooks";import{connectAndUpdateStateForMultiNetworks as ot,intoConnecting as rt,intoConnectionFinished as ct}from"@hub3js/std/operators";var it=o(()=>new A("connect").and(ot).before(rt).after(ct),"connect"),st=o(()=>new A("canEagerConnect"),"canEagerConnect"),at=o(()=>new A("canSwitchNetwork"),"canSwitchNetwork"),At=o(e=>new nt().getInstance(e).onSwitchAccount((t,n)=>{(!t.payload||!t.payload.length)&&(n.action("disconnect"),t.preventDefault())}).format(async(t,n)=>{let r=await t.request({method:"eth_chainId"});return u(n,r)}).addEventListener((t,n)=>{t.on("accountsChanged",n)}).removeEventListener((t,n)=>{t.removeListener?.("accountsChanged",n)}),"changeAccountSubscriber"),ut=o(()=>new A("getChainId"),"getChainId"),mt=o(()=>new A("getAllowance"),"getAllowance"),dt=o(()=>new A("getTransactionReceipt"),"getTransactionReceipt");export{bt as CAIP_ARBITRUM_CHAIN_ID,Dt as CAIP_AVAX_CHAIN_ID,vt as CAIP_BASE_CHAIN_ID,gt as CAIP_BERACHAIN_CHAIN_ID,ft as CAIP_BLAST_CHAIN_ID,Tt as CAIP_BOBA_CHAIN_ID,yt as CAIP_BSC_CHAIN_ID,Et as CAIP_CELO_CHAIN_ID,Ht as CAIP_CRONOS_CHAIN_ID,Ct as CAIP_ETHEREUM_CHAIN_ID,xt as CAIP_FANTOM_CHAIN_ID,Rt as CAIP_GNOSIS_CHAIN_ID,Bt as CAIP_HARMONY_CHAIN_ID,lt as CAIP_LINEA_CHAIN_ID,ht as CAIP_METIS_CHAIN_ID,wt as CAIP_MONAD_CHAIN_ID,kt as CAIP_MOONBEAM_CHAIN_ID,Mt as CAIP_MOONRIVER_CHAIN_ID,d as CAIP_NAMESPACE,_t as CAIP_OPTIMISM_CHAIN_ID,Ot as CAIP_POLYGON_CHAIN_ID,St as CAIP_SCROLL_CHAIN_ID,Pt as CAIP_SONIC_CHAIN_ID,Nt as CAIP_ZETA_CHAIN_ID,Lt as CAIP_ZKSYNC_CHAIN_ID,v as actions,b as after,y as and,S as before,m as builders,N as hooks,E as isEvmNamespace,g as utils};
|
|
2
2
|
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/actions.ts", "../src/utils.ts", "../src/constants.ts", "../src/hooks.ts", "../src/after.ts", "../src/and.ts", "../src/before.ts", "../src/builders.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n ConnectOptions,\n EvmActions,\n ProviderAccounts,\n ProviderAPI,\n} from './types.js';\nimport type {\n CanEagerConnect,\n Context,\n FunctionWithContext,\n} from '@hub3js/core';\n\nimport { recommendedActions } from '@hub3js/std/actions';\n\nimport {\n filterAndGetEvmBlockchainNames,\n formatAccountsToCAIP,\n getAccounts,\n switchOrAddNetwork,\n} from './utils.js';\n\nexport const recommended = [...recommendedActions];\nexport function connect(\n instance: () => ProviderAPI,\n options?: ConnectOptions,\n): FunctionWithContext<EvmActions['connect'], Context> {\n return async (context, chain) => {\n // Setting connect args to be used on other actions\n const [, setState] = context.state();\n setState('connectArgs', { chain });\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Do your wallet injected correctly and is evm compatible?',\n );\n }\n\n if (chain) {\n /*\n * The `switchOrAddNetwork` function can be optionally provided through `options`\n * to handle network switching or addition in a way that is compatible with the specific wallet provider.\n * This approach is necessary because not all providers follow the same conventions\u2014\n * for example, Rabby uses a different error code for \"chain not found\".\n */\n if (options?.switchOrAddNetwork) {\n await options.switchOrAddNetwork(evmInstance, chain);\n } else {\n await switchOrAddNetwork(evmInstance, chain);\n }\n }\n\n let providerAccounts: ProviderAccounts;\n /*\n * The `getAccounts` function can be optionally provided through `options`\n * to handle getting address and chainId of the specific wallet provider.\n * This approach is necessary because not all providers follow the same conventions.\n */\n if (options?.getAccounts) {\n providerAccounts = await options.getAccounts(evmInstance);\n } else {\n providerAccounts = await getAccounts(evmInstance);\n }\n\n /*\n * Ensure that the provider returns at least one valid account before proceeding.\n * This prevents cases (e.g., MetaMask bug) where a user connects with an account\n * that has no associated EVM address, leaving the dApp without any usable accounts.\n */\n if (!providerAccounts.accounts || !providerAccounts.accounts.length) {\n throw new Error(\n 'No accounts were returned by the provider. Please make sure your wallet has an active EVM-compatible account selected.',\n );\n }\n const formattedAccounts = formatAccountsToCAIP(\n providerAccounts.accounts,\n providerAccounts.chainId,\n );\n\n return {\n accounts: formattedAccounts,\n network: providerAccounts.chainId,\n };\n };\n}\n\nexport function canEagerConnect(\n instance: () => ProviderAPI | undefined,\n): CanEagerConnect<EvmActions> {\n return async () => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to eagerly connect to your EVM wallet, but seems its instance is not available.',\n );\n }\n\n try {\n const accounts: string[] = await evmInstance.request({\n method: 'eth_accounts',\n });\n if (accounts.length) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n };\n}\nexport function canSwitchNetwork(): FunctionWithContext<\n EvmActions['canSwitchNetwork'],\n Context\n> {\n return (context, params) => {\n const { network, supportedChains } = params;\n return filterAndGetEvmBlockchainNames(supportedChains).includes(network);\n };\n}\n\nexport function getChainId(\n instance: () => ProviderAPI | undefined,\n): FunctionWithContext<EvmActions['getChainId'], Context> {\n return async () => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to get chain id from your EVM wallet, but instance is not available.',\n );\n }\n\n return evmInstance.request({ method: 'eth_chainId' });\n };\n}\n", "import type { Chain, ChainId, ProviderAPI } from './types.js';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { getNamespaceFromCaip2ChainId } from '@hub3js/std/utils';\nimport { AccountId } from 'caip';\nimport { type BlockchainMeta, evmBlockchains } from 'rango-types';\n\nimport { CAIP_NAMESPACE } from './constants.js';\n\nconst CHAIN_ID_RADIX = 16;\n\nexport function isEvmNamespace(caip2ChainId: string): boolean {\n return getNamespaceFromCaip2ChainId(caip2ChainId) === CAIP_NAMESPACE;\n}\n\nexport async function getAccounts(provider: ProviderAPI) {\n const [accounts, chainId] = await Promise.all([\n provider.request({ method: 'eth_requestAccounts' }),\n provider.request({ method: 'eth_chainId' }),\n ]);\n /*\n * Trust Wallet Compatibility Fix:\n * Trust Wallet's in-app browser has been observed to return the `chainId` as a\n * number (e.g., 1) rather than the standard hexadecimal string (e.g., \"0x1\").\n * This code block standardizes the `chainId` to the required hex format to\n * prevent downstream errors.\n */\n let standardChainId = chainId;\n if (typeof standardChainId === 'number') {\n standardChainId = `0x${Number(chainId).toString(CHAIN_ID_RADIX)}`;\n }\n\n return {\n accounts,\n chainId: standardChainId,\n };\n}\n\nexport async function suggestNetwork(instance: ProviderAPI, chain: Chain) {\n return await instance.request({\n method: 'wallet_addEthereumChain',\n params: [chain],\n });\n}\n\nexport async function switchNetwork(instance: ProviderAPI, chainId: ChainId) {\n return await instance.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainId }],\n });\n}\nexport function filterAndGetEvmBlockchainNames(meta: BlockchainMeta[]) {\n return evmBlockchains(meta).map((blockchain) => blockchain.name);\n}\nexport async function switchOrAddNetwork(\n instance: ProviderAPI,\n chain: ChainId | Chain,\n) {\n try {\n const chainId = typeof chain === 'string' ? chain : chain.chainId;\n await switchNetwork(instance, chainId);\n } catch (switchError) {\n const error = switchError as { code: number };\n\n /*\n * Error code 4902 is used by MetaMask to indicate that the requested chain has not been added to the wallet.\n * This code is not part of the official EIP-1193 spec (https://eips.ethereum.org/EIPS/eip-1193#supported-rpc-methods),\n * so other providers may use a different code or behavior for the same condition.\n */\n const NOT_FOUND_CHAIN_ERROR_CODE = 4902;\n if (\n typeof chain !== 'string' &&\n (error.code === NOT_FOUND_CHAIN_ERROR_CODE || !error.code)\n ) {\n /*\n * Note: on WalletConnect `code` is undefined so we have to use !switchError.code as fallback.\n * This error code indicates that the chain has not been added to wallet.\n */\n await suggestNetwork(instance, chain);\n return;\n }\n throw switchError;\n }\n}\n\nconst EIP_1193_USER_REJECTION_ERROR_CODE = 4001;\nexport function isUserRejectionError(error: unknown): boolean {\n // EIP-1193 user rejection error can be in error.code or error.cause.code\n if (typeof error === 'object' && error !== null) {\n const code = (error as { code?: number }).code;\n const causeCode = (error as { cause?: { code?: number } }).cause?.code;\n return (\n code === EIP_1193_USER_REJECTION_ERROR_CODE ||\n causeCode === EIP_1193_USER_REJECTION_ERROR_CODE\n );\n }\n return false;\n}\n\nexport function formatAccountsToCAIP(accounts: string[], chainId: string) {\n return accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: chainId,\n },\n }) as CaipAccount,\n );\n}\n", "export const CAIP_NAMESPACE = 'eip155';\n\nexport const CAIP_ETHEREUM_CHAIN_ID = '1';\nexport const CAIP_OPTIMISM_CHAIN_ID = '10';\nexport const CAIP_LINEA_CHAIN_ID = '59144';\nexport const CAIP_METIS_CHAIN_ID = '1088';\nexport const CAIP_BLAST_CHAIN_ID = '81457';\nexport const CAIP_CELO_CHAIN_ID = '42220';\nexport const CAIP_FANTOM_CHAIN_ID = '250';\nexport const CAIP_MONAD_CHAIN_ID = '143';\nexport const CAIP_SONIC_CHAIN_ID = '146';\nexport const CAIP_BERACHAIN_CHAIN_ID = '80094';\nexport const CAIP_BASE_CHAIN_ID = '8453';\nexport const CAIP_ZETA_CHAIN_ID = '7000';\nexport const CAIP_ARBITRUM_CHAIN_ID = '42161';\nexport const CAIP_BSC_CHAIN_ID = '56';\nexport const CAIP_SCROLL_CHAIN_ID = '534352';\nexport const CAIP_AVAX_CHAIN_ID = '43114';\nexport const CAIP_POLYGON_CHAIN_ID = '137';\nexport const CAIP_GNOSIS_CHAIN_ID = '100';\nexport const CAIP_CRONOS_CHAIN_ID = '25';\nexport const CAIP_BOBA_CHAIN_ID = '288';\nexport const CAIP_MOONBEAM_CHAIN_ID = '1284';\nexport const CAIP_MOONRIVER_CHAIN_ID = '1285';\nexport const CAIP_HARMONY_CHAIN_ID = '1666600000';\nexport const CAIP_ZKSYNC_CHAIN_ID = '324';\n", "import type { EIP1193EventMap } from './eip1193.js';\nimport type { EvmActions, ProviderAPI } from './types.js';\nimport type { Subscriber, SubscriberCleanUp } from '@hub3js/core';\n\nimport { builders } from './mod.js';\n\nexport function changeAccountSubscriber(\n instance: () => ProviderAPI,\n): [Subscriber<EvmActions>, SubscriberCleanUp<EvmActions>] {\n return builders.changeAccountSubscriber(instance).build();\n}\n\nexport function changeChainSubscriber(\n instance: () => ProviderAPI,\n): [Subscriber<EvmActions>, SubscriberCleanUp<EvmActions>] {\n let eventCallback: EIP1193EventMap['chainChanged'];\n\n return [\n (context) => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to subscribe to your EVM wallet, but seems its instance is not available.',\n );\n }\n\n const [, setState] = context.state();\n\n eventCallback = async (chainId: string) => {\n setState('network', chainId);\n };\n evmInstance.on('chainChanged', eventCallback);\n },\n () => {\n const evmInstance = instance();\n\n if (eventCallback && evmInstance) {\n evmInstance.removeListener('chainChanged', eventCallback);\n }\n },\n ];\n}\n", "import { afterRecommended } from '@hub3js/std/operators';\n\nexport const recommended = [...afterRecommended];\n", "import { connectAndUpdateStateForMultiNetworks } from '@hub3js/std/operators';\n\nexport const recommended = [\n ['connect', connectAndUpdateStateForMultiNetworks] as const,\n];\n", "import { beforeRecommended } from '@hub3js/std/operators';\n\nexport const recommended = [...beforeRecommended];\n", "import type { EvmActions, ProviderAPI } from './types.js';\n\nimport { ActionBuilder } from '@hub3js/core';\nimport { ChangeAccountSubscriberBuilder } from '@hub3js/std/hooks';\nimport {\n connectAndUpdateStateForMultiNetworks,\n intoConnecting,\n intoConnectionFinished,\n} from '@hub3js/std/operators';\n\nimport { formatAccountsToCAIP } from './utils.js';\n\n// Actions\nexport const connect = () =>\n new ActionBuilder<EvmActions, 'connect'>('connect')\n .and(connectAndUpdateStateForMultiNetworks)\n .before(intoConnecting)\n .after(intoConnectionFinished);\n\nexport const canEagerConnect = () =>\n new ActionBuilder<EvmActions, 'canEagerConnect'>('canEagerConnect');\nexport const canSwitchNetwork = () =>\n new ActionBuilder<EvmActions, 'canSwitchNetwork'>('canSwitchNetwork');\n\n// Hooks\nexport const changeAccountSubscriber = (getInstance: () => ProviderAPI) =>\n new ChangeAccountSubscriberBuilder<string[], ProviderAPI, EvmActions>()\n .getInstance(getInstance)\n /*\n * In some wallets, when a user switches to an account not yet connected to the dApp, it returns null.\n * A null value indicates no access to the account, requiring a disconnect and user reconnection.\n * This behavior may vary across different wallets, and if so, a different approach may be needed.\n */\n .onSwitchAccount((event, context) => {\n if (!event.payload || !event.payload.length) {\n context.action('disconnect');\n event.preventDefault();\n }\n })\n .format(async (instance, accounts) => {\n const chainId = await instance.request({ method: 'eth_chainId' });\n return formatAccountsToCAIP(accounts, chainId);\n })\n .addEventListener((instance, callback) => {\n instance.on('accountsChanged', callback);\n })\n .removeEventListener((instance, callback) => {\n instance.removeListener?.('accountsChanged', callback);\n });\n\nexport const getChainId = () =>\n new ActionBuilder<EvmActions, 'getChainId'>('getChainId');\n"],
|
|
5
|
-
"mappings": "6IAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,qBAAAC,EAAA,YAAAC,EAAA,eAAAC,EAAA,gBAAAC,IAYA,OAAS,sBAAAC,MAA0B,sBCZnC,IAAAC,EAAA,GAAAC,EAAAD,EAAA,
|
|
6
|
-
"names": ["actions_exports", "__export", "canEagerConnect", "canSwitchNetwork", "connect", "getChainId", "recommended", "recommendedActions", "utils_exports", "__export", "filterAndGetEvmBlockchainNames", "formatAccountsToCAIP", "getAccounts", "isEvmNamespace", "isUserRejectionError", "suggestNetwork", "switchNetwork", "switchOrAddNetwork", "getNamespaceFromCaip2ChainId", "AccountId", "evmBlockchains", "CAIP_NAMESPACE", "CAIP_ETHEREUM_CHAIN_ID", "CAIP_OPTIMISM_CHAIN_ID", "CAIP_LINEA_CHAIN_ID", "CAIP_METIS_CHAIN_ID", "CAIP_BLAST_CHAIN_ID", "CAIP_CELO_CHAIN_ID", "CAIP_FANTOM_CHAIN_ID", "CAIP_MONAD_CHAIN_ID", "CAIP_SONIC_CHAIN_ID", "CAIP_BERACHAIN_CHAIN_ID", "CAIP_BASE_CHAIN_ID", "CAIP_ZETA_CHAIN_ID", "CAIP_ARBITRUM_CHAIN_ID", "CAIP_BSC_CHAIN_ID", "CAIP_SCROLL_CHAIN_ID", "CAIP_AVAX_CHAIN_ID", "CAIP_POLYGON_CHAIN_ID", "CAIP_GNOSIS_CHAIN_ID", "CAIP_CRONOS_CHAIN_ID", "CAIP_BOBA_CHAIN_ID", "CAIP_MOONBEAM_CHAIN_ID", "CAIP_MOONRIVER_CHAIN_ID", "CAIP_HARMONY_CHAIN_ID", "CAIP_ZKSYNC_CHAIN_ID", "CHAIN_ID_RADIX", "isEvmNamespace", "caip2ChainId", "getNamespaceFromCaip2ChainId", "CAIP_NAMESPACE", "__name", "getAccounts", "provider", "accounts", "chainId", "standardChainId", "suggestNetwork", "instance", "chain", "switchNetwork", "filterAndGetEvmBlockchainNames", "meta", "evmBlockchains", "blockchain", "switchOrAddNetwork", "switchError", "error", "EIP_1193_USER_REJECTION_ERROR_CODE", "isUserRejectionError", "code", "causeCode", "formatAccountsToCAIP", "account", "AccountId", "recommended", "recommendedActions", "connect", "instance", "options", "context", "chain", "setState", "evmInstance", "switchOrAddNetwork", "providerAccounts", "getAccounts", "formatAccountsToCAIP", "__name", "canEagerConnect", "canSwitchNetwork", "params", "network", "supportedChains", "filterAndGetEvmBlockchainNames", "getChainId", "hooks_exports", "__export", "changeAccountSubscriber", "changeChainSubscriber", "changeAccountSubscriber", "instance", "builders_exports", "__name", "changeChainSubscriber", "eventCallback", "context", "evmInstance", "setState", "chainId", "after_exports", "__export", "recommended", "afterRecommended", "and_exports", "__export", "recommended", "connectAndUpdateStateForMultiNetworks", "before_exports", "__export", "recommended", "beforeRecommended", "builders_exports", "__export", "canEagerConnect", "canSwitchNetwork", "changeAccountSubscriber", "connect", "getChainId", "ActionBuilder", "ChangeAccountSubscriberBuilder", "connectAndUpdateStateForMultiNetworks", "intoConnecting", "intoConnectionFinished", "connect", "__name", "ActionBuilder", "connectAndUpdateStateForMultiNetworks", "intoConnecting", "intoConnectionFinished", "canEagerConnect", "canSwitchNetwork", "changeAccountSubscriber", "getInstance", "ChangeAccountSubscriberBuilder", "event", "context", "instance", "accounts", "chainId", "formatAccountsToCAIP", "callback", "getChainId"]
|
|
4
|
+
"sourcesContent": ["import type {\n ConnectOptions,\n EvmActions,\n ProviderAccounts,\n ProviderAPI,\n} from './types.js';\nimport type {\n CanEagerConnect,\n Context,\n FunctionWithContext,\n} from '@hub3js/core';\n\nimport { recommendedActions } from '@hub3js/std/actions';\n\nimport {\n encodeAllowanceCallData,\n filterAndGetEvmBlockchainNames,\n formatAccountsToCAIP,\n getAccounts,\n switchOrAddNetwork,\n} from './utils.js';\n\nexport const recommended = [...recommendedActions];\nexport function connect(\n instance: () => ProviderAPI,\n options?: ConnectOptions,\n): FunctionWithContext<EvmActions['connect'], Context> {\n return async (context, chain) => {\n // Setting connect args to be used on other actions\n const [, setState] = context.state();\n setState('connectArgs', { chain });\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Do your wallet injected correctly and is evm compatible?',\n );\n }\n\n if (chain) {\n /*\n * The `switchOrAddNetwork` function can be optionally provided through `options`\n * to handle network switching or addition in a way that is compatible with the specific wallet provider.\n * This approach is necessary because not all providers follow the same conventions\u2014\n * for example, Rabby uses a different error code for \"chain not found\".\n */\n if (options?.switchOrAddNetwork) {\n await options.switchOrAddNetwork(evmInstance, chain);\n } else {\n await switchOrAddNetwork(evmInstance, chain);\n }\n }\n\n let providerAccounts: ProviderAccounts;\n /*\n * The `getAccounts` function can be optionally provided through `options`\n * to handle getting address and chainId of the specific wallet provider.\n * This approach is necessary because not all providers follow the same conventions.\n */\n if (options?.getAccounts) {\n providerAccounts = await options.getAccounts(evmInstance);\n } else {\n providerAccounts = await getAccounts(evmInstance);\n }\n\n /*\n * Ensure that the provider returns at least one valid account before proceeding.\n * This prevents cases (e.g., MetaMask bug) where a user connects with an account\n * that has no associated EVM address, leaving the dApp without any usable accounts.\n */\n if (!providerAccounts.accounts || !providerAccounts.accounts.length) {\n throw new Error(\n 'No accounts were returned by the provider. Please make sure your wallet has an active EVM-compatible account selected.',\n );\n }\n const formattedAccounts = formatAccountsToCAIP(\n providerAccounts.accounts,\n providerAccounts.chainId,\n );\n\n return {\n accounts: formattedAccounts,\n network: providerAccounts.chainId,\n };\n };\n}\n\nexport function canEagerConnect(\n instance: () => ProviderAPI | undefined,\n): CanEagerConnect<EvmActions> {\n return async () => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to eagerly connect to your EVM wallet, but seems its instance is not available.',\n );\n }\n\n try {\n const accounts: string[] = await evmInstance.request({\n method: 'eth_accounts',\n });\n if (accounts.length) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n };\n}\nexport function canSwitchNetwork(): FunctionWithContext<\n EvmActions['canSwitchNetwork'],\n Context\n> {\n return (context, params) => {\n const { network, supportedChains } = params;\n return filterAndGetEvmBlockchainNames(supportedChains).includes(network);\n };\n}\n\nexport function getChainId(\n instance: () => ProviderAPI | undefined,\n): FunctionWithContext<EvmActions['getChainId'], Context> {\n return async () => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to get chain id from your EVM wallet, but instance is not available.',\n );\n }\n\n return evmInstance.request({ method: 'eth_chainId' });\n };\n}\n\nexport function getAllowance(\n instance: () => ProviderAPI | undefined,\n): FunctionWithContext<EvmActions['getAllowance'], Context> {\n return async (_context, params) => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to get allowance from your EVM wallet, but instance is not available.',\n );\n }\n\n const result = await evmInstance.request({\n method: 'eth_call',\n params: [\n {\n to: params.token as `0x${string}`,\n data: encodeAllowanceCallData(params.owner, params.spender),\n },\n 'latest',\n ],\n });\n\n // An empty result ('0x') means the call returned no data; treat as zero allowance.\n return BigInt(result === '0x' ? 0 : result).toString();\n };\n}\n\nexport function getTransactionReceipt(\n instance: () => ProviderAPI | undefined,\n): FunctionWithContext<EvmActions['getTransactionReceipt'], Context> {\n return async (_context, txHash) => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to get transaction receipt from your EVM wallet, but instance is not available.',\n );\n }\n\n return evmInstance.request({\n method: 'eth_getTransactionReceipt',\n params: [txHash],\n });\n };\n}\n", "import type { Chain, ChainId, ProviderAPI } from './types.js';\nimport type { CaipAccount } from '@hub3js/std/types';\n\nimport { getNamespaceFromCaip2ChainId } from '@hub3js/std/utils';\nimport { AccountId } from 'caip';\nimport { type BlockchainMeta, evmBlockchains } from 'rango-types';\n\nimport { CAIP_NAMESPACE } from './constants.js';\n\nconst CHAIN_ID_RADIX = 16;\n\nexport function isEvmNamespace(caip2ChainId: string): boolean {\n return getNamespaceFromCaip2ChainId(caip2ChainId) === CAIP_NAMESPACE;\n}\n\nexport async function getAccounts(provider: ProviderAPI) {\n const [accounts, chainId] = await Promise.all([\n provider.request({ method: 'eth_requestAccounts' }),\n provider.request({ method: 'eth_chainId' }),\n ]);\n /*\n * Trust Wallet Compatibility Fix:\n * Trust Wallet's in-app browser has been observed to return the `chainId` as a\n * number (e.g., 1) rather than the standard hexadecimal string (e.g., \"0x1\").\n * This code block standardizes the `chainId` to the required hex format to\n * prevent downstream errors.\n */\n let standardChainId = chainId;\n if (typeof standardChainId === 'number') {\n standardChainId = `0x${Number(chainId).toString(CHAIN_ID_RADIX)}`;\n }\n\n return {\n accounts,\n chainId: standardChainId,\n };\n}\n\nexport async function suggestNetwork(instance: ProviderAPI, chain: Chain) {\n return await instance.request({\n method: 'wallet_addEthereumChain',\n params: [chain],\n });\n}\n\nexport async function switchNetwork(instance: ProviderAPI, chainId: ChainId) {\n return await instance.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainId }],\n });\n}\nexport function filterAndGetEvmBlockchainNames(meta: BlockchainMeta[]) {\n return evmBlockchains(meta).map((blockchain) => blockchain.name);\n}\nexport async function switchOrAddNetwork(\n instance: ProviderAPI,\n chain: ChainId | Chain,\n) {\n try {\n const chainId = typeof chain === 'string' ? chain : chain.chainId;\n await switchNetwork(instance, chainId);\n } catch (switchError) {\n const error = switchError as { code: number };\n\n /*\n * Error code 4902 is used by MetaMask to indicate that the requested chain has not been added to the wallet.\n * This code is not part of the official EIP-1193 spec (https://eips.ethereum.org/EIPS/eip-1193#supported-rpc-methods),\n * so other providers may use a different code or behavior for the same condition.\n */\n const NOT_FOUND_CHAIN_ERROR_CODE = 4902;\n if (\n typeof chain !== 'string' &&\n (error.code === NOT_FOUND_CHAIN_ERROR_CODE || !error.code)\n ) {\n /*\n * Note: on WalletConnect `code` is undefined so we have to use !switchError.code as fallback.\n * This error code indicates that the chain has not been added to wallet.\n */\n await suggestNetwork(instance, chain);\n return;\n }\n throw switchError;\n }\n}\n\nconst EIP_1193_USER_REJECTION_ERROR_CODE = 4001;\nexport function isUserRejectionError(error: unknown): boolean {\n // EIP-1193 user rejection error can be in error.code or error.cause.code\n if (typeof error === 'object' && error !== null) {\n const code = (error as { code?: number }).code;\n const causeCode = (error as { cause?: { code?: number } }).cause?.code;\n return (\n code === EIP_1193_USER_REJECTION_ERROR_CODE ||\n causeCode === EIP_1193_USER_REJECTION_ERROR_CODE\n );\n }\n return false;\n}\n\nexport function formatAccountsToCAIP(accounts: string[], chainId: string) {\n return accounts.map(\n (account) =>\n AccountId.format({\n address: account,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: chainId,\n },\n }) as CaipAccount,\n );\n}\n\nconst EVM_WORD_LENGTH = 64;\n/** First 4 bytes of keccak256(\"allowance(address,address)\") */\nconst ERC20_ALLOWANCE_SELECTOR = '0xdd62ed3e';\n/** First 4 bytes of keccak256(\"approve(address,uint256)\") */\nconst ERC20_APPROVE_SELECTOR = '0x095ea7b3';\n\nfunction padAddressToEvmWord(address: string): string {\n return address\n .toLowerCase()\n .replace(/^0x/, '')\n .padStart(EVM_WORD_LENGTH, '0');\n}\n\nconst HEX_RADIX = 16;\n\nfunction padUintToEvmWord(value: string): string {\n return BigInt(value).toString(HEX_RADIX).padStart(EVM_WORD_LENGTH, '0');\n}\n\nexport function encodeAllowanceCallData(\n owner: string,\n spender: string,\n): `0x${string}` {\n return `${ERC20_ALLOWANCE_SELECTOR}${padAddressToEvmWord(\n owner,\n )}${padAddressToEvmWord(spender)}`;\n}\n\nexport function encodeApproveCallData(\n spender: string,\n amount: string,\n): `0x${string}` {\n return `${ERC20_APPROVE_SELECTOR}${padAddressToEvmWord(\n spender,\n )}${padUintToEvmWord(amount)}`;\n}\n", "export const CAIP_NAMESPACE = 'eip155';\n\nexport const CAIP_ETHEREUM_CHAIN_ID = '1';\nexport const CAIP_OPTIMISM_CHAIN_ID = '10';\nexport const CAIP_LINEA_CHAIN_ID = '59144';\nexport const CAIP_METIS_CHAIN_ID = '1088';\nexport const CAIP_BLAST_CHAIN_ID = '81457';\nexport const CAIP_CELO_CHAIN_ID = '42220';\nexport const CAIP_FANTOM_CHAIN_ID = '250';\nexport const CAIP_MONAD_CHAIN_ID = '143';\nexport const CAIP_SONIC_CHAIN_ID = '146';\nexport const CAIP_BERACHAIN_CHAIN_ID = '80094';\nexport const CAIP_BASE_CHAIN_ID = '8453';\nexport const CAIP_ZETA_CHAIN_ID = '7000';\nexport const CAIP_ARBITRUM_CHAIN_ID = '42161';\nexport const CAIP_BSC_CHAIN_ID = '56';\nexport const CAIP_SCROLL_CHAIN_ID = '534352';\nexport const CAIP_AVAX_CHAIN_ID = '43114';\nexport const CAIP_POLYGON_CHAIN_ID = '137';\nexport const CAIP_GNOSIS_CHAIN_ID = '100';\nexport const CAIP_CRONOS_CHAIN_ID = '25';\nexport const CAIP_BOBA_CHAIN_ID = '288';\nexport const CAIP_MOONBEAM_CHAIN_ID = '1284';\nexport const CAIP_MOONRIVER_CHAIN_ID = '1285';\nexport const CAIP_HARMONY_CHAIN_ID = '1666600000';\nexport const CAIP_ZKSYNC_CHAIN_ID = '324';\n", "import type { EIP1193EventMap } from './eip1193.js';\nimport type { EvmActions, ProviderAPI } from './types.js';\nimport type { Subscriber, SubscriberCleanUp } from '@hub3js/core';\n\nimport { builders } from './mod.js';\n\nexport function changeAccountSubscriber(\n instance: () => ProviderAPI,\n): [Subscriber<EvmActions>, SubscriberCleanUp<EvmActions>] {\n return builders.changeAccountSubscriber(instance).build();\n}\n\nexport function changeChainSubscriber(\n instance: () => ProviderAPI,\n): [Subscriber<EvmActions>, SubscriberCleanUp<EvmActions>] {\n let eventCallback: EIP1193EventMap['chainChanged'];\n\n return [\n (context) => {\n const evmInstance = instance();\n\n if (!evmInstance) {\n throw new Error(\n 'Trying to subscribe to your EVM wallet, but seems its instance is not available.',\n );\n }\n\n const [, setState] = context.state();\n\n eventCallback = async (chainId: string) => {\n setState('network', chainId);\n };\n evmInstance.on('chainChanged', eventCallback);\n },\n () => {\n const evmInstance = instance();\n\n if (eventCallback && evmInstance) {\n evmInstance.removeListener('chainChanged', eventCallback);\n }\n },\n ];\n}\n", "import { afterRecommended } from '@hub3js/std/operators';\n\nexport const recommended = [...afterRecommended];\n", "import { connectAndUpdateStateForMultiNetworks } from '@hub3js/std/operators';\n\nexport const recommended = [\n ['connect', connectAndUpdateStateForMultiNetworks] as const,\n];\n", "import { beforeRecommended } from '@hub3js/std/operators';\n\nexport const recommended = [...beforeRecommended];\n", "import type { EvmActions, ProviderAPI } from './types.js';\n\nimport { ActionBuilder } from '@hub3js/core';\nimport { ChangeAccountSubscriberBuilder } from '@hub3js/std/hooks';\nimport {\n connectAndUpdateStateForMultiNetworks,\n intoConnecting,\n intoConnectionFinished,\n} from '@hub3js/std/operators';\n\nimport { formatAccountsToCAIP } from './utils.js';\n\n// Actions\nexport const connect = () =>\n new ActionBuilder<EvmActions, 'connect'>('connect')\n .and(connectAndUpdateStateForMultiNetworks)\n .before(intoConnecting)\n .after(intoConnectionFinished);\n\nexport const canEagerConnect = () =>\n new ActionBuilder<EvmActions, 'canEagerConnect'>('canEagerConnect');\nexport const canSwitchNetwork = () =>\n new ActionBuilder<EvmActions, 'canSwitchNetwork'>('canSwitchNetwork');\n\n// Hooks\nexport const changeAccountSubscriber = (getInstance: () => ProviderAPI) =>\n new ChangeAccountSubscriberBuilder<string[], ProviderAPI, EvmActions>()\n .getInstance(getInstance)\n /*\n * In some wallets, when a user switches to an account not yet connected to the dApp, it returns null.\n * A null value indicates no access to the account, requiring a disconnect and user reconnection.\n * This behavior may vary across different wallets, and if so, a different approach may be needed.\n */\n .onSwitchAccount((event, context) => {\n if (!event.payload || !event.payload.length) {\n context.action('disconnect');\n event.preventDefault();\n }\n })\n .format(async (instance, accounts) => {\n const chainId = await instance.request({ method: 'eth_chainId' });\n return formatAccountsToCAIP(accounts, chainId);\n })\n .addEventListener((instance, callback) => {\n instance.on('accountsChanged', callback);\n })\n .removeEventListener((instance, callback) => {\n instance.removeListener?.('accountsChanged', callback);\n });\n\nexport const getChainId = () =>\n new ActionBuilder<EvmActions, 'getChainId'>('getChainId');\n\nexport const getAllowance = () =>\n new ActionBuilder<EvmActions, 'getAllowance'>('getAllowance');\n\nexport const getTransactionReceipt = () =>\n new ActionBuilder<EvmActions, 'getTransactionReceipt'>(\n 'getTransactionReceipt',\n );\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["actions_exports", "__export", "canEagerConnect", "canSwitchNetwork", "connect", "getAllowance", "getChainId", "getTransactionReceipt", "recommended", "recommendedActions", "utils_exports", "__export", "encodeAllowanceCallData", "encodeApproveCallData", "filterAndGetEvmBlockchainNames", "formatAccountsToCAIP", "getAccounts", "isEvmNamespace", "isUserRejectionError", "suggestNetwork", "switchNetwork", "switchOrAddNetwork", "getNamespaceFromCaip2ChainId", "AccountId", "evmBlockchains", "CAIP_NAMESPACE", "CAIP_ETHEREUM_CHAIN_ID", "CAIP_OPTIMISM_CHAIN_ID", "CAIP_LINEA_CHAIN_ID", "CAIP_METIS_CHAIN_ID", "CAIP_BLAST_CHAIN_ID", "CAIP_CELO_CHAIN_ID", "CAIP_FANTOM_CHAIN_ID", "CAIP_MONAD_CHAIN_ID", "CAIP_SONIC_CHAIN_ID", "CAIP_BERACHAIN_CHAIN_ID", "CAIP_BASE_CHAIN_ID", "CAIP_ZETA_CHAIN_ID", "CAIP_ARBITRUM_CHAIN_ID", "CAIP_BSC_CHAIN_ID", "CAIP_SCROLL_CHAIN_ID", "CAIP_AVAX_CHAIN_ID", "CAIP_POLYGON_CHAIN_ID", "CAIP_GNOSIS_CHAIN_ID", "CAIP_CRONOS_CHAIN_ID", "CAIP_BOBA_CHAIN_ID", "CAIP_MOONBEAM_CHAIN_ID", "CAIP_MOONRIVER_CHAIN_ID", "CAIP_HARMONY_CHAIN_ID", "CAIP_ZKSYNC_CHAIN_ID", "CHAIN_ID_RADIX", "isEvmNamespace", "caip2ChainId", "getNamespaceFromCaip2ChainId", "CAIP_NAMESPACE", "__name", "getAccounts", "provider", "accounts", "chainId", "standardChainId", "suggestNetwork", "instance", "chain", "switchNetwork", "filterAndGetEvmBlockchainNames", "meta", "evmBlockchains", "blockchain", "switchOrAddNetwork", "switchError", "error", "EIP_1193_USER_REJECTION_ERROR_CODE", "isUserRejectionError", "code", "causeCode", "formatAccountsToCAIP", "account", "AccountId", "EVM_WORD_LENGTH", "ERC20_ALLOWANCE_SELECTOR", "ERC20_APPROVE_SELECTOR", "padAddressToEvmWord", "address", "HEX_RADIX", "padUintToEvmWord", "value", "encodeAllowanceCallData", "owner", "spender", "encodeApproveCallData", "amount", "recommended", "recommendedActions", "connect", "instance", "options", "context", "chain", "setState", "evmInstance", "switchOrAddNetwork", "providerAccounts", "getAccounts", "formatAccountsToCAIP", "__name", "canEagerConnect", "canSwitchNetwork", "params", "network", "supportedChains", "filterAndGetEvmBlockchainNames", "getChainId", "getAllowance", "_context", "result", "encodeAllowanceCallData", "getTransactionReceipt", "txHash", "hooks_exports", "__export", "changeAccountSubscriber", "changeChainSubscriber", "changeAccountSubscriber", "instance", "builders_exports", "__name", "changeChainSubscriber", "eventCallback", "context", "evmInstance", "setState", "chainId", "after_exports", "__export", "recommended", "afterRecommended", "and_exports", "__export", "recommended", "connectAndUpdateStateForMultiNetworks", "before_exports", "__export", "recommended", "beforeRecommended", "builders_exports", "__export", "canEagerConnect", "canSwitchNetwork", "changeAccountSubscriber", "connect", "getAllowance", "getChainId", "getTransactionReceipt", "ActionBuilder", "ChangeAccountSubscriberBuilder", "connectAndUpdateStateForMultiNetworks", "intoConnecting", "intoConnectionFinished", "connect", "__name", "ActionBuilder", "connectAndUpdateStateForMultiNetworks", "intoConnecting", "intoConnectionFinished", "canEagerConnect", "canSwitchNetwork", "changeAccountSubscriber", "getInstance", "ChangeAccountSubscriberBuilder", "event", "context", "instance", "accounts", "chainId", "formatAccountsToCAIP", "callback", "getChainId", "getAllowance", "getTransactionReceipt"]
|
|
7
7
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,11 +6,27 @@ export interface EvmActions extends AutoImplementedActionsByRecommended, CommonA
|
|
|
6
6
|
canEagerConnect: () => Promise<boolean>;
|
|
7
7
|
canSwitchNetwork: (params: CanSwitchNetworkParams) => boolean;
|
|
8
8
|
getChainId: () => Promise<`0x${string}`>;
|
|
9
|
+
getAllowance: (params: AllowanceParams) => Promise<string>;
|
|
10
|
+
getTransactionReceipt: (txHash: `0x${string}`) => Promise<EvmTransactionReceipt | null>;
|
|
9
11
|
}
|
|
10
12
|
type CanSwitchNetworkParams = {
|
|
11
13
|
network: string;
|
|
12
14
|
supportedChains: BlockchainMeta[];
|
|
13
15
|
};
|
|
16
|
+
export type AllowanceParams = {
|
|
17
|
+
/** ERC-20 token contract address */
|
|
18
|
+
token: string;
|
|
19
|
+
/** Owner wallet address */
|
|
20
|
+
owner: string;
|
|
21
|
+
/** Spender contract address */
|
|
22
|
+
spender: string;
|
|
23
|
+
};
|
|
24
|
+
export type EvmTransactionReceipt = {
|
|
25
|
+
/** '0x1' if the transaction succeeded, '0x0' if it reverted */
|
|
26
|
+
status: '0x0' | '0x1';
|
|
27
|
+
transactionHash: string;
|
|
28
|
+
blockNumber: string;
|
|
29
|
+
};
|
|
14
30
|
export type ProviderAPI = EIP1193Provider;
|
|
15
31
|
export type ChainId = string;
|
|
16
32
|
export type Chain = AddEthereumChainParameter;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EACV,uBAAuB,EACvB,mCAAmC,EACnC,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,UACf,SAAQ,mCAAmC,EAAE,aAAa;IAC1D,OAAO,EAAE,CACP,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,EACvB,OAAO,CAAC,EAAE,cAAc,KACrB,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC9D,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EACV,uBAAuB,EACvB,mCAAmC,EACnC,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,UACf,SAAQ,mCAAmC,EAAE,aAAa;IAC1D,OAAO,EAAE,CACP,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,EACvB,OAAO,CAAC,EAAE,cAAc,KACrB,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC9D,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,qBAAqB,EAAE,CACrB,MAAM,EAAE,KAAK,MAAM,EAAE,KAClB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;CAC5C;AACD,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,+DAA+D;IAC/D,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAC9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC;IAC7E,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export declare function filterAndGetEvmBlockchainNames(meta: BlockchainMeta[]):
|
|
|
11
11
|
export declare function switchOrAddNetwork(instance: ProviderAPI, chain: ChainId | Chain): Promise<void>;
|
|
12
12
|
export declare function isUserRejectionError(error: unknown): boolean;
|
|
13
13
|
export declare function formatAccountsToCAIP(accounts: string[], chainId: string): `${string}:${string}:${string}`[];
|
|
14
|
+
export declare function encodeAllowanceCallData(owner: string, spender: string): `0x${string}`;
|
|
15
|
+
export declare function encodeApproveCallData(spender: string, amount: string): `0x${string}`;
|
|
14
16
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9D,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,aAAa,CAAC;AAMlE,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,WAAW;;;GAqBtD;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,iBAKvE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,iBAK1E;AACD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,cAAc,EAAE,YAEpE;AACD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,OAAO,GAAG,KAAK,iBA2BvB;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,qCAWvE"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9D,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,aAAa,CAAC;AAMlE,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,WAAW;;;GAqBtD;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,iBAKvE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,iBAK1E;AACD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,cAAc,EAAE,YAEpE;AACD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,OAAO,GAAG,KAAK,iBA2BvB;AAGD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,qCAWvE;AAqBD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,KAAK,MAAM,EAAE,CAIf;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,KAAK,MAAM,EAAE,CAIf"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hub3js/evm",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"source": "./src/mod.ts",
|
|
@@ -26,15 +26,15 @@
|
|
|
26
26
|
"coverage": "vitest run --coverage"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
|
-
"@hub3js/core": "^0.
|
|
29
|
+
"@hub3js/core": "^0.63.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@hub3js/core": "^0.
|
|
32
|
+
"@hub3js/core": "^0.63.0"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@hub3js/std": "^0.
|
|
35
|
+
"@hub3js/std": "^0.5.0",
|
|
36
36
|
"caip": "^1.1.1",
|
|
37
|
-
"rango-types": "^0.
|
|
37
|
+
"rango-types": "^0.6.0"
|
|
38
38
|
},
|
|
39
39
|
"publishConfig": {
|
|
40
40
|
"access": "public"
|
package/src/actions.ts
CHANGED
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
import { recommendedActions } from '@hub3js/std/actions';
|
|
14
14
|
|
|
15
15
|
import {
|
|
16
|
+
encodeAllowanceCallData,
|
|
16
17
|
filterAndGetEvmBlockchainNames,
|
|
17
18
|
formatAccountsToCAIP,
|
|
18
19
|
getAccounts,
|
|
@@ -134,3 +135,50 @@ export function getChainId(
|
|
|
134
135
|
return evmInstance.request({ method: 'eth_chainId' });
|
|
135
136
|
};
|
|
136
137
|
}
|
|
138
|
+
|
|
139
|
+
export function getAllowance(
|
|
140
|
+
instance: () => ProviderAPI | undefined,
|
|
141
|
+
): FunctionWithContext<EvmActions['getAllowance'], Context> {
|
|
142
|
+
return async (_context, params) => {
|
|
143
|
+
const evmInstance = instance();
|
|
144
|
+
|
|
145
|
+
if (!evmInstance) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
'Trying to get allowance from your EVM wallet, but instance is not available.',
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const result = await evmInstance.request({
|
|
152
|
+
method: 'eth_call',
|
|
153
|
+
params: [
|
|
154
|
+
{
|
|
155
|
+
to: params.token as `0x${string}`,
|
|
156
|
+
data: encodeAllowanceCallData(params.owner, params.spender),
|
|
157
|
+
},
|
|
158
|
+
'latest',
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// An empty result ('0x') means the call returned no data; treat as zero allowance.
|
|
163
|
+
return BigInt(result === '0x' ? 0 : result).toString();
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function getTransactionReceipt(
|
|
168
|
+
instance: () => ProviderAPI | undefined,
|
|
169
|
+
): FunctionWithContext<EvmActions['getTransactionReceipt'], Context> {
|
|
170
|
+
return async (_context, txHash) => {
|
|
171
|
+
const evmInstance = instance();
|
|
172
|
+
|
|
173
|
+
if (!evmInstance) {
|
|
174
|
+
throw new Error(
|
|
175
|
+
'Trying to get transaction receipt from your EVM wallet, but instance is not available.',
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return evmInstance.request({
|
|
180
|
+
method: 'eth_getTransactionReceipt',
|
|
181
|
+
params: [txHash],
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
}
|
package/src/builders.ts
CHANGED
|
@@ -50,3 +50,11 @@ export const changeAccountSubscriber = (getInstance: () => ProviderAPI) =>
|
|
|
50
50
|
|
|
51
51
|
export const getChainId = () =>
|
|
52
52
|
new ActionBuilder<EvmActions, 'getChainId'>('getChainId');
|
|
53
|
+
|
|
54
|
+
export const getAllowance = () =>
|
|
55
|
+
new ActionBuilder<EvmActions, 'getAllowance'>('getAllowance');
|
|
56
|
+
|
|
57
|
+
export const getTransactionReceipt = () =>
|
|
58
|
+
new ActionBuilder<EvmActions, 'getTransactionReceipt'>(
|
|
59
|
+
'getTransactionReceipt',
|
|
60
|
+
);
|
package/src/mod.ts
CHANGED
|
@@ -6,6 +6,13 @@ export * as before from './before.js';
|
|
|
6
6
|
export * as utils from './utils.js';
|
|
7
7
|
export * as builders from './builders.js';
|
|
8
8
|
|
|
9
|
-
export type {
|
|
9
|
+
export type {
|
|
10
|
+
EvmActions,
|
|
11
|
+
ProviderAPI,
|
|
12
|
+
Chain,
|
|
13
|
+
ChainId,
|
|
14
|
+
AllowanceParams,
|
|
15
|
+
EvmTransactionReceipt,
|
|
16
|
+
} from './types.js';
|
|
10
17
|
export * from './constants.js';
|
|
11
18
|
export { isEvmNamespace } from './utils.js';
|
package/src/types.ts
CHANGED
|
@@ -15,12 +15,32 @@ export interface EvmActions
|
|
|
15
15
|
canEagerConnect: () => Promise<boolean>;
|
|
16
16
|
canSwitchNetwork: (params: CanSwitchNetworkParams) => boolean;
|
|
17
17
|
getChainId: () => Promise<`0x${string}`>;
|
|
18
|
+
getAllowance: (params: AllowanceParams) => Promise<string>;
|
|
19
|
+
getTransactionReceipt: (
|
|
20
|
+
txHash: `0x${string}`,
|
|
21
|
+
) => Promise<EvmTransactionReceipt | null>;
|
|
18
22
|
}
|
|
19
23
|
type CanSwitchNetworkParams = {
|
|
20
24
|
network: string;
|
|
21
25
|
supportedChains: BlockchainMeta[];
|
|
22
26
|
};
|
|
23
27
|
|
|
28
|
+
export type AllowanceParams = {
|
|
29
|
+
/** ERC-20 token contract address */
|
|
30
|
+
token: string;
|
|
31
|
+
/** Owner wallet address */
|
|
32
|
+
owner: string;
|
|
33
|
+
/** Spender contract address */
|
|
34
|
+
spender: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type EvmTransactionReceipt = {
|
|
38
|
+
/** '0x1' if the transaction succeeded, '0x0' if it reverted */
|
|
39
|
+
status: '0x0' | '0x1';
|
|
40
|
+
transactionHash: string;
|
|
41
|
+
blockNumber: string;
|
|
42
|
+
};
|
|
43
|
+
|
|
24
44
|
export type ProviderAPI = EIP1193Provider;
|
|
25
45
|
// A 0x-prefixed hexadecimal string
|
|
26
46
|
export type ChainId = string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { encodeAllowanceCallData, encodeApproveCallData } from './utils.js';
|
|
4
|
+
|
|
5
|
+
const OWNER = '0x04883baca105E4307591d289aE11C08D0F6f0cF6';
|
|
6
|
+
const SPENDER = '0x69460570c93f9DE5E2edbC3052bf10125f0Ca22d';
|
|
7
|
+
|
|
8
|
+
describe('erc20 call data encoding', () => {
|
|
9
|
+
it('encodes allowance(owner, spender)', () => {
|
|
10
|
+
expect(encodeAllowanceCallData(OWNER, SPENDER)).toBe(
|
|
11
|
+
'0xdd62ed3e' +
|
|
12
|
+
'00000000000000000000000004883baca105e4307591d289ae11c08d0f6f0cf6' +
|
|
13
|
+
'00000000000000000000000069460570c93f9de5e2edbc3052bf10125f0ca22d',
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('encodes approve(spender, amount)', () => {
|
|
18
|
+
expect(encodeApproveCallData(SPENDER, '175703')).toBe(
|
|
19
|
+
'0x095ea7b3' +
|
|
20
|
+
'00000000000000000000000069460570c93f9de5e2edbc3052bf10125f0ca22d' +
|
|
21
|
+
'000000000000000000000000000000000000000000000000000000000002ae57',
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
});
|
package/src/utils.ts
CHANGED
|
@@ -109,3 +109,40 @@ export function formatAccountsToCAIP(accounts: string[], chainId: string) {
|
|
|
109
109
|
}) as CaipAccount,
|
|
110
110
|
);
|
|
111
111
|
}
|
|
112
|
+
|
|
113
|
+
const EVM_WORD_LENGTH = 64;
|
|
114
|
+
/** First 4 bytes of keccak256("allowance(address,address)") */
|
|
115
|
+
const ERC20_ALLOWANCE_SELECTOR = '0xdd62ed3e';
|
|
116
|
+
/** First 4 bytes of keccak256("approve(address,uint256)") */
|
|
117
|
+
const ERC20_APPROVE_SELECTOR = '0x095ea7b3';
|
|
118
|
+
|
|
119
|
+
function padAddressToEvmWord(address: string): string {
|
|
120
|
+
return address
|
|
121
|
+
.toLowerCase()
|
|
122
|
+
.replace(/^0x/, '')
|
|
123
|
+
.padStart(EVM_WORD_LENGTH, '0');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const HEX_RADIX = 16;
|
|
127
|
+
|
|
128
|
+
function padUintToEvmWord(value: string): string {
|
|
129
|
+
return BigInt(value).toString(HEX_RADIX).padStart(EVM_WORD_LENGTH, '0');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function encodeAllowanceCallData(
|
|
133
|
+
owner: string,
|
|
134
|
+
spender: string,
|
|
135
|
+
): `0x${string}` {
|
|
136
|
+
return `${ERC20_ALLOWANCE_SELECTOR}${padAddressToEvmWord(
|
|
137
|
+
owner,
|
|
138
|
+
)}${padAddressToEvmWord(spender)}`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function encodeApproveCallData(
|
|
142
|
+
spender: string,
|
|
143
|
+
amount: string,
|
|
144
|
+
): `0x${string}` {
|
|
145
|
+
return `${ERC20_APPROVE_SELECTOR}${padAddressToEvmWord(
|
|
146
|
+
spender,
|
|
147
|
+
)}${padUintToEvmWord(amount)}`;
|
|
148
|
+
}
|