@avalabs/evm-module 0.0.8 → 0.0.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @avalabs/evm-module@0.0.8 build /home/runner/work/vm-modules/vm-modules/packages/evm-module
2
+ > @avalabs/evm-module@0.0.9 build /home/runner/work/vm-modules/vm-modules/packages/evm-module
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: ./src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
12
  ESM Build start
13
- CJS dist/index.cjs 9.17 KB
14
- CJS dist/index.cjs.map 36.22 KB
15
- CJS ⚡️ Build success in 1521ms
16
- ESM dist/index.js 8.54 KB
17
- ESM dist/index.js.map 36.22 KB
18
- ESM ⚡️ Build success in 1527ms
13
+ CJS dist/index.cjs 10.34 KB
14
+ CJS dist/index.cjs.map 40.40 KB
15
+ CJS ⚡️ Build success in 1259ms
16
+ ESM dist/index.js 9.71 KB
17
+ ESM dist/index.js.map 40.40 KB
18
+ ESM ⚡️ Build success in 1260ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 8845ms
21
- DTS dist/index.d.cts 612.00 B
22
- DTS dist/index.d.ts 612.00 B
20
+ DTS ⚡️ Build success in 9283ms
21
+ DTS dist/index.d.cts 834.00 B
22
+ DTS dist/index.d.ts 834.00 B
@@ -1,4 +1,4 @@
1
1
 
2
- > @avalabs/evm-module@0.0.8 lint /home/runner/work/vm-modules/vm-modules/packages/evm-module
2
+ > @avalabs/evm-module@0.0.9 lint /home/runner/work/vm-modules/vm-modules/packages/evm-module
3
3
  > eslint "src/**/*.ts"
4
4
 
@@ -1,14 +1,14 @@
1
1
 
2
- > @avalabs/evm-module@0.0.8 test /home/runner/work/vm-modules/vm-modules/packages/evm-module
2
+ > @avalabs/evm-module@0.0.9 test /home/runner/work/vm-modules/vm-modules/packages/evm-module
3
3
  > jest
4
4
 
5
- PASS src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transaction-from-glacier.test.ts (10.698 s)
5
+ PASS src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transaction-from-glacier.test.ts (11.184 s)
6
6
  PASS src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.test.ts
7
- PASS src/handlers/get-transaction-history/index.test.ts
8
- PASS src/handlers/get-network-fee.test.ts
7
+ PASS src/handlers/get-transaction-history/get-transaction-history.test.ts
8
+ PASS src/handlers/get-network-fee/get-network-fee.test.ts
9
9
 
10
10
  Test Suites: 4 passed, 4 total
11
11
  Tests: 12 passed, 12 total
12
12
  Snapshots: 0 total
13
- Time: 11.786 s
13
+ Time: 12.889 s
14
14
  Ran all test suites.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @avalabs/evm-module
2
2
 
3
+ ## 0.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 6ffa356: add module functions to evm-module
8
+ - Updated dependencies [6ffa356]
9
+ - @avalabs/vm-module-types@0.0.9
10
+
3
11
  ## 0.0.8
4
12
 
5
13
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -1,19 +1,20 @@
1
1
  'use strict';
2
2
 
3
3
  var vmModuleTypes = require('@avalabs/vm-module-types');
4
- require('ethers');
4
+ var walletsSdk = require('@avalabs/wallets-sdk');
5
+ var ethers = require('ethers');
5
6
  var utilsSdk = require('@avalabs/utils-sdk');
6
7
  var bn_js = require('bn.js');
7
8
  var etherscanSdk = require('@avalabs/etherscan-sdk');
8
9
  var glacierSdk = require('@avalabs/glacier-sdk');
9
- var lt = require('lodash.startcase');
10
+ var yt = require('lodash.startcase');
10
11
 
11
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
13
 
13
- var lt__default = /*#__PURE__*/_interopDefault(lt);
14
+ var yt__default = /*#__PURE__*/_interopDefault(yt);
14
15
 
15
- var b=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)};var w=(t,e,r)=>(b(t,e,"read from private field"),r?r.call(t):e.get(t)),F=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r);},I=(t,e,r,n)=>(b(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r);var R={LOW:1n,MEDIUM:4n,HIGH:6n},x=500000000n;async function C(t){let{maxFeePerGas:e}=await t.getFeeData();if(!e)throw new Error("Pre-EIP-1559 networks are not supported");let r=x*R.LOW,n=x*R.MEDIUM,s=x*R.HIGH;return {baseFee:e,low:{maxFeePerGas:e+r,maxPriorityFeePerGas:r},medium:{maxFeePerGas:e+n,maxPriorityFeePerGas:n},high:{maxFeePerGas:e+s,maxPriorityFeePerGas:s}}}function E(t,e,r="tx"){return `${t}/${r}/${e}`}var M=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),o=parseInt(t.timeStamp)*1e3,i=e.decimals,m=new bn_js.BN(t.value),c=utilsSdk.balanceToDisplayValue(m,i),T=a?vmModuleTypes.TransactionType.SEND:vmModuleTypes.TransactionType.RECEIVE,{from:p,to:l,gasPrice:f,gasUsed:g,hash:u}=t,y=E(n,u);return {isIncoming:!a,isOutgoing:a,isContractCall:st(t),timestamp:o,hash:u,isSender:a,from:p,to:l,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:c,type:vmModuleTypes.TokenType.NATIVE}],gasUsed:g,gasPrice:f,chainId:r.toString(),txType:T,explorerLink:y}};function st(t){return t.input!=="0x"}function O({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,o=parseInt(t.tokenDecimal),i=new bn_js.BN(t.value),m=utilsSdk.balanceToDisplayValue(i,o),{from:c,to:T,gasPrice:p,gasUsed:l,hash:f,tokenDecimal:g,tokenName:u,tokenSymbol:y}=t,k=s?vmModuleTypes.TransactionType.SEND:vmModuleTypes.TransactionType.RECEIVE,et=E(r,f);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:f,isSender:s,from:c,to:T,tokens:[{decimal:g,name:u,symbol:y,type:vmModuleTypes.TokenType.ERC20,amount:m}],gasUsed:l,gasPrice:p,chainId:n.toString(),txType:k,explorerLink:et}}var _=async({isTestnet:t,chainId:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o})=>{let i=a?JSON.parse(a):void 0,m=i?.page||1,c=i?.queries||["normal","erc20"],T=(c.includes("normal")?await etherscanSdk.getNormalTxs(s,!t,{page:m,offset:o}):[]).map(u=>M({tx:u,chainId:e,networkToken:r,explorerUrl:n,address:s})),p=(c.includes("erc20")?await etherscanSdk.getErc20Txs(s,!t,void 0,{page:m,offset:o}):[]).map(u=>O({tx:u,address:s,explorerUrl:n,chainId:e})),l=p.map(u=>u.hash),f=T.filter(u=>!l.includes(u.hash)),g={queries:[],page:m+1};return T.length&&g.queries.push("normal"),p.length&&g.queries.push("erc20"),{transactions:[...f,...p],nextPageToken:g.queries.length?JSON.stringify(g):""}};var A=t=>t===1||t===5||t===4||t===11155111;var U=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r},n,s)=>{let a=!e&&!r,o=ut(t.method?.methodName),i=o.toLowerCase().includes("swap"),m=a&&t.from.address===n,c=a&&t.to.address===n,T=o==="Market Buy Orders With Eth"||o==="Buy NFT",p=o==="Approve",l=o.toLowerCase().includes("transfer"),f=o.toLowerCase().includes("airdrop"),g=o.toLowerCase().includes("unwrap"),u=o==="Fill Order",y=l&&!!s[0]&&L(s[0].type)&&s[0].from?.address===n,k=l&&!!s[0]&&L(s[0].type)&&s[0].to?.address===n;return i?vmModuleTypes.TransactionType.SWAP:m?vmModuleTypes.TransactionType.SEND:c?vmModuleTypes.TransactionType.RECEIVE:T?vmModuleTypes.TransactionType.NFT_BUY:p?vmModuleTypes.TransactionType.APPROVE:y?vmModuleTypes.TransactionType.NFT_SEND:k?vmModuleTypes.TransactionType.NFT_RECEIVE:l?vmModuleTypes.TransactionType.TRANSFER:f?vmModuleTypes.TransactionType.AIRDROP:g?vmModuleTypes.TransactionType.UNWRAP:u?vmModuleTypes.TransactionType.FILL_ORDER:vmModuleTypes.TransactionType.UNKNOWN};function L(t){return t===vmModuleTypes.TokenType.ERC721||t===vmModuleTypes.TokenType.ERC1155}var ut=(t="")=>t.includes("(")?lt__default.default(t.split("(",1)[0]):t;var V=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let a=t===vmModuleTypes.TransactionType.TRANSFER,o=t===vmModuleTypes.TransactionType.SEND,i=t===vmModuleTypes.TransactionType.RECEIVE,m=e?.from?.address,c=e?.to?.address;return a&&r&&r[0]&&(m=r[0].from.address,c=r[0].to.address),a&&n&&n[0]&&(m=n[0].from.address,c=n[0].to.address),{isOutgoing:o||a&&m===s,isIncoming:i||a&&c===s,isSender:m===s,from:m,to:c}};async function B(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var gt="https://cloudflare-ipfs.com";function N(t,e=gt){if(!t)return "";try{return utilsSdk.ipfsResolver(t,e)}catch{return t}}async function dt(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function W(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let r=t.substring(29);try{let n=Buffer.from(r,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await dt(N(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var ft="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function q(t,e="256"){let r=N(t);return `${ft}/width=${e},fit/${r}`}var $=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let o=s.decimals,i=new bn_js.BN(t.value),m=utilsSdk.balanceToDisplayValue(i,o);a.push({decimal:o.toString(),name:s.name,symbol:s.symbol,amount:m,from:t.from,to:t.to,type:vmModuleTypes.TokenType.NATIVE});}return e?.forEach(o=>{let i=o.erc20Token.decimals,m=new bn_js.BN(o.value),c=utilsSdk.balanceToDisplayValue(m,i);a.push({decimal:i.toString(),name:o.erc20Token.name,symbol:o.erc20Token.symbol,amount:c,from:o.from,to:o.to,imageUri:o.erc20Token.logoUri,type:vmModuleTypes.TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async o=>{let i=o.erc721Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:o.erc721Token.name,symbol:o.erc721Token.symbol,amount:"1",imageUri:m,from:o.from,to:o.to,collectableTokenId:o.erc721Token.tokenId,type:vmModuleTypes.TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async o=>{let i=o.erc1155Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:o.erc1155Token.metadata.name??"",symbol:o.erc1155Token.metadata.symbol??"",amount:o.value,imageUri:m,from:o.from,to:o.to,collectableTokenId:o.erc1155Token.tokenId,type:vmModuleTypes.TokenType.ERC1155});})),a},Y=async(t,e)=>{if(e)return e.startsWith("ipfs://")?N(e):e;{let[r,n]=await B(W(t));return n?"":r.image?q(r.image):""}};var K=[vmModuleTypes.TransactionType.SEND,vmModuleTypes.TransactionType.RECEIVE,vmModuleTypes.TransactionType.TRANSFER];var z=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let a=await $(t,r),o=U(t,s,a),{isOutgoing:i,isIncoming:m,isSender:c,from:T,to:p}=V(o,t,s),{blockTimestamp:l,txHash:f,gasPrice:g,gasUsed:u}=t.nativeTransaction,y=E(e,f);return {isContractCall:!K.includes(o),isIncoming:m,isOutgoing:i,isSender:c,timestamp:l*1e3,hash:f,from:T,to:p,tokens:a,gasPrice:g,gasUsed:u,chainId:n.toString(),txType:o,explorerLink:y}};var Z=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:a,glacierApiUrl:o})=>{if(!o)throw new Error("Glacier API URL is required");let i=new glacierSdk.Glacier({BASE:o});try{let m=await i.evmTransactions.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(m.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>z({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(l=>l)))).filter(p=>p.tokens.find(l=>Number(l.amount)!==0)),nextPageToken:m.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var Q=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o,glacierApiUrl:i})=>A(t)?_({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o}):Z({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o,glacierApiUrl:i});var X={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:1","eip155:43114","eip155:43113"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["eth_sendTransaction","eth_*","getTransactionHistory"]}},manifestVersion:"0.0"};var h,tt=class{constructor(e){F(this,h,void 0);I(this,h,e);}getAddress(){return Promise.resolve("EVM address")}getBalances(){return Promise.resolve("EVM balances")}getManifest(){let e=vmModuleTypes.parseManifest(X);return e.success?e.data:void 0}getNetworkFee(){return C(w(this,h))}getTransactionHistory(e){return Q(e)}};h=new WeakMap;
16
+ var C=(t,e,o)=>{if(!e.has(t))throw TypeError("Cannot "+o)};var v=(t,e,o)=>(C(t,e,"read from private field"),o?o.call(t):e.get(t)),x=(t,e,o)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,o);},P=(t,e,o,n)=>(C(t,e,"write to private field"),n?n.call(t,o):e.set(t,o),o);var A=({glacierApiKey:t,chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s})=>{if(!e||!o||!n)throw new Error("Missing required parameters");let a=e.split(":")[1];if(!a||isNaN(Number(a)))throw new Error("Invalid chainId");let r=new walletsSdk.JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},it(n,t),new ethers.Network(o,Number(a)));return r.pollingInterval=2e3,r},at=["glacier-api.avax.network","proxy-api.avax.network"];function it(t,e){let o=new URL(t);if(e&&at.includes(o.hostname)){let n=o.searchParams;return n.set("token",e),o.search=n.toString(),o.toString()}return t}var b={LOW:1n,MEDIUM:4n,HIGH:6n},S=500000000n;async function H({glacierApiUrl:t,glacierApiKey:e,chainId:o,chainName:n,rpcUrl:s,multiContractAddress:a}){let r=A({glacierApiUrl:t,glacierApiKey:e,chainId:o,chainName:n,rpcUrl:s,multiContractAddress:a}),{maxFeePerGas:i}=await r.getFeeData();if(!i)throw new Error("Pre-EIP-1559 networks are not supported");let m=S*b.LOW,c=S*b.MEDIUM,g=S*b.HIGH;return {baseFee:i,low:{maxFeePerGas:i+m,maxPriorityFeePerGas:m},medium:{maxFeePerGas:i+c,maxPriorityFeePerGas:c},high:{maxFeePerGas:i+g,maxPriorityFeePerGas:g}}}function E(t,e,o="tx"){return `${t}/${o}/${e}`}var D=({tx:t,networkToken:e,chainId:o,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),r=parseInt(t.timeStamp)*1e3,i=e.decimals,m=new bn_js.BN(t.value),c=utilsSdk.balanceToDisplayValue(m,i),g=a?vmModuleTypes.TransactionType.SEND:vmModuleTypes.TransactionType.RECEIVE,{from:l,to:p,gasPrice:f,gasUsed:d,hash:u}=t,y=E(n,u);return {isIncoming:!a,isOutgoing:a,isContractCall:pt(t),timestamp:r,hash:u,isSender:a,from:l,to:p,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:c,type:vmModuleTypes.TokenType.NATIVE}],gasUsed:d,gasPrice:f,chainId:o.toString(),txType:g,explorerLink:y}};function pt(t){return t.input!=="0x"}function O({tx:t,address:e,explorerUrl:o,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,r=parseInt(t.tokenDecimal),i=new bn_js.BN(t.value),m=utilsSdk.balanceToDisplayValue(i,r),{from:c,to:g,gasPrice:l,gasUsed:p,hash:f,tokenDecimal:d,tokenName:u,tokenSymbol:y}=t,w=s?vmModuleTypes.TransactionType.SEND:vmModuleTypes.TransactionType.RECEIVE,rt=E(o,f);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:f,isSender:s,from:c,to:g,tokens:[{decimal:d,name:u,symbol:y,type:vmModuleTypes.TokenType.ERC20,amount:m}],gasUsed:p,gasPrice:l,chainId:n.toString(),txType:w,explorerLink:rt}}var _=async({isTestnet:t,chainId:e,networkToken:o,explorerUrl:n,address:s,nextPageToken:a,offset:r})=>{let i=a?JSON.parse(a):void 0,m=i?.page||1,c=i?.queries||["normal","erc20"],g=(c.includes("normal")?await etherscanSdk.getNormalTxs(s,!t,{page:m,offset:r}):[]).map(u=>D({tx:u,chainId:e,networkToken:o,explorerUrl:n,address:s})),l=(c.includes("erc20")?await etherscanSdk.getErc20Txs(s,!t,void 0,{page:m,offset:r}):[]).map(u=>O({tx:u,address:s,explorerUrl:n,chainId:e})),p=l.map(u=>u.hash),f=g.filter(u=>!p.includes(u.hash)),d={queries:[],page:m+1};return g.length&&d.queries.push("normal"),l.length&&d.queries.push("erc20"),{transactions:[...f,...l],nextPageToken:d.queries.length?JSON.stringify(d):""}};var U=t=>t===1||t===5||t===4||t===11155111;var V=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:o},n,s)=>{let a=!e&&!o,r=Et(t.method?.methodName),i=r.toLowerCase().includes("swap"),m=a&&t.from.address===n,c=a&&t.to.address===n,g=r==="Market Buy Orders With Eth"||r==="Buy NFT",l=r==="Approve",p=r.toLowerCase().includes("transfer"),f=r.toLowerCase().includes("airdrop"),d=r.toLowerCase().includes("unwrap"),u=r==="Fill Order",y=p&&!!s[0]&&B(s[0].type)&&s[0].from?.address===n,w=p&&!!s[0]&&B(s[0].type)&&s[0].to?.address===n;return i?vmModuleTypes.TransactionType.SWAP:m?vmModuleTypes.TransactionType.SEND:c?vmModuleTypes.TransactionType.RECEIVE:g?vmModuleTypes.TransactionType.NFT_BUY:l?vmModuleTypes.TransactionType.APPROVE:y?vmModuleTypes.TransactionType.NFT_SEND:w?vmModuleTypes.TransactionType.NFT_RECEIVE:p?vmModuleTypes.TransactionType.TRANSFER:f?vmModuleTypes.TransactionType.AIRDROP:d?vmModuleTypes.TransactionType.UNWRAP:u?vmModuleTypes.TransactionType.FILL_ORDER:vmModuleTypes.TransactionType.UNKNOWN};function B(t){return t===vmModuleTypes.TokenType.ERC721||t===vmModuleTypes.TokenType.ERC1155}var Et=(t="")=>t.includes("(")?yt__default.default(t.split("(",1)[0]):t;var W=(t,{nativeTransaction:e,erc20Transfers:o,erc721Transfers:n},s)=>{let a=t===vmModuleTypes.TransactionType.TRANSFER,r=t===vmModuleTypes.TransactionType.SEND,i=t===vmModuleTypes.TransactionType.RECEIVE,m=e?.from?.address,c=e?.to?.address;return a&&o&&o[0]&&(m=o[0].from.address,c=o[0].to.address),a&&n&&n[0]&&(m=n[0].from.address,c=n[0].to.address),{isOutgoing:r||a&&m===s,isIncoming:i||a&&c===s,isSender:m===s,from:m,to:c}};async function q(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var Nt="https://cloudflare-ipfs.com";function h(t,e=Nt){if(!t)return "";try{return utilsSdk.ipfsResolver(t,e)}catch{return t}}async function kt(t,e=5e3){let o=new AbortController;return setTimeout(()=>o.abort(),e),fetch(t,{signal:o.signal})}async function j(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let o=t.substring(29);try{let n=Buffer.from(o,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await kt(h(t)).then(o=>o.json()).catch(()=>({}));else return {};return e}var wt="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function K(t,e="256"){let o=h(t);return `${wt}/width=${e},fit/${o}`}var z=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:o,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let r=s.decimals,i=new bn_js.BN(t.value),m=utilsSdk.balanceToDisplayValue(i,r);a.push({decimal:r.toString(),name:s.name,symbol:s.symbol,amount:m,from:t.from,to:t.to,type:vmModuleTypes.TokenType.NATIVE});}return e?.forEach(r=>{let i=r.erc20Token.decimals,m=new bn_js.BN(r.value),c=utilsSdk.balanceToDisplayValue(m,i);a.push({decimal:i.toString(),name:r.erc20Token.name,symbol:r.erc20Token.symbol,amount:c,from:r.from,to:r.to,imageUri:r.erc20Token.logoUri,type:vmModuleTypes.TokenType.ERC20});}),o&&await Promise.allSettled(o.map(async r=>{let i=r.erc721Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:r.erc721Token.name,symbol:r.erc721Token.symbol,amount:"1",imageUri:m,from:r.from,to:r.to,collectableTokenId:r.erc721Token.tokenId,type:vmModuleTypes.TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async r=>{let i=r.erc1155Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:r.erc1155Token.metadata.name??"",symbol:r.erc1155Token.metadata.symbol??"",amount:r.value,imageUri:m,from:r.from,to:r.to,collectableTokenId:r.erc1155Token.tokenId,type:vmModuleTypes.TokenType.ERC1155});})),a},Y=async(t,e)=>{if(e)return e.startsWith("ipfs://")?h(e):e;{let[o,n]=await q(j(t));return n?"":o.image?K(o.image):""}};var Z=[vmModuleTypes.TransactionType.SEND,vmModuleTypes.TransactionType.RECEIVE,vmModuleTypes.TransactionType.TRANSFER];var Q=async({transactions:t,explorerUrl:e,networkToken:o,chainId:n,address:s})=>{let a=await z(t,o),r=V(t,s,a),{isOutgoing:i,isIncoming:m,isSender:c,from:g,to:l}=W(r,t,s),{blockTimestamp:p,txHash:f,gasPrice:d,gasUsed:u}=t.nativeTransaction,y=E(e,f);return {isContractCall:!Z.includes(r),isIncoming:m,isOutgoing:i,isSender:c,timestamp:p*1e3,hash:f,from:g,to:l,tokens:a,gasPrice:d,gasUsed:u,chainId:n.toString(),txType:r,explorerLink:y}};var X=async({chainId:t,explorerUrl:e,networkToken:o,address:n,nextPageToken:s,offset:a,glacierApiUrl:r})=>{if(!r)throw new Error("Glacier API URL is required");let i=new glacierSdk.Glacier({BASE:r});try{let m=await i.evmTransactions.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(m.transactions.filter(l=>l.nativeTransaction.txStatus==="1").map(l=>Q({transactions:l,explorerUrl:e,networkToken:o,chainId:t,address:n}).then(p=>p)))).filter(l=>l.tokens.find(p=>Number(p.amount)!==0)),nextPageToken:m.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var tt=async({chainId:t,isTestnet:e,networkToken:o,explorerUrl:n,address:s,nextPageToken:a,offset:r,glacierApiUrl:i})=>U(t)?_({isTestnet:e,networkToken:o,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:r}):X({isTestnet:e,networkToken:o,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:r,glacierApiUrl:i});var et={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:1","eip155:43114","eip155:43113"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["eth_sendTransaction","eth_*","getTransactionHistory"]}},manifestVersion:"0.0"};var N,k,ot=class{constructor({glacierApiUrl:e,glacierApiKey:o}){x(this,N,void 0);x(this,k,void 0);P(this,N,e),P(this,k,o);}getAddress(){return Promise.resolve("EVM address")}getBalances(){return Promise.resolve("EVM balances")}getManifest(){let e=vmModuleTypes.parseManifest(et);return e.success?e.data:void 0}getNetworkFee({chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s}){return H({glacierApiUrl:v(this,N),glacierApiKey:v(this,k),chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s})}getTransactionHistory(e){return tt({...e,glacierApiUrl:v(this,N)})}async onRpcRequest(e){switch(e.method){default:return {error:new Error(`Method ${e.method} not supported`)}}}};N=new WeakMap,k=new WeakMap;
16
17
 
17
- exports.EvmModule = tt;
18
+ exports.EvmModule = ot;
18
19
  //# sourceMappingURL=out.js.map
19
20
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/handlers/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/types.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/index.ts","../src/manifest.json"],"names":["parseManifest","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","provider","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","chainId","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","Glacier","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","url","getTokens","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","convertTransaction","transactions","isOutgoing","isIncoming","blockTimestamp","getTransactionsFromGlacier","glacierApiUrl","glacierSdk","response","tranasaction","transaction","getTransactionHistory","manifest_default","_provider","EvmModule","__privateAdd","__privateSet","__privateGet","params"],"mappings":"mVACA,OAAS,iBAAAA,OAAqB,2BCD9B,MAAgC,SAGhC,IAAMC,EAAkB,CACtB,IAAK,GACL,OAAQ,GACR,KAAM,EACR,EAEMC,EAAwB,WAO9B,eAAsBC,EAAcC,EAAiD,CACnF,GAAM,CAAE,aAAcC,CAAkB,EAAI,MAAMD,EAAS,WAAW,EACtE,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,yCAAyC,EAG3D,IAAMC,EAAYJ,EAAwBD,EAAgB,IACpDM,EAAeL,EAAwBD,EAAgB,OACvDO,EAAaN,EAAwBD,EAAgB,KAC3D,MAAO,CACL,QAASI,EACT,IAAK,CACH,aAAcA,EAAoBC,EAClC,qBAAsBA,CACxB,EACA,OAAQ,CACN,aAAcD,EAAoBE,EAClC,qBAAsBA,CACxB,EACA,KAAM,CACJ,aAAcF,EAAoBG,EAClC,qBAAsBA,CACxB,CACF,CACF,CCvCA,OAAS,aAAAC,GAAW,mBAAAC,MAA4D,2BAChF,OAAS,yBAAAC,OAA6B,qBACtC,OAAS,MAAAC,OAAU,QCHZ,SAASC,EACdC,EACAC,EACAC,EAA6B,KACrB,CACR,MAAO,GAAGF,CAAW,IAAIE,CAAQ,IAAID,CAAI,EAC3C,CDAO,IAAME,EAA2B,CAAC,CACvC,GAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAN,EACA,QAAAO,CACF,IAMmB,CACjB,IAAMC,EAAWJ,EAAG,KAAK,YAAY,IAAMG,EAAQ,YAAY,EACzDE,EAAY,SAASL,EAAG,SAAS,EAAI,IACrCM,EAAWL,EAAa,SACxBM,EAAW,IAAIb,GAAGM,EAAG,KAAK,EAC1BQ,EAAqBf,GAAsBc,EAAUD,CAAQ,EAC7DG,EAASL,EAAWZ,EAAgB,KAAOA,EAAgB,QAE3D,CAAE,KAAAkB,EAAM,GAAAC,EAAI,SAAAC,EAAU,QAAAC,EAAS,KAAAhB,CAAK,EAAIG,EACxCc,EAAenB,EAA4BC,EAAaC,CAAI,EAElE,MAAO,CACL,WAAY,CAACO,EACb,WAAYA,EACZ,eAAgBW,GAAef,CAAE,EACjC,UAAAK,EACA,KAAAR,EACA,SAAAO,EACA,KAAAM,EACA,GAAAC,EACA,OAAQ,CACN,CACE,QAASL,EAAS,SAAS,EAC3B,KAAML,EAAa,KACnB,OAAQA,EAAa,OACrB,OAAQO,EACR,KAAMjB,GAAU,MAClB,CACF,EACA,QAAAsB,EACA,SAAAD,EACA,QAASV,EAAQ,SAAS,EAC1B,OAAAO,EACA,aAAAK,CACF,CACF,EAEA,SAASC,GAAef,EAAuB,CAC7C,OAAOA,EAAG,QAAU,IACtB,CExDA,OAAS,aAAAT,GAAW,mBAAAC,MAAyC,2BAC7D,OAAS,yBAAAC,OAA6B,qBAEtC,OAAS,MAAAC,OAAU,QAEZ,SAASsB,EAAwB,CACtC,GAAAhB,EACA,QAAAG,EACA,YAAAP,EACA,QAAAM,CACF,EAKgB,CACd,IAAME,EAAWJ,EAAG,KAAK,YAAY,IAAMG,EAAQ,YAAY,EACzDE,EAAY,SAASL,EAAG,SAAS,EAAI,IACrCM,EAAW,SAASN,EAAG,YAAY,EACnCO,EAAW,IAAIb,GAAGM,EAAG,KAAK,EAC1BQ,EAAqBf,GAAsBc,EAAUD,CAAQ,EAC7D,CAAE,KAAAI,EAAM,GAAAC,EAAI,SAAAC,EAAU,QAAAC,EAAS,KAAAhB,EAAM,aAAAoB,EAAc,UAAAC,EAAW,YAAAC,CAAY,EAAInB,EAC9ES,EAASL,EAAWZ,EAAgB,KAAOA,EAAgB,QAC3DsB,GAAenB,EAA4BC,EAAaC,CAAI,EAElE,MAAO,CACL,WAAY,CAACO,EACb,WAAYA,EACZ,eAAgB,GAChB,UAAAC,EACA,KAAAR,EACA,SAAAO,EACA,KAAAM,EACA,GAAAC,EACA,OAAQ,CACN,CACE,QAASM,EACT,KAAMC,EACN,OAAQC,EACR,KAAM5B,GAAU,MAChB,OAAQiB,CACV,CACF,EACA,QAAAK,EACA,SAAAD,EACA,QAASV,EAAQ,SAAS,EAC1B,OAAAO,EACA,aAAAK,EACF,CACF,CC/CA,OAAS,eAAAM,GAAa,gBAAAC,OAAoB,yBAOnC,IAAMC,EAA8B,MAAO,CAChD,UAAAC,EACA,QAAArB,EACA,aAAAD,EACA,YAAAL,EACA,QAAAO,EACA,cAAAqB,EACA,OAAAC,CACF,IAAkE,CAQhE,IAAMC,EAAkBF,EAAiB,KAAK,MAAMA,CAAa,EAA4B,OACvFG,EAAOD,GAAiB,MAAQ,EAChCE,EAAUF,GAAiB,SAAW,CAAC,SAAU,OAAO,EAExDG,GAAcD,EAAQ,SAAS,QAAQ,EAAI,MAAMP,GAAalB,EAAS,CAACoB,EAAW,CAAE,KAAAI,EAAM,OAAAF,CAAO,CAAC,EAAI,CAAC,GAAG,IAC9GzB,GAAOD,EAAyB,CAAE,GAAAC,EAAI,QAAAE,EAAS,aAAAD,EAAc,YAAAL,EAAa,QAAAO,CAAQ,CAAC,CACtF,EAEM2B,GACJF,EAAQ,SAAS,OAAO,EACpB,MAAMR,GAAYjB,EAAS,CAACoB,EAAW,OAAW,CAChD,KAAAI,EACA,OAAAF,CACF,CAAC,EACD,CAAC,GACL,IAAKzB,GACLgB,EAAwB,CACtB,GAAAhB,EACA,QAAAG,EACA,YAAAP,EACA,QAAAM,CACF,CAAC,CACH,EAGM6B,EAAgBD,EAAU,IAAK9B,GAAOA,EAAG,IAAI,EAC7CgC,EAAoBH,EAAW,OAAQ7B,GACpC,CAAC+B,EAAc,SAAS/B,EAAG,IAAI,CACvC,EAEKiC,EAA4B,CAAE,QAAS,CAAC,EAAG,KAAMN,EAAO,CAAE,EAChE,OAAIE,EAAW,QAAQI,EAAK,QAAQ,KAAK,QAAQ,EAC7CH,EAAU,QAAQG,EAAK,QAAQ,KAAK,OAAO,EAExC,CACL,aAAc,CAAC,GAAGD,EAAmB,GAAGF,CAAS,EACjD,cAAeG,EAAK,QAAQ,OAAS,KAAK,UAAUA,CAAI,EAAI,EAC9D,CACF,ECzDO,IAAMC,EAAqBhC,GAECA,IAA/B,GACiCA,IAAjC,GACkCA,IAAlC,GACkCA,IAAlC,SCXJ,OAAS,WAAAiC,OAAe,uBCAxB,OAAS,aAAA5C,EAAW,mBAAAC,MAAqC,2BACzD,OAAO4C,OAAe,mBAEf,IAAMC,EAAY,CACvB,CAAE,kBAAAC,EAAmB,eAAAC,EAAgB,gBAAAC,CAAgB,EACrDrC,EACAsC,IACoB,CACpB,IAAMC,EAAa,CAACH,GAAkB,CAACC,EACjCG,EAASC,GAAeN,EAAkB,QAAQ,UAAU,EAE5DO,EAASF,EAAO,YAAY,EAAE,SAAS,MAAM,EAC7CG,EAAeJ,GAAcJ,EAAkB,KAAK,UAAYnC,EAChE4C,EAAkBL,GAAcJ,EAAkB,GAAG,UAAYnC,EACjE6C,EAAgBL,IAAW,8BAAgCA,IAAW,UACtEM,EAAYN,IAAW,UACvBO,EAAaP,EAAO,YAAY,EAAE,SAAS,UAAU,EACrDQ,EAAYR,EAAO,YAAY,EAAE,SAAS,SAAS,EACnDS,EAAWT,EAAO,YAAY,EAAE,SAAS,QAAQ,EACjDU,EAAcV,IAAW,aACzBW,EAAYJ,GAAc,CAAC,CAACT,EAAO,CAAC,GAAKc,EAAMd,EAAO,CAAC,EAAE,IAAI,GAAKA,EAAO,CAAC,EAAE,MAAM,UAAYtC,EAC9FqD,EAAeN,GAAc,CAAC,CAACT,EAAO,CAAC,GAAKc,EAAMd,EAAO,CAAC,EAAE,IAAI,GAAKA,EAAO,CAAC,EAAE,IAAI,UAAYtC,EAErG,OAAI0C,EAAerD,EAAgB,KAC/BsD,EAAqBtD,EAAgB,KACrCuD,EAAwBvD,EAAgB,QACxCwD,EAAsBxD,EAAgB,QACtCyD,EAAkBzD,EAAgB,QAClC8D,EAAkB9D,EAAgB,SAClCgE,EAAqBhE,EAAgB,YACrC0D,EAAmB1D,EAAgB,SACnC2D,EAAkB3D,EAAgB,QAClC4D,EAAiB5D,EAAgB,OACjC6D,EAAoB7D,EAAgB,WACjCA,EAAgB,OACzB,EAEA,SAAS+D,EAAME,EAAsB,CACnC,OAAOA,IAAclE,EAAU,QAAUkE,IAAclE,EAAU,OACnE,CAEA,IAAMqD,GAAiB,CAACD,EAAS,KAC3BA,EAAO,SAAS,GAAG,EACdP,GAAUO,EAAO,MAAM,IAAK,CAAC,EAAE,CAAC,CAAC,EAEnCA,EC7CT,OAAS,mBAAAnD,MAAuB,2BAEzB,IAAMkE,EAAgB,CAC3BjD,EACA,CAAE,kBAAA6B,EAAmB,eAAAC,EAAgB,gBAAAC,CAAgB,EACrDrC,IAC8F,CAC9F,IAAM+C,EAAazC,IAAWjB,EAAgB,SACxCsD,EAAerC,IAAWjB,EAAgB,KAC1CuD,EAAkBtC,IAAWjB,EAAgB,QAC/CkB,EAAO4B,GAAmB,MAAM,QAChC3B,EAAK2B,GAAmB,IAAI,QAGhC,OAAIY,GAAcX,GAAkBA,EAAe,CAAC,IAClD7B,EAAO6B,EAAe,CAAC,EAAE,KAAK,QAC9B5B,EAAK4B,EAAe,CAAC,EAAE,GAAG,SAGxBW,GAAcV,GAAmBA,EAAgB,CAAC,IACpD9B,EAAO8B,EAAgB,CAAC,EAAE,KAAK,QAC/B7B,EAAK6B,EAAgB,CAAC,EAAE,GAAG,SAQtB,CACL,WANiBM,GAAiBI,GAAcxC,IAASP,EAOzD,WANiB4C,GAAoBG,GAAcvC,IAAOR,EAO1D,SALeO,IAASP,EAMxB,KAAAO,EACA,GAAAC,CACF,CACF,ECpCA,OAAS,yBAAAlB,MAA6B,qBACtC,OAAS,MAAAC,MAAU,QAEnB,OAAS,aAAAH,MAAiB,2BCJ1B,eAAsBoE,EAAqBC,EAAqB,CAC9D,GAAI,CACF,OAAOA,EAAQ,KAAMC,GAAQ,CAACA,EAAK,IAAI,CAAC,EAAE,MAAOC,GAAQ,CAAC,KAAMA,CAAG,CAAC,CACtE,OAASA,EAAK,CACZ,OAAO,QAAQ,QAAQ,CAAC,KAAMA,CAAG,CAAC,CACpC,CACF,CCNA,OAAS,gBAAAC,OAAoB,qBAEtB,IAAMC,GAAsB,8BAE5B,SAASC,EACdC,EACAC,EAA+BH,GAC/B,CACA,GAAI,CAACE,EACH,MAAO,GAGT,GAAI,CACF,OAAOH,GAAaG,EAAWC,CAAoB,CACrD,MAAQ,CACN,OAAOD,CACT,CACF,CCRA,eAAeE,GAAiBC,EAAaC,EAAU,IAAM,CAC3D,IAAMC,EAAa,IAAI,gBACvB,kBAAW,IAAMA,EAAW,MAAM,EAAGD,CAAO,EAErC,MAAMD,EAAK,CAAE,OAAQE,EAAW,MAAO,CAAC,CACjD,CAEA,eAAsBC,EAAeC,EAAkB,CACrD,IAAIC,EAAoB,CAAC,EACzB,GAAKD,EAEE,GAAIA,EAAS,WAAW,+BAA+B,EAAG,CAC/D,IAAME,EAAQF,EAAS,UAAU,EAAE,EACnC,GAAI,CACF,IAAMG,EAAO,OAAO,KAAKD,EAAO,QAAQ,EAAE,SAAS,EACnDD,EAAO,KAAK,MAAME,CAAI,CACxB,MAAQ,CACNF,EAAO,CAAC,CACV,CACF,MACEA,EAAO,MAAMN,GAAiBH,EAAyBQ,CAAQ,CAAC,EAC7D,KAAM,GAAM,EAAE,KAAK,CAAC,EACpB,MAAM,KAAO,CAAC,EAAE,MAZnB,OAAO,CAAC,EAcV,OAAOC,CACT,CChCA,IAAMG,GAAqB,4DAUpB,SAASC,EAAoBC,EAAgBC,EAAoC,MAAO,CAC7F,IAAMC,EAAMhB,EAAyBc,CAAM,EAC3C,MAAO,GAAGF,EAAkB,UAAUG,CAAS,QAAQC,CAAG,EAC5D,CJLO,IAAMC,EAAY,MACvB,CAAE,kBAAA5C,EAAmB,eAAAC,EAAgB,gBAAAC,EAAiB,iBAAA2C,CAAiB,EACvElF,IACuB,CACvB,IAAMmF,EAAoB,CAAC,EAE3B,GAAI9C,EAAkB,QAAU,IAAK,CACnC,IAAM+C,EAAUpF,EAAa,SACvBM,EAAW,IAAIb,EAAG4C,EAAkB,KAAK,EACzC9B,EAAqBf,EAAsBc,EAAU8E,CAAO,EAClED,EAAO,KAAK,CACV,QAASC,EAAQ,SAAS,EAC1B,KAAMpF,EAAa,KACnB,OAAQA,EAAa,OACrB,OAAQO,EACR,KAAM8B,EAAkB,KACxB,GAAIA,EAAkB,GACtB,KAAM/C,EAAU,MAClB,CAAC,CACH,CAEA,OAAAgD,GAAgB,QAAS+C,GAAkB,CACzC,IAAMhF,EAAWgF,EAAc,WAAW,SACpC/E,EAAW,IAAIb,EAAG4F,EAAc,KAAK,EACrC9E,EAAqBf,EAAsBc,EAAUD,CAAQ,EAEnE8E,EAAO,KAAK,CACV,QAAS9E,EAAS,SAAS,EAC3B,KAAMgF,EAAc,WAAW,KAC/B,OAAQA,EAAc,WAAW,OACjC,OAAQ9E,EACR,KAAM8E,EAAc,KACpB,GAAIA,EAAc,GAClB,SAAUA,EAAc,WAAW,QACnC,KAAM/F,EAAU,KAClB,CAAC,CACH,CAAC,EAEGiD,GACF,MAAM,QAAQ,WACZA,EAAgB,IAAI,MAAO+C,GAAmB,CAC5C,IAAMC,EAAQD,EAAe,YACvBE,EAAW,MAAMC,EAAYF,EAAM,SAAUA,EAAM,SAAS,QAAQ,EAE1EJ,EAAO,KAAK,CACV,KAAMG,EAAe,YAAY,KACjC,OAAQA,EAAe,YAAY,OACnC,OAAQ,IACR,SAAAE,EACA,KAAMF,EAAe,KACrB,GAAIA,EAAe,GACnB,mBAAoBA,EAAe,YAAY,QAC/C,KAAMhG,EAAU,MAClB,CAAC,CACH,CAAC,CACH,EAGE4F,GACF,MAAM,QAAQ,WACZA,EAAiB,IAAI,MAAOQ,GAAoB,CAC9C,IAAMH,EAAQG,EAAgB,aACxBF,EAAW,MAAMC,EAAYF,EAAM,SAAUA,EAAM,SAAS,QAAQ,EAE1EJ,EAAO,KAAK,CACV,KAAMO,EAAgB,aAAa,SAAS,MAAQ,GACpD,OAAQA,EAAgB,aAAa,SAAS,QAAU,GACxD,OAAQA,EAAgB,MACxB,SAAAF,EACA,KAAME,EAAgB,KACtB,GAAIA,EAAgB,GACpB,mBAAoBA,EAAgB,aAAa,QACjD,KAAMpG,EAAU,OAClB,CAAC,CACH,CAAC,CACH,EAGK6F,CACT,EAEMM,EAAc,MAAOjB,EAAkBgB,IAAuC,CAClF,GAAIA,EACF,OAAIA,EAAS,WAAW,SAAS,EACxBxB,EAAyBwB,CAAQ,EAEjCA,EAEJ,CACL,GAAM,CAACG,EAAUC,CAAK,EAAI,MAAMlC,EAAQa,EAAeC,CAAQ,CAAC,EAChE,OAAIoB,EACK,GAEAD,EAAS,MAAQd,EAAoBc,EAAS,KAAK,EAAI,EAElE,CACF,EK1GA,OAAS,mBAAApG,MAAuB,2BAEzB,IAAMsG,EAAuB,CAACtG,EAAgB,KAAMA,EAAgB,QAASA,EAAgB,QAAQ,ECcrG,IAAMuG,EAAqB,MAAO,CACvC,aAAAC,EACA,YAAApG,EACA,aAAAK,EACA,QAAAC,EACA,QAAAC,CACF,IAAsD,CACpD,IAAMsC,EAAS,MAAMyC,EAAUc,EAAc/F,CAAY,EACnDQ,EAAS4B,EAAU2D,EAAc7F,EAASsC,CAAM,EAChD,CAAE,WAAAwD,EAAY,WAAAC,EAAY,SAAA9F,EAAU,KAAAM,EAAM,GAAAC,CAAG,EAAI+C,EAAcjD,EAAQuF,EAAc7F,CAAO,EAC5F,CAAE,eAAAgG,EAAgB,OAAQtG,EAAM,SAAAe,EAAU,QAAAC,CAAQ,EAAImF,EAAa,kBACnElF,EAAenB,EAA4BC,EAAaC,CAAI,EAGlE,MAAO,CACL,eAHqB,CAACiG,EAAqB,SAASrF,CAAM,EAI1D,WAAAyF,EACA,WAAAD,EACA,SAAA7F,EACA,UAAW+F,EAAiB,IAC5B,KAAAtG,EACA,KAAAa,EACA,GAAAC,EACA,OAAA8B,EACA,SAAA7B,EACA,QAAAC,EACA,QAASX,EAAQ,SAAS,EAC1B,OAAAO,EACA,aAAAK,CACF,CACF,ET1CO,IAAMsF,EAA6B,MAAO,CAC/C,QAAAlG,EACA,YAAAN,EACA,aAAAK,EACA,QAAAE,EACA,cAAAqB,EACA,OAAAC,EACA,cAAA4E,CACF,IAAkE,CAChE,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,6BAA6B,EAG/C,IAAMC,EAAa,IAAInE,GAAQ,CAAE,KAAMkE,CAAc,CAAC,EAEtD,GAAI,CACF,IAAME,EAAW,MAAMD,EAAW,gBAAgB,iBAAiB,CACjE,QAASpG,EAAQ,SAAS,EAC1B,QAAAC,EACA,UAAWqB,EACX,SAAUC,CACZ,CAAC,EAwBD,MAAO,CACL,cAvBmB,MAAM,QAAQ,IACjC8E,EAAS,aACN,OAEEC,GAAiBA,EAAa,kBAAkB,WAAa,GAChE,EACC,IAAKR,GACJD,EAAmB,CACjB,aAAAC,EACA,YAAApG,EACA,aAAAK,EACA,QAAAC,EACA,QAAAC,CACF,CAAC,EAAE,KAAMH,GAAOA,CAAE,CACpB,CACJ,GAEkC,OAE/ByG,GAAgBA,EAAY,OAAO,KAAMjB,GAAU,OAAOA,EAAM,MAAM,IAAM,CAAC,CAChF,EAIE,cAAee,EAAS,aAC1B,CACF,MAAQ,CACN,MAAO,CACL,aAAc,CAAC,EACf,cAAe,EACjB,CACF,CACF,EUtDO,IAAMG,EAAwB,MAAO,CAC1C,QAAAxG,EACA,UAAAqB,EACA,aAAAtB,EACA,YAAAL,EACA,QAAAO,EACA,cAAAqB,EACA,OAAAC,EACA,cAAA4E,CACF,IACMnE,EAAkBhC,CAAO,EACpBoB,EAA4B,CACjC,UAAAC,EACA,aAAAtB,EACA,YAAAL,EACA,QAAAM,EACA,QAAAC,EACA,cAAAqB,EACA,OAAAC,CACF,CAAC,EAEI2E,EAA2B,CAChC,UAAA7E,EACA,aAAAtB,EACA,YAAAL,EACA,QAAAM,EACA,QAAAC,EACA,cAAAqB,EACA,OAAAC,EACA,cAAA4E,CACF,CAAC,ECnCH,IAAAM,EAAA,CACE,KAAQ,MACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,sBACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,sBACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CAAC,WAAY,eAAgB,cAAc,EACvD,WAAc,CAAC,QAAQ,CACzB,EACA,SAAY,KACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,sBAAuB,QAAS,uBAAuB,CACrE,CACF,EACA,gBAAmB,KACrB,ElBtCA,IAAAC,EAOaC,GAAN,KAAkC,CAGvC,YAAY3H,EAA2B,CAFvC4H,EAAA,KAAAF,EAAA,QAGEG,EAAA,KAAKH,EAAY1H,EACnB,CACA,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,aAAa,CACtC,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,cAAc,CACvC,CAEA,aAAoC,CAClC,IAAMkG,EAAStG,GAAc6H,CAAY,EACzC,OAAOvB,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,eAAsC,CACpC,OAAOnG,EAAc+H,EAAA,KAAKJ,EAAS,CACrC,CAEA,sBAAsBK,EAA+B,CACnD,OAAOP,EAAsBO,CAAM,CACrC,CACF,EAzBEL,EAAA","sourcesContent":["import type { Module, Manifest, NetworkFees, GetTransactionHistory } from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport type { JsonRpcProvider } from 'ethers';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport ManifestJson from './manifest.json';\n\nexport class EvmModule implements Module {\n #provider: JsonRpcProvider;\n\n constructor(provider: JsonRpcProvider) {\n this.#provider = provider;\n }\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('EVM balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(): Promise<NetworkFees> {\n return getNetworkFee(this.#provider);\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n return getTransactionHistory(params);\n }\n}\n","import { JsonRpcProvider } from 'ethers';\nimport type { NetworkFees } from '@avalabs/vm-module-types';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @param provider\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee(provider: JsonRpcProvider): Promise<NetworkFees> {\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw new Error('Pre-EIP-1559 networks are not supported');\n }\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\n}\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\n );\n};\n","import type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { Glacier } from '@avalabs/glacier-sdk';\nimport { convertTransaction } from './convert-transaction';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (!glacierApiUrl) {\n throw new Error('Glacier API URL is required');\n }\n\n const glacierSdk = new Glacier({ BASE: glacierApiUrl });\n\n try {\n const response = await glacierSdk.evmTransactions.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n const isNFTSend = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address === address;\n const isNFTReceive = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\n}\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isNativeSend || (isTransfer && from === address);\n const isIncoming = isNativeReceive || (isTransfer && to === address);\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n });\n }\n return getTransactionsFromGlacier({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n });\n};\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"getTransactionHistory\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/types.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/manifest.json"],"names":["parseManifest","JsonRpcBatchInternal","Network","getProvider","glacierApiKey","caip2ChainId","chainName","rpcUrl","multiContractAddress","chainId","provider","addGlacierAPIKeyIfNeeded","knownHosts","url","urlObj","search_params","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","glacierApiUrl","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","Glacier","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","r","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","getTokens","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","convertTransaction","transactions","isOutgoing","isIncoming","blockTimestamp","getTransactionsFromGlacier","glacierSdk","response","tranasaction","transaction","getTransactionHistory","manifest_default","_glacierApiUrl","_glacierApiKey","EvmModule","__privateAdd","__privateSet","__privateGet","params","request"],"mappings":"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","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n GetNetworkFeeParams,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport ManifestJson from './manifest.json';\n\nexport class EvmModule implements Module {\n #glacierApiUrl: string;\n #glacierApiKey?: string;\n\n constructor({ glacierApiUrl, glacierApiKey }: { glacierApiUrl: string; glacierApiKey?: string }) {\n this.#glacierApiUrl = glacierApiUrl;\n this.#glacierApiKey = glacierApiKey;\n }\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('EVM balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee({ chainId, chainName, rpcUrl, multiContractAddress }: GetNetworkFeeParams): Promise<NetworkFees> {\n return getNetworkFee({\n glacierApiUrl: this.#glacierApiUrl,\n glacierApiKey: this.#glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n return getTransactionHistory({ ...params, glacierApiUrl: this.#glacierApiUrl });\n }\n\n async onRpcRequest(request: RpcRequest) {\n // TODO implement the RPC request handler\n switch (request.method) {\n default:\n return { error: new Error(`Method ${request.method} not supported`) };\n }\n }\n}\n","import type { GetNetworkFeeParams } from '@avalabs/vm-module-types';\nimport { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { Network } from 'ethers';\n\nexport const getProvider = ({\n glacierApiKey,\n chainId: caip2ChainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n}: GetNetworkFeeParams & {\n glacierApiUrl: string;\n glacierApiKey?: string;\n}): JsonRpcBatchInternal => {\n if (!caip2ChainId || !chainName || !rpcUrl) {\n throw new Error('Missing required parameters');\n }\n\n const chainId = caip2ChainId.split(':')[1];\n if (!chainId || isNaN(Number(chainId))) {\n throw new Error('Invalid chainId');\n }\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n addGlacierAPIKeyIfNeeded(rpcUrl, glacierApiKey),\n new Network(chainName, Number(chainId)),\n );\n\n provider.pollingInterval = 2000;\n\n return provider;\n};\n\n// RPC urls returned in the token list are always using the production URL\nconst knownHosts = ['glacier-api.avax.network', 'proxy-api.avax.network'];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string, glacierApiKey?: string): string {\n const urlObj = new URL(url);\n\n if (glacierApiKey && knownHosts.includes(urlObj.hostname)) {\n const search_params = urlObj.searchParams; // copy, does not update the URL\n search_params.set('token', glacierApiKey);\n urlObj.search = search_params.toString();\n return urlObj.toString();\n }\n return url;\n}\n","import type { GetNetworkFeeParams, NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @param glacierApiUrl\n * @param glacierApiKey\n * @params GetNetworkFeeParams\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee({\n glacierApiUrl,\n glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n}: GetNetworkFeeParams & {\n glacierApiUrl: string;\n glacierApiKey?: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n glacierApiUrl,\n glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw new Error('Pre-EIP-1559 networks are not supported');\n }\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\n}\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\n );\n};\n","import type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { Glacier } from '@avalabs/glacier-sdk';\nimport { convertTransaction } from './convert-transaction';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (!glacierApiUrl) {\n throw new Error('Glacier API URL is required');\n }\n\n const glacierSdk = new Glacier({ BASE: glacierApiUrl });\n\n try {\n const response = await glacierSdk.evmTransactions.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n const isNFTSend = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address === address;\n const isNFTReceive = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\n}\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isNativeSend || (isTransfer && from === address);\n const isIncoming = isNativeReceive || (isTransfer && to === address);\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n });\n }\n return getTransactionsFromGlacier({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n });\n};\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"getTransactionHistory\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,15 +1,20 @@
1
1
  import * as _avalabs_vm_module_types from '@avalabs/vm-module-types';
2
- import { Module, Manifest, NetworkFees, GetTransactionHistory } from '@avalabs/vm-module-types';
3
- import { JsonRpcProvider } from 'ethers';
2
+ import { Module, Manifest, GetNetworkFeeParams, NetworkFees, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
4
3
 
5
4
  declare class EvmModule implements Module {
6
5
  #private;
7
- constructor(provider: JsonRpcProvider);
6
+ constructor({ glacierApiUrl, glacierApiKey }: {
7
+ glacierApiUrl: string;
8
+ glacierApiKey?: string;
9
+ });
8
10
  getAddress(): Promise<string>;
9
11
  getBalances(): Promise<string>;
10
12
  getManifest(): Manifest | undefined;
11
- getNetworkFee(): Promise<NetworkFees>;
13
+ getNetworkFee({ chainId, chainName, rpcUrl, multiContractAddress }: GetNetworkFeeParams): Promise<NetworkFees>;
12
14
  getTransactionHistory(params: GetTransactionHistory): Promise<_avalabs_vm_module_types.TransactionHistoryResponse>;
15
+ onRpcRequest(request: RpcRequest): Promise<{
16
+ error: Error;
17
+ }>;
13
18
  }
14
19
 
15
20
  export { EvmModule };
package/dist/index.d.ts CHANGED
@@ -1,15 +1,20 @@
1
1
  import * as _avalabs_vm_module_types from '@avalabs/vm-module-types';
2
- import { Module, Manifest, NetworkFees, GetTransactionHistory } from '@avalabs/vm-module-types';
3
- import { JsonRpcProvider } from 'ethers';
2
+ import { Module, Manifest, GetNetworkFeeParams, NetworkFees, GetTransactionHistory, RpcRequest } from '@avalabs/vm-module-types';
4
3
 
5
4
  declare class EvmModule implements Module {
6
5
  #private;
7
- constructor(provider: JsonRpcProvider);
6
+ constructor({ glacierApiUrl, glacierApiKey }: {
7
+ glacierApiUrl: string;
8
+ glacierApiKey?: string;
9
+ });
8
10
  getAddress(): Promise<string>;
9
11
  getBalances(): Promise<string>;
10
12
  getManifest(): Manifest | undefined;
11
- getNetworkFee(): Promise<NetworkFees>;
13
+ getNetworkFee({ chainId, chainName, rpcUrl, multiContractAddress }: GetNetworkFeeParams): Promise<NetworkFees>;
12
14
  getTransactionHistory(params: GetTransactionHistory): Promise<_avalabs_vm_module_types.TransactionHistoryResponse>;
15
+ onRpcRequest(request: RpcRequest): Promise<{
16
+ error: Error;
17
+ }>;
13
18
  }
14
19
 
15
20
  export { EvmModule };
package/dist/index.js CHANGED
@@ -1,13 +1,14 @@
1
1
  import { TransactionType, parseManifest, TokenType } from '@avalabs/vm-module-types';
2
- import 'ethers';
2
+ import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';
3
+ import { Network } from 'ethers';
3
4
  import { balanceToDisplayValue, ipfsResolver } from '@avalabs/utils-sdk';
4
5
  import { BN } from 'bn.js';
5
6
  import { getNormalTxs, getErc20Txs } from '@avalabs/etherscan-sdk';
6
7
  import { Glacier } from '@avalabs/glacier-sdk';
7
- import lt from 'lodash.startcase';
8
+ import yt from 'lodash.startcase';
8
9
 
9
- var b=(t,e,r)=>{if(!e.has(t))throw TypeError("Cannot "+r)};var w=(t,e,r)=>(b(t,e,"read from private field"),r?r.call(t):e.get(t)),F=(t,e,r)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,r);},I=(t,e,r,n)=>(b(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r);var R={LOW:1n,MEDIUM:4n,HIGH:6n},x=500000000n;async function C(t){let{maxFeePerGas:e}=await t.getFeeData();if(!e)throw new Error("Pre-EIP-1559 networks are not supported");let r=x*R.LOW,n=x*R.MEDIUM,s=x*R.HIGH;return {baseFee:e,low:{maxFeePerGas:e+r,maxPriorityFeePerGas:r},medium:{maxFeePerGas:e+n,maxPriorityFeePerGas:n},high:{maxFeePerGas:e+s,maxPriorityFeePerGas:s}}}function E(t,e,r="tx"){return `${t}/${r}/${e}`}var M=({tx:t,networkToken:e,chainId:r,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),o=parseInt(t.timeStamp)*1e3,i=e.decimals,m=new BN(t.value),c=balanceToDisplayValue(m,i),T=a?TransactionType.SEND:TransactionType.RECEIVE,{from:p,to:l,gasPrice:f,gasUsed:g,hash:u}=t,y=E(n,u);return {isIncoming:!a,isOutgoing:a,isContractCall:st(t),timestamp:o,hash:u,isSender:a,from:p,to:l,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:c,type:TokenType.NATIVE}],gasUsed:g,gasPrice:f,chainId:r.toString(),txType:T,explorerLink:y}};function st(t){return t.input!=="0x"}function O({tx:t,address:e,explorerUrl:r,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,o=parseInt(t.tokenDecimal),i=new BN(t.value),m=balanceToDisplayValue(i,o),{from:c,to:T,gasPrice:p,gasUsed:l,hash:f,tokenDecimal:g,tokenName:u,tokenSymbol:y}=t,k=s?TransactionType.SEND:TransactionType.RECEIVE,et=E(r,f);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:f,isSender:s,from:c,to:T,tokens:[{decimal:g,name:u,symbol:y,type:TokenType.ERC20,amount:m}],gasUsed:l,gasPrice:p,chainId:n.toString(),txType:k,explorerLink:et}}var _=async({isTestnet:t,chainId:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o})=>{let i=a?JSON.parse(a):void 0,m=i?.page||1,c=i?.queries||["normal","erc20"],T=(c.includes("normal")?await getNormalTxs(s,!t,{page:m,offset:o}):[]).map(u=>M({tx:u,chainId:e,networkToken:r,explorerUrl:n,address:s})),p=(c.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:m,offset:o}):[]).map(u=>O({tx:u,address:s,explorerUrl:n,chainId:e})),l=p.map(u=>u.hash),f=T.filter(u=>!l.includes(u.hash)),g={queries:[],page:m+1};return T.length&&g.queries.push("normal"),p.length&&g.queries.push("erc20"),{transactions:[...f,...p],nextPageToken:g.queries.length?JSON.stringify(g):""}};var A=t=>t===1||t===5||t===4||t===11155111;var U=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r},n,s)=>{let a=!e&&!r,o=ut(t.method?.methodName),i=o.toLowerCase().includes("swap"),m=a&&t.from.address===n,c=a&&t.to.address===n,T=o==="Market Buy Orders With Eth"||o==="Buy NFT",p=o==="Approve",l=o.toLowerCase().includes("transfer"),f=o.toLowerCase().includes("airdrop"),g=o.toLowerCase().includes("unwrap"),u=o==="Fill Order",y=l&&!!s[0]&&L(s[0].type)&&s[0].from?.address===n,k=l&&!!s[0]&&L(s[0].type)&&s[0].to?.address===n;return i?TransactionType.SWAP:m?TransactionType.SEND:c?TransactionType.RECEIVE:T?TransactionType.NFT_BUY:p?TransactionType.APPROVE:y?TransactionType.NFT_SEND:k?TransactionType.NFT_RECEIVE:l?TransactionType.TRANSFER:f?TransactionType.AIRDROP:g?TransactionType.UNWRAP:u?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function L(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var ut=(t="")=>t.includes("(")?lt(t.split("(",1)[0]):t;var V=(t,{nativeTransaction:e,erc20Transfers:r,erc721Transfers:n},s)=>{let a=t===TransactionType.TRANSFER,o=t===TransactionType.SEND,i=t===TransactionType.RECEIVE,m=e?.from?.address,c=e?.to?.address;return a&&r&&r[0]&&(m=r[0].from.address,c=r[0].to.address),a&&n&&n[0]&&(m=n[0].from.address,c=n[0].to.address),{isOutgoing:o||a&&m===s,isIncoming:i||a&&c===s,isSender:m===s,from:m,to:c}};async function B(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var gt="https://cloudflare-ipfs.com";function N(t,e=gt){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function dt(t,e=5e3){let r=new AbortController;return setTimeout(()=>r.abort(),e),fetch(t,{signal:r.signal})}async function W(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let r=t.substring(29);try{let n=Buffer.from(r,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await dt(N(t)).then(r=>r.json()).catch(()=>({}));else return {};return e}var ft="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function q(t,e="256"){let r=N(t);return `${ft}/width=${e},fit/${r}`}var $=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:r,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let o=s.decimals,i=new BN(t.value),m=balanceToDisplayValue(i,o);a.push({decimal:o.toString(),name:s.name,symbol:s.symbol,amount:m,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(o=>{let i=o.erc20Token.decimals,m=new BN(o.value),c=balanceToDisplayValue(m,i);a.push({decimal:i.toString(),name:o.erc20Token.name,symbol:o.erc20Token.symbol,amount:c,from:o.from,to:o.to,imageUri:o.erc20Token.logoUri,type:TokenType.ERC20});}),r&&await Promise.allSettled(r.map(async o=>{let i=o.erc721Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:o.erc721Token.name,symbol:o.erc721Token.symbol,amount:"1",imageUri:m,from:o.from,to:o.to,collectableTokenId:o.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async o=>{let i=o.erc1155Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:o.erc1155Token.metadata.name??"",symbol:o.erc1155Token.metadata.symbol??"",amount:o.value,imageUri:m,from:o.from,to:o.to,collectableTokenId:o.erc1155Token.tokenId,type:TokenType.ERC1155});})),a},Y=async(t,e)=>{if(e)return e.startsWith("ipfs://")?N(e):e;{let[r,n]=await B(W(t));return n?"":r.image?q(r.image):""}};var K=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER];var z=async({transactions:t,explorerUrl:e,networkToken:r,chainId:n,address:s})=>{let a=await $(t,r),o=U(t,s,a),{isOutgoing:i,isIncoming:m,isSender:c,from:T,to:p}=V(o,t,s),{blockTimestamp:l,txHash:f,gasPrice:g,gasUsed:u}=t.nativeTransaction,y=E(e,f);return {isContractCall:!K.includes(o),isIncoming:m,isOutgoing:i,isSender:c,timestamp:l*1e3,hash:f,from:T,to:p,tokens:a,gasPrice:g,gasUsed:u,chainId:n.toString(),txType:o,explorerLink:y}};var Z=async({chainId:t,explorerUrl:e,networkToken:r,address:n,nextPageToken:s,offset:a,glacierApiUrl:o})=>{if(!o)throw new Error("Glacier API URL is required");let i=new Glacier({BASE:o});try{let m=await i.evmTransactions.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(m.transactions.filter(p=>p.nativeTransaction.txStatus==="1").map(p=>z({transactions:p,explorerUrl:e,networkToken:r,chainId:t,address:n}).then(l=>l)))).filter(p=>p.tokens.find(l=>Number(l.amount)!==0)),nextPageToken:m.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var Q=async({chainId:t,isTestnet:e,networkToken:r,explorerUrl:n,address:s,nextPageToken:a,offset:o,glacierApiUrl:i})=>A(t)?_({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o}):Z({isTestnet:e,networkToken:r,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:o,glacierApiUrl:i});var X={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:1","eip155:43114","eip155:43113"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["eth_sendTransaction","eth_*","getTransactionHistory"]}},manifestVersion:"0.0"};var h,tt=class{constructor(e){F(this,h,void 0);I(this,h,e);}getAddress(){return Promise.resolve("EVM address")}getBalances(){return Promise.resolve("EVM balances")}getManifest(){let e=parseManifest(X);return e.success?e.data:void 0}getNetworkFee(){return C(w(this,h))}getTransactionHistory(e){return Q(e)}};h=new WeakMap;
10
+ var C=(t,e,o)=>{if(!e.has(t))throw TypeError("Cannot "+o)};var v=(t,e,o)=>(C(t,e,"read from private field"),o?o.call(t):e.get(t)),x=(t,e,o)=>{if(e.has(t))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(t):e.set(t,o);},P=(t,e,o,n)=>(C(t,e,"write to private field"),n?n.call(t,o):e.set(t,o),o);var A=({glacierApiKey:t,chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s})=>{if(!e||!o||!n)throw new Error("Missing required parameters");let a=e.split(":")[1];if(!a||isNaN(Number(a)))throw new Error("Invalid chainId");let r=new JsonRpcBatchInternal({maxCalls:40,multiContractAddress:s},it(n,t),new Network(o,Number(a)));return r.pollingInterval=2e3,r},at=["glacier-api.avax.network","proxy-api.avax.network"];function it(t,e){let o=new URL(t);if(e&&at.includes(o.hostname)){let n=o.searchParams;return n.set("token",e),o.search=n.toString(),o.toString()}return t}var b={LOW:1n,MEDIUM:4n,HIGH:6n},S=500000000n;async function H({glacierApiUrl:t,glacierApiKey:e,chainId:o,chainName:n,rpcUrl:s,multiContractAddress:a}){let r=A({glacierApiUrl:t,glacierApiKey:e,chainId:o,chainName:n,rpcUrl:s,multiContractAddress:a}),{maxFeePerGas:i}=await r.getFeeData();if(!i)throw new Error("Pre-EIP-1559 networks are not supported");let m=S*b.LOW,c=S*b.MEDIUM,g=S*b.HIGH;return {baseFee:i,low:{maxFeePerGas:i+m,maxPriorityFeePerGas:m},medium:{maxFeePerGas:i+c,maxPriorityFeePerGas:c},high:{maxFeePerGas:i+g,maxPriorityFeePerGas:g}}}function E(t,e,o="tx"){return `${t}/${o}/${e}`}var D=({tx:t,networkToken:e,chainId:o,explorerUrl:n,address:s})=>{let a=t.from.toLowerCase()===s.toLowerCase(),r=parseInt(t.timeStamp)*1e3,i=e.decimals,m=new BN(t.value),c=balanceToDisplayValue(m,i),g=a?TransactionType.SEND:TransactionType.RECEIVE,{from:l,to:p,gasPrice:f,gasUsed:d,hash:u}=t,y=E(n,u);return {isIncoming:!a,isOutgoing:a,isContractCall:pt(t),timestamp:r,hash:u,isSender:a,from:l,to:p,tokens:[{decimal:i.toString(),name:e.name,symbol:e.symbol,amount:c,type:TokenType.NATIVE}],gasUsed:d,gasPrice:f,chainId:o.toString(),txType:g,explorerLink:y}};function pt(t){return t.input!=="0x"}function O({tx:t,address:e,explorerUrl:o,chainId:n}){let s=t.from.toLowerCase()===e.toLowerCase(),a=parseInt(t.timeStamp)*1e3,r=parseInt(t.tokenDecimal),i=new BN(t.value),m=balanceToDisplayValue(i,r),{from:c,to:g,gasPrice:l,gasUsed:p,hash:f,tokenDecimal:d,tokenName:u,tokenSymbol:y}=t,w=s?TransactionType.SEND:TransactionType.RECEIVE,rt=E(o,f);return {isIncoming:!s,isOutgoing:s,isContractCall:!1,timestamp:a,hash:f,isSender:s,from:c,to:g,tokens:[{decimal:d,name:u,symbol:y,type:TokenType.ERC20,amount:m}],gasUsed:p,gasPrice:l,chainId:n.toString(),txType:w,explorerLink:rt}}var _=async({isTestnet:t,chainId:e,networkToken:o,explorerUrl:n,address:s,nextPageToken:a,offset:r})=>{let i=a?JSON.parse(a):void 0,m=i?.page||1,c=i?.queries||["normal","erc20"],g=(c.includes("normal")?await getNormalTxs(s,!t,{page:m,offset:r}):[]).map(u=>D({tx:u,chainId:e,networkToken:o,explorerUrl:n,address:s})),l=(c.includes("erc20")?await getErc20Txs(s,!t,void 0,{page:m,offset:r}):[]).map(u=>O({tx:u,address:s,explorerUrl:n,chainId:e})),p=l.map(u=>u.hash),f=g.filter(u=>!p.includes(u.hash)),d={queries:[],page:m+1};return g.length&&d.queries.push("normal"),l.length&&d.queries.push("erc20"),{transactions:[...f,...l],nextPageToken:d.queries.length?JSON.stringify(d):""}};var U=t=>t===1||t===5||t===4||t===11155111;var V=({nativeTransaction:t,erc20Transfers:e,erc721Transfers:o},n,s)=>{let a=!e&&!o,r=Et(t.method?.methodName),i=r.toLowerCase().includes("swap"),m=a&&t.from.address===n,c=a&&t.to.address===n,g=r==="Market Buy Orders With Eth"||r==="Buy NFT",l=r==="Approve",p=r.toLowerCase().includes("transfer"),f=r.toLowerCase().includes("airdrop"),d=r.toLowerCase().includes("unwrap"),u=r==="Fill Order",y=p&&!!s[0]&&B(s[0].type)&&s[0].from?.address===n,w=p&&!!s[0]&&B(s[0].type)&&s[0].to?.address===n;return i?TransactionType.SWAP:m?TransactionType.SEND:c?TransactionType.RECEIVE:g?TransactionType.NFT_BUY:l?TransactionType.APPROVE:y?TransactionType.NFT_SEND:w?TransactionType.NFT_RECEIVE:p?TransactionType.TRANSFER:f?TransactionType.AIRDROP:d?TransactionType.UNWRAP:u?TransactionType.FILL_ORDER:TransactionType.UNKNOWN};function B(t){return t===TokenType.ERC721||t===TokenType.ERC1155}var Et=(t="")=>t.includes("(")?yt(t.split("(",1)[0]):t;var W=(t,{nativeTransaction:e,erc20Transfers:o,erc721Transfers:n},s)=>{let a=t===TransactionType.TRANSFER,r=t===TransactionType.SEND,i=t===TransactionType.RECEIVE,m=e?.from?.address,c=e?.to?.address;return a&&o&&o[0]&&(m=o[0].from.address,c=o[0].to.address),a&&n&&n[0]&&(m=n[0].from.address,c=n[0].to.address),{isOutgoing:r||a&&m===s,isIncoming:i||a&&c===s,isSender:m===s,from:m,to:c}};async function q(t){try{return t.then(e=>[e,null]).catch(e=>[null,e])}catch(e){return Promise.resolve([null,e])}}var Nt="https://cloudflare-ipfs.com";function h(t,e=Nt){if(!t)return "";try{return ipfsResolver(t,e)}catch{return t}}async function kt(t,e=5e3){let o=new AbortController;return setTimeout(()=>o.abort(),e),fetch(t,{signal:o.signal})}async function j(t){let e={};if(t)if(t.startsWith("data:application/json;base64,")){let o=t.substring(29);try{let n=Buffer.from(o,"base64").toString();e=JSON.parse(n);}catch{e={};}}else e=await kt(h(t)).then(o=>o.json()).catch(()=>({}));else return {};return e}var wt="https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image";function K(t,e="256"){let o=h(t);return `${wt}/width=${e},fit/${o}`}var z=async({nativeTransaction:t,erc20Transfers:e,erc721Transfers:o,erc1155Transfers:n},s)=>{let a=[];if(t.value!=="0"){let r=s.decimals,i=new BN(t.value),m=balanceToDisplayValue(i,r);a.push({decimal:r.toString(),name:s.name,symbol:s.symbol,amount:m,from:t.from,to:t.to,type:TokenType.NATIVE});}return e?.forEach(r=>{let i=r.erc20Token.decimals,m=new BN(r.value),c=balanceToDisplayValue(m,i);a.push({decimal:i.toString(),name:r.erc20Token.name,symbol:r.erc20Token.symbol,amount:c,from:r.from,to:r.to,imageUri:r.erc20Token.logoUri,type:TokenType.ERC20});}),o&&await Promise.allSettled(o.map(async r=>{let i=r.erc721Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:r.erc721Token.name,symbol:r.erc721Token.symbol,amount:"1",imageUri:m,from:r.from,to:r.to,collectableTokenId:r.erc721Token.tokenId,type:TokenType.ERC721});})),n&&await Promise.allSettled(n.map(async r=>{let i=r.erc1155Token,m=await Y(i.tokenUri,i.metadata.imageUri);a.push({name:r.erc1155Token.metadata.name??"",symbol:r.erc1155Token.metadata.symbol??"",amount:r.value,imageUri:m,from:r.from,to:r.to,collectableTokenId:r.erc1155Token.tokenId,type:TokenType.ERC1155});})),a},Y=async(t,e)=>{if(e)return e.startsWith("ipfs://")?h(e):e;{let[o,n]=await q(j(t));return n?"":o.image?K(o.image):""}};var Z=[TransactionType.SEND,TransactionType.RECEIVE,TransactionType.TRANSFER];var Q=async({transactions:t,explorerUrl:e,networkToken:o,chainId:n,address:s})=>{let a=await z(t,o),r=V(t,s,a),{isOutgoing:i,isIncoming:m,isSender:c,from:g,to:l}=W(r,t,s),{blockTimestamp:p,txHash:f,gasPrice:d,gasUsed:u}=t.nativeTransaction,y=E(e,f);return {isContractCall:!Z.includes(r),isIncoming:m,isOutgoing:i,isSender:c,timestamp:p*1e3,hash:f,from:g,to:l,tokens:a,gasPrice:d,gasUsed:u,chainId:n.toString(),txType:r,explorerLink:y}};var X=async({chainId:t,explorerUrl:e,networkToken:o,address:n,nextPageToken:s,offset:a,glacierApiUrl:r})=>{if(!r)throw new Error("Glacier API URL is required");let i=new Glacier({BASE:r});try{let m=await i.evmTransactions.listTransactions({chainId:t.toString(),address:n,pageToken:s,pageSize:a});return {transactions:(await Promise.all(m.transactions.filter(l=>l.nativeTransaction.txStatus==="1").map(l=>Q({transactions:l,explorerUrl:e,networkToken:o,chainId:t,address:n}).then(p=>p)))).filter(l=>l.tokens.find(p=>Number(p.amount)!==0)),nextPageToken:m.nextPageToken}}catch{return {transactions:[],nextPageToken:""}}};var tt=async({chainId:t,isTestnet:e,networkToken:o,explorerUrl:n,address:s,nextPageToken:a,offset:r,glacierApiUrl:i})=>U(t)?_({isTestnet:e,networkToken:o,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:r}):X({isTestnet:e,networkToken:o,explorerUrl:n,chainId:t,address:s,nextPageToken:a,offset:r,glacierApiUrl:i});var et={name:"EVM",description:"",version:"0.0.1",sources:{module:{checksum:"",location:{npm:{filePath:"dist/bundle.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}},provider:{checksum:"",location:{npm:{filePath:"dist/provider.js",packageName:"@avalabs/evm-module",registry:"https://registry.npmjs.org"}}}},network:{chainIds:["eip155:1","eip155:43114","eip155:43113"],namespaces:["eip155"]},cointype:"60",permissions:{rpc:{dapps:!0,methods:["eth_sendTransaction","eth_*","getTransactionHistory"]}},manifestVersion:"0.0"};var N,k,ot=class{constructor({glacierApiUrl:e,glacierApiKey:o}){x(this,N,void 0);x(this,k,void 0);P(this,N,e),P(this,k,o);}getAddress(){return Promise.resolve("EVM address")}getBalances(){return Promise.resolve("EVM balances")}getManifest(){let e=parseManifest(et);return e.success?e.data:void 0}getNetworkFee({chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s}){return H({glacierApiUrl:v(this,N),glacierApiKey:v(this,k),chainId:e,chainName:o,rpcUrl:n,multiContractAddress:s})}getTransactionHistory(e){return tt({...e,glacierApiUrl:v(this,N)})}async onRpcRequest(e){switch(e.method){default:return {error:new Error(`Method ${e.method} not supported`)}}}};N=new WeakMap,k=new WeakMap;
10
11
 
11
- export { tt as EvmModule };
12
+ export { ot as EvmModule };
12
13
  //# sourceMappingURL=out.js.map
13
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/handlers/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/types.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/index.ts","../src/manifest.json"],"names":["parseManifest","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","provider","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","chainId","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","Glacier","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","url","getTokens","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","convertTransaction","transactions","isOutgoing","isIncoming","blockTimestamp","getTransactionsFromGlacier","glacierApiUrl","glacierSdk","response","tranasaction","transaction","getTransactionHistory","manifest_default","_provider","EvmModule","__privateAdd","__privateSet","__privateGet","params"],"mappings":"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","sourcesContent":["import type { Module, Manifest, NetworkFees, GetTransactionHistory } from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport type { JsonRpcProvider } from 'ethers';\nimport { getNetworkFee } from './handlers/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history';\nimport ManifestJson from './manifest.json';\n\nexport class EvmModule implements Module {\n #provider: JsonRpcProvider;\n\n constructor(provider: JsonRpcProvider) {\n this.#provider = provider;\n }\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('EVM balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee(): Promise<NetworkFees> {\n return getNetworkFee(this.#provider);\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n return getTransactionHistory(params);\n }\n}\n","import { JsonRpcProvider } from 'ethers';\nimport type { NetworkFees } from '@avalabs/vm-module-types';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @param provider\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee(provider: JsonRpcProvider): Promise<NetworkFees> {\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw new Error('Pre-EIP-1559 networks are not supported');\n }\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\n}\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\n );\n};\n","import type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { Glacier } from '@avalabs/glacier-sdk';\nimport { convertTransaction } from './convert-transaction';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (!glacierApiUrl) {\n throw new Error('Glacier API URL is required');\n }\n\n const glacierSdk = new Glacier({ BASE: glacierApiUrl });\n\n try {\n const response = await glacierSdk.evmTransactions.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n const isNFTSend = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address === address;\n const isNFTReceive = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\n}\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isNativeSend || (isTransfer && from === address);\n const isIncoming = isNativeReceive || (isTransfer && to === address);\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n });\n }\n return getTransactionsFromGlacier({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n });\n};\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"getTransactionHistory\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/get-provider.ts","../src/handlers/get-network-fee/get-network-fee.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-normal.ts","../src/handlers/get-transaction-history/utils/get-explorer-address-by-network.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/convert-transaction-erc20.ts","../src/handlers/get-transaction-history/converters/etherscan-transaction-converter/get-transaction-from-etherscan.ts","../src/handlers/get-transaction-history/utils/is-ethereum-chain-id.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-transactions-from-glacier.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tx-type.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-sender-info.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-tokens.ts","../src/handlers/get-transaction-history/utils/resolve.ts","../src/handlers/get-transaction-history/utils/ipfs-resolver-with-fallback.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/get-nft-metadata.ts","../src/handlers/get-transaction-history/utils/get-small-image-for-nft.ts","../src/types.ts","../src/handlers/get-transaction-history/converters/evm-transaction-converter/convert-transaction.ts","../src/handlers/get-transaction-history/get-transaction-history.ts","../src/manifest.json"],"names":["parseManifest","JsonRpcBatchInternal","Network","getProvider","glacierApiKey","caip2ChainId","chainName","rpcUrl","multiContractAddress","chainId","provider","addGlacierAPIKeyIfNeeded","knownHosts","url","urlObj","search_params","DEFAULT_PRESETS","BASE_PRIORITY_FEE_WEI","getNetworkFee","glacierApiUrl","maxFeePerGasInWei","lowMaxTip","mediumMaxTip","highMaxTip","TokenType","TransactionType","balanceToDisplayValue","BN","getExplorerAddressByNetwork","explorerUrl","hash","hashType","convertTransactionNormal","tx","networkToken","address","isSender","timestamp","decimals","amountBN","amountDisplayValue","txType","from","to","gasPrice","gasUsed","explorerLink","isContractCall","convertTransactionERC20","tokenDecimal","tokenName","tokenSymbol","getErc20Txs","getNormalTxs","getTransactionFromEtherscan","isTestnet","nextPageToken","offset","parsedPageToken","page","queries","normalHist","erc20Hist","erc20TxHashes","filteredNormalTxs","next","isEthereumChainId","Glacier","startCase","getTxType","nativeTransaction","erc20Transfers","erc721Transfers","tokens","nativeOnly","method","parseRawMethod","isSwap","isNativeSend","isNativeReceive","isNFTPurchase","isApprove","isTransfer","isAirdrop","isUnwrap","isFillOrder","isNFTSend","isNFT","isNFTReceive","tokenType","getSenderInfo","resolve","promise","res","err","ipfsResolver","CLOUDFLARE_IPFS_URL","ipfsResolverWithFallback","sourceUrl","desiredGatewayPrefix","fetchWithTimeout","uri","timeout","controller","getNftMetadata","tokenUri","data","value","json","r","COVALENT_IMG_SIZER","getSmallImageForNFT","imgUrl","imageSize","getTokens","erc1155Transfers","result","decimal","erc20Transfer","erc721Transfer","token","imageUri","getImageUri","erc1155Transfer","metadata","error","NonContractCallTypes","convertTransaction","transactions","isOutgoing","isIncoming","blockTimestamp","getTransactionsFromGlacier","glacierSdk","response","tranasaction","transaction","getTransactionHistory","manifest_default","_glacierApiUrl","_glacierApiKey","EvmModule","__privateAdd","__privateSet","__privateGet","params","request"],"mappings":"mVAQA,OAAS,iBAAAA,OAAqB,2BCP9B,OAAS,wBAAAC,OAA4B,uBACrC,OAAS,WAAAC,OAAe,SAEjB,IAAMC,EAAc,CAAC,CAC1B,cAAAC,EACA,QAASC,EACT,UAAAC,EACA,OAAAC,EACA,qBAAAC,CACF,IAG4B,CAC1B,GAAI,CAACH,GAAgB,CAACC,GAAa,CAACC,EAClC,MAAM,IAAI,MAAM,6BAA6B,EAG/C,IAAME,EAAUJ,EAAa,MAAM,GAAG,EAAE,CAAC,EACzC,GAAI,CAACI,GAAW,MAAM,OAAOA,CAAO,CAAC,EACnC,MAAM,IAAI,MAAM,iBAAiB,EAGnC,IAAMC,EAAW,IAAIT,GACnB,CAAE,SAAU,GAAI,qBAAAO,CAAqB,EACrCG,GAAyBJ,EAAQH,CAAa,EAC9C,IAAIF,GAAQI,EAAW,OAAOG,CAAO,CAAC,CACxC,EAEA,OAAAC,EAAS,gBAAkB,IAEpBA,CACT,EAGME,GAAa,CAAC,2BAA4B,wBAAwB,EAKjE,SAASD,GAAyBE,EAAaT,EAAgC,CACpF,IAAMU,EAAS,IAAI,IAAID,CAAG,EAE1B,GAAIT,GAAiBQ,GAAW,SAASE,EAAO,QAAQ,EAAG,CACzD,IAAMC,EAAgBD,EAAO,aAC7B,OAAAC,EAAc,IAAI,QAASX,CAAa,EACxCU,EAAO,OAASC,EAAc,SAAS,EAChCD,EAAO,SAAS,CACzB,CACA,OAAOD,CACT,CC/CA,IAAMG,EAAkB,CACtB,IAAK,GACL,OAAQ,GACR,KAAM,EACR,EAEMC,EAAwB,WAS9B,eAAsBC,EAAc,CAClC,cAAAC,EACA,cAAAf,EACA,QAAAK,EACA,UAAAH,EACA,OAAAC,EACA,qBAAAC,CACF,EAGyB,CACvB,IAAME,EAAWP,EAAY,CAC3B,cAAAgB,EACA,cAAAf,EACA,QAAAK,EACA,UAAAH,EACA,OAAAC,EACA,qBAAAC,CACF,CAAC,EACK,CAAE,aAAcY,CAAkB,EAAI,MAAMV,EAAS,WAAW,EACtE,GAAI,CAACU,EACH,MAAM,IAAI,MAAM,yCAAyC,EAG3D,IAAMC,EAAYJ,EAAwBD,EAAgB,IACpDM,EAAeL,EAAwBD,EAAgB,OACvDO,EAAaN,EAAwBD,EAAgB,KAC3D,MAAO,CACL,QAASI,EACT,IAAK,CACH,aAAcA,EAAoBC,EAClC,qBAAsBA,CACxB,EACA,OAAQ,CACN,aAAcD,EAAoBE,EAClC,qBAAsBA,CACxB,EACA,KAAM,CACJ,aAAcF,EAAoBG,EAClC,qBAAsBA,CACxB,CACF,CACF,CC3DA,OAAS,aAAAC,GAAW,mBAAAC,MAA4D,2BAChF,OAAS,yBAAAC,OAA6B,qBACtC,OAAS,MAAAC,OAAU,QCHZ,SAASC,EACdC,EACAC,EACAC,EAA6B,KACrB,CACR,MAAO,GAAGF,CAAW,IAAIE,CAAQ,IAAID,CAAI,EAC3C,CDAO,IAAME,EAA2B,CAAC,CACvC,GAAAC,EACA,aAAAC,EACA,QAAAzB,EACA,YAAAoB,EACA,QAAAM,CACF,IAMmB,CACjB,IAAMC,EAAWH,EAAG,KAAK,YAAY,IAAME,EAAQ,YAAY,EACzDE,EAAY,SAASJ,EAAG,SAAS,EAAI,IACrCK,EAAWJ,EAAa,SACxBK,EAAW,IAAIZ,GAAGM,EAAG,KAAK,EAC1BO,EAAqBd,GAAsBa,EAAUD,CAAQ,EAC7DG,EAASL,EAAWX,EAAgB,KAAOA,EAAgB,QAE3D,CAAE,KAAAiB,EAAM,GAAAC,EAAI,SAAAC,EAAU,QAAAC,EAAS,KAAAf,CAAK,EAAIG,EACxCa,EAAelB,EAA4BC,EAAaC,CAAI,EAElE,MAAO,CACL,WAAY,CAACM,EACb,WAAYA,EACZ,eAAgBW,GAAed,CAAE,EACjC,UAAAI,EACA,KAAAP,EACA,SAAAM,EACA,KAAAM,EACA,GAAAC,EACA,OAAQ,CACN,CACE,QAASL,EAAS,SAAS,EAC3B,KAAMJ,EAAa,KACnB,OAAQA,EAAa,OACrB,OAAQM,EACR,KAAMhB,GAAU,MAClB,CACF,EACA,QAAAqB,EACA,SAAAD,EACA,QAASnC,EAAQ,SAAS,EAC1B,OAAAgC,EACA,aAAAK,CACF,CACF,EAEA,SAASC,GAAed,EAAuB,CAC7C,OAAOA,EAAG,QAAU,IACtB,CExDA,OAAS,aAAAT,GAAW,mBAAAC,MAAyC,2BAC7D,OAAS,yBAAAC,OAA6B,qBAEtC,OAAS,MAAAC,OAAU,QAEZ,SAASqB,EAAwB,CACtC,GAAAf,EACA,QAAAE,EACA,YAAAN,EACA,QAAApB,CACF,EAKgB,CACd,IAAM2B,EAAWH,EAAG,KAAK,YAAY,IAAME,EAAQ,YAAY,EACzDE,EAAY,SAASJ,EAAG,SAAS,EAAI,IACrCK,EAAW,SAASL,EAAG,YAAY,EACnCM,EAAW,IAAIZ,GAAGM,EAAG,KAAK,EAC1BO,EAAqBd,GAAsBa,EAAUD,CAAQ,EAC7D,CAAE,KAAAI,EAAM,GAAAC,EAAI,SAAAC,EAAU,QAAAC,EAAS,KAAAf,EAAM,aAAAmB,EAAc,UAAAC,EAAW,YAAAC,CAAY,EAAIlB,EAC9EQ,EAASL,EAAWX,EAAgB,KAAOA,EAAgB,QAC3DqB,GAAelB,EAA4BC,EAAaC,CAAI,EAElE,MAAO,CACL,WAAY,CAACM,EACb,WAAYA,EACZ,eAAgB,GAChB,UAAAC,EACA,KAAAP,EACA,SAAAM,EACA,KAAAM,EACA,GAAAC,EACA,OAAQ,CACN,CACE,QAASM,EACT,KAAMC,EACN,OAAQC,EACR,KAAM3B,GAAU,MAChB,OAAQgB,CACV,CACF,EACA,QAAAK,EACA,SAAAD,EACA,QAASnC,EAAQ,SAAS,EAC1B,OAAAgC,EACA,aAAAK,EACF,CACF,CC/CA,OAAS,eAAAM,GAAa,gBAAAC,OAAoB,yBAOnC,IAAMC,EAA8B,MAAO,CAChD,UAAAC,EACA,QAAA9C,EACA,aAAAyB,EACA,YAAAL,EACA,QAAAM,EACA,cAAAqB,EACA,OAAAC,CACF,IAAkE,CAQhE,IAAMC,EAAkBF,EAAiB,KAAK,MAAMA,CAAa,EAA4B,OACvFG,EAAOD,GAAiB,MAAQ,EAChCE,EAAUF,GAAiB,SAAW,CAAC,SAAU,OAAO,EAExDG,GAAcD,EAAQ,SAAS,QAAQ,EAAI,MAAMP,GAAalB,EAAS,CAACoB,EAAW,CAAE,KAAAI,EAAM,OAAAF,CAAO,CAAC,EAAI,CAAC,GAAG,IAC9GxB,GAAOD,EAAyB,CAAE,GAAAC,EAAI,QAAAxB,EAAS,aAAAyB,EAAc,YAAAL,EAAa,QAAAM,CAAQ,CAAC,CACtF,EAEM2B,GACJF,EAAQ,SAAS,OAAO,EACpB,MAAMR,GAAYjB,EAAS,CAACoB,EAAW,OAAW,CAChD,KAAAI,EACA,OAAAF,CACF,CAAC,EACD,CAAC,GACL,IAAKxB,GACLe,EAAwB,CACtB,GAAAf,EACA,QAAAE,EACA,YAAAN,EACA,QAAApB,CACF,CAAC,CACH,EAGMsD,EAAgBD,EAAU,IAAK7B,GAAOA,EAAG,IAAI,EAC7C+B,EAAoBH,EAAW,OAAQ5B,GACpC,CAAC8B,EAAc,SAAS9B,EAAG,IAAI,CACvC,EAEKgC,EAA4B,CAAE,QAAS,CAAC,EAAG,KAAMN,EAAO,CAAE,EAChE,OAAIE,EAAW,QAAQI,EAAK,QAAQ,KAAK,QAAQ,EAC7CH,EAAU,QAAQG,EAAK,QAAQ,KAAK,OAAO,EAExC,CACL,aAAc,CAAC,GAAGD,EAAmB,GAAGF,CAAS,EACjD,cAAeG,EAAK,QAAQ,OAAS,KAAK,UAAUA,CAAI,EAAI,EAC9D,CACF,ECzDO,IAAMC,EAAqBzD,GAECA,IAA/B,GACiCA,IAAjC,GACkCA,IAAlC,GACkCA,IAAlC,SCXJ,OAAS,WAAA0D,OAAe,uBCAxB,OAAS,aAAA3C,EAAW,mBAAAC,MAAqC,2BACzD,OAAO2C,OAAe,mBAEf,IAAMC,EAAY,CACvB,CAAE,kBAAAC,EAAmB,eAAAC,EAAgB,gBAAAC,CAAgB,EACrDrC,EACAsC,IACoB,CACpB,IAAMC,EAAa,CAACH,GAAkB,CAACC,EACjCG,EAASC,GAAeN,EAAkB,QAAQ,UAAU,EAE5DO,EAASF,EAAO,YAAY,EAAE,SAAS,MAAM,EAC7CG,EAAeJ,GAAcJ,EAAkB,KAAK,UAAYnC,EAChE4C,EAAkBL,GAAcJ,EAAkB,GAAG,UAAYnC,EACjE6C,EAAgBL,IAAW,8BAAgCA,IAAW,UACtEM,EAAYN,IAAW,UACvBO,EAAaP,EAAO,YAAY,EAAE,SAAS,UAAU,EACrDQ,EAAYR,EAAO,YAAY,EAAE,SAAS,SAAS,EACnDS,EAAWT,EAAO,YAAY,EAAE,SAAS,QAAQ,EACjDU,EAAcV,IAAW,aACzBW,EAAYJ,GAAc,CAAC,CAACT,EAAO,CAAC,GAAKc,EAAMd,EAAO,CAAC,EAAE,IAAI,GAAKA,EAAO,CAAC,EAAE,MAAM,UAAYtC,EAC9FqD,EAAeN,GAAc,CAAC,CAACT,EAAO,CAAC,GAAKc,EAAMd,EAAO,CAAC,EAAE,IAAI,GAAKA,EAAO,CAAC,EAAE,IAAI,UAAYtC,EAErG,OAAI0C,EAAepD,EAAgB,KAC/BqD,EAAqBrD,EAAgB,KACrCsD,EAAwBtD,EAAgB,QACxCuD,EAAsBvD,EAAgB,QACtCwD,EAAkBxD,EAAgB,QAClC6D,EAAkB7D,EAAgB,SAClC+D,EAAqB/D,EAAgB,YACrCyD,EAAmBzD,EAAgB,SACnC0D,EAAkB1D,EAAgB,QAClC2D,EAAiB3D,EAAgB,OACjC4D,EAAoB5D,EAAgB,WACjCA,EAAgB,OACzB,EAEA,SAAS8D,EAAME,EAAsB,CACnC,OAAOA,IAAcjE,EAAU,QAAUiE,IAAcjE,EAAU,OACnE,CAEA,IAAMoD,GAAiB,CAACD,EAAS,KAC3BA,EAAO,SAAS,GAAG,EACdP,GAAUO,EAAO,MAAM,IAAK,CAAC,EAAE,CAAC,CAAC,EAEnCA,EC7CT,OAAS,mBAAAlD,MAAuB,2BAEzB,IAAMiE,EAAgB,CAC3BjD,EACA,CAAE,kBAAA6B,EAAmB,eAAAC,EAAgB,gBAAAC,CAAgB,EACrDrC,IAC8F,CAC9F,IAAM+C,EAAazC,IAAWhB,EAAgB,SACxCqD,EAAerC,IAAWhB,EAAgB,KAC1CsD,EAAkBtC,IAAWhB,EAAgB,QAC/CiB,EAAO4B,GAAmB,MAAM,QAChC3B,EAAK2B,GAAmB,IAAI,QAGhC,OAAIY,GAAcX,GAAkBA,EAAe,CAAC,IAClD7B,EAAO6B,EAAe,CAAC,EAAE,KAAK,QAC9B5B,EAAK4B,EAAe,CAAC,EAAE,GAAG,SAGxBW,GAAcV,GAAmBA,EAAgB,CAAC,IACpD9B,EAAO8B,EAAgB,CAAC,EAAE,KAAK,QAC/B7B,EAAK6B,EAAgB,CAAC,EAAE,GAAG,SAQtB,CACL,WANiBM,GAAiBI,GAAcxC,IAASP,EAOzD,WANiB4C,GAAoBG,GAAcvC,IAAOR,EAO1D,SALeO,IAASP,EAMxB,KAAAO,EACA,GAAAC,CACF,CACF,ECpCA,OAAS,yBAAAjB,MAA6B,qBACtC,OAAS,MAAAC,MAAU,QAEnB,OAAS,aAAAH,MAAiB,2BCJ1B,eAAsBmE,EAAqBC,EAAqB,CAC9D,GAAI,CACF,OAAOA,EAAQ,KAAMC,GAAQ,CAACA,EAAK,IAAI,CAAC,EAAE,MAAOC,GAAQ,CAAC,KAAMA,CAAG,CAAC,CACtE,OAASA,EAAK,CACZ,OAAO,QAAQ,QAAQ,CAAC,KAAMA,CAAG,CAAC,CACpC,CACF,CCNA,OAAS,gBAAAC,OAAoB,qBAEtB,IAAMC,GAAsB,8BAE5B,SAASC,EACdC,EACAC,EAA+BH,GAC/B,CACA,GAAI,CAACE,EACH,MAAO,GAGT,GAAI,CACF,OAAOH,GAAaG,EAAWC,CAAoB,CACrD,MAAQ,CACN,OAAOD,CACT,CACF,CCRA,eAAeE,GAAiBC,EAAaC,EAAU,IAAM,CAC3D,IAAMC,EAAa,IAAI,gBACvB,kBAAW,IAAMA,EAAW,MAAM,EAAGD,CAAO,EAErC,MAAMD,EAAK,CAAE,OAAQE,EAAW,MAAO,CAAC,CACjD,CAEA,eAAsBC,EAAeC,EAAkB,CACrD,IAAIC,EAAoB,CAAC,EACzB,GAAKD,EAEE,GAAIA,EAAS,WAAW,+BAA+B,EAAG,CAC/D,IAAME,EAAQF,EAAS,UAAU,EAAE,EACnC,GAAI,CACF,IAAMG,EAAO,OAAO,KAAKD,EAAO,QAAQ,EAAE,SAAS,EACnDD,EAAO,KAAK,MAAME,CAAI,CACxB,MAAQ,CACNF,EAAO,CAAC,CACV,CACF,MACEA,EAAO,MAAMN,GAAiBH,EAAyBQ,CAAQ,CAAC,EAC7D,KAAMI,GAAMA,EAAE,KAAK,CAAC,EACpB,MAAM,KAAO,CAAC,EAAE,MAZnB,OAAO,CAAC,EAcV,OAAOH,CACT,CChCA,IAAMI,GAAqB,4DAUpB,SAASC,EAAoBC,EAAgBC,EAAoC,MAAO,CAC7F,IAAMpG,EAAMoF,EAAyBe,CAAM,EAC3C,MAAO,GAAGF,EAAkB,UAAUG,CAAS,QAAQpG,CAAG,EAC5D,CJLO,IAAMqG,EAAY,MACvB,CAAE,kBAAA5C,EAAmB,eAAAC,EAAgB,gBAAAC,EAAiB,iBAAA2C,CAAiB,EACvEjF,IACuB,CACvB,IAAMkF,EAAoB,CAAC,EAE3B,GAAI9C,EAAkB,QAAU,IAAK,CACnC,IAAM+C,EAAUnF,EAAa,SACvBK,EAAW,IAAIZ,EAAG2C,EAAkB,KAAK,EACzC9B,EAAqBd,EAAsBa,EAAU8E,CAAO,EAClED,EAAO,KAAK,CACV,QAASC,EAAQ,SAAS,EAC1B,KAAMnF,EAAa,KACnB,OAAQA,EAAa,OACrB,OAAQM,EACR,KAAM8B,EAAkB,KACxB,GAAIA,EAAkB,GACtB,KAAM9C,EAAU,MAClB,CAAC,CACH,CAEA,OAAA+C,GAAgB,QAAS+C,GAAkB,CACzC,IAAMhF,EAAWgF,EAAc,WAAW,SACpC/E,EAAW,IAAIZ,EAAG2F,EAAc,KAAK,EACrC9E,EAAqBd,EAAsBa,EAAUD,CAAQ,EAEnE8E,EAAO,KAAK,CACV,QAAS9E,EAAS,SAAS,EAC3B,KAAMgF,EAAc,WAAW,KAC/B,OAAQA,EAAc,WAAW,OACjC,OAAQ9E,EACR,KAAM8E,EAAc,KACpB,GAAIA,EAAc,GAClB,SAAUA,EAAc,WAAW,QACnC,KAAM9F,EAAU,KAClB,CAAC,CACH,CAAC,EAEGgD,GACF,MAAM,QAAQ,WACZA,EAAgB,IAAI,MAAO+C,GAAmB,CAC5C,IAAMC,EAAQD,EAAe,YACvBE,EAAW,MAAMC,EAAYF,EAAM,SAAUA,EAAM,SAAS,QAAQ,EAE1EJ,EAAO,KAAK,CACV,KAAMG,EAAe,YAAY,KACjC,OAAQA,EAAe,YAAY,OACnC,OAAQ,IACR,SAAAE,EACA,KAAMF,EAAe,KACrB,GAAIA,EAAe,GACnB,mBAAoBA,EAAe,YAAY,QAC/C,KAAM/F,EAAU,MAClB,CAAC,CACH,CAAC,CACH,EAGE2F,GACF,MAAM,QAAQ,WACZA,EAAiB,IAAI,MAAOQ,GAAoB,CAC9C,IAAMH,EAAQG,EAAgB,aACxBF,EAAW,MAAMC,EAAYF,EAAM,SAAUA,EAAM,SAAS,QAAQ,EAE1EJ,EAAO,KAAK,CACV,KAAMO,EAAgB,aAAa,SAAS,MAAQ,GACpD,OAAQA,EAAgB,aAAa,SAAS,QAAU,GACxD,OAAQA,EAAgB,MACxB,SAAAF,EACA,KAAME,EAAgB,KACtB,GAAIA,EAAgB,GACpB,mBAAoBA,EAAgB,aAAa,QACjD,KAAMnG,EAAU,OAClB,CAAC,CACH,CAAC,CACH,EAGK4F,CACT,EAEMM,EAAc,MAAOjB,EAAkBgB,IAAuC,CAClF,GAAIA,EACF,OAAIA,EAAS,WAAW,SAAS,EACxBxB,EAAyBwB,CAAQ,EAEjCA,EAEJ,CACL,GAAM,CAACG,EAAUC,CAAK,EAAI,MAAMlC,EAAQa,EAAeC,CAAQ,CAAC,EAChE,OAAIoB,EACK,GAEAD,EAAS,MAAQb,EAAoBa,EAAS,KAAK,EAAI,EAElE,CACF,EK1GA,OAAS,mBAAAnG,MAAuB,2BAEzB,IAAMqG,EAAuB,CAACrG,EAAgB,KAAMA,EAAgB,QAASA,EAAgB,QAAQ,ECcrG,IAAMsG,EAAqB,MAAO,CACvC,aAAAC,EACA,YAAAnG,EACA,aAAAK,EACA,QAAAzB,EACA,QAAA0B,CACF,IAAsD,CACpD,IAAMsC,EAAS,MAAMyC,EAAUc,EAAc9F,CAAY,EACnDO,EAAS4B,EAAU2D,EAAc7F,EAASsC,CAAM,EAChD,CAAE,WAAAwD,EAAY,WAAAC,EAAY,SAAA9F,EAAU,KAAAM,EAAM,GAAAC,CAAG,EAAI+C,EAAcjD,EAAQuF,EAAc7F,CAAO,EAC5F,CAAE,eAAAgG,EAAgB,OAAQrG,EAAM,SAAAc,EAAU,QAAAC,CAAQ,EAAImF,EAAa,kBACnElF,EAAelB,EAA4BC,EAAaC,CAAI,EAGlE,MAAO,CACL,eAHqB,CAACgG,EAAqB,SAASrF,CAAM,EAI1D,WAAAyF,EACA,WAAAD,EACA,SAAA7F,EACA,UAAW+F,EAAiB,IAC5B,KAAArG,EACA,KAAAY,EACA,GAAAC,EACA,OAAA8B,EACA,SAAA7B,EACA,QAAAC,EACA,QAASpC,EAAQ,SAAS,EAC1B,OAAAgC,EACA,aAAAK,CACF,CACF,ET1CO,IAAMsF,EAA6B,MAAO,CAC/C,QAAA3H,EACA,YAAAoB,EACA,aAAAK,EACA,QAAAC,EACA,cAAAqB,EACA,OAAAC,EACA,cAAAtC,CACF,IAAkE,CAChE,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,6BAA6B,EAG/C,IAAMkH,EAAa,IAAIlE,GAAQ,CAAE,KAAMhD,CAAc,CAAC,EAEtD,GAAI,CACF,IAAMmH,EAAW,MAAMD,EAAW,gBAAgB,iBAAiB,CACjE,QAAS5H,EAAQ,SAAS,EAC1B,QAAA0B,EACA,UAAWqB,EACX,SAAUC,CACZ,CAAC,EAwBD,MAAO,CACL,cAvBmB,MAAM,QAAQ,IACjC6E,EAAS,aACN,OAEEC,GAAiBA,EAAa,kBAAkB,WAAa,GAChE,EACC,IAAKP,GACJD,EAAmB,CACjB,aAAAC,EACA,YAAAnG,EACA,aAAAK,EACA,QAAAzB,EACA,QAAA0B,CACF,CAAC,EAAE,KAAMF,GAAOA,CAAE,CACpB,CACJ,GAEkC,OAE/BuG,GAAgBA,EAAY,OAAO,KAAMhB,GAAU,OAAOA,EAAM,MAAM,IAAM,CAAC,CAChF,EAIE,cAAec,EAAS,aAC1B,CACF,MAAQ,CACN,MAAO,CACL,aAAc,CAAC,EACf,cAAe,EACjB,CACF,CACF,EUtDO,IAAMG,GAAwB,MAAO,CAC1C,QAAAhI,EACA,UAAA8C,EACA,aAAArB,EACA,YAAAL,EACA,QAAAM,EACA,cAAAqB,EACA,OAAAC,EACA,cAAAtC,CACF,IACM+C,EAAkBzD,CAAO,EACpB6C,EAA4B,CACjC,UAAAC,EACA,aAAArB,EACA,YAAAL,EACA,QAAApB,EACA,QAAA0B,EACA,cAAAqB,EACA,OAAAC,CACF,CAAC,EAEI2E,EAA2B,CAChC,UAAA7E,EACA,aAAArB,EACA,YAAAL,EACA,QAAApB,EACA,QAAA0B,EACA,cAAAqB,EACA,OAAAC,EACA,cAAAtC,CACF,CAAC,ECnCH,IAAAuH,GAAA,CACE,KAAQ,MACR,YAAe,GACf,QAAW,QACX,QAAW,CACT,OAAU,CACR,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,iBACZ,YAAe,sBACf,SAAY,4BACd,CACF,CACF,EACA,SAAY,CACV,SAAY,GACZ,SAAY,CACV,IAAO,CACL,SAAY,mBACZ,YAAe,sBACf,SAAY,4BACd,CACF,CACF,CACF,EACA,QAAW,CACT,SAAY,CAAC,WAAY,eAAgB,cAAc,EACvD,WAAc,CAAC,QAAQ,CACzB,EACA,SAAY,KACZ,YAAe,CACb,IAAO,CACL,MAAS,GACT,QAAW,CAAC,sBAAuB,QAAS,uBAAuB,CACrE,CACF,EACA,gBAAmB,KACrB,EnBtCA,IAAAC,EAAAC,EAaaC,GAAN,KAAkC,CAIvC,YAAY,CAAE,cAAA1H,EAAe,cAAAf,CAAc,EAAsD,CAHjG0I,EAAA,KAAAH,EAAA,QACAG,EAAA,KAAAF,EAAA,QAGEG,EAAA,KAAKJ,EAAiBxH,GACtB4H,EAAA,KAAKH,EAAiBxI,EACxB,CACA,YAA8B,CAC5B,OAAO,QAAQ,QAAQ,aAAa,CACtC,CAEA,aAA+B,CAC7B,OAAO,QAAQ,QAAQ,cAAc,CACvC,CAEA,aAAoC,CAClC,IAAMgH,EAASpH,GAAc0I,EAAY,EACzC,OAAOtB,EAAO,QAAUA,EAAO,KAAO,MACxC,CAEA,cAAc,CAAE,QAAA3G,EAAS,UAAAH,EAAW,OAAAC,EAAQ,qBAAAC,CAAqB,EAA8C,CAC7G,OAAOU,EAAc,CACnB,cAAe8H,EAAA,KAAKL,GACpB,cAAeK,EAAA,KAAKJ,GACpB,QAAAnI,EACA,UAAAH,EACA,OAAAC,EACA,qBAAAC,CACF,CAAC,CACH,CAEA,sBAAsByI,EAA+B,CACnD,OAAOR,GAAsB,CAAE,GAAGQ,EAAQ,cAAeD,EAAA,KAAKL,EAAe,CAAC,CAChF,CAEA,MAAM,aAAaO,EAAqB,CAEtC,OAAQA,EAAQ,OAAQ,CACtB,QACE,MAAO,CAAE,MAAO,IAAI,MAAM,UAAUA,EAAQ,MAAM,gBAAgB,CAAE,CACxE,CACF,CACF,EA1CEP,EAAA,YACAC,EAAA","sourcesContent":["import type {\n Module,\n Manifest,\n NetworkFees,\n GetTransactionHistory,\n RpcRequest,\n GetNetworkFeeParams,\n} from '@avalabs/vm-module-types';\nimport { parseManifest } from '@avalabs/vm-module-types';\nimport { getNetworkFee } from './handlers/get-network-fee/get-network-fee';\nimport { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';\nimport ManifestJson from './manifest.json';\n\nexport class EvmModule implements Module {\n #glacierApiUrl: string;\n #glacierApiKey?: string;\n\n constructor({ glacierApiUrl, glacierApiKey }: { glacierApiUrl: string; glacierApiKey?: string }) {\n this.#glacierApiUrl = glacierApiUrl;\n this.#glacierApiKey = glacierApiKey;\n }\n getAddress(): Promise<string> {\n return Promise.resolve('EVM address');\n }\n\n getBalances(): Promise<string> {\n return Promise.resolve('EVM balances');\n }\n\n getManifest(): Manifest | undefined {\n const result = parseManifest(ManifestJson);\n return result.success ? result.data : undefined;\n }\n\n getNetworkFee({ chainId, chainName, rpcUrl, multiContractAddress }: GetNetworkFeeParams): Promise<NetworkFees> {\n return getNetworkFee({\n glacierApiUrl: this.#glacierApiUrl,\n glacierApiKey: this.#glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n }\n\n getTransactionHistory(params: GetTransactionHistory) {\n return getTransactionHistory({ ...params, glacierApiUrl: this.#glacierApiUrl });\n }\n\n async onRpcRequest(request: RpcRequest) {\n // TODO implement the RPC request handler\n switch (request.method) {\n default:\n return { error: new Error(`Method ${request.method} not supported`) };\n }\n }\n}\n","import type { GetNetworkFeeParams } from '@avalabs/vm-module-types';\nimport { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';\nimport { Network } from 'ethers';\n\nexport const getProvider = ({\n glacierApiKey,\n chainId: caip2ChainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n}: GetNetworkFeeParams & {\n glacierApiUrl: string;\n glacierApiKey?: string;\n}): JsonRpcBatchInternal => {\n if (!caip2ChainId || !chainName || !rpcUrl) {\n throw new Error('Missing required parameters');\n }\n\n const chainId = caip2ChainId.split(':')[1];\n if (!chainId || isNaN(Number(chainId))) {\n throw new Error('Invalid chainId');\n }\n\n const provider = new JsonRpcBatchInternal(\n { maxCalls: 40, multiContractAddress },\n addGlacierAPIKeyIfNeeded(rpcUrl, glacierApiKey),\n new Network(chainName, Number(chainId)),\n );\n\n provider.pollingInterval = 2000;\n\n return provider;\n};\n\n// RPC urls returned in the token list are always using the production URL\nconst knownHosts = ['glacier-api.avax.network', 'proxy-api.avax.network'];\n\n/**\n * Glacier needs an API key for development, this adds the key if needed.\n */\nexport function addGlacierAPIKeyIfNeeded(url: string, glacierApiKey?: string): string {\n const urlObj = new URL(url);\n\n if (glacierApiKey && knownHosts.includes(urlObj.hostname)) {\n const search_params = urlObj.searchParams; // copy, does not update the URL\n search_params.set('token', glacierApiKey);\n urlObj.search = search_params.toString();\n return urlObj.toString();\n }\n return url;\n}\n","import type { GetNetworkFeeParams, NetworkFees } from '@avalabs/vm-module-types';\nimport { getProvider } from '../../utils/get-provider';\n\nconst DEFAULT_PRESETS = {\n LOW: 1n,\n MEDIUM: 4n,\n HIGH: 6n,\n};\n\nconst BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei\n\n/**\n * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.\n * @param glacierApiUrl\n * @param glacierApiKey\n * @params GetNetworkFeeParams\n * @throws Error if provider does not support eip-1559\n */\nexport async function getNetworkFee({\n glacierApiUrl,\n glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n}: GetNetworkFeeParams & {\n glacierApiUrl: string;\n glacierApiKey?: string;\n}): Promise<NetworkFees> {\n const provider = getProvider({\n glacierApiUrl,\n glacierApiKey,\n chainId,\n chainName,\n rpcUrl,\n multiContractAddress,\n });\n const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();\n if (!maxFeePerGasInWei) {\n throw new Error('Pre-EIP-1559 networks are not supported');\n }\n\n const lowMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.LOW;\n const mediumMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.MEDIUM;\n const highMaxTip = BASE_PRIORITY_FEE_WEI * DEFAULT_PRESETS.HIGH;\n return {\n baseFee: maxFeePerGasInWei,\n low: {\n maxFeePerGas: maxFeePerGasInWei + lowMaxTip,\n maxPriorityFeePerGas: lowMaxTip,\n },\n medium: {\n maxFeePerGas: maxFeePerGasInWei + mediumMaxTip,\n maxPriorityFeePerGas: mediumMaxTip,\n },\n high: {\n maxFeePerGas: maxFeePerGasInWei + highMaxTip,\n maxPriorityFeePerGas: highMaxTip,\n },\n };\n}\n","import type { NormalTx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type NetworkToken, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\n\nexport const convertTransactionNormal = ({\n tx,\n networkToken,\n chainId,\n explorerUrl,\n address,\n}: {\n tx: NormalTx;\n networkToken: NetworkToken;\n chainId: number;\n explorerUrl: string;\n address: string;\n}): Transaction => {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = networkToken.decimals;\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n\n const { from, to, gasPrice, gasUsed, hash } = tx;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: isContractCall(tx),\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: decimals.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n type: TokenType.NATIVE,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n\nfunction isContractCall(tx: NormalTx): boolean {\n return tx.input !== '0x';\n}\n","export function getExplorerAddressByNetwork(\n explorerUrl: string,\n hash: string,\n hashType: 'address' | 'tx' = 'tx',\n): string {\n return `${explorerUrl}/${hashType}/${hash}`;\n}\n","import type { Erc20Tx } from '@avalabs/etherscan-sdk';\nimport { TokenType, TransactionType, type Transaction } from '@avalabs/vm-module-types';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport { BN } from 'bn.js';\n\nexport function convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n}: {\n tx: Erc20Tx;\n address: string;\n chainId: number;\n explorerUrl: string;\n}): Transaction {\n const isSender = tx.from.toLowerCase() === address.toLowerCase();\n const timestamp = parseInt(tx.timeStamp) * 1000;\n const decimals = parseInt(tx.tokenDecimal);\n const amountBN = new BN(tx.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n const { from, to, gasPrice, gasUsed, hash, tokenDecimal, tokenName, tokenSymbol } = tx;\n const txType = isSender ? TransactionType.SEND : TransactionType.RECEIVE;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n\n return {\n isIncoming: !isSender,\n isOutgoing: isSender,\n isContractCall: false,\n timestamp,\n hash,\n isSender,\n from,\n to,\n tokens: [\n {\n decimal: tokenDecimal,\n name: tokenName,\n symbol: tokenSymbol,\n type: TokenType.ERC20,\n amount: amountDisplayValue,\n },\n ],\n gasUsed,\n gasPrice,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n}\n","import { convertTransactionNormal } from './convert-transaction-normal';\nimport { convertTransactionERC20 } from './convert-transaction-erc20';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getErc20Txs, getNormalTxs } from '@avalabs/etherscan-sdk';\n\ninterface EtherscanPagination {\n queries: ('normal' | 'erc20')[];\n page?: number;\n}\n\nexport const getTransactionFromEtherscan = async ({\n isTestnet,\n chainId,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n /*\n Using JSON for nextPageToken because this function is managing both the Normal\n and ERC20 queries. It encodes the current page and the queries that should be\n run. For example, if 'normal' has no more records to fetch then it will be\n excluded from the list and the JSON will be something like:\n { page: 3, queries: ['erc20'] }\n */\n const parsedPageToken = nextPageToken ? (JSON.parse(nextPageToken) as EtherscanPagination) : undefined;\n const page = parsedPageToken?.page || 1;\n const queries = parsedPageToken?.queries || ['normal', 'erc20'];\n\n const normalHist = (queries.includes('normal') ? await getNormalTxs(address, !isTestnet, { page, offset }) : []).map(\n (tx) => convertTransactionNormal({ tx, chainId, networkToken, explorerUrl, address }),\n );\n\n const erc20Hist = (\n queries.includes('erc20')\n ? await getErc20Txs(address, !isTestnet, undefined, {\n page,\n offset,\n })\n : []\n ).map((tx) =>\n convertTransactionERC20({\n tx,\n address,\n explorerUrl,\n chainId,\n }),\n );\n\n // Filter erc20 transactions from normal tx list\n const erc20TxHashes = erc20Hist.map((tx) => tx.hash);\n const filteredNormalTxs = normalHist.filter((tx) => {\n return !erc20TxHashes.includes(tx.hash);\n });\n\n const next: EtherscanPagination = { queries: [], page: page + 1 };\n if (normalHist.length) next.queries.push('normal');\n if (erc20Hist.length) next.queries.push('erc20');\n\n return {\n transactions: [...filteredNormalTxs, ...erc20Hist],\n nextPageToken: next.queries.length ? JSON.stringify(next) : '', // stop pagination\n };\n};\n","enum ChainId {\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_RINKEBY = 4,\n ETHEREUM_TEST_GOERLY = 5,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n}\n\nexport const isEthereumChainId = (chainId: number): boolean => {\n return (\n ChainId.ETHEREUM_HOMESTEAD === chainId ||\n ChainId.ETHEREUM_TEST_GOERLY === chainId ||\n ChainId.ETHEREUM_TEST_RINKEBY === chainId ||\n ChainId.ETHEREUM_TEST_SEPOLIA === chainId\n );\n};\n","import type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { Glacier } from '@avalabs/glacier-sdk';\nimport { convertTransaction } from './convert-transaction';\n\nexport const getTransactionsFromGlacier = async ({\n chainId,\n explorerUrl,\n networkToken,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (!glacierApiUrl) {\n throw new Error('Glacier API URL is required');\n }\n\n const glacierSdk = new Glacier({ BASE: glacierApiUrl });\n\n try {\n const response = await glacierSdk.evmTransactions.listTransactions({\n chainId: chainId.toString(),\n address,\n pageToken: nextPageToken,\n pageSize: offset,\n });\n\n const convertedTxs = await Promise.all(\n response.transactions\n .filter(\n // Currently not showing failed tx\n (tranasaction) => tranasaction.nativeTransaction.txStatus === '1',\n )\n .map((transactions) =>\n convertTransaction({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n }).then((tx) => tx),\n ),\n );\n\n const transactions = convertedTxs.filter(\n // Filtering txs with 0 value since there is no change in balance\n (transaction) => transaction.tokens.find((token) => Number(token.amount) !== 0),\n );\n\n return {\n transactions,\n nextPageToken: response.nextPageToken,\n };\n } catch {\n return {\n transactions: [],\n nextPageToken: '',\n };\n }\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TokenType, TransactionType, type TxToken } from '@avalabs/vm-module-types';\nimport startCase from 'lodash.startcase';\n\nexport const getTxType = (\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n tokens: TxToken[],\n): TransactionType => {\n const nativeOnly = !erc20Transfers && !erc721Transfers;\n const method = parseRawMethod(nativeTransaction.method?.methodName);\n\n const isSwap = method.toLowerCase().includes('swap');\n const isNativeSend = nativeOnly && nativeTransaction.from.address === address;\n const isNativeReceive = nativeOnly && nativeTransaction.to.address === address;\n const isNFTPurchase = method === 'Market Buy Orders With Eth' || method === 'Buy NFT';\n const isApprove = method === 'Approve';\n const isTransfer = method.toLowerCase().includes('transfer');\n const isAirdrop = method.toLowerCase().includes('airdrop');\n const isUnwrap = method.toLowerCase().includes('unwrap');\n const isFillOrder = method === 'Fill Order';\n const isNFTSend = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].from?.address === address;\n const isNFTReceive = isTransfer && !!tokens[0] && isNFT(tokens[0].type) && tokens[0].to?.address === address;\n\n if (isSwap) return TransactionType.SWAP;\n if (isNativeSend) return TransactionType.SEND;\n if (isNativeReceive) return TransactionType.RECEIVE;\n if (isNFTPurchase) return TransactionType.NFT_BUY;\n if (isApprove) return TransactionType.APPROVE;\n if (isNFTSend) return TransactionType.NFT_SEND;\n if (isNFTReceive) return TransactionType.NFT_RECEIVE;\n if (isTransfer) return TransactionType.TRANSFER;\n if (isAirdrop) return TransactionType.AIRDROP;\n if (isUnwrap) return TransactionType.UNWRAP;\n if (isFillOrder) return TransactionType.FILL_ORDER;\n return TransactionType.UNKNOWN;\n};\n\nfunction isNFT(tokenType: TokenType) {\n return tokenType === TokenType.ERC721 || tokenType === TokenType.ERC1155;\n}\n\nconst parseRawMethod = (method = ''): string => {\n if (method.includes('(')) {\n return startCase(method.split('(', 1)[0]);\n }\n return method;\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { TransactionType } from '@avalabs/vm-module-types';\n\nexport const getSenderInfo = (\n txType: TransactionType,\n { nativeTransaction, erc20Transfers, erc721Transfers }: TransactionDetails,\n address: string,\n): { isOutgoing: boolean; isIncoming: boolean; isSender: boolean; from: string; to: string } => {\n const isTransfer = txType === TransactionType.TRANSFER;\n const isNativeSend = txType === TransactionType.SEND;\n const isNativeReceive = txType === TransactionType.RECEIVE;\n let from = nativeTransaction?.from?.address;\n let to = nativeTransaction?.to?.address;\n\n // Until multi tokens transaction is supported in UI, using from and to of the only token is helpful for UI\n if (isTransfer && erc20Transfers && erc20Transfers[0]) {\n from = erc20Transfers[0].from.address;\n to = erc20Transfers[0].to.address;\n }\n\n if (isTransfer && erc721Transfers && erc721Transfers[0]) {\n from = erc721Transfers[0].from.address;\n to = erc721Transfers[0].to.address;\n }\n\n const isOutgoing = isNativeSend || (isTransfer && from === address);\n const isIncoming = isNativeReceive || (isTransfer && to === address);\n\n const isSender = from === address;\n\n return {\n isOutgoing,\n isIncoming,\n isSender,\n from,\n to,\n };\n};\n","import type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { balanceToDisplayValue } from '@avalabs/utils-sdk';\nimport { BN } from 'bn.js';\nimport type { TxToken, NetworkToken } from '@avalabs/vm-module-types';\nimport { TokenType } from '@avalabs/vm-module-types';\nimport { resolve } from '../../utils/resolve';\nimport { getNftMetadata } from './get-nft-metadata';\nimport { getSmallImageForNFT } from '../../utils/get-small-image-for-nft';\nimport { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\nexport const getTokens = async (\n { nativeTransaction, erc20Transfers, erc721Transfers, erc1155Transfers }: TransactionDetails,\n networkToken: NetworkToken,\n): Promise<TxToken[]> => {\n const result: TxToken[] = [];\n\n if (nativeTransaction.value !== '0') {\n const decimal = networkToken.decimals;\n const amountBN = new BN(nativeTransaction.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimal);\n result.push({\n decimal: decimal.toString(),\n name: networkToken.name,\n symbol: networkToken.symbol,\n amount: amountDisplayValue,\n from: nativeTransaction.from,\n to: nativeTransaction.to,\n type: TokenType.NATIVE,\n });\n }\n\n erc20Transfers?.forEach((erc20Transfer) => {\n const decimals = erc20Transfer.erc20Token.decimals;\n const amountBN = new BN(erc20Transfer.value);\n const amountDisplayValue = balanceToDisplayValue(amountBN, decimals);\n\n result.push({\n decimal: decimals.toString(),\n name: erc20Transfer.erc20Token.name,\n symbol: erc20Transfer.erc20Token.symbol,\n amount: amountDisplayValue,\n from: erc20Transfer.from,\n to: erc20Transfer.to,\n imageUri: erc20Transfer.erc20Token.logoUri,\n type: TokenType.ERC20,\n });\n });\n\n if (erc721Transfers) {\n await Promise.allSettled(\n erc721Transfers.map(async (erc721Transfer) => {\n const token = erc721Transfer.erc721Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc721Transfer.erc721Token.name,\n symbol: erc721Transfer.erc721Token.symbol,\n amount: '1',\n imageUri,\n from: erc721Transfer.from,\n to: erc721Transfer.to,\n collectableTokenId: erc721Transfer.erc721Token.tokenId,\n type: TokenType.ERC721,\n });\n }),\n );\n }\n\n if (erc1155Transfers) {\n await Promise.allSettled(\n erc1155Transfers.map(async (erc1155Transfer) => {\n const token = erc1155Transfer.erc1155Token;\n const imageUri = await getImageUri(token.tokenUri, token.metadata.imageUri);\n\n result.push({\n name: erc1155Transfer.erc1155Token.metadata.name ?? '',\n symbol: erc1155Transfer.erc1155Token.metadata.symbol ?? '',\n amount: erc1155Transfer.value,\n imageUri,\n from: erc1155Transfer.from,\n to: erc1155Transfer.to,\n collectableTokenId: erc1155Transfer.erc1155Token.tokenId,\n type: TokenType.ERC1155,\n });\n }),\n );\n }\n\n return result;\n};\n\nconst getImageUri = async (tokenUri: string, imageUri?: string): Promise<string> => {\n if (imageUri) {\n if (imageUri.startsWith('ipfs://')) {\n return ipfsResolverWithFallback(imageUri);\n } else {\n return imageUri;\n }\n } else {\n const [metadata, error] = await resolve(getNftMetadata(tokenUri));\n if (error) {\n return '';\n } else {\n return metadata.image ? getSmallImageForNFT(metadata.image) : '';\n }\n }\n};\n","export async function resolve<T = unknown>(promise: Promise<T>) {\n try {\n return promise.then((res) => [res, null]).catch((err) => [null, err]);\n } catch (err) {\n return Promise.resolve([null, err]);\n }\n}\n","import { ipfsResolver } from '@avalabs/utils-sdk';\n\nexport const CLOUDFLARE_IPFS_URL = 'https://cloudflare-ipfs.com';\n\nexport function ipfsResolverWithFallback(\n sourceUrl: string | undefined,\n desiredGatewayPrefix: string = CLOUDFLARE_IPFS_URL,\n) {\n if (!sourceUrl) {\n return '';\n }\n\n try {\n return ipfsResolver(sourceUrl, desiredGatewayPrefix);\n } catch {\n return sourceUrl;\n }\n}\n","import { ipfsResolverWithFallback } from '../../utils/ipfs-resolver-with-fallback';\n\ninterface NftMetadata {\n attributes?: string;\n name?: string;\n image?: string;\n description?: string;\n}\n\nasync function fetchWithTimeout(uri: string, timeout = 5000) {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return fetch(uri, { signal: controller.signal });\n}\n\nexport async function getNftMetadata(tokenUri: string) {\n let data: NftMetadata = {};\n if (!tokenUri) {\n return {};\n } else if (tokenUri.startsWith('data:application/json;base64,')) {\n const value = tokenUri.substring(29);\n try {\n const json = Buffer.from(value, 'base64').toString();\n data = JSON.parse(json);\n } catch {\n data = {};\n }\n } else {\n data = await fetchWithTimeout(ipfsResolverWithFallback(tokenUri))\n .then((r) => r.json())\n .catch(() => ({}));\n }\n return data;\n}\n","import { ipfsResolverWithFallback } from './ipfs-resolver-with-fallback';\n\nconst COVALENT_IMG_SIZER = 'https://image-proxy.svc.prod.covalenthq.com/cdn-cgi/image';\n\n/**\n * Covalent has an on the fly image resizer, it resolves image urls then resizes the image.\n *\n * This allows us to request smaller images depending on the UI needs\n *\n * @param imgUrl the url of the image to convert to size\n * @returns The url to the image which is sized at the time of request\n */\nexport function getSmallImageForNFT(imgUrl: string, imageSize: '256' | '512' | '1024' = '256') {\n const url = ipfsResolverWithFallback(imgUrl);\n return `${COVALENT_IMG_SIZER}/width=${imageSize},fit/${url}`;\n}\n","import { TransactionType } from '@avalabs/vm-module-types';\n\nexport const NonContractCallTypes = [TransactionType.SEND, TransactionType.RECEIVE, TransactionType.TRANSFER];\n","import type { Transaction, NetworkToken } from '@avalabs/vm-module-types';\nimport { getTxType } from './get-tx-type';\nimport { getSenderInfo } from './get-sender-info';\nimport { getTokens } from './get-tokens';\nimport { getExplorerAddressByNetwork } from '../../utils/get-explorer-address-by-network';\nimport type { TransactionDetails } from '@avalabs/glacier-sdk';\nimport { NonContractCallTypes } from '../../../../types';\n\ntype ConvertTransactionParams = {\n transactions: TransactionDetails;\n explorerUrl: string;\n networkToken: NetworkToken;\n chainId: number;\n address: string;\n};\n\nexport const convertTransaction = async ({\n transactions,\n explorerUrl,\n networkToken,\n chainId,\n address,\n}: ConvertTransactionParams): Promise<Transaction> => {\n const tokens = await getTokens(transactions, networkToken);\n const txType = getTxType(transactions, address, tokens);\n const { isOutgoing, isIncoming, isSender, from, to } = getSenderInfo(txType, transactions, address);\n const { blockTimestamp, txHash: hash, gasPrice, gasUsed } = transactions.nativeTransaction;\n const explorerLink = getExplorerAddressByNetwork(explorerUrl, hash);\n const isContractCall = !NonContractCallTypes.includes(txType);\n\n return {\n isContractCall,\n isIncoming,\n isOutgoing,\n isSender,\n timestamp: blockTimestamp * 1000, // s to ms\n hash,\n from,\n to,\n tokens,\n gasPrice,\n gasUsed,\n chainId: chainId.toString(),\n txType,\n explorerLink,\n };\n};\n","import { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';\nimport { isEthereumChainId } from './utils/is-ethereum-chain-id';\nimport type { GetTransactionHistory, TransactionHistoryResponse } from '@avalabs/vm-module-types';\nimport { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';\n\nexport const getTransactionHistory = async ({\n chainId,\n isTestnet,\n networkToken,\n explorerUrl,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n}: GetTransactionHistory): Promise<TransactionHistoryResponse> => {\n if (isEthereumChainId(chainId)) {\n return getTransactionFromEtherscan({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n });\n }\n return getTransactionsFromGlacier({\n isTestnet,\n networkToken,\n explorerUrl,\n chainId,\n address,\n nextPageToken,\n offset,\n glacierApiUrl,\n });\n};\n","{\n \"name\": \"EVM\",\n \"description\": \"\",\n \"version\": \"0.0.1\",\n \"sources\": {\n \"module\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/bundle.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n },\n \"provider\": {\n \"checksum\": \"\",\n \"location\": {\n \"npm\": {\n \"filePath\": \"dist/provider.js\",\n \"packageName\": \"@avalabs/evm-module\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n }\n }\n },\n \"network\": {\n \"chainIds\": [\"eip155:1\", \"eip155:43114\", \"eip155:43113\"],\n \"namespaces\": [\"eip155\"]\n },\n \"cointype\": \"60\",\n \"permissions\": {\n \"rpc\": {\n \"dapps\": true,\n \"methods\": [\"eth_sendTransaction\", \"eth_*\", \"getTransactionHistory\"]\n }\n },\n \"manifestVersion\": \"0.0\"\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avalabs/evm-module",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -10,9 +10,10 @@
10
10
  "@avalabs/chains-sdk": "v2.8.0-alpha.187",
11
11
  "@avalabs/etherscan-sdk": "v2.8.0-alpha.187",
12
12
  "@avalabs/glacier-sdk": "v2.8.0-alpha.187",
13
+ "@avalabs/wallets-sdk": "v2.8.0-alpha.187",
13
14
  "bn.js": "5.2.1",
14
15
  "lodash.startcase": "4.4.0",
15
- "@avalabs/vm-module-types": "0.0.8"
16
+ "@avalabs/vm-module-types": "0.0.9"
16
17
  },
17
18
  "devDependencies": {
18
19
  "@types/bn.js": "5.1.5",
@@ -1,6 +1,13 @@
1
1
  import { getNetworkFee } from './get-network-fee';
2
2
  import { FeeData, JsonRpcProvider } from 'ethers';
3
3
 
4
+ const params = {
5
+ glacierApiUrl: 'https://glacier-api.avax.network',
6
+ chainId: 'eip155:1',
7
+ chainName: 'Ethereum Mainnet',
8
+ rpcUrl: 'https://mainnet.infura.io/v3/1234567890',
9
+ };
10
+
4
11
  describe('get-network-fee', () => {
5
12
  it("should throw error if provider.getFeeData() doesn't return eip-1559 compatible fees", async () => {
6
13
  jest.spyOn(JsonRpcProvider.prototype, 'getFeeData').mockImplementationOnce(async () => {
@@ -8,8 +15,7 @@ describe('get-network-fee', () => {
8
15
  maxFeePerGas: null,
9
16
  } as FeeData;
10
17
  });
11
- const provider = new JsonRpcProvider();
12
- await expect(getNetworkFee(provider)).rejects.toThrow('Pre-EIP-1559 networks are not supported');
18
+ await expect(getNetworkFee(params)).rejects.toThrow('Pre-EIP-1559 networks are not supported');
13
19
  });
14
20
 
15
21
  it('should return correct network fees based on maxFeePerGas returned from provider.getFeeData', async () => {
@@ -18,8 +24,7 @@ describe('get-network-fee', () => {
18
24
  maxFeePerGas: 1000000000n, //1 gWei
19
25
  } as FeeData;
20
26
  });
21
- const provider = new JsonRpcProvider();
22
- await expect(getNetworkFee(provider)).resolves.toEqual({
27
+ await expect(getNetworkFee(params)).resolves.toEqual({
23
28
  baseFee: 1000000000n,
24
29
  low: {
25
30
  maxFeePerGas: 1500000000n,
@@ -1,5 +1,5 @@
1
- import { JsonRpcProvider } from 'ethers';
2
- import type { NetworkFees } from '@avalabs/vm-module-types';
1
+ import type { GetNetworkFeeParams, NetworkFees } from '@avalabs/vm-module-types';
2
+ import { getProvider } from '../../utils/get-provider';
3
3
 
4
4
  const DEFAULT_PRESETS = {
5
5
  LOW: 1n,
@@ -11,10 +11,30 @@ const BASE_PRIORITY_FEE_WEI = 500000000n; //0.5 GWei
11
11
 
12
12
  /**
13
13
  * Returns {@link NetworkFees} based on {@link DEFAULT_PRESETS} multipliers.
14
- * @param provider
14
+ * @param glacierApiUrl
15
+ * @param glacierApiKey
16
+ * @params GetNetworkFeeParams
15
17
  * @throws Error if provider does not support eip-1559
16
18
  */
17
- export async function getNetworkFee(provider: JsonRpcProvider): Promise<NetworkFees> {
19
+ export async function getNetworkFee({
20
+ glacierApiUrl,
21
+ glacierApiKey,
22
+ chainId,
23
+ chainName,
24
+ rpcUrl,
25
+ multiContractAddress,
26
+ }: GetNetworkFeeParams & {
27
+ glacierApiUrl: string;
28
+ glacierApiKey?: string;
29
+ }): Promise<NetworkFees> {
30
+ const provider = getProvider({
31
+ glacierApiUrl,
32
+ glacierApiKey,
33
+ chainId,
34
+ chainName,
35
+ rpcUrl,
36
+ multiContractAddress,
37
+ });
18
38
  const { maxFeePerGas: maxFeePerGasInWei } = await provider.getFeeData();
19
39
  if (!maxFeePerGasInWei) {
20
40
  throw new Error('Pre-EIP-1559 networks are not supported');
@@ -1,4 +1,4 @@
1
- import { getTransactionHistory } from './index';
1
+ import { getTransactionHistory } from './get-transaction-history';
2
2
  import { getTransactionFromEtherscan } from './converters/etherscan-transaction-converter/get-transaction-from-etherscan';
3
3
  import { getTransactionsFromGlacier } from './converters/evm-transaction-converter/get-transactions-from-glacier';
4
4
 
package/src/index.ts CHANGED
@@ -1,15 +1,23 @@
1
- import type { Module, Manifest, NetworkFees, GetTransactionHistory } from '@avalabs/vm-module-types';
1
+ import type {
2
+ Module,
3
+ Manifest,
4
+ NetworkFees,
5
+ GetTransactionHistory,
6
+ RpcRequest,
7
+ GetNetworkFeeParams,
8
+ } from '@avalabs/vm-module-types';
2
9
  import { parseManifest } from '@avalabs/vm-module-types';
3
- import type { JsonRpcProvider } from 'ethers';
4
- import { getNetworkFee } from './handlers/get-network-fee';
5
- import { getTransactionHistory } from './handlers/get-transaction-history';
10
+ import { getNetworkFee } from './handlers/get-network-fee/get-network-fee';
11
+ import { getTransactionHistory } from './handlers/get-transaction-history/get-transaction-history';
6
12
  import ManifestJson from './manifest.json';
7
13
 
8
14
  export class EvmModule implements Module {
9
- #provider: JsonRpcProvider;
15
+ #glacierApiUrl: string;
16
+ #glacierApiKey?: string;
10
17
 
11
- constructor(provider: JsonRpcProvider) {
12
- this.#provider = provider;
18
+ constructor({ glacierApiUrl, glacierApiKey }: { glacierApiUrl: string; glacierApiKey?: string }) {
19
+ this.#glacierApiUrl = glacierApiUrl;
20
+ this.#glacierApiKey = glacierApiKey;
13
21
  }
14
22
  getAddress(): Promise<string> {
15
23
  return Promise.resolve('EVM address');
@@ -24,11 +32,26 @@ export class EvmModule implements Module {
24
32
  return result.success ? result.data : undefined;
25
33
  }
26
34
 
27
- getNetworkFee(): Promise<NetworkFees> {
28
- return getNetworkFee(this.#provider);
35
+ getNetworkFee({ chainId, chainName, rpcUrl, multiContractAddress }: GetNetworkFeeParams): Promise<NetworkFees> {
36
+ return getNetworkFee({
37
+ glacierApiUrl: this.#glacierApiUrl,
38
+ glacierApiKey: this.#glacierApiKey,
39
+ chainId,
40
+ chainName,
41
+ rpcUrl,
42
+ multiContractAddress,
43
+ });
29
44
  }
30
45
 
31
46
  getTransactionHistory(params: GetTransactionHistory) {
32
- return getTransactionHistory(params);
47
+ return getTransactionHistory({ ...params, glacierApiUrl: this.#glacierApiUrl });
48
+ }
49
+
50
+ async onRpcRequest(request: RpcRequest) {
51
+ // TODO implement the RPC request handler
52
+ switch (request.method) {
53
+ default:
54
+ return { error: new Error(`Method ${request.method} not supported`) };
55
+ }
33
56
  }
34
57
  }
@@ -0,0 +1,51 @@
1
+ import type { GetNetworkFeeParams } from '@avalabs/vm-module-types';
2
+ import { JsonRpcBatchInternal } from '@avalabs/wallets-sdk';
3
+ import { Network } from 'ethers';
4
+
5
+ export const getProvider = ({
6
+ glacierApiKey,
7
+ chainId: caip2ChainId,
8
+ chainName,
9
+ rpcUrl,
10
+ multiContractAddress,
11
+ }: GetNetworkFeeParams & {
12
+ glacierApiUrl: string;
13
+ glacierApiKey?: string;
14
+ }): JsonRpcBatchInternal => {
15
+ if (!caip2ChainId || !chainName || !rpcUrl) {
16
+ throw new Error('Missing required parameters');
17
+ }
18
+
19
+ const chainId = caip2ChainId.split(':')[1];
20
+ if (!chainId || isNaN(Number(chainId))) {
21
+ throw new Error('Invalid chainId');
22
+ }
23
+
24
+ const provider = new JsonRpcBatchInternal(
25
+ { maxCalls: 40, multiContractAddress },
26
+ addGlacierAPIKeyIfNeeded(rpcUrl, glacierApiKey),
27
+ new Network(chainName, Number(chainId)),
28
+ );
29
+
30
+ provider.pollingInterval = 2000;
31
+
32
+ return provider;
33
+ };
34
+
35
+ // RPC urls returned in the token list are always using the production URL
36
+ const knownHosts = ['glacier-api.avax.network', 'proxy-api.avax.network'];
37
+
38
+ /**
39
+ * Glacier needs an API key for development, this adds the key if needed.
40
+ */
41
+ export function addGlacierAPIKeyIfNeeded(url: string, glacierApiKey?: string): string {
42
+ const urlObj = new URL(url);
43
+
44
+ if (glacierApiKey && knownHosts.includes(urlObj.hostname)) {
45
+ const search_params = urlObj.searchParams; // copy, does not update the URL
46
+ search_params.set('token', glacierApiKey);
47
+ urlObj.search = search_params.toString();
48
+ return urlObj.toString();
49
+ }
50
+ return url;
51
+ }