<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Web3HackerWorld</title>
        <link>https://paragraph.com/@web3hackerworld</link>
        <description>Web3Hacker.World</description>
        <lastBuildDate>Thu, 04 Jun 2026 00:43:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Web3HackerWorld</title>
            <url>https://storage.googleapis.com/papyrus_images/a45cbb413c6ff5aaed2f3cfc843620c81641309582c5eddec4faa65371000b73.jpg</url>
            <link>https://paragraph.com/@web3hackerworld</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Plan to write a full-stack browser plug-in development tutorial, the content involves Web3, front-end, back-end, and browser development, are you interested?]]></title>
            <link>https://paragraph.com/@web3hackerworld/plan-to-write-a-full-stack-browser-plug-in-development-tutorial-the-content-involves-web3-front-end-back-end-and-browser-development-are-you-interested</link>
            <guid>V6sHTbVvzkxWj22eheg3</guid>
            <pubDate>Fri, 02 Jun 2023 16:26:55 GMT</pubDate>
            <description><![CDATA[Take you to develop a Web3 RWA(Real World Assets) wallet from scratchUse competitions to promote project implementationRecently, I signed up for a new Polkadot Hackathon competition. The prize money for this competition is very generous. The first place is about 40,000 US dollars, but I have no idea whether I can win the prize. In fact, the main purpose of participating in the competition is to create a sense of urgency for me to promote the implementation of my idea. This time I plan to buil...]]></description>
            <content:encoded><![CDATA[<h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h1><blockquote><p>Take you to develop a Web3 RWA(Real World Assets) wallet from scratch</p></blockquote><h2 id="h-use-competitions-to-promote-project-implementation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Use competitions to promote project implementation</h2><p>Recently, I signed up for a new Polkadot Hackathon competition. The prize money for this competition is very generous. The first place is about 40,000 US dollars, but I have no idea whether I can win the prize.</p><p>In fact, the main purpose of participating in the competition is to create a sense of urgency for me to promote the implementation of my idea. This time I plan to build a Web3 RWA wallet, and this time the code is also directly open source.</p><h2 id="h-during-the-project-landing-process-i-can-write-a-small-book-to-introduce-the-technical-principles-of-this-project-etc" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">During the project landing process, I can write a small book to introduce the technical principles of this project, etc.</h2><p>In fact, I wanted to write a full-stack Web3 training course for a long time, but it never landed because I have been participating in various Web3 hackathon competitions or researching new technologies.</p><p>Wallet development will involve front-end, back-end, browser plug-ins, Web3 and other knowledge.</p><p>In this process, I hope to sort out some related technologies for developing this wallet little by little, and finally form a book.</p><p>Eventually, this book will be published on the blockchain by Web3Blog.World, the Web3 book publishing platform that I am also developing.</p><p>At that time, each chapter will have a one-time payment logic on the corresponding blockchain to support the needs of some readers who do not want to read the original book but only read some chapters.</p><h2 id="h-the-project-code-is-open-source" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The project code is open source</h2><p>This Web3 RWA wallet project is completely open source.</p><p>Current project status: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/15">https://github.com/Web3Hacker-World/Discussions/issues/15</a></p><p>During the competition, the code was put here: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/NftTopBest/hackathon-2023-summer/tree/main/projects/01-NFT-Fi-Twitter/code">https://github.com/NftTopBest/hackathon-2023-summer/tree/main/projects/01-NFT-Fi-Twitter/code</a> After the competition, it will be moved to the Web3Hacker-World organization headquarters: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/web3-rwa-wallet">https://github.com/Web3Hacker-World/web3-rwa-wallet</a></p><h2 id="h-applicable-people-and-content-planning-of-the-book" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Applicable people and content planning of the book</h2><p>This book is suitable for those who have a certain programming foundation, preferably with a front-end foundation, but if you think you have more learning ability or time, you can also participate with zero foundation, but it will be more difficult!</p><p>Each chapter is actually the process of advancing the development of this wallet and the problems we encounter every day.</p><p>This book is actually a tutorial book that focuses on actual combat. The best way to learn a certain technology is to learn or read a certain knowledge with goals and questions.</p><p>For example, after confirming that I wanted to write my own wallet for Web3Hacker.World, I started to study the wallet principle of MetaMask.</p><p>In the process of researching the principles, I wrote an article to introduce the knowledge I learned.</p><p>This process may be tortuous and lengthy, but I think it will be more meaningful than simply learning a certain technical knowledge point and then developing it all at once.</p><p>So after writing a few articles, I decided to turn this into a book.</p><p>In this way, in the process of developing the wallet together with everyone, we can gradually sort out this knowledge information and share it with more people.</p><p>At the same time, in the process of learning together, you may also think of some functions of the wallet waiting to be developed, then you can use your spare time to participate in the development of the code of this part of the module, and then output the chapters of the book.</p><p>This may be a process of <code>Learn by doing</code>, and we may be more like <code>Learn by building &amp;&amp; booking</code>.</p><p>At present, the chapters of the book are still clear, because the wallet has just begun to be developed.</p><p>But the ultimate intention of the tutorial is to hope that everyone can learn with me step by step how to develop and implement the wallet.</p><p>In the last month, I will strive to update the wallet code every day, and there will be a 10-minute video demonstration at 21:00 every day to explain the progress code of the day.</p><p>Of course, if you have any questions, you can also answer them in the video conference.</p><p>Note, the video will be shared online!</p><p>Articles related to this book that have been published so far:</p><ul><li><p>\MetaMask&apos;s key encryption logic\ This article is a translated article , will be rearranged later</p></li><li><p>\Web3 Development Technology Update: Still using web3.js or ethers.js? Try Wagmi and Viem!\</p></li><li><p>\WebExt Bridge in action\</p></li></ul><h2 id="h-early-bird-program" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Early Bird Program</h2><ul><li><p>The price limit for the top 10 is 99RMB.</p></li><li><p>11 - 100 people limit the price to 199RMB.</p></li><li><p>The final price of this book will be 300RMB, and will receive lifetime update support.</p></li><li><p>After becoming a member, forward and recommend new members, old members will get 20% rebates, and new members will get 20% rebates.</p></li></ul><p>Additionally, this book will be part of the <code>Full Stack Life Hacker Handbook</code>, but that book will be priced higher and will be a membership access to all Web3Hacker.World resources.</p><p>This book is directly open to buyers of the <code>Full Stack Life Hacker Handbook</code> book and Web3Hacker.World&apos;s seed user members and hacker members without additional payment.</p><blockquote><p>I am Bruce from <code>Web3Hacker.World</code>, I was All In Web3 in May 2022, and I participated in more than 10 hackathons in a row and got about 15 track awards and Grants within three months). Later, I experienced a rest, moved to the seaside (lazy for a few months), and learned a lot of new technologies. Now a new round of Web3 nuggets has begun. This wave mainly revolves around the <code>BuidlerProtocol</code> created by me to create a cross-chain <code>Web3 App Store</code> ecological platform of <code>Everything can be Web3</code> to create various DApps with different practical application scenarios. Participate in various hackathon competitions and try Obtain investment from Web3 investment agency.</p></blockquote>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
        </item>
        <item>
            <title><![CDATA[Tens of thousands of chains into one]]></title>
            <link>https://paragraph.com/@web3hackerworld/tens-of-thousands-of-chains-into-one</link>
            <guid>CfGtZQEjlatR5ut3d2Sw</guid>
            <pubDate>Fri, 02 Jun 2023 06:15:56 GMT</pubDate>
            <description><![CDATA[Web3Hacker.World is an ecosystem built around the concept of everything can be Web3, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. We will continue to share the latest technological developments in Web3, and create an open hacker community and produce truly non-Ponzi Web3 products.questionI saw Bob Jiang&apos;s question about multi-chain in the newly created group of LXDAO today Developer PerspectiveFor contract developers (deployment), ...]]></description>
            <content:encoded><![CDATA[<h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h1><blockquote><p>Web3Hacker.World is an ecosystem built around the concept of <code>everything can be Web3</code>, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. We will continue to share the latest technological developments in Web3, and create an open hacker community and produce truly non-Ponzi Web3 products.</p></blockquote><h2 id="h-question" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">question</h2><p>I saw Bob Jiang&apos;s question about multi-chain in the newly created group of LXDAO today</p><p><strong>Developer Perspective</strong></p><blockquote><p>For contract developers (deployment), there are so many chains, each of which must be deployed. Is there any scheme to minimize developer effort? (Currently known layer2, there are 4 or 5, each of which needs to be deployed, and some contracts need to be slightly adjusted to manage multiple versions, and gas is required for each deployment)</p></blockquote><blockquote><p><strong>END USER PERSPECTIVE</strong> The second question is for end users. After there are multiple layer2s, users need to switch to the corresponding layer2 network every time before using a service, and need to have the gas of this layer2 network to use it normally. User experience, very poor!</p></blockquote><h2 id="h-tldr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">TL;DR</h2><ol><li><p>This can be completely solved by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-2535">EIP2535</a> + <code>DevOps</code>. Our \BuidlerProtocol\ uses <code>EIP2535</code> to land, because the code logic has far exceeded 24kb, and we also added some scripts, so that when we update or deploy the contract, it will automatically update our front-end Some parameter data related to chain and contract. At the same time, because <code>EIP2535</code> is used to update large contracts, it is especially valuable, we only need to update the contract of the shard. We don&apos;t even need to change the contract address of the DApp. If the ABI does not change, the DApp is completely indifferent.</p></li><li><p>In this regard, users need to have a wallet that can land on AA and is different from MetaMask to solve this problem. Our new <code>Web3 UWA Wallet</code> is thinking and redesigning and developing a new wallet from this aspect.</p></li></ol><h2 id="h-view" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">View</h2><p>Because we believe that the value of web3 does not lie in any chain, but in the true value of the product. The world will have only one chain or some logic to form a chain.</p><p>You can think about our real world: a product in different countries has almost the same price (except taxes and transaction fees), but in different currencies.</p><p>Currently, I just feel like different chains have different fee costs, almost like taxes and tx fees in the real world, in the end, the fastest and cheapest chain will win the race, but the value of the product wins all chains.</p><p>That&apos;s why we started building a Web3 RWA wallet, which, unlike MetaMask, focuses on bringing real-world assets to Web3.</p><hr><h3 id="h-past-review" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Past review</h3><ul><li><p>\The latest technology stack updates related to Web3 development &amp;&amp; how does MetaMask save your wallet key? \</p></li><li><p>\Web3 Development Technology Update: Still using web3.js or ethers.js? Try Wagmi and Viem!\</p></li><li><p>\Resignation All in Web3 year review and some views on Web3 NFT (1)\</p></li><li><p>\Resignation All in Web3 year review and some views on Web3 NFT (2)<br>*\Some thoughts on 2023-2025 is Web3&apos;s iPhone moment article\</p></li><li><p>\Some Tips for Applying for Alliance Investment Incubation\</p></li><li><p>\Introduce the necessary out-of-the-box Web3 metaverse NFT development necessary scaffolding for Web3 bounty hackers\</p></li><li><p>\A solution to make your NFT have unlimited possibilities\</p></li></ul>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
        </item>
        <item>
            <title><![CDATA[WebExt Bridge in action]]></title>
            <link>https://paragraph.com/@web3hackerworld/webext-bridge-in-action</link>
            <guid>41iSFw6E0r54cCebTMID</guid>
            <pubDate>Thu, 01 Jun 2023 12:52:05 GMT</pubDate>
            <description><![CDATA[Web3Hacker.World is an ecosystem built around the concept of everything can be Web3, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. We will continue to share the latest technological development of Web3, and create an open hacker community and produce truly non-Ponzi Web3 productsThis article was compiled when we studied the logic of message transmission between different modules of the browser extension organized by webext-bridge in the ...]]></description>
            <content:encoded><![CDATA[<blockquote><p>Web3Hacker.World is an ecosystem built around the concept of <code>everything can be Web3</code>, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. We will continue to share the latest technological development of Web3, and create an open hacker community and produce truly non-Ponzi Web3 products</p></blockquote><p>This article was compiled when we studied the logic of message transmission between different modules of the browser extension organized by webext-bridge in the process of developing the RWA wallet of Web3. In the end, we will have two open source project outputs:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3HackerWorld/vitesse-webext-tutorial">WebExtension Vite Starter Web3 RWA Wallet Full Stack Developer Tutorial</a> write a using \vitesse-webext\ A book on developing RWA wallets</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/web3-rwa-wallet">Web3 RWA Wallet</a></p></li></ul><p>This article introduces the usage of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/zikaari/webext-bridge">WebExt Bridge</a>.</p><p><code>WebExt Bridge</code> allows you to have a more unified and convenient message transmission logic when developing browser extensions.</p><h2 id="h-tldr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">TL;DR</h2><ul><li><p><code>content-script &lt;=&gt; background, popup, option</code></p></li></ul><pre data-type="codeBlock" text="// content-script
const yourJsonDataToPass = { what: ‘ever json you want to pass here’ }
await sendMessage(‘eventNameA’, yourJsonDataToPass, ‘background’)
onMessage(‘eventNameB’, async (msg) =&gt; { console. log(msg) })

// background or popup

// currentTabId only can get in background script, so you should store it in storage so in popup we can get the tabId
const currentTabId = ref(‘’)
browser.tabs.onActivated.addListener(async ({ tabId }) =&gt; {
currentTabId.value = tabId
})
onMessage(‘eventNameA’, async (msg) =&gt; { console. log(msg) })
await sendMessage(‘eventNameB’, yourJsonDataToPass, `content-script@${tabId}`)
"><code><span class="hljs-comment">// content-script</span>
const yourJsonDataToPass <span class="hljs-operator">=</span> { what: ‘ever json you want to pass here’ }
await sendMessage(‘eventNameA’, yourJsonDataToPass, ‘background’)
onMessage(‘eventNameB’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> { console. log(<span class="hljs-built_in">msg</span>) })

<span class="hljs-comment">// background or popup</span>

<span class="hljs-comment">// currentTabId only can get in background script, so you should store it in storage so in popup we can get the tabId</span>
const currentTabId <span class="hljs-operator">=</span> ref(‘’)
browser.tabs.onActivated.addListener(async ({ tabId }) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
currentTabId.<span class="hljs-built_in">value</span> <span class="hljs-operator">=</span> tabId
})
onMessage(‘eventNameA’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> { console. log(<span class="hljs-built_in">msg</span>) })
await sendMessage(‘eventNameB’, yourJsonDataToPass, `content<span class="hljs-operator">-</span>script@${tabId}`)
</code></pre><ul><li><p>Except for <code>content-script</code>, it is relatively simple for other parties to send and receive messages to each other, no need to attach <code>tabId</code></p></li></ul><h2 id="h-default-setting" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">default setting</h2><p>I have prepared a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3HackerWorld/vitesse-webext-tutorial">demo</a> code in the webext-bridge branch, so that everyone can try it quickly.</p><pre data-type="codeBlock" text="git clone — depth=1 git@github.com:Web3HackerWorld/vitesse-webext-tutorial.git — branch webext-bridge
cd vitesse-webext-tutorial
pnpm i
pnpm dev
"><code>git clone — depth<span class="hljs-operator">=</span><span class="hljs-number">1</span> git@github.com:Web3HackerWorld<span class="hljs-operator">/</span>vitesse<span class="hljs-operator">-</span>webext<span class="hljs-operator">-</span>tutorial.git — branch webext<span class="hljs-operator">-</span>bridge
cd vitesse<span class="hljs-operator">-</span>webext<span class="hljs-operator">-</span>tutorial
pnpm i
pnpm dev
</code></pre><p>The <code>pnpm dev</code> command uses <code>run-p</code> to run multiple scripts starting with <code>dev:</code> at the same time, where <code>dev:html</code> is to automatically open a local webpage for you, so that you can directly view the effect of the browser extension.</p><p>After opening the page, our <code>Vitesse webext tutorial</code> browser extension will not appear, you need to open <code>chrome://extensions/</code>, click <code>Load unpacked</code>, and then navigate to the <code>extensions</code> directory of this code.</p><p>Note that after modifying the <code>manifest.ts</code> file, you need to manually delete the extension and then click the <code>Load unpacked</code> button to load it again. Other code modifications can be done by installing <code>[Extensions Reloader](https://chrome.google.com/webstore /detail/extensions-reloader/fimgfedafeadlieiabdeeaodndnlbhid)</code> to facilitate you to click the button to refresh the extension. Of course, you can directly open <code>chrome://extensions/</code> and click the <code>reload</code> button in the lower right corner of your extension.</p><h2 id="h-1-content-script-lessgreater-background" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. content-script &lt;=&gt; background</h2><h3 id="h-content-script-greater-background" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">content-script =&gt; background</h3><ol><li><p>In <code>content-script</code> (/src/contentScripts/views/App.vue) define <code>content-scipt=&gt;background</code> send button code</p></li></ol><pre data-type="codeBlock" text="&lt;button @click=”doContentScriptToBackground”&gt;
content-script=&gt;background
&lt;/button&gt;
"><code><span class="hljs-operator">&#x3C;</span>button @click<span class="hljs-operator">=</span>”doContentScriptToBackground”<span class="hljs-operator">></span>
content<span class="hljs-operator">-</span>script<span class="hljs-operator">=</span><span class="hljs-operator">></span>background
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>button<span class="hljs-operator">></span>
</code></pre><pre data-type="codeBlock" text="import { sendMessage } from ‘webext-bridge/content-script’

const clickCount = ref(1)
const doContentScriptToBackground = async () =&gt; {
await sendMessage(‘content-scipt=&gt;background’, {
count: clickCount. value,
}, ‘background’)
clickCount. value++
}
"><code><span class="hljs-keyword">import</span> { <span class="hljs-title">sendMessage</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> ‘<span class="hljs-title">webext</span><span class="hljs-operator">-</span><span class="hljs-title">bridge</span><span class="hljs-operator">/</span><span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">script</span>’

<span class="hljs-title">const</span> <span class="hljs-title">clickCount</span> <span class="hljs-operator">=</span> <span class="hljs-title">ref</span>(1)
<span class="hljs-title">const</span> <span class="hljs-title">doContentScriptToBackground</span> <span class="hljs-operator">=</span> <span class="hljs-title">async</span> () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-title">await</span> <span class="hljs-title">sendMessage</span>(‘<span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">scipt</span><span class="hljs-operator">=</span><span class="hljs-operator">></span><span class="hljs-title">background</span>’, {
<span class="hljs-title">count</span>: <span class="hljs-title">clickCount</span>. <span class="hljs-title">value</span>,
}, ‘<span class="hljs-title">background</span>’)
<span class="hljs-title">clickCount</span>. <span class="hljs-title">value</span><span class="hljs-operator">+</span><span class="hljs-operator">+</span>
}
</code></pre><ol><li><p>Define the receiving function of the message in <code>background</code> (/src/background/main.ts)</p></li></ol><pre data-type="codeBlock" text="onMessage(‘content-script=&gt;background’, async (msg) =&gt; {
console.log(‘====&gt; msg :’, msg)
const keys = Object. keys(msg)
const { sender, data } = msg
console.log(‘====&gt; keys, sender, data :’, keys, sender, data)
})
"><code>onMessage(‘content<span class="hljs-operator">-</span>script<span class="hljs-operator">=</span><span class="hljs-operator">></span>background’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
const keys <span class="hljs-operator">=</span> Object. keys(<span class="hljs-built_in">msg</span>)
const { sender, data } <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> keys, sender, data :’, keys, sender, data)
})
</code></pre><ol><li><p>Open the <code>service worker</code> of your extension (open <code>chrome://extensions/</code>, find the <code>Vitesse WebExt Tutorial</code> extension, there is an <code>Inspect views service worker</code> button, click it and it will pop up</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/47f5e89642bdc01ef304d6020d729fcf23b79774082cd56fc2ca9955516156b0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f1beeedbe0c6d4522f90df587f648199f8e9780af1ed7e520fc0096d8e8e9bc3.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ol><li><p>Click the <code>content-scipt=&gt;background</code> button injected by the extension on the webpage, and you will see a log similar to this in the <code>service worker</code>.</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-content-script-less-background" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">content-script &lt;= background</h3><p>At this point, we can trigger the <code>content-script&lt;=background</code> event when <code>background</code> receives a <code>content-scipt=&gt;background</code> message.</p><ol><li><p>Add the following code in <code>App.vue</code> (/src/contentScripts/views/App.vue) to define the <code>content-scipt&lt;=background</code> event.</p></li></ol><pre data-type="codeBlock" text="onMessage(‘content-script&lt;=background’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; content-scipt&lt;=background msg :’, msg)
return { cool: ‘Got you! I am cool from content-script’ }
})
"><code>onMessage(‘content<span class="hljs-operator">-</span>script<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>background’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>background <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
<span class="hljs-keyword">return</span> { cool: ‘Got you<span class="hljs-operator">!</span> I am cool <span class="hljs-keyword">from</span> content<span class="hljs-operator">-</span>script’ }
})
</code></pre><ol><li><p>The <code>content-scipt=&gt;background</code> event callback function in <code>background</code> (/src/background/main.ts) defines the code that sends a message to <code>content-scipt&lt;=background</code>, here we take a trick, in Click on the web interface to trigger the event <code>background</code>, and immediately trigger a new event to the front-end <code>content-script</code>, the complete code is as follows:</p></li></ol><pre data-type="codeBlock" text="onMessage(‘content-script=&gt;background’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; msg :’, msg)
const keys = Object. keys(msg)
const { sender, data } = msg
// eslint-disable-next-line no-console
console.log(‘====&gt; keys, sender, data :’, keys, sender, data)

const rz = await sendMessage(‘content-scipt&lt;=background’, {
time: new Date(),
}, `content-script@${currentTabId}`)
// eslint-disable-next-line no-console
console.log(‘====&gt; response from content-sciript’, rz)

return { yaha: ‘hoho’ }
})
"><code>onMessage(‘content<span class="hljs-operator">-</span>script<span class="hljs-operator">=</span><span class="hljs-operator">></span>background’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
const keys <span class="hljs-operator">=</span> Object. keys(<span class="hljs-built_in">msg</span>)
const { sender, data } <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> keys, sender, data :’, keys, sender, data)

const rz <span class="hljs-operator">=</span> await sendMessage(‘content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>background’, {
time: <span class="hljs-keyword">new</span> Date(),
}, `content<span class="hljs-operator">-</span>script@${currentTabId}`)
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> response <span class="hljs-keyword">from</span> content<span class="hljs-operator">-</span>sciript’, rz)

<span class="hljs-keyword">return</span> { yaha: ‘hoho’ }
})
</code></pre><p>we are here too Added the return data to the previous <code>sendMessage</code>, so we also modified the previous <code>doContentScriptToBackground</code> function</p><pre data-type="codeBlock" text="const doContentScriptToBackground = async () =&gt; {
const rz = await sendMessage(‘content-scipt=&gt;background’, {
count: clickCount. value,
}, ‘background’)
clickCount. value++
// eslint-disable-next-line no-console

console.log(‘====&gt; doContentScriptToBackground sendMessage rz :’, rz)
}
"><code>const doContentScriptToBackground <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
const rz <span class="hljs-operator">=</span> await sendMessage(‘content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">=</span><span class="hljs-operator">></span>background’, {
count: clickCount. <span class="hljs-built_in">value</span>,
}, ‘background’)
clickCount. <span class="hljs-built_in">value</span>+<span class="hljs-operator">+</span>
<span class="hljs-comment">// eslint-disable-next-line no-console</span>

console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> doContentScriptToBackground sendMessage rz :’, rz)
}
</code></pre><p>Click the <code>reload</code> button of the extension to reload the extension to trigger the refresh of <code>service worker</code>, and then refresh the web page <code>http://localhost:5173/</code>, you may need to switch to another tab and then switch back, because We need to get the currently active <code>tabId</code> in <code>background</code></p><pre data-type="codeBlock" text="let currentTabId = 0
// communication example: send previous tab title from background page
// see shim.d.ts for type declaration
browser.tabs.onActivated.addListener(async ({ tabId }) =&gt; {
currentTabId = tabId
})
"><code>let currentTabId <span class="hljs-operator">=</span> <span class="hljs-number">0</span>
<span class="hljs-comment">// communication example: send previous tab title from background page</span>
<span class="hljs-comment">// see shim.d.ts for type declaration</span>
browser.tabs.onActivated.addListener(async ({ tabId }) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
currentTabId <span class="hljs-operator">=</span> tabId
})
</code></pre><ol><li><p>Finally, you can click the button on the webpage to trigger the <code>content-scipt=&gt;background</code> event again. After <code>background</code> receives this event, it also triggers a new <code>content-scipt&lt;=background</code> event to the webpage<code> contentScripts</code></p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-content-script-lessgreater-popup" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">content-script &lt;=&gt; popup</h2><ol><li><p>In <code>content-script</code> (/src/contentScripts/views/App.vue), define the code of <code>content-scipt=&gt;popup</code> to send the button and the event code of <code>content-scipt&lt;=popup</code> to receive the message.</p></li></ol><pre data-type="codeBlock" text="&lt;br&gt;
&lt;br&gt;
&lt;button @click=”doContentScriptToPopup”&gt;
content-script=&gt;popup
&lt;/button&gt;
"><code><span class="hljs-operator">&#x3C;</span>br<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>br<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>button @click<span class="hljs-operator">=</span>”doContentScriptToPopup”<span class="hljs-operator">></span>
content<span class="hljs-operator">-</span>script<span class="hljs-operator">=</span><span class="hljs-operator">></span>popup
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>button<span class="hljs-operator">></span>
</code></pre><pre data-type="codeBlock" text="const doContentScriptToPopup = async () =&gt; {
const rz = await sendMessage(‘content-scipt=&gt;popup’, {
count: clickCount. value,
}, ‘popup’)
clickCount. value++
// eslint-disable-next-line no-console
console.log(‘====&gt; doContentScriptToPopup sendMessage rz :’, rz)
}

onMessage(‘content-script&lt;=popup’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; content-scipt&lt;=popup msg :’, msg)
return { cool: ‘Got you popup! I am cool from content-script’ }
})
"><code>const doContentScriptToPopup <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
const rz <span class="hljs-operator">=</span> await sendMessage(‘content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">=</span><span class="hljs-operator">></span>popup’, {
count: clickCount. <span class="hljs-built_in">value</span>,
}, ‘popup’)
clickCount. <span class="hljs-built_in">value</span>+<span class="hljs-operator">+</span>
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> doContentScriptToPopup sendMessage rz :’, rz)
}

onMessage(‘content<span class="hljs-operator">-</span>script<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>popup’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>popup <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
<span class="hljs-keyword">return</span> { cool: ‘Got you popup<span class="hljs-operator">!</span> I am cool <span class="hljs-keyword">from</span> content<span class="hljs-operator">-</span>script’ }
})
</code></pre><ol><li><p>Define the event <code>content-script=&gt;popup</code> and the <code>sendMessageToContentScript</code> button in <code>popup</code> (/src/popup/views/popup.vue), so that we can click the button in the popup to trigger logic to send a message to contentScript. We defined <code>currentTabId</code> in <code>storage</code>, so that we can get the currently active <code>tabId</code> in <code>popup</code>, so that there is a way to send a message to the <code>content-script</code> of the <code>tabId</code>.</p></li></ol><pre data-type="codeBlock" text="import { currentTabId } from ‘~/logic/storage’

const count = ref(0)
onMessage(‘content-script=&gt;popup’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; content-scipt=&gt;popup msg :’, msg)
count.value = msg.data.count
return { cool: ‘Got you! I am cool from popup’ }
})

const sendMessageToContentScript = async () =&gt; {
console.log(‘====&gt; currentTabId.value :’, currentTabId.value)
const rz = await sendMessage(‘content-scipt&lt;=popup’, {
time: new Date(),
}, `content-script@${currentTabId.value}`)
// eslint-disable-next-line no-console
console.log(‘====&gt; response from content-sciript’, rz)
}
"><code><span class="hljs-keyword">import</span> { <span class="hljs-title">currentTabId</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> ‘<span class="hljs-operator">~</span><span class="hljs-operator">/</span><span class="hljs-title">logic</span><span class="hljs-operator">/</span><span class="hljs-title"><span class="hljs-keyword">storage</span></span>’

<span class="hljs-title">const</span> <span class="hljs-title">count</span> <span class="hljs-operator">=</span> <span class="hljs-title">ref</span>(0)
<span class="hljs-title">onMessage</span>(‘<span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">script</span><span class="hljs-operator">=</span><span class="hljs-operator">></span><span class="hljs-title">popup</span>’, <span class="hljs-title">async</span> (<span class="hljs-title"><span class="hljs-built_in">msg</span></span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
<span class="hljs-title">console</span>.<span class="hljs-title">log</span>(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">scipt</span><span class="hljs-operator">=</span><span class="hljs-operator">></span><span class="hljs-title">popup</span> <span class="hljs-title"><span class="hljs-built_in">msg</span></span> :’, <span class="hljs-title"><span class="hljs-built_in">msg</span></span>)
<span class="hljs-title">count</span>.<span class="hljs-title">value</span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-built_in">msg</span></span>.<span class="hljs-title">data</span>.<span class="hljs-title">count</span>
<span class="hljs-title"><span class="hljs-keyword">return</span></span> { <span class="hljs-title">cool</span>: ‘<span class="hljs-title">Got</span> <span class="hljs-title">you</span><span class="hljs-operator">!</span> <span class="hljs-title">I</span> <span class="hljs-title">am</span> <span class="hljs-title">cool</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">popup</span>’ }
})

<span class="hljs-title">const</span> <span class="hljs-title">sendMessageToContentScript</span> <span class="hljs-operator">=</span> <span class="hljs-title">async</span> () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-title">console</span>.<span class="hljs-title">log</span>(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-title">currentTabId</span>.<span class="hljs-title">value</span> :’, <span class="hljs-title">currentTabId</span>.<span class="hljs-title">value</span>)
<span class="hljs-title">const</span> <span class="hljs-title">rz</span> <span class="hljs-operator">=</span> <span class="hljs-title">await</span> <span class="hljs-title">sendMessage</span>(‘<span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">scipt</span><span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span><span class="hljs-title">popup</span>’, {
<span class="hljs-title">time</span>: <span class="hljs-title"><span class="hljs-keyword">new</span></span> <span class="hljs-title">Date</span>(),
}, `<span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">script</span>@<span class="hljs-title">$</span>{<span class="hljs-title">currentTabId</span>.<span class="hljs-title">value</span>}`)
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
<span class="hljs-title">console</span>.<span class="hljs-title">log</span>(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-title">response</span> <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">content</span><span class="hljs-operator">-</span><span class="hljs-title">sciript</span>’, <span class="hljs-title">rz</span>)
}
</code></pre><pre data-type="codeBlock" text="currentTabId {{ currentTabId }} &lt;br &gt;
count from content-script: {{ count }}
&lt;button class=”mt-2 btn” @click=”sendMessageToContentScript”&gt;
content-scipt&amp;lt;= popup
&lt;/button&gt;
"><code>currentTabId {{ currentTabId }} <span class="hljs-operator">&#x3C;</span>br <span class="hljs-operator">></span>
count <span class="hljs-keyword">from</span> content<span class="hljs-operator">-</span>script: {{ count }}
<span class="hljs-operator">&#x3C;</span>button class<span class="hljs-operator">=</span>”mt<span class="hljs-number">-2</span> btn” @click<span class="hljs-operator">=</span>”sendMessageToContentScript”<span class="hljs-operator">></span>
content<span class="hljs-operator">-</span>scipt<span class="hljs-operator">&#x26;</span>lt;<span class="hljs-operator">=</span> popup
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>button<span class="hljs-operator">></span>
</code></pre><ol><li><p>Now you can right-click the browser extension icon, click the menu item <code>Inspect Popup</code> at the bottom of the pop-up menu, and then click <code>content-script=&gt;popup</code> on the left, you can see <code>content-script</code> to <code>popup</code> <code>The message has been sent, and the event receiving callback in</code>popup<code>returns</code>{ cool: ‘Got you! I am cool from popup’ }<code>to</code>content-script<code>. Note that the event monitoring of </code>content-scipt=&gt;popup<code>can only be registered successfully if</code>popup<code>is opened here. If the</code>popup<code>pop-up window has not been opened, click on</code>content-scipt=&gt;popup<code>on the page and an error will be reported. of. Because the</code>popup` code doesn’t run at all. All such scenarios are estimated to be used less in actual development.</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ol><li><p>Then click the <code>content-scipt&lt;=popup</code> button in <code>popup</code>, then you can see the <code>content-scipt&lt;=popup</code> event listener callback triggered by <code>content-script</code>, and return <code>{ cool: ‘Got you popup! I am cool from content-script’ }</code> gave <code>popup</code></p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-popup-lessgreater-background" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">popup &lt;=&gt; background</h2><ol><li><p>Add event listener and send code in <code>background</code></p></li></ol><pre data-type="codeBlock" text="onMessage(‘background&lt;=popup’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; msg :’, msg)
const keys = Object. keys(msg)
const { sender, data } = msg
// eslint-disable-next-line no-console
console.log(‘====&gt; keys, sender, data :’, keys, sender, data)

const rz = await sendMessage(‘background=&gt;popup’, {
time: new Date(),
}, ‘popup’)
// eslint-disable-next-line no-console
console.log(‘====&gt; response from popup’, rz)

return { yoho: ‘huhu’ }
})
"><code>onMessage(‘background<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>popup’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
const keys <span class="hljs-operator">=</span> Object. keys(<span class="hljs-built_in">msg</span>)
const { sender, data } <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> keys, sender, data :’, keys, sender, data)

const rz <span class="hljs-operator">=</span> await sendMessage(‘background<span class="hljs-operator">=</span><span class="hljs-operator">></span>popup’, {
time: <span class="hljs-keyword">new</span> Date(),
}, ‘popup’)
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> response <span class="hljs-keyword">from</span> popup’, rz)

<span class="hljs-keyword">return</span> { yoho: ‘huhu’ }
})
</code></pre><ol><li><p>Add event listener and send code in <code>popup</code></p></li></ol><pre data-type="codeBlock" text="onMessage(‘background=&gt;popup’, async (msg) =&gt; {
// eslint-disable-next-line no-console
console.log(‘====&gt; background=&gt;popup msg :’, msg)
count.value = msg.data.count
return { cool: ‘Got you! I am cool from popup’ }
})

const sendMessageToBackground = async () =&gt; {
const rz = await sendMessage(‘background&lt;=popup’, {
time: new Date(),
}, ‘background’)
// eslint-disable-next-line no-console
console.log(‘====&gt; response from background’, rz)
}
"><code>onMessage(‘background<span class="hljs-operator">=</span><span class="hljs-operator">></span>popup’, async (<span class="hljs-built_in">msg</span>) <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> background<span class="hljs-operator">=</span><span class="hljs-operator">></span>popup <span class="hljs-built_in">msg</span> :’, <span class="hljs-built_in">msg</span>)
count.<span class="hljs-built_in">value</span> <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">data</span>.count
return { cool: ‘Got you<span class="hljs-operator">!</span> I am cool <span class="hljs-keyword">from</span> popup’ }
})

const sendMessageToBackground <span class="hljs-operator">=</span> async () <span class="hljs-operator">=</span><span class="hljs-operator">></span> {
const rz <span class="hljs-operator">=</span> await sendMessage(‘background<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span>popup’, {
time: <span class="hljs-keyword">new</span> Date(),
}, ‘background’)
<span class="hljs-comment">// eslint-disable-next-line no-console</span>
console.log(‘<span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> response <span class="hljs-keyword">from</span> background’, rz)
}
</code></pre><pre data-type="codeBlock" text="&lt;br&gt;
&lt;br&gt;
&lt;button class=”mt-2 btn” @click=”sendMessageToBackground”&gt;
background&amp;lt;= popup
&lt;/button&gt;
"><code><span class="hljs-operator">&#x3C;</span>br<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>br<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>button class<span class="hljs-operator">=</span>”mt<span class="hljs-number">-2</span> btn” @click<span class="hljs-operator">=</span>”sendMessageToBackground”<span class="hljs-operator">></span>
background<span class="hljs-operator">&#x26;</span>lt;<span class="hljs-operator">=</span> popup
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>button<span class="hljs-operator">></span>
</code></pre><ol><li><p>As shown in the figure, open the console of <code>service worker</code> (lower right) and the console of <code>popup</code> (upper right)</p></li></ol><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><blockquote><p>I am Bruce from <code>Web3Hacker.World</code>. I was All In Web3 in May 2022. After that, I participated in more than 10 hackathons in a row and got about 15 track awards and Grants within three months, with a cumulative output value of 700,000 About RMB (including subsequent participation in other teams). Later, I experienced a rest, moved to the seaside (lazy for a few months), and learned a lot of new technologies. Now a new round of Web3 nuggets has begun. This wave mainly revolves around the <code>BuidlerProtocol</code> created by me to create a cross-chain <code>Web3 App Store</code> ecological platform of <code>Everything can be Web3</code> to create various DApps with different practical application scenarios. Participate in various hackathon competitions and try Obtain investment from Web3 investment agency. In this process, I will use Web3 technology to develop a series of products and actually use them in the process. For example, use the Web3 blog platform to share our subsequent paid-to-read articles Web3NFT.Social.</p></blockquote><p>— -</p><h3 id="h-past-review" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Past review</h3><ul><li><p>\The latest technology stack updates related to Web3 development &amp;&amp; how does MetaMask save your wallet key? \</p></li><li><p>\Web3 Development Technology Update: Still using web3.js or ethers.js? Try Wagmi and Viem!\</p></li><li><p>\Resignation All in Web3 year review and some views on Web3 NFT (1)\</p></li><li><p>\Resignation All in Web3 year review and some views on Web3 NFT (2)<br>*\Some thoughts on 2023–2025 is Web3’s iPhone moment article\</p></li><li><p>\Some Tips for Applying for Alliance Investment Incubation\</p></li><li><p>\Introduce the necessary out-of-the-box Web3 metaverse NFT development necessary scaffolding for Web3 bounty hackers\</p><p>\A solution to make your NFT have unlimited possibilities\</p></li></ul>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/bf9ba8b5b5c025c5a801a1e8cc35b99cd9ed19886ad52aa5a2e3c1fa1242a2e0.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The latest technology stack updates related to Web3 development]]></title>
            <link>https://paragraph.com/@web3hackerworld/the-latest-technology-stack-updates-related-to-web3-development</link>
            <guid>N5Gp9Npni7B7VHJ6mkYi</guid>
            <pubDate>Mon, 29 May 2023 09:50:30 GMT</pubDate>
            <description><![CDATA[Web3Hacker.World is an ecosystem built around the concept of Everything can be Web3, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. There are currently 19 paid membersI am Bruce from Web3Hacker.World. I was All In Web3 in May 2022. After that, I participated in more than 10 hackathons in a row and got about 15 track awards and Grants within three months, with a cumulative output value of 700,000 About RMB (including subsequent participati...]]></description>
            <content:encoded><![CDATA[<h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h1><p>Web3Hacker.World is an ecosystem built around the concept of <code>Everything can be Web3</code>, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. There are currently 19 paid members</p><blockquote><p>I am Bruce from <code>Web3Hacker.World</code>. I was All In Web3 in May 2022. After that, I participated in more than 10 hackathons in a row and got about 15 track awards and Grants within three months, with a cumulative output value of 700,000 About RMB (including subsequent participation in other teams). Later, I experienced a rest, moved to the seaside (lazy for a few months), and learned a lot of new technologies. Now a new round of Web3 nuggets has begun. This wave mainly revolves around the <code>BuidlerProtocol</code> created by me to create a cross-chain <code>Web3 App Store</code> ecological platform of <code>Everything can be Web3</code> to create a variety of DApps with different actual RWA (Real World Assets) application scenarios. Hackathon competition and try to get early seed users of RWA. In this process, I will use Web3 technology to develop a series of products, and synchronously output and summarize and share some relevant technical materials for developing these products.</p></blockquote><p>This week, I started to sign up for the Polkadot Hackathon. This time I plan to make an NFT-Fi-Twitter browser plug-in, which allows Twitter users to post NFT-Gating twitter or comments, and users who want to view encrypted content need to Pay $BST to unlock (the corresponding NFT will be obtained as a payment certificate when you pay to unlock), and a series of technical expansions need to be studied in the process of doing it.</p><p>All relevant information and content can be viewed and discussed through our github discussion section, welcome to visit: ​<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/orgs/Web3Hacker-World/discussions">https://github.com/orgs/Web3Hacker-World/discussions</a></p><h2 id="h-tldr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">TL;DR</h2><ul><li><p>NFT-Fi-Twitter: BuidlerProtocol application wallet that can be injected into various pages</p><ul><li><p>content inject part: the content data list and new content form are injected into the page</p></li><li><p>options: The UI of the entire onboard module is set up. In order to realize the key storage function of the wallet, I translated <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.wispwisp.com/index.php/2020/12/25/how-metamask-stores-your-wallet-secret/">How does MetaMask save your wallet key? </a>This article, but the author is actually a Chinese, only written in English article</p></li></ul></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/17">vue3-wagmi</a> Students who develop the Web3 components of the vue ecosystem are welcome to sign up, and Web3Hacker.World will launch incentive mechanisms in succession</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/18">wagmi-cn</a> will organize the translation of wagmi and viem documents that have nothing to do with react (ie the general part)</p></li></ul><h2 id="h-detail-version" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">detail version</h2><ul><li><p>Browser plug-in development related technologies: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://plasmo.com/">Plasmo</a> / <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/antfu/vitesse-webext">vitesse-webext</a></p><ul><li><p>Plasmo</p><ul><li><p>This technology has attracted attention last year, but there has been no actual combat. The NFT-Fi-Twitter browser extension for this project also re-read a wave of his documents and sample codes at the beginning, but it was not used in the end.</p></li><li><p>Because the vue technology stack is used, although there are vue sample codes in it, the actual large-scale engineering development still requires a lot of configuration and modular design</p></li><li><p>Although open source, I haven&apos;t seen many low-level configurations that can be set freely. It feels a bit tied up. If you want to modify a vite configuration, you have to go through additional documents or codes.</p></li></ul></li></ul></li><li><p>Ended up using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/antfu/vitesse-webext">vitesse-webext</a></p></li><li><p>This is a variant of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/antfu/vitesse">vitesse</a></p></li><li><p>Although his existing code logic has not fully designed a large-scale engineering and open architecture design, we can freely modify some underlying settings</p></li><li><p>Our previous Craft V1 and last year&apos;s web3-framework were actually further developed on the basis of it</p></li><li><p>At present, our Craft V2, Nuxt3 version is also developed on the basis of its Nuxt variant with an additional design architecture to inherit the layer mode</p></li><li><p>The design ideas of these various variants are the same, to create a unified and consistent code architecture design that can simplify the programmer&apos;s development mind</p></li><li><p>In fact, most of the kits in this series are the same</p><ul><li><p>Vue3, Vite, pnpm, esbuild</p></li><li><p>File based routing</p><ul><li><p>It is not supported in the webext version, we also modified it this week, and designed the routing prefix of options/popup</p></li></ul></li><li><p>Components are automatically imported</p></li><li><p>State management via Pinia</p><ul><li><p>The webext version does not yet use Pinia</p></li></ul></li><li><p>Layout system</p><ul><li><p>It was not supported in the webext version, we also implemented it this week</p></li></ul></li><li><p>UnoCSS</p></li><li><p>Quickly use various Icons without importing</p></li></ul></li><li><p>We have made further modifications according to the needs of Web3 development</p><ul><li><p>Introduced using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wagmi.sh/core/getting-started">Wagmi</a> 4.5k star</p><ul><li><p>Its initial positioning is React Hooks of Ethereum (but EVM compatible ones are available)</p></li><li><p>The latter abstracts a set of ts native apis, so we can encapsulate a set of vue composables apis on this basis</p><ul><li><p>See a project in its <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/wagmi-dev/awesome-wagmi">awesome</a> repository</p><ul><li><p>A <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://vagmi.vercel.app/">vagmi</a>, but the author actually <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/wobsoriano/vagmi/issues/60">abandoned the pit</a></p><ul><li><p>It is estimated that there are relatively few people who use Vue to develop Web3. There are few users. This buddy can’t stand the loneliness and abandons the pit (and he said that he will no longer do Web3 development)</p></li><li><p>I feel that there needs to be a non-Ponzi Web3 incentive at the level of software open source to promote the iterative development of code tools, but the core is that the author himself has this enthusiasm and a certain background support to promote it, and love power alone cannot be maintained for a long time</p></li></ul></li><li><p>There are actually other vue stacks on the market, but they are not very active</p></li></ul></li><li><p>Web3Hacker.World also opened a pit last week, but it has not pushed the code yet: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/17">https://github.com/Web3Hacker-World/Discussions/issues/17</a>, welcome vue3 technology stack students to sign up in the post</p></li></ul></li></ul></li><li><p>ethersjs is replaced by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://viem.sh/">Viem</a></p><ul><li><p>Wagmi and Viem are developed by the same very active team that started Wagmmi 16 months ago <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/wagmi_sh/status/1655993650621317149">https://twitter.com/wagmi_sh/status/1655993650621317149</a></p></li><li><p>This time, based on the intensive development of the past 16 months, an additional abstraction <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://viem.sh/">Viem</a>, used to replace ethers.js</p></li><li><p>We also spent a lot of time this week on a wave of in-depth research, and will follow up to organize the translation of Wagmmi and Viem&apos;s Chinese documents. These materials will eventually be put on BuidlerProtocol and provided to our hackers in the NFT-Gating mode of Web3 Member use</p></li><li><p>Interested students are welcome to sign up: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/18">https://github.com/Web3Hacker-World/Discussions/issues/18</a></p></li></ul></li></ul></li></ul>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
        </item>
        <item>
            <title><![CDATA[Web3 Tea Party, BS-Craft, Web3Hacker.News, sign up for Polkadot 2023 Summer Hackathon, and a few hacks this week]]></title>
            <link>https://paragraph.com/@web3hackerworld/web3-tea-party-bs-craft-web3hacker-news-sign-up-for-polkadot-2023-summer-hackathon-and-a-few-hacks-this-week</link>
            <guid>p2WGinVxq3L3ogRtIDLh</guid>
            <pubDate>Mon, 22 May 2023 08:24:42 GMT</pubDate>
            <description><![CDATA[Hello, this article is the weekly update log of Web3Hacker.World, which will synchronize the progress and information of the Web3Hacker.World ecology. Weekly recommended news links will be added in the next issue, and contributions are welcome at https://github.com/Web3Hacker-World/Discussions/issues/10 (future data sources will be read from the Web3Hacker.News platform)Source of this issue: https://github.com/Web3Hacker-World/Discussions/issues/9Note that the source links include some PR lin...]]></description>
            <content:encoded><![CDATA[<h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h1><p>Hello, this article is the weekly update log of Web3Hacker.World, which will synchronize the progress and information of the Web3Hacker.World ecology.</p><p>Weekly recommended news links will be added in the next issue, and contributions are welcome at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/10">https://github.com/Web3Hacker-World/Discussions/issues/10</a> (future data sources will be read from the Web3Hacker.News platform)</p><h2 id="h-source-of-this-issue-httpsgithubcomweb3hacker-worlddiscussionsissues9" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Source of this issue: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Web3Hacker-World/Discussions/issues/9">https://github.com/Web3Hacker-World/Discussions/issues/9</a></h2><p>Note that the source links include some PR links, etc., because some projects are not yet public, so non-hacker member users may have errors that they cannot be found when clicking some PR links. To access all private codes, you need to become a hacker member. For seed user members and VC members, after some products of Web3Hacker.World are launched, NFT will be issued to obtain access to paid content.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8d3191aeeff77cef96fbab24484fa55ea39fedcd93c1e344d401cb578d1e198a.png" alt="Screenshot 2023-05-22 at 16 10 01" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Screenshot 2023-05-22 at 16 10 01</figcaption></figure><h2 id="h-web3-tea-party" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Web3 Tea Party</h2><p>Another week has passed, and last week the newly joined hacker members suggested that we could create an article such as a weekly progress report to synchronize information with everyone.</p><p>I actually thought about doing this very early, including doing weekly tea parties for all staff. However, given that there are not enough hacker members and the technical framework of Web3Hacker.World has not yet been fully formed, from my point of view, it seems that the content of the tea party is not rich enough. You can try launching this week to see everyone&apos;s feedback.</p><p>The Web3 tea party is currently tentatively scheduled to be every Sunday at 15:00 pm. Mainly to prevent crashes with other conferences, the tea party mainly provides weekly progress sharing of Web3Hacker.World and free sharing of any information that they think can be shared with everyone. Currently only members of . Web3Hacker.World can participate (Hacker Members, Seed User Members, VC Members).</p><p>##BS-Craft At present, the main line of Web3Hacker.World is to promote the development of <code>bs-craft</code> technical framework, and eventually become a standard development framework platform and protocol for <code>everything can be NFT</code>.</p><p>At present, this technical framework system has been migrated to <code>Web3Hacker.News</code>, <code>Web3Blog.World</code>, <code>Web3NFT.Social</code> products.</p><p>This week, we mainly put the core architecture of <code>BS-Craft</code> on the ground. The technology is based on Nuxt3 / EthersJS / LitProtocol. At the same time, we applied the layer extension method of nuxt3 when refactoring Web3Hacker.News</p><pre data-type="codeBlock" text="export default defineNuxtConfig({
   extends: [
     &apos;../bs-craft&apos;,
     // https://nuxt.com/docs/guide/going-further/layers#git-repository
     // &apos;github:Web3Hacker-World/bs-craft#v0.0.1&apos;, // require to setup GIGET_AUTH=&lt;token&gt;
   ]
})
"><code>export default defineNuxtConfig({
   <span class="hljs-symbol">extends:</span> [
     <span class="hljs-string">'../bs-craft'</span>,
     <span class="hljs-regexp">//</span> <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/nuxt.com/docs</span><span class="hljs-regexp">/guide/going</span>-further/layers<span class="hljs-comment">#git-repository</span>
     /<span class="hljs-regexp">/ 'github:Web3Hacker-World/bs</span>-craft<span class="hljs-comment">#v0.0.1', // require to setup GIGET_AUTH=&#x3C;token></span>
   ]
})
</code></pre><p>The current development mode is to clone the bs-craft code to the local parent at the same level as your project, and then use the relative path to expand. In the future official version, you can directly use the github link to import the specified version.</p><p>The Layer architecture mode of NuxtJS 3 brings great convenience to program architecture reuse. At the same time, when we develop new projects, we can submit code in our new projects without worrying about program code logic reuse. Once our new project enters a stage, we can in turn abstract part of the code logic into the <code>bs-craft</code> library for reuse by other projects.</p><p>One step further, the official NuxtLab is also developing a logic low-code platform <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nuxt.studio/">Nuxt Studio</a>.</p><p>Another praise, the designers of NuxtLab are very good, and the development team is also a bigwig in the industry~~</p><p>##Web3Hacker.News</p><p>This project was started in March, and it was positioned as a Web3 version of HackerNews based on BuidlerProtocol. At that time, only the basic functions of Web2 were realized. In the process of doing it, a new hole <code>Web3Blog.World</code> (current domain name Web3NFT.Social) was opened.</p><p>Now <code>Web3Blog.World</code> V1 version is completed, so we will go back and develop <code>Web3Hacker.News</code> based on the nuxt layer of <code>bs-craft</code> to expand the model, and then we will quickly refactor <code>Web3Blog.World</code> to extend <code>bs-craft </code>version. I believe the reconstruction speed will be very fast. Because most of the functions are available out of the box.</p><h2 id="h-open-source-contribution-nuxt3-content" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Open source contribution nuxt3 content</h2><p>When using docus.dev as a document site, I found that its multi-language architecture function is not perfect enough. After further searching, I found that other people also have this demand. In the past two weeks, I spent half a day researching docus.dev and content. I only configured it so that it can display documents in a certain language separately, and then deployed it to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zh-docs.web3hacker.world/">https://zh-docs.web3hacker.world/</a></p><p>The final effect should be similar to vitepress, etc. You can have a multi-language switcher in the upper right corner of docs.web3hacker.world, so that you can switch to different languages ​​of the same document at the same time without switching domain names.</p><p>It took about 10 hours yesterday to submit a PR to content, which enables multi-language switching, but there are still remaining bugs. PR: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/nuxt/content/pull/2075#issuecomment-1556179705">https://github.com/nuxt/content/pull/2075#issuecomment-1556179705</a> Legacy Bugs: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/NftTopBest/nuxt-content/issues/1">https://github.com/NftTopBest/nuxt-content/issues/1</a></p><p>By the way, if this PR is successfully implemented, someone will be willing to pay 0.04 BTC <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/nuxt-themes/docus/issues/770">https://github.com/nuxt-themes/docus/issues/770</a></p><h2 id="h-register-for-the-polkadot-2023-summer-hackathon" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Register for the Polkadot 2023 Summer Hackathon</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c04418b9d45ba65a6b03434eba6493f6a1329bd6c1d12e1b5e3b45a99dec8262.png" alt="cz-twitter" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">cz-twitter</figcaption></figure><p>Earlier CZ replied to Elon Musk on Twitter about how Web3 can help Twitter reduce bots etc. In fact, I started thinking about this idea last year, but at that time Web3 technology was not yet mature, and I hadn’t figured out how to implement it. In fact, the current Mask plug-in can also solve this problem. I&apos;m not sure about the market share of Mask products though. For me, this hackathon will be used to advance the development of NFT-Fi-Twitter. Of course it will also be based on BuidlerProtocol. In the long run, this will eventually become a window for BuidlerProtocol to link to all external web platforms. In the short term, it is hoped that the PoC version will be launched within a month, and a natural income of 1w/month is enough within a few months.</p><p>Of course, the development direction is estimated to be similar to Mask, and a plug-in system will also be designed to allow third-party developers to join in module development.</p><p>In addition, students who are interested in participating in this Polkadot Hackathon are welcome to sign up, and they can sign up before July 4th.</p><h2 id="h-opened-a-few-pits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Opened a few pits</h2><p>In the process of developing <code>bs-craft</code>, I have studied the related architecture of nuxt3 in depth. This market is a blank, and it is also a very optimistic technology development direction (compared with the technical ecology of react, it feels too messy) .</p><p>There are still many gaps in the ecology of Nuxt that can be filled, so a few pits were opened, hacker members are welcome to join in to fill the pits, and there will be a revenue-related distribution mechanism in the future (of course, it will be distributed based on the $BST of our BuidlerProtocol <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zh-">https://zh-</a> docs.web3hacker.world/buidlers.space/what-is-bst)</p><h3 id="h-nuxtcnweb3hackerworld" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">nuxtcn.web3hacker.world</h3><ul><li><p>Will translate nuxt3 related documentation, blog content, etc.</p></li></ul><h3 id="h-writing-a-book-web3-nuxt3-full-stack-developer-guide" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Writing a Book Web3-Nuxt3 Full Stack Developer Guide</h3><p>This book is positioned around the Nuxt3 technology stack to integrate Web3 and BuidlerProtocol to develop Web3 full-stack application products.</p><ul><li><p>Record the development process and code logic of bs-craft</p></li><li><p>Analyze the core logic of nuxt3</p></li><li><p>Comes with the development practice of several products of Web3Hacker.World</p></li></ul><h3 id="h-buidler-protocol-js-sdk" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Buidler Protocol JS SDK</h3><p>This project will abstract the various functions of BuidlerProtocol into a set of js sdk</p><blockquote><p>Web3Hacker.World is an ecosystem built around the concept of <code>Everything can be Web3</code>, which gathers programmers and hackers, seed users who are curious about new things, and vc investors. There are currently 19 paid members</p></blockquote>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
        </item>
        <item>
            <title><![CDATA[Hello]]></title>
            <link>https://paragraph.com/@web3hackerworld/hello</link>
            <guid>A5cUBM6i0jdr8QCVZWAZ</guid>
            <pubDate>Tue, 28 Mar 2023 18:56:34 GMT</pubDate>
            <description><![CDATA[HoHO]]></description>
            <content:encoded><![CDATA[<p>HoHO</p>]]></content:encoded>
            <author>web3hackerworld@newsletter.paragraph.com (Web3HackerWorld)</author>
        </item>
    </channel>
</rss>