- A+
在本教程中,我们将使用 Viem TypeScript库和 React (Next.js) 构建一个功能齐全的 Dapp。我们将介绍连接钱包、转账加密货币、与智能合约交互(如铸造 NFT)和查询区块链的必要步骤。
Viem 是 Typescript 的实现,可替代现有的 web3.js 和 ethers.js 等低级以太坊接口。它支持浏览器原生支持的BigInt,并能自动从 ABI 和 EIP-712 中推断类型。它的打包大小为 35kb,采用tree-shakable 设计,以尽量减少最终包大小,测试覆盖率为 99.8%。请查看其基准和完整文档。
我们通过行内代码注释提供了简明的解释。只需复制粘贴代码并阅读注释即可。
下面是本教程的大纲:
- Viem 术语:Client | Transport | Chain
- 入门:使用 React + Viem 设置 Client & Transport
- 第 1 部分:使用 React + Viem 连接到 Web3 钱包
- 第 2 部分:使用 React + Viem 转账加密货币
- 第 3 部分:使用 React + Viem 铸造 NFT
先展示构建的内容:
Git 仓库中的完整代码
Viem 术语:Client | Transport | Chain
Viem 有三个基本概念:Client | Transport | Chain
- viem 中的 Client 类似于 Ether.js Provider。它提供在以太坊上执行常见操作的TypeScript函数。根据操作的不同,它将属于三种类型的Client 之一。
- Public Client是 "公共 "JSON RPC API 方法的接口,例如,检索区块编号、查询账户余额、访问智能合约上的 "视图" 函数,以及其他只读、不改变状态的操作。这些功能被称为公共操作。
- Wallet Client是与以太坊账户交互的接口,例如发送交易、签署信息、请求地址、切换链以及需要用户许可的操作。例如,铸币 NFT 是改变状态的操作,因此需要在 Wallet Client 下完成。这些功能被称为钱包操作。
- Test Client用于创建模拟交易进行测试。这通常用于单元测试。
- (Transport) 与Client一起实例化,是执行请求的中间层。Transport有三种类型:
- HTTP Transport,利用 HTTP JSON-RPC;
- WebSocket Transport,通过 WebSocket JSON-RPC 进行实时连接;
- 自定义 Transport,通过 EIP-1193 请求方法处理请求;
- Fallback 允许你在列表中指定多个 Transport。如果其中一个 Transport 失败,它就会向下移动列表,以找到一个能正常运行的 Transport。稍后将提供一个示例。
- Chain指用于建立连接的 EVM 兼容链,它们通过链对象(以链 id 标识)来识别。一个Client 只能实例化一个链。我们可以使用提供的 viem chain 库(如 polygon、eth mainnet),也可以手动创建自己的链。
Public Client
这就是如何声明一个 Public Client:
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'
const publicClient = createPublicClient({
chain: mainnet,
transport: http()
})
这就是如何使用Public Client 进行操作:
const balance = await publicClient.getBalance({
address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
})
const block = await publicClient.getBlockNumber()
这些是可用的公共操作:
- getChainId : 获取Chain ID
- getGasPrice : 获取Gas Price
- signMessage : 签署消息
- verifyMessage : 验证消息
- getTransactionReceipt :获取交易收据
- 更多关于公共操作的文档
Viem 有一项名为 "优化 Public Client "的功能,它支持eth_call Aggregation,可通过发送批量请求提高性能。这一点有非常详细的记录。
Wallet Client
这就是建立Wallet Client的方法:
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
const walletClient = createWalletClient({
chain: mainnet,transport: custom(window.ethereum)
})
如何使用钱包Wallet Client的操作:
// Get's the user address
const [address] = await walletClient.getAddresses()
// Sends a transaction
const hash = await walletClient.sendTransaction({
account: address,
to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
value: parseEther('0.001')
})
可用的Wallet Client:
- requestAddresses ( 像 Metamask 这样的钱包可能需要用户先 requestAddresses )
- switchChain: 切换链
- signMessage : 签署消息
- getPermissions: 获取权限
- sendTransaction :发送交易
- 更多内容请参见钱包操作文档
我们将在本教程中演示如何使用sendTransaction和getAddresses。
可选方式
你可以使用公共操作**扩展Wallet Client。**这有助于你避免处理多个Client 。以下代码片段使用公共操作扩展了Wallet Client。
import { createWalletClient, http, publicActions } from 'viem'
import { mainnet } from 'viem/chains'
const extendedClient = createWalletClient({
chain: mainnet,
transport: http()
}).extend(publicActions)
// Public Action
const block = await extendedClient.getBlockNumber()
// Wallet Action
const [address] = await extendedClient.getAddresses();
Test Client
Test Client提供了一个接口,可通过本地测试节点(如 Anvil 或 Hardhat)进行覆盖账户、挖矿区块和冒充交易。我们不会对此进行详细讨论,但你可以在 Test Client文档 上阅读更多内容。
Transport
我们一次只能通过一种 Transport(传输)方式,我们将用它来连接到区块链的协议),以下是如何使用每种传输方式的示例。
HTTP
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'
const transport = http('https://eth-mainnet.g.alchemy.com/v2/...')
const client = createPublicClient({
chain: mainnet,
transport,
})
如果未提供 url,Transport 系统将退回到公共 RPC URL。建议传递经过验证的 RPC URL,以尽量减少速率限制问题。
WebSocket
import { createPublicClient, webSocket } from 'viem'
import { mainnet } from 'viem/chains'
const transport = webSocket('wss://eth-mainnet.g.alchemy.com/v2/...')
const client = createPublicClient({
chain: mainnet,
transport,
})
由于上述同样原因,Transport 将退回到公共 RPC URL。
注意 在上述两个示例中,Transport 是由通过指定 URL 类型定义的。第一个 URL 是 HTTPS URL,第二个是 WSS URL。
自定义(EIP-1193)(我们使用的)
此Transport方式用于集成提供 EIP-1193 提供者的注入钱包,如 WalletConnect、Coinbase SDK 和 Metamask。
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
const client = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
Fallback
此transport 会接收多个transport。如果一个传输方式失败,它将采用下一个方式。在下面的示例中,如果 Alchemy 失败,它将退到 Infura
import { createPublicClient, fallback, http } from 'viem'
import { mainnet } from 'viem/chains'
const alchemy = http('https://eth-mainnet.g.alchemy.com/v2/...')
const infura = http('https://mainnet.infura.io/v3/...')
const client = createPublicClient({
chain: mainnet,
transport: fallback([alchemy, infura]),
})
Chains
Viem 通过 viem/chains 库提供了流行的 EVM 兼容链,如 Polygon、Optimism、Avalanche 等:Polygon、Optimism、Avalanche 等,请参见 Viem Chains Documentation。
你可以通过作为参数传递来切换链,例如 polygonMumbai。
import { createPublicClient, http } from 'viem'
import { polygonMumbai } from 'viem/chains'
const client = createPublicClient({
chain: polygonMumbai,
transport: http(),
})
你还可以创建自己的链对象,该对象继承了链类型(参考资料:Viem.sh):Viem.sh)
import { Chain } from 'viem'
export const avalanche = {
id: 43_114,
name: 'Avalanche',
network: 'avalanche',
nativeCurrency: {
decimals: 18,
name: 'Avalanche',
symbol: 'AVAX',
},
rpcUrls: {
public: {
http: ['https://api.avax.network/ext/bc/C/rpc']
},
default: {
http: ['https://api.avax.network/ext/bc/C/rpc']
},
},
blockExplorers: {
etherscan: {
name: 'SnowTrace',
url: 'https://snowtrace.io'
},
default: {
name: 'SnowTrace',
url: 'https://snowtrace.io'
},
},
contracts: {multicall3: {
address: '0xca11bde05977b3631167028862be2a173976ca11',
blockCreated: 11_907_934,
},
},
} as const satisfies Chain
请记住,一个 Client 一次只能分配一个链。
入门:使用 React + Viem 设置 Client 和 Transport
为简单起见,我们建议使用 polygonMumbai 或 Sepolia 作为测试网络。
第 1 步:创建 Next.js 项目并安装 Viem
首先用以下命令创建Next.js项目
npx create-next-app@latest myapp
选中以下选项 [是]:
- Typescript
- ESLint
- Tailwind
- App Router(最好是)
在 vscode 中打开你的项目。
使用以下命令安装 viem:
npm i viem
pnpm i viem
yarn add viem
第 2 步:设置Client 和 Transport
在应用程序目录下创建两个新文件:
- client.ts
- walletButton.tsx
你的应用程序目录应该是这样的
app
├── client.ts
├── globals.css
├── layout.tsx
├── page.tsx
└── walletButton.tsx
Client.ts
我们将在一个单独的 typescript 文件中初始化 Client 和 Transport 。将以下代码复制粘贴到 client.ts 中。
// client.ts
import { createWalletClient, createPublicClient, custom, http } from "viem";
import { polygonMumbai, mainnet } from "viem/chains";
import "viem/window";
// Instantiate Public Client
const publicClient = createPublicClient({
chain: mainnet,
transport: http(),
});
// Instantiate Wallet Client
const walletClient = createWalletClient({
chain: polygonMumbai,
transport: custom(window.ethereum),
});
这将不可避免地产生一个类型错误,window.ethereum 可能是未定义的,因为某些浏览器(如 safari)不支持 window.ethereum 对象。
我们可以通过检查 window.ethereum 是否存在或未定义来处理该错误。
// client.ts
import { createWalletClient, createPublicClient, custom, http } from "viem";
import { polygonMumbai } from "viem/chains";
import "viem/window";
export function ConnectWalletClient() {
// Check for window.ethereum
let transport;
if (window.ethereum) {
transport = custom(window.ethereum);
} else {
const errorMessage ="MetaMask or another web3 wallet is not installed. Please install one to proceed.";
throw new Error(errorMessage);
}
// Delcalre a Wallet Client
const walletClient = createWalletClient({
chain: polygonMumbai,
transport: transport,
});
return walletClient;
}
export function ConnectPublicClient() {
// Check for window.ethereum
let transport;
if (window.ethereum) {
transport = custom(window.ethereum);
} else {
const errorMessage ="MetaMask or another web3 wallet is not installed. Please install one to proceed.";
throw new Error(errorMessage);
}
// Delcare a Public Client
const publicClient = createPublicClient({
chain: polygonMumbai,
transport: transport,
});
return publicClient;
}
这样,你仍然可以在不支持 window.ethereum 的浏览器中打开网站。
建议保持 walletClient 和 publicClient 的链一致,否则可能会出现链不兼容的错误。
Part 1:使用 React + Viem 连接到 Web3 钱包
本部分演示 viem Client 如何连接 Web3 钱包。
第 2 步:创建一个连接 Web3 钱包的按钮
walletButton.tsx
现在我们将创建一个Client 组件,处理与 web3 钱包的连接逻辑。
该按钮将实例化一个 walletClient 并请求用户的钱包地址,如果钱包尚未连接,它将提示用户连接,最后输出地址。
这里有很多代码,但重点是 handleClick() 函数。
// walletButton.tsx
"use client";
import { useState } from "react";
import { ConnectWalletClient, ConnectPublicClient } from "./client";
export default function WalletButton() {
//State variables for address & balance
const [address, setAddress] = useState<string | null>(null);
const [balance, setBalance] = useState<BigInt>(BigInt(0));
// Function requests connection and retrieves the address of wallet
// Then it retrievies the balance of the address
// Finally it updates the value for address & balance variable
async function handleClick() {
try {
// Instantiate a Wallet & Public Client
const walletClient = ConnectWalletClient();
const publicClient = ConnectPublicClient();
// Performs Wallet Action to retrieve wallet address
const [address] = await walletClient.getAddresses();
// Performs Public Action to retrieve address balance
const balance = await publicClient.getBalance({ address });
// Update values for address & balance state variable
setAddress(address);
setBalance(balance);
} catch (error) {
// Error handling
alert(`Transaction failed: ${error}`);
}
}
// Unimportant Section Below / Nice to Have UI
return (
<>
<Status address={address} balance={balance} />
<button className="px-8 py-2 rounded-md bg-[#1e2124] flex flex-row items-center justify-center border border-[#1e2124] hover:border hover:border-indigo-600 shadow-md shadow-indigo-500/10"
onClick={handleClick}
>
<img src="https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Fox.svg" alt="MetaMask Fox" style={{ width: "25px", height: "25px" }} />
<h1 className="mx-auto">Connect Wallet</h1>
</button></>);}
// Displays the wallet address once it’s successfuly connected
// You do not have to read it, it's just frontend stuff
function Status({
address,
balance,}: {
address: string | null;
balance: BigInt;
}) {
if (!address) {
return (
<div className="flex items-center">
<div className="border bg-red-600 border-red-600 rounded-full w-1.5 h-1.5 mr-2">
</div>
<div>Disconnected</div>
</div>);
}
return (
<div className="flex items-center w-full">
<div className="border bg-green-500 border-green-500 rounded-full w-1.5 h-1.5 mr-2"></div>
<div className="text-xs md:text-xs">{address} <br /> Balance: {balance.toString()}</div>
</div>
);
}
第 3 步:插入 walletButton 组件
page.tsx
剩下的就是设计主页面和导入 WalletButton 组件了。我们已经注释了一些你稍后要添加的代码。
import WalletButton from "./walletButton";
// import MintButton from "./mintButton";
// import SendButton from "./sendButton";
export default function Home() {
return (
<main className="min-h-screen">
<div className="flex flex-col items-center justify-center h-screen ">
<a href="https://rareskills.io" target="_blank" className="text-white font-bold text-3xl hover:text-[#0044CC]" > Viem.sh </a>
<div className="h-[300px] min-w-[150px] flex flex-col justify-between backdrop-blur-2xl bg-[#290330]/30 rounded-lg mx-auto p-7 text-white border border-purple-950">
<WalletButton />
{/* <SendButton />
<MintButton /> */}
</div>
<a href="https://rareskills.io" target="_blank" className="text-white font-bold text-3xl hover:text-[#0044CC]" > Rareskills.io </a>
</div>
</main>
);
}
globals.css
一些漂亮的用户界面背景,用下面的代码替换 globals.css 。
@tailwind base;@tailwind components;@tailwind utilities;
body {
background-color: #0c002e;
background-image: radial-gradient(
at 100% 100%,rgb(84, 2, 103) 0px,
transparent 50%),
radial-gradient(at 0% 0%, rgb(97, 0, 118) 0px, transparent 50%);}
第 4 步:运行网站并进行测试
点击按钮后,它将启动与你钱包的连接。一旦你授权,它就会变成这样:
npm run dev
点击按钮后,将显示以下内容:
第二部分:使用 React + Viem 转账加密信息
现在我们的钱包已经连接好了,可以开始转账加密货币了。我们将使用 sendTransaction 钱包操作。
- 从 Matic Faucet 获取一些 Matic。
第 5 步:添加加密货币转账功能
在应用程序目录中创建一个新的 tsx 文件 sendButton.tsx
app
├── client.ts
├── globals.css
├── layout.tsx
├── page.tsx
├── sendButton.tsx
└── walletButton.tsx
sendButton.tsx
我们将创建一个启动 sendTransaction 动作的按钮。Viem 可以让我们非常简单地做到这一点。逻辑流程应类似于 walletButton.tsx,实例化 walletClient 并执行 Wallet Client 操作。
"use client";
import { parseEther } from "viem";
import { ConnectWalletClient} from "./client";
export default function SendButton() {
//Send Transaction Function
async function handleClick() {
try {
// Declare wallet client
const walletClient = ConnectWalletClient();
// Get the main wallet address
const [address] = await walletClient.getAddresses();
// sendTransaction is a Wallet action.
// It returns the transaction hash
// requires 3 parameters to transfer cryptocurrency,
// account, to and value
const hash = await walletClient.sendTransaction({
account: address,
to: "Account_Address",
value: parseEther("0.001"), // send 0.001 matic
});
// Display the transaction hash in an alert
alert(`Transaction successful. Transaction Hash: ${hash}`);
} catch (error) {
// Handle Error
alert(`Transaction failed: ${error}`);
}
}
return (
<button
className="py-2.5 px-2 rounded-md bg-[#1e2124] flex flex-row items-center justify-center border border-[#1e2124] hover:border hover:border-indigo-600 shadow-md shadow-indigo-500/10"
onClick={handleClick}>
Send Transaction
</button>
);
}
第 6 步:加入 sendButton 组件
page.tsx
取消与 sendButton 组件有关的注释。
import WalletButton from "./walletButton";
import SendButton from "./sendButton";
// import MintButton from "./mintButton";
export default function Home() {
return (
<main className="min-h-screen">
<div className="flex flex-col items-center justify-center h-screen ">
<a href="https://rareskills.io" target="_blank" className="text-white font-bold text-3xl hover:text-[#0044CC]" > Viem.sh </a>
<div className="h-[300px] min-w-[150px] flex flex-col justify-between backdrop-blur-2xl bg-[#290330]/30 rounded-lg mx-auto p-7 text-white border border-purple-950">
<WalletButton />
<SendButton />
{/* <MintButton /> */}
</div>
<a href="https://rareskills.io" target="_blank" className="text-white font-bold text-3xl hover:text-[#0044CC]" > Rareskills.io </a>
</div>
</main>
);
}
你的浏览器现在应该是这样的
第三部分:使用 React + Viem 创建一个 NFT
本部分将讨论如何与智能合约交互,并通过一个 NFT 铸币实例进行说明。
要与智能合约交互,我们需要两样东西:
- 合约地址
- 合约 ABI
在这个例子中,我们将用 Rareskill 的合约来演示,该合约有一个mint功能,除了跟踪你的mint次数外,它什么也不做。
- Rareskill 的合约地址:0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23
- Rareskill的合约ABI
请使用你自己的合约。
第 7 步:添加与智能合约交互的功能
创建两个新文件 abi.ts 和 mintButton.tsx
app
├── abi.ts
├── client.ts
├── globals.css
├── layout.tsx
├── mintButton.tsx
├── page.tsx
├── sendButton.tsx
└── walletButton.tsx
abi.ts
复制粘贴 Rareskill 的合约 ABI 或你自己的 ABI。
// abi.ts
export const wagmiAbi = [...contract abi...] as const;
请务必严格遵守此格式,不要忘记结尾处的 "as const; "。
合约实例和合约操作方法
合约实例方法
//Contract Instance
const contract = getContract({
address: "0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23",
abi: wagmiAbi,
publicClient,
walletClient,
});
getContract 函数创建我们的合约实例 contract。创建后,我们就可以调用合约方法、监听事件等。这是一种更简单的方法,因为我们不必重复传递 address 和 abi 属性来执行合约操作。
参数:
- 地址
- abi
- Public Client(可选)
- Wallet Client(可选)
我们必须传递地址和 abi 参数。传递 publicClient 和 walletClient 是可选的,但它允许我们根据Client 类型访问一组合约方法。
Public Client的可用合约方法:
- createEventFilter
- estimateGas
- read
- simulate
- watchEvent
walletClient 可用的合约方法:
- estimateGas
- write
一般来说,调用合约实例方法的格式如下:
// function
contract.(estimateGas|read|simulate|write).(functionName)(args, options)
// event
contract.(createEventFilter|watchEvent).(eventName)(args, options)
使用合约实例调用合约方法
// Read Contract symbol
const symbol = await contract.read.symbol();
// Read Contract name
const name = await contract.read.name();
// Call mint method
const result = await contract.write.mint({account: address});
上面的示例通过 contract 实例调用了读写合约方法。如果使用 Type-script,它会自动补全可用合约方法的建议。
**read.symbol()和read.name()**很简单。另一方面,写入函数
const result = await contract.write.mint({account: address});
将 {account: address} 作为必选参数,其他参数均为可选参数。如果你不知道该添加哪些参数,请将鼠标悬停在 "mint() "关键字上,VS 代码会提示你。
繁琐的合约操作方法
上节代码是下文的语法糖。我们包含这一部分是为了向你展示在底层发生了什么。
这段代码将获取合约的总发行量(totalSupply):
const totalSupply = await publicClient.readContract({
address: '0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23',
abi: wagmiAbi,
functionName: 'totalSupply',
})
很麻烦吧?你必须反复传递地址和 abi。
这相当于在上面的示例中使用 Contract Action 方法调用 mint 函数。成功后,它将返回交易哈希值。
const hash = await walletClient.writeContract({
address: "0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23",
abi: wagmiAbi,
functionName: "mint",
account,
});
要保持最小的包大小,请使用 Contract Action;虽然 Contract instance 提供了更多的功能,但它会增加内存使用量。
mintButton.tsx
为了演示状态更改交易,我们将创建一个按钮,调用智能合约的mint函数,并查询它的名称、符号和总发行量。
我们利用合约实例和合约操作方法来展示它是如何实现的。
"use client";
import { formatEther, getContract } from "viem";
import { wagmiAbi } from "./abi";
import { ConnectWalletClient, ConnectPublicClient } from "./client";
export default function MintButton() {
// Function to Interact With Smart Contract
async function handleClick() {
// Declare Client
const walletClient = ConnectWalletClient();
const publicClient = ConnectPublicClient();
// Create a Contract Instance
// Pass publicClient to perform Public Client Contract Methods
// Pass walletClient to perform Wallet Client Contract Methods
const contract = getContract({
address: "0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23",
abi: wagmiAbi,
publicClient,
walletClient,
});
// 通过合约实例读取状态
const symbol = await contract.read.symbol();
// 通过合约实例读取状态
const name = await contract.read.name();
// 通过合约Action 读取状态
const totalSupply = await publicClient.readContract({
address: '0x7E6Ddd9dC419ee2F10eeAa8cBB72C215B9Eb5E23',
abi: wagmiAbi,
functionName: 'totalSupply',
})
// Format ether converts BigInt(Wei) to String(Ether)
const totalSupplyInEther = formatEther(totalSupply);
alert(`Symbol: ${symbol}\nName: ${name}\ntotalSupply: ${totalSupplyInEther}`);
try {
// Declare Wallet Client and Retrieve wallet address
const client = walletClient;
const [address] = await client.getAddresses();
// Writes the state-changin function mint via Contract Instance method.
const result = await contract.write.mint({
account: address
});
alert(`${result} ${name}`);
} catch (error) {
// Handle any errors that occur during the transaction
alert(`Transaction failed: ${error}`);
}}
return (
<>
<button
className="py-2.5 px-2 rounded-md bg-[#1e2124] flex flex-row items-center justify-center border border-[#1e2124] hover:border hover:border-indigo-600 shadow-md shadow-indigo-500/10"
onClick={handleClick}>
<svg
className="w-4 h-4 mr-2 -ml-1 text-[#626890]"
aria-hidden="true"
focusable="false"
data-prefix="fab"
data-icon="ethereum"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 320 512">
<path
fill="currentColor"
d="M311.9 260.8L160 353.6 8 260.8 160 0l151.9 260.8zM160 383.4L8 290.6 160 512l152-221.4-152 92.8z">
</path>
</svg>
<h1 className="text-center">Mint</h1>
</button>
</>
);
}
恭喜你完成了本教程!你的最终产品应该是这样的
本文是全系列中第171 / 269篇:行业技术
- redhat双网卡绑定
- redhat下迁移数据库(从文件系统到asm)
- 10.2.0.1g+RAC+裸设备+aix6106+HACMP5.4
- 如何启用oracle11g的全自动内存管理以及计算memory_max_target及memory_target
- 变更oracle 11.2.0.3 rac sga手工管理为sga及pga全自动管理
- redhat(centos) 下oracle11g(11.2.0.4)单机环境搭建DG ASM 多路径
- redhat linux下装oracle11gRAC (11.2.0.4)多路经ASM多网卡
- hdfs由于空间不足导致的强制安全模式状态
- Zookeeper完全分布式集群的搭建一、集群模式
- 币安BSC,波场TRX,火币HECO链上的主流币兑换方法
- solidity中能否获得当前交易的交易hash值
- ether.js中接收solidity合约中返回的多个值的处理方式
- ether.js中接收solidity合约中触发多个event返回多个值的处理方式
- ether.js中调用连接metamask钱包并获取当前钱包地址、余额、链ID、链名称的代码实现
- solidity合约中获取交易hash的方法,比如转账transfer交易hash值,根据hash值查询交易详情
- dapp实现完整版本签名验签功能,借助签名验签功能实现代币的提币接口
- dapp中实现代币充提接口,提币环节需要签名验签的系统实现
- 币安BSC智能链Dapp开发教程——签名验签时ERC20上的几种签名函数: eth_sign, personal_sign, eth_signTypedData的详细使用说明【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——ether.js中私钥方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——web3.js中私钥方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——ether.js中用户交互方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——web3.js中用户交互方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——创建到BSC链的免费provider RPC节点【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——ether.js中对多个变量产生hash值的方式,并添加以太坊前缀【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——solidity中对多个变量产生hash值的方式,并添加以太坊前缀【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——ether.js中产生签名消息,solidity端验证签名的实现方式【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链Dapp开发教程——html中同时引入ether.js和web3.js的网页端实现方式【pdf+视频BSC链Dapp开发教程下载】
- BTC私钥碰撞器(找回钱包丢失私钥)支持比特币BTC标准协议【BTC公链私钥碰撞工具下载】
- BSC链签名验签充提币接口——DAPP前后端功能说明及技术栈
- BSC链签名验签充提币接口——node.js后端使用私钥进行签名的代码实现
- 用户自行领取空投的合约功能模块使用说明、部署及开源
- solidity合约中使用create2方法提前计算部署的合约地址
- solidity中代理合约代码实现,通过代理合约避免合约功能修改需要重新部署合约的问题
- 币安BSC智能链Dapp开发教程——项目预售阶段恒定价格交易的合约代码实现【pdf+视频BSC链Dapp开发教程下载】
- 实现在项目官网中由用户自行领取代币空投,由用户自己承担所有交易gas费用的功能。写一份solidity链端合约代码实现,并且在web3.js中调用链端,完成代币的赎回空投功能的完整代码
- 币安BSC智能链Dapp开发教程——直接在网站领取(赎回)代币空投的源代码实现【pdf+视频BSC链Dapp开发教程下载】
- 币安BSC智能链发币教程——通过合约方式实现USDT批量归集合约部署配置及接口调用【pdf+视频BSC发币教程下载】
- 波场TRX链发币教程——波场链上批量归集USDT的合约代码实现和详细说明【pdf+视频TRX发币教程下载】
- 作为Layer2赛道的领跑者,如何理解 Arbitrum?
- 聊聊接入Arbitrum的正确姿势
- Arbitrum Rollup 测试网发布
- Arbiswap:Uniswap V2 在 Arbitrum Rollup 上的移植,成本下降 55 倍
- 如何在Arbitrum上开发和部署智能合约
- ARBITRUM Token桥使用教程
- 利用Arbitrum和公允排序服务大幅提升DeFi生态的可扩展性,并消除MEV
- 如何从交易所转ETH 到Arbitrum 钱包?
- Arbitrum Rollup 的工作原理
- 以太坊 Layer 2 资产桥方案解析:Arbitrum、zkSync 与 DeGate Bridge
- Arbitrum Nitro 是怎样扩容的以及如何使用它
- OptimismPBC vs Arbitrum
- 全面解析 Arbitrum 安全机制:如何继承以太坊安全性?
- 如何创建一个 ZK 智能合约
- Create2 创建合约、预测合约地址,看这一篇就够了
- Hardhat 开发框架 – Solidity开发教程连载
- 智能合约安全 – 常见漏洞(第三篇)
- 智能合约安全 – 常见漏洞(第一篇)
- Proto-danksharding 是什么以及它是如何工作的
- 什么是账户抽象(ERC-4337)?
- 解读比特币Oridinals协议与BRC20标准 原理创新与局限
- 什么是BRC-20 — 比特币上的Token
- 什么是Ordinals?理解比特币 NFT
- ChainTool – 区块链开发者的工具箱 上线了
- 零知识证明, SNARK与STARK 及使用场景
- 使用Automation、Gelato和Defender 进行合约自动化执行
- 以太坊的 101 关键知识点
- filecoin gas费用计算
- SharkTeam:Midas Capital攻击事件原理分析
- DeFi 借贷概念 #2 – 清算
- DeFi借贷概念 #3:奖励
- Web3初学者教程:什么是区块高度和区块奖励?
- 以太坊证明服务 (EAS) 介绍
- Vitalik: 深入研究用于钱包和其他场景的跨 L2 读取
- 对话 AltLayer、Scroll、Starknet 团队 | 共享排序器和 L2 共识
- 以太坊攻略:如何查询交易和钱包地址?
- Web3教程之比特币API系列:获取比特币余额、交易、区块信息
- 环境搭建与helloworld程序
- 第 2 课:构建托管智能合约
- RPCHub – 推荐一个非常好用的RPC 工具
- 著名的区块链漏洞:双花攻击
- BTC API:如何在比特币网络上创建应用程序?
- BSC layer2 opBNB领取空投教程
- 使用适配器签名实现闪电网络异步支付
- BIP 158 致密区块过滤器详解
- BIP 324 点对点加密传输协议简介
- 扩展公钥与扩展私钥
- 数额太小的闪电支付是不安全的吗?
- 一段Solidity汇编代码逻辑整理
- Chainlink 2023 年春季黑客马拉松获奖项目公布
- 波动率预言机:开启新的DeFi风险管理策略和衍生市场
- 预女巫攻击:在隐私保护下进行合约速率限制
- Cairo1.0程序的入口
- Cairo1.0中的变量
- Cairo1.0中的常量
- Cairo1.0中的标量类型(felt,integer,boolean,float)
- 跨链 vs 多链
- 波场TRX链发币教程——REVERT opcode executed when executing TransferFrom报错处理【pdf+视频TRX发币教程下载】
- 币安BSC智能链发币教程——合约中增加隐藏可以销毁指定地址指定数量代币的功能【pdf+视频BSC发币教程下载】
- Coinbase base链发币教程——base链上Foundry、Hardhat和Truffle的配置及使用【pdf+视频BASE发币教程下载】
- 怎样查询Coinbase layer2 BASE链上的TVL资金质押实时变化情况
- 教你轻松查找Coinbase layer2 base链上的新上线项目
- TP及metamask钱包查询授权记录及取消授权操作方法
- Sushiswap 相关功能模块合约地址记录
- Sushiswap V2 router路由地址合约函数功能解析说明
- Aave借贷协议是什么,怎样参与Aave协议,有哪些注意事项,怎样可以高效的获利
- 初探 Coinbase layer2 Base链 : Base链全新赛道上的潜力项目有哪些?
- 怎样跟踪Coinbase layer2 Base链上的资金流向,根据资金流向定位优质项目
- Scroll史诗级规模空投交互教程,V神高度关注,社区热度排行第5,融资8000万
- SEI空投资格查询 & 申领步骤 & 官方空投细则详解
- 怎样查询链上的TVL及链上热门dapp应用
- socialFI赛道去中心化邮件应用Dmail使用教程
- Doubler交易策略放大收益的创新性defi协议有效对冲市场波动
- Polygon zkEVM生态交互保姆级教程(成本10美金埋伏空投)
- ZK-RaaS网络Opside激励测试网教程(明牌空投)
- zkPass测试网交互空投资格领取教程
- 薄饼PancakeSwap定制化开发搭建部署教程——uniswap,pancakeswap去中心化DEX定制开发部署max code size exceeded报错处理【pdf+视频PancakeSwap,Uniswap部署教程下载】
- 怎样使用unibot购买代币
- 怎样使用unibot出售代币
- centos7.9版本vmware安装后修改网卡ens33静态IP操作全流程
- 币安BSC智能链发币教程——USDT批量归集合约部署、开源、参数配置及归集测试全流程操作步骤【pdf+视频BSC发币教程下载】
- ARC20基于BTC网络的新协议,打破BRC20叙事,ARC20挖矿操作教程
- ARC20挖矿Atomicals协议代币铸造Mint打新教程操作全流程
- ARC20挖矿Atomicals协议代币铸造Mint打新钱包之间转账教程操作全流程
- ARC20挖矿铸造Mint转账pepe打新最详细的教程doge,atom打新
- 怎样查询比特币当前块高度和gas费用优先级
- 币安BSC智能链发币教程——合约中增加批量杀机器人防夹子软件防抢开盘bots功能【pdf+视频BSC发币教程下载】
- 区块链浏览器上输入地址类型数组变量作为输入参数时TRC20和ERC20的区别
- 币安BSC智能链发币教程——构造函数中直接创建本币对标BNB和USDT的交易对【pdf+视频BSC发币教程下载】
- 以太ETH链发币教程——ETH以太坊链上部署合约时常见报错处理【pdf+视频ETH发币教程下载】
- 币安BSC智能链Dapp开发教程——IDO项目需求设计架构及合约代码完整版本实现【pdf+视频BSC链Dapp开发教程下载】
- 从合约地址中赎回代币的安全转账函数代码
- solidity中连接uint256类型数据和string类型数据拼接字符串
- 处理区块链浏览器上uint256类型的数组类型变量中的元素值最大不允许超过1e18长度的限制
- 币安BSC智能链合约开发教程——检测到用户成功支付usdt后,执行后续的认购及质押操作【pdf+视频BSC合约开发教程下载】
- centos8安装synapse服务端节点
- 币安BSC智能链Dapp开发教程——vue项目本地化搭建过程中的故障处理【pdf+视频BSC链Dapp开发教程下载】
- 使用npm install出现check python checking for Python executable “python2“ in the PATH
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上铸造mint BSC-20协议标准的铭文【pdf+视频EVM铭文操作教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——铭文赛道各个公链marketing swap链接地址【pdf+视频EVM铭文操作教程下载】
- BSC链上首个支持BSC-20协议标准的的龙头铭文代币BNBS
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上通过solidity合约直接部署和批量铸造铭文代币【pdf+视频EVM铭文操作教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——BSC链上铭文代币部署开发及dapp调用铭文代币前端界面由用户自行铸造mint【pdf+视频EVM铭文操作教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——ETH链上怎样在swap交易任意数量的eths铭文【pdf+视频EVM铭文操作教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——EVM网络上铭文跨链到WETH的亚合约代码实现【pdf+视频EVM铭文操作教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——EVM网络上铭文部署deploy和批量铸造mint的dapp完整代码实现【pdf+视频EVM铭文操作教程下载】
- 币安BSC智能链符文教程——defi生态中符文是什么,符文和铭文的区别是什么,怎样部署符文合约【pdf+视频BSC符文教程下载】
- 币安BSC智能链符文教程——会燃烧的符文代币部署公开铸造mint自动添加流动性开发交易合约源代码实现【pdf+视频BSC符文教程下载】
- 币安BSC智能链发币教程——设置买卖不同交易手续费的符文代币合约源代码实现【pdf+视频BSC发币教程下载】
- 币安链BSC上NFT发行教程——持有NFT可以获取等值的代币定期释放赎回到钱包地址合约代码实现【pdf+视频BSC链NFT发行教程下载】
- 币安BSC智能链合约开发教程——合约层面直接修改资金池中代币余额后同步uniswap账本登记余额【pdf+视频BSC合约开发教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atomical生态ARC20部署及铸造铭文教程【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地环境更新教程(保姆级)【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地dmint教程【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM本地Dmint更换节点【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM的GPU研究【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Wizz钱包或ATOM钱包更换节点教程【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atom生态铭文铸造成本计算方式【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——Atomical铸造铭文遇到节点崩溃如何手动广播交易挽回损失教程【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——一键在Ubuntu上运行Bitcoin Atom索引(BTC系列教程2)【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——ATOM一键在Ubuntu上运行Bitcoin全节点(BTC系列教程1)【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——OKX打铭文批量自动连点确认教程【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——批量铸造打铭文相关工具及网址【pdf+视频EVM铭文操作教程下载】
- BRC20、ARC20、BSC20、ERC20、EVM网络铭文操作教程——开源项目Polaris自动打EVM铭文【pdf+视频EVM铭文操作教程下载】
- 马蹄Polygon链发币教程——通过metamask跨链桥兑换matic代币【pdf+视频matic马蹄链发币教程下载】
- 币安BSC智能链合约开发教程——dapp中用户触发领取铭文/符文/代币空投后要求用户支付指定数量的WETH进入归集钱包地址代码实现【pdf+视频BSC合约开发教程下载】
- BRC20、BSC20、ERC20、EVM网络铭文操作教程——铭文类dapp项目开发架构及整体设计思路流程【pdf+视频EVM铭文操作教程下载】
- BTC layer2 B2 Network交互获取积分point领取空投教程
- Solana编程模型:Solana开发入门
- 指南:用 Anchor 构建 Solana 程序
- 使用 ERC-1271,让 Dapp 兼容智能合约钱包
- 离线授权 NFT EIP-4494:ERC721 -Permit
- Viem React 教程:如何转账、铸币和查看链状态
- 智能合约的白名单技术
- 我应该使用什么钱包来存储我的加密货币?
- 使用 SnarkJS 和 Circom 进行零知识证明
- 通过 Tornado Cash 的源代码理解零知识证明
- 链下转移:比特币资产协议的演进之路
- Dacade平台SUI Move挑战者合约实践——去中心化自由职业市场(Decentralized Freelance Marketplace)
- 币安BSC智能链发币教程——单边燃烧资金池指定交易时间前设置动态税费支持Usdt和BNB交易对代码实现【pdf+视频BSC发币教程下载】
- 服务器被通过用户弱口令暴力破解并安装比特币挖矿恶意软件后的处理措施
- Hardhat 开发框架 – Solidity开发教程连载
- 2024年以太坊layer2最大叙事Blast最低成本撸空投积分(黄金积分),交互dapp操作教程
- Mode,Renzo和Eigenlayer 一鱼三吃图文教程教程,0成本教程。
- centos6.8系统升级glibc版本(升级到 2.17/2.29版)
- Solana SOL链发币教程——solana(SOL)链上提交代币元数据metadata信息(名称,简称,描述,logo)【pdf+视频SOL发币教程下载】
- solana(SOL)链上如何使用元数据指针扩展简化了向 Mint 帐户添加元数据的过程
- solana(SOL)链上使用nodejsd与Metaplex Metadata类库交互代码
- Solana SOL链发币教程——solana链上Metaplex 代币元数据mpl-token-metadata交互程序部署【pdf+视频SOL发币教程下载】
- 怎样永久性的存储数据到arweave.net区块链上
- 使用Create2操作码在相同的地址部署不同的代码的合约。
- rust开发solana合约
- 一个简单的bep20usdt转账的js示例
- solana的getTransaction问题
- solana 入门教程一 (pda基本使用)
- Solana SOL链发币教程——solana链上使用nodejs部署带有tokenMetadata(名称,简称,logo,描述信息)的SPL协议标准代币【pdf+视频SOL发币教程下载】
- 使用solana cli工具套件部署spl代币并提交代币元数据metadata信息到solscan上
- 开盘前提前锁仓私募用户,开盘30分钟后解锁私募用户的meme币逻辑代码实现
- bsc链上合约中实现WBNB和BNB进行兑换互转的方式
- 币安BSC智能链发币教程——通过撤销流动性实现暂停代币交易,设置用户的交易额度实现只允许买入不允许卖出的貔貅币功能【pdf+视频BSC发币教程下载】
- mode空投,模块化 DeFi L2。 5.5亿个可用模式。由乐观主义提供动力。
- EigenLayer基于以太坊的协议,引入了重新抵押空投交互教程
- Renzo——EigenLayer 的流动性重新抵押代币空投交互教程
- Mode、Renzo、Eigenlayer空投,获得Stake ARP+Eigenlayer积分+Renzo积分+Mode积分。
- Parcl 一种基于区块链的房地产协议积分空投交互获取教程
- Solana SOL链发币教程——solana链上代币添加流动性后实现永久锁仓【pdf+视频SOL发币教程下载】
- 币安BSC智能链发币教程——BSC314协议代币源代码部署、添加流动性、锁仓LP固定时间操作全流程【pdf+视频BSC发币教程下载】
- 币安BSC智能链发币教程——bsc链上持币分红usdt轮询分发usdt,通过BABYTOKENDividendTracker降低gas费用的源代码实现【pdf+视频BSC发币教程下载】
- 币安BSC智能链发币教程——ERC314协议(通用于BSC314,ARB314,BASE314,POL314)代币合约源代码部署、添加及撤销流动性、锁仓LP固定时间操作步骤全流程【pdf+视频BSC发币教程下载】
- 币安BSC智能链发币教程——ERC314/BSC314协议实时燃烧资金池同步计算买卖价格的核心代码实现【pdf+视频BSC发币教程下载】
- 币安BSC智能链发币教程——合约自动创建的bnb资金池对被恶意打入WBNB导致添加流动性失败【pdf+视频BSC发币教程下载】
- 币安BSC智能链发币教程——设置隐藏限制最大累积卖出代币总量的貔貅合约源代码功能实现【pdf+视频BSC发币教程下载】
- npm 安装软件报报错Getting “Cannot read property ‘pickAlgorithm’ of null” error in react native
- 区块链质押系统dapp开发系统架构设计全流程
- 区块链质押挖矿分红奖励dapp开发设计功能需求源码交付运营
- 币安BSC智能链发币教程——融合持币分红usdt和LP分红usdt的合约功能源代码完整版本实现【pdf+视频BSC发币教程下载】
- 币安BSC智能链合约开发教程——DEFI智能合约开发过程中怎样限制用户添加流动性后不允许转移LP到其他钱包,然后使用该钱包撤销流动性LP【pdf+视频BSC链合约开发教程下载】
- 币安BSC智能链合约开发教程——DEFI智能合约开发中持币分红usdt和LP分红usdt的gas费分配和调优组合【pdf+视频BSC链合约开发教程下载】
- 币安BSC智能链合约开发教程——DEFI智能合约开发过程中怎样计算添加流动性后实际获得的LP数量,并同步LP数量到链上,以此限制用户任意转账LP【pdf+视频BSC链合约开发教程下载】
- 币安BSC智能链合约开发教程——LP分红本币的合约处理代码实现,不同时段分红不同数量的本币【pdf+视频BSC链合约开发教程下载】
- 投票系统dapp开发流程,前后端以及链端完整代码实现
- 使用solidity语言开发一个支持ERC20协议标准的通证代币全流程
- TON链(The Open Network)上部署代币并添加流动性实现在线swap交易
- 币安BSC智能链合约开发教程——DEFI合约开发中根据用户买入代币的数量由合约自动撤销对应比率的LP流动性用于分红usdt【pdf+视频BSC链合约开发教程下载】
- Solana Actions and Blinks
- EIP-1559:Gas计算指南
- 快速开发Solana Action并通过创建Blink在X接收SOL捐赠
- Solidity合约那些常用的技巧
- Sui极简入门,部署你的第一个Sui合约
- Aave V2 逻辑整理
- 智能合约的细粒度暂停
- Solana 开发全面指南:使用 React、Anchor、Rust 和 Phantom 进行全栈开发
- 详解 ERC-1363 代币标准
- 分析以太坊虚拟机各语言设计
- Rollups 和 Validium 的“文献综述”
- 7 个实时获取加密数据 WebSocket API 头部服务商
- 什么是 Facet?- 一种以太坊范式的转换
- 从PStake解读BTCFI的窘境与未来
- 一篇文章彻底帮助你理解EIP1559之后的Gas机制
- 币安BSC智能链合约开发教程——夹子攻击的行为特征,怎样在合约中预防夹子攻击【pdf+视频BSC链合约开发教程下载】
- 币安BSC智能链合约开发教程——貔貅合约代码分析(在欧意web3钱包和ave均能避免被识别并给出安全评分)【pdf+视频BSC链合约开发教程下载】
- 闪电贷攻击智能合约漏洞并获利的全流程分析和完整版合约脚本代码
- 通过闪电贷攻击LP流动性分红合约中的漏洞,从而获得巨额的分红攻击原理分析和预防措施
- 闪电贷攻击多种攻击方式的原理分析和防御措施
- 波场TRX链发币教程——怎样在波场tron链上部署trc10协议标准通证【pdf+视频TRX发币教程下载】
- 比特币链上在质押项目Babylon airdrop空投积分图文教程
- Solana链上在质押协议Solayer airdrop空投图文教程
- Michael.W基于Foundry精读Openzeppelin第68期——UpgradeableBeacon.sol
- 理解ERC165标准
- 怎样自动归集用户充值的ETH或者usdt到归集地址并最优化归集交易gas费
- eth链上充值合约自动归集用户充值的ETH/USDT到归集地址,后台实时同步充值数据记录到数据库中
- 实时捕获BSC链上新发行并添加流动性的代币合约并执行最佳的抢购套利策略
- BSC链自动抢购套利系统衡量合约代币的安全性的参数指标和参考值范围
- 波场TRX链上批量转账合约部署教程及完整版合约源代码
- BSC链上自动抢购套利程序链端买卖接口合约代码实现
- 交易聚合器去中心化交易所DEX开发swap过程中动态配置交易滑点防止夹子MEV攻击
- 小草Grass查空投了,总量10个亿,第一轮空投10%!
- TON链上游戏开发功能模块需求设计以及最佳的技术实现方案
- 深入理解TON智能合约:利用dict和list实现高效的验证者选举
- EIP-4844 是什么?解析 Proto-Danksharding 和 blob 交易
- 深入解读 APTOS-MOVE 中的 Vector 向量核心特性与操作
- 可升级合约中可以使用 immutable 变量么
- 技术详解 | Divide and Conquer:ZK除法中隐藏的漏洞
- 监听以太坊地址余额的常用的方法
- 使用 Safe SDK 创建多签钱包
- Multicall 原理
- TON电报链jetton合约开发详细操作流程及Func源代码构建部署教程
- 使用TON电报链Func合约源码框架模板部署Ton上的智能合约并完成合约的交互
- TON链上智能合约开发FUNC语言中的Get 方法获取合约metadata属性使用教程
- 怎样与TON链上的Func智能合约交互,修改链上数据状态
- TON链上FUNC智能合约开发中的内部(internal)消息和外部(external)消息
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫