{"id":15643276,"url":"https://github.com/paulmillr/micro-web3","last_synced_at":"2025-03-30T14:30:56.889Z","repository":{"id":43197527,"uuid":"510900973","full_name":"paulmillr/micro-web3","owner":"paulmillr","description":"Typesafe Web3 with minimum deps: call eth contracts directly from JS. Batteries included","archived":true,"fork":false,"pushed_at":"2024-01-05T05:12:02.000Z","size":80,"stargazers_count":59,"open_issues_count":2,"forks_count":8,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-23T13:05:08.520Z","etag":null,"topics":["abi","api","contract","ethereum","ethers","json","node","typesafe","typescript","web3"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paulmillr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/funding.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":"paulmillr"}},"created_at":"2022-07-05T21:36:27.000Z","updated_at":"2025-01-09T16:52:08.000Z","dependencies_parsed_at":"2024-01-05T06:26:46.736Z","dependency_job_id":"5aaba241-3fe9-4828-bd71-1e0e927f362c","html_url":"https://github.com/paulmillr/micro-web3","commit_stats":{"total_commits":11,"total_committers":2,"mean_commits":5.5,"dds":0.09090909090909094,"last_synced_commit":"f0635e241f48f8f1513de4bd2066bdf4487f67e4"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fmicro-web3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fmicro-web3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fmicro-web3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fmicro-web3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paulmillr","download_url":"https://codeload.github.com/paulmillr/micro-web3/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246331887,"owners_count":20760372,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abi","api","contract","ethereum","ethers","json","node","typesafe","typescript","web3"],"created_at":"2024-10-03T11:59:45.163Z","updated_at":"2025-03-30T14:30:55.601Z","avatar_url":"https://github.com/paulmillr.png","language":"TypeScript","funding_links":["https://github.com/sponsors/paulmillr"],"categories":[],"sub_categories":[],"readme":"# micro-web3\n\nTypesafe Web3 with minimum deps: call eth contracts directly from JS. Batteries included.\n\n## Deprecated\n\nThe package has been integrated into micro-eth-signer.\nCheck it out: https://github.com/paulmillr/micro-eth-signer\n\n---\n\n- Connect to web3 nodes\n- Write typesafe code with auto inference of TypeScript types from ABI JSON\n- Fetch token balances, resolve ENS domains, watch token prices with chainlink web3 oracle\n- Decode transactions: create readable tx descriptions from tx data \u0026 ABIs\n- No network code in main package: allows simpler audits and offline usage\n- Tiny, thanks to generic serializer: [micro-packed](https://github.com/paulmillr/micro-packed)\n\n*Check out all web3 utility libraries:* [micro-eth-signer](https://github.com/paulmillr/micro-eth-signer), [micro-btc-signer](https://github.com/paulmillr/micro-btc-signer), [micro-sol-signer](https://github.com/paulmillr/micro-sol-signer), [micro-web3](https://github.com/paulmillr/micro-web3), [tx-tor-broadcaster](https://github.com/paulmillr/tx-tor-broadcaster)\n\n## Usage\n\n\u003e npm install micro-web3\n\n```ts\nimport web3 from 'micro-web3';\nimport contracts from 'micro-web3/contracts';\nimport web3net from 'micro-web3-net';\nconst DEF_CONTRACTS = contracts.DEFAULT_CONTRACTS;\n```\n\n### Decode transactions without network\n\n```ts\nimport { hex } from '@scure/base';\nconst tx =\n  'a9059cbb000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000542598700';\nconst decoder = new web3.Decoder();\nconst USDT = contracts.tokenFromSymbol('USDT').contract;\ndecoder.add(USDT, contracts.ERC20);\nconst info = decoder.decode(USDT, hex.decode(tx), { contractInfo: DEF_CONTRACTS[USDT] });\nconsole.log(info);\n// { name: 'transfer', signature: 'transfer(address,uint256)',\n// value: { to: '0xdac17f958d2ee523a2206206994597c13d831ec7', value: 22588000000n },\n// hint: 'Transfer 22588 USDT to 0xdac17f958d2ee523a2206206994597c13d831ec7' }\n```\n\n### Decode events\n\n```ts\nconst BAT = '0x0d8775f648430679a709e98d2b0cb6250d2887ef';\nconst decoder = new web3.Decoder();\ndecoder.add(BAT, contracts.ERC20);\nconst info = decoder.decodeEvent(\n  BAT,\n  [\n    '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',\n    '0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045',\n    '0x000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564',\n  ],\n  '0x00000000000000000000000000000000000000000000003635c9adc5dea00000',\n  { contract: BAT, contracts: { ...DEF_CONTRACTS }, contractInfo: DEF_CONTRACTS[BAT] }\n);\nconsole.log(info.hint);\n// Allow 0xe592427a0aece92de3edee1f18e0157c05861564 spending up to 1000 BAT from 0xd8da6bf26964af9d7eed9e03e53415d37aa96045\n```\n\n### Fetch Chainlink oracle prices\n\n```ts\nimport chainlink from 'micro-web3/api/chainlink';\nconst provider = new web3net.Web3({\n  url: 'https://nodes.mewapi.io/rpc/eth',\n  headers: { Origin: 'https://www.myetherwallet.com' },\n});\nconst btc = await chainlink.coinPrice(provider, 'BTC');\nconst bat = await chainlink.tokenPrice(provider, 'BAT');\nconsole.log({ btc, bat }); // BTC 19188.68870991, BAT 0.39728989 in USD\n```\n\n### Uniswap\n\nSwap 12.12 USDT to BAT with uniswap V3 defaults of 0.5% slippage, 30 min expiration.\n\n```ts\nimport univ2 from 'micro-web3/api/uniswap-v2';\nimport univ3 from 'micro-web3/api/uniswap-v3';\n\nconst provider = new web3net.Web3({\n  url: 'https://nodes.mewapi.io/rpc/eth',\n  headers: { Origin: 'https://www.myetherwallet.com' },\n});\nconst USDT = contracts.tokenFromSymbol('USDT');\nconst BAT = contracts.tokenFromSymbol('BAT');\nconst u3 = new univ3.UniswapV3(provider); // or new univ2.UniswapV2(provider)\nconst fromAddress = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045';\nconst toAddress = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045';\nconst swap = await u3.swap(USDT, BAT, '12.12', { slippagePercent: 0.5, ttl: 30 * 60 });\nconst swapData = await swap.tx(fromAddress, toAddress);\nconsole.log(swapData.amount, swapData.expectedAmount, swapData.allowance);\n```\n\n### Type inference\n\nBy offering sacrifices to The Forbidden Ones, we were able to achive basic type-safety,\nhowever there are some limitations:\n\n- Fixed size arrays can have 999 elements at max: string[], string[1], ..., string[999]\n- Fixed size 2d arrays can have 39 elements at max: string[][], string[][1], ..., string[39][39]\n- Which is enough for almost all cases\n- ABI must be described as constant value: `[...] as const`\n- We're not able to handle contracts with method overload (same function names with different args) — the code will still work, but not types\n\nWe're parsing values as:\n\n```js\n// no inputs\n{} -\u003e encodeInput();\n// single input\n{inputs: [{type: 'uint'}]} -\u003e encodeInput(bigint);\n// all inputs named\n{inputs: [{type: 'uint', name: 'lol}, {type: 'address', name: 'wut'}]} -\u003e encodeInput({lol: bigint, wut: string})\n// at least one input is unnamed\n{inputs: [{type: 'uint', name: 'lol}, {type: 'address'}]} -\u003e encodeInput([bigint, string])\n// Same applies for output!\n```\n\nCheck out [`src/api/ens.ts`](./src/api/ens.ts) for type-safe contract execution example.\n\n## License\n\nMIT (c) Paul Miller [(https://paulmillr.com)](https://paulmillr.com), see LICENSE file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulmillr%2Fmicro-web3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaulmillr%2Fmicro-web3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulmillr%2Fmicro-web3/lists"}