
注册ChatGPT全攻略(账号购买)
最近ChatGPT很火,但是有人注册会经常出现不服务当前地区问题,现在手把手教你解决。加个群8如果你有账号需求,代收验证码,或者需要帮助开通Plus,也可以加群直接联系群主。现在提供服务:成品号 - 一人一号,包括邮箱和账号密码都可以修改,是目前市面上唯一一个提供邮箱密码的。代收验证码 - 你如果借不到验证码也可以找我代充Plus会员和depay如果你有问题或者有需要,可以直接进去找群主或者客服。 ChatGPT Plus教程 Plus的申请教程也来了,快来成为高贵的Plus用户。 https://mirror.xyz/boxchen.eth/fi-WPM78UeTRwo_r3rNZesrZ_hfQfFltkOT2kb9k6Jk准备代理,要求是,韩国,日本,印度,新加坡,美国这几个地址。其他的不太清楚,反正香港肯定不行。准备一个国外手机号,如果没有用接码平台也行,有些接码平台是无法接的,所以我找了一个,sms-activate.org准备一个浏览器开始第一步 准备接码打开接码平台 sms-activate.org,注册一个账号注册充值,这里单位是卢布接码OpenAi的一次费用是大...

Web3企业级工程-初级篇:1. 前期准备
前言在文章开始前,先明确好几个阅读要点。文章中会多次出现,必要条件,可选内容,一定不要,注意⚠️ 等词。他们的意思分别为。必要条件:属于一定需要的内容,缺少后将会无法进行教程。可选内容:属于补充性内容,并不会对教程产生影响一定不要:属于强制规范内容,请不要做此内容下的行为注意⚠️:属于提示性内容,该内容中会进行指引,并且指出什么应该,什么不应该。目标人群本文适合以下用户阅读。必要条件:具备理解能力和英语阅读能力。计算机专业相关人员Web2转向Web3的有基础开发者有开发简单项目,但是缺少开发大型项目经验的开发者在校大学生,需要有自制力和自学能力还有较为出色的综合能力进来图一乐本文不适合以下用户阅读。毫无编程基础的用户顶尖高手开发环境本文将全程用Macos进行开发,如果你是使用Windows系统,推荐两个解决方案。更换Mac自行搜索一些无法在Windows上执行的命令如何用其他方案替代,比如安装Node环境,在Unix类系统下可以使用nvm,但是win只能下载安装包必要软件科学上网工具软件环境安装一般情况下,开发一个Dapp(EVM)需要一些基础软件,下面是必要的基础软件在Maco...
ChatGPT Plus注册全攻略
简要这篇文章适合拥有ChatGPT账号的朋友,并且身边缺少美国VISA或者万事达卡。 如果你没有ChatGPT账户,问题不大,你可以看我上一篇文章: https://mirror.xyz/boxchen.eth/9O9CSqyKDj4BKUIil7NC1Sa1LJM-3hsPqaeW_QjfFBc 同时,如果你想要使用,你还需要有一定的加密货币知识,不过没关系,如果你没有加密货币知识,你可以直接加入群寻求群主帮助。 当然,如果你有账号需求,代收验证码,或者需要帮助开通Plus,也可以加群直接联系群主。现在提供服务:成品号 - 一人一号,包括邮箱和账号密码都可以修改,是目前市面上唯一一个提供邮箱密码的。代收验证码 - 你如果借不到验证码也可以找我代充Plus会员和depay如果你有问题或者有需要,可以直接进去找群主或者客服。切回正题,事前准备内容:一个可用的ChatGPT账号一个日本地区的IP(当然也不限制,不过我自己用的是日本IP)一些USDT(如果没有,可以加群找人代充)一个虚拟信用卡,点此注册第一步 检测资格第一步自然是检测是否有Plus资格,不过从2月11日开始,Plus资...
Full stack Dev.

注册ChatGPT全攻略(账号购买)
最近ChatGPT很火,但是有人注册会经常出现不服务当前地区问题,现在手把手教你解决。加个群8如果你有账号需求,代收验证码,或者需要帮助开通Plus,也可以加群直接联系群主。现在提供服务:成品号 - 一人一号,包括邮箱和账号密码都可以修改,是目前市面上唯一一个提供邮箱密码的。代收验证码 - 你如果借不到验证码也可以找我代充Plus会员和depay如果你有问题或者有需要,可以直接进去找群主或者客服。 ChatGPT Plus教程 Plus的申请教程也来了,快来成为高贵的Plus用户。 https://mirror.xyz/boxchen.eth/fi-WPM78UeTRwo_r3rNZesrZ_hfQfFltkOT2kb9k6Jk准备代理,要求是,韩国,日本,印度,新加坡,美国这几个地址。其他的不太清楚,反正香港肯定不行。准备一个国外手机号,如果没有用接码平台也行,有些接码平台是无法接的,所以我找了一个,sms-activate.org准备一个浏览器开始第一步 准备接码打开接码平台 sms-activate.org,注册一个账号注册充值,这里单位是卢布接码OpenAi的一次费用是大...

Web3企业级工程-初级篇:1. 前期准备
前言在文章开始前,先明确好几个阅读要点。文章中会多次出现,必要条件,可选内容,一定不要,注意⚠️ 等词。他们的意思分别为。必要条件:属于一定需要的内容,缺少后将会无法进行教程。可选内容:属于补充性内容,并不会对教程产生影响一定不要:属于强制规范内容,请不要做此内容下的行为注意⚠️:属于提示性内容,该内容中会进行指引,并且指出什么应该,什么不应该。目标人群本文适合以下用户阅读。必要条件:具备理解能力和英语阅读能力。计算机专业相关人员Web2转向Web3的有基础开发者有开发简单项目,但是缺少开发大型项目经验的开发者在校大学生,需要有自制力和自学能力还有较为出色的综合能力进来图一乐本文不适合以下用户阅读。毫无编程基础的用户顶尖高手开发环境本文将全程用Macos进行开发,如果你是使用Windows系统,推荐两个解决方案。更换Mac自行搜索一些无法在Windows上执行的命令如何用其他方案替代,比如安装Node环境,在Unix类系统下可以使用nvm,但是win只能下载安装包必要软件科学上网工具软件环境安装一般情况下,开发一个Dapp(EVM)需要一些基础软件,下面是必要的基础软件在Maco...
ChatGPT Plus注册全攻略
简要这篇文章适合拥有ChatGPT账号的朋友,并且身边缺少美国VISA或者万事达卡。 如果你没有ChatGPT账户,问题不大,你可以看我上一篇文章: https://mirror.xyz/boxchen.eth/9O9CSqyKDj4BKUIil7NC1Sa1LJM-3hsPqaeW_QjfFBc 同时,如果你想要使用,你还需要有一定的加密货币知识,不过没关系,如果你没有加密货币知识,你可以直接加入群寻求群主帮助。 当然,如果你有账号需求,代收验证码,或者需要帮助开通Plus,也可以加群直接联系群主。现在提供服务:成品号 - 一人一号,包括邮箱和账号密码都可以修改,是目前市面上唯一一个提供邮箱密码的。代收验证码 - 你如果借不到验证码也可以找我代充Plus会员和depay如果你有问题或者有需要,可以直接进去找群主或者客服。切回正题,事前准备内容:一个可用的ChatGPT账号一个日本地区的IP(当然也不限制,不过我自己用的是日本IP)一些USDT(如果没有,可以加群找人代充)一个虚拟信用卡,点此注册第一步 检测资格第一步自然是检测是否有Plus资格,不过从2月11日开始,Plus资...
Full stack Dev.

Subscribe to BoxChen

Subscribe to BoxChen
Share Dialog
Share Dialog


>100 subscribers
>100 subscribers
既然是一个循序渐进的教程,那么肯定不能一上来就开始写代码。就好比你想造一台永动机,你至少要知道这个永动机动起来是什么样子,你才能更好的去分解他。
所以这一章节我们主要是部署一个UniswapV3,所以这章节的目的是快速并且简单的部署好一个UniswapV3,用于未来我们程序和Uni的联调。
不过,在安装之前,我推荐你把第二章配置好的模版保存起来,以后就不用重新配置了。当然,这是可选内容。
首先安装UniswapV3,我们要知道一件事。Uniswap的合约分为两个,一个是v3-periphery 另外一个是v3-core 。现在简单介绍一下这两个仓库的合约是代表什么。
core合约是uniswap中负责掌管pool和factory的仓库。
pool:是资金存储和交换运算的合约。
factory:用于批量创造Pool的合约。
这两个合约是整个uniswap的核心。就算在没有periphery的情况下,也能正常运行的最小合约。
periphery存放的是外围合约,这些合约是给用户和开发者一个统一的接口或者是便捷的通证。核心合约有NFTManager和SwapRouter。
NFTManager:一个用于记录用户创建的流动性各类数据的合约。
SwapRouter:包装类,将交换的各种逻辑进行包装抽象。
这里我们不过度展开UniswapV3的逻辑。我们重点是如何去部署他。
通过执行
yarn add @uniswap/v3-core @uniswap/v3-periphery@1.4.1
先安装好两个必要的合约仓库。要注意的是,@uniswap/v3-periphery@1.4.1 是带了版本号的,这是因为在编写本文的时候,1.4.2版本缺少artifacts文件夹,相关issue如下。github-issue, 如果当你看到这篇文章时,这个issue已经被解决了,那么就不用加上末尾的版本号指定了。
部署合约其实只有一种方式,就是从bytecode进行部署,但是不同的工具会提供不同等级的封装。以至于封装到极致后,你只需要输入一个合约名称就可以部署。不过为了方便了解原理,我们就使用最为基础的部署方式进行部署。
我们先创建一个deploy文件。在deploy文件夹下创建一个名为00_deploy_univ3.ts的文件。
代码内容如下。
import { DeployFunction } from "hardhat-deploy/types";
const func: DeployFunction = async function () {
}
export default func;
这是一个deploy文件最基础的框架函数,我们首先要部署的是core中的factory合约。所以我们修改代码为。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments,ethers } = hre
const [deployer] = await ethers.getSigners()
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
}
export default func;
加了”一点点”细节后,我们的代码丰富了起来。这里先解释一下关键内容。
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
这段代码的内容是从uniswap提供的官方包中,引入bytecode和abi数据,这样我们就能直接在下面进行内容填充。
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
这段代码是部署V3Factory合约的代码。其中deploy是hardhat-deploy插件提供的函数,我们在第二个参数中指定了bytecode和abi——这两个必须都要有。
当然,我们还要修改tsconfig.json文件,添加 "resolveJsonModule": true的选项。修改后文件如下。
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"resolveJsonModule": true
},
}
接下来是SwapRouter合约,我们如法炮制,修改代码如下。当然你也可以尝试自己动手试试。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import {
abi as SWAP_ROUTER_ABI,
bytecode as SWAP_ROUTER_BYTECODE,
} from '@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { constants } from "ethers";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments, ethers } = hre
const [deployer] = await ethers.getSigners()
const factory = await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
await deployments.deploy("UniV3SwapRouter", {
from: deployer.address,
contract: {
abi: SWAP_ROUTER_ABI,
bytecode: SWAP_ROUTER_BYTECODE
},
args:[factory.address,constants.AddressZero]
// 上面是部署合约的参数,第一个参数为factory地址,第二个为WETH地址,这里为了图方便就直接用0地址啦😁
})
}
export default func;
那么我们的部署脚本到这里就编写完成了。通过命令yarn hardhat deploy 即可将代码部署到任何网络上。
不过,通过bytecode直接部署会有一些不好的地方,比如在出错的时候,你无法获得源码级别的错误追踪。并且,我们部署的也是一个残缺的版本,因为我们还缺少NonfungiblePositionManager,NonfungibleTokenPositionDescriptor,NFTDescriptor合约,不过,它们的部署方式都是一样的。你可以试着用上述的方法添加它们。就当是课后作业啦。
这一个章节只构建了通过bytecode部署uniswap的基础文件,但是我们的内容其实是不够一个实际的uniswap运行的。所以在下一章节,我们会使用另外一种方式部署uniswapv3,并且编写测试用例。等测试用例通过后,我们再用源码编译的方式对UniswapV3进行部署。
PS:我发现mirror不太适合写这种技术类文章,后续会切换到其他平台。
既然是一个循序渐进的教程,那么肯定不能一上来就开始写代码。就好比你想造一台永动机,你至少要知道这个永动机动起来是什么样子,你才能更好的去分解他。
所以这一章节我们主要是部署一个UniswapV3,所以这章节的目的是快速并且简单的部署好一个UniswapV3,用于未来我们程序和Uni的联调。
不过,在安装之前,我推荐你把第二章配置好的模版保存起来,以后就不用重新配置了。当然,这是可选内容。
首先安装UniswapV3,我们要知道一件事。Uniswap的合约分为两个,一个是v3-periphery 另外一个是v3-core 。现在简单介绍一下这两个仓库的合约是代表什么。
core合约是uniswap中负责掌管pool和factory的仓库。
pool:是资金存储和交换运算的合约。
factory:用于批量创造Pool的合约。
这两个合约是整个uniswap的核心。就算在没有periphery的情况下,也能正常运行的最小合约。
periphery存放的是外围合约,这些合约是给用户和开发者一个统一的接口或者是便捷的通证。核心合约有NFTManager和SwapRouter。
NFTManager:一个用于记录用户创建的流动性各类数据的合约。
SwapRouter:包装类,将交换的各种逻辑进行包装抽象。
这里我们不过度展开UniswapV3的逻辑。我们重点是如何去部署他。
通过执行
yarn add @uniswap/v3-core @uniswap/v3-periphery@1.4.1
先安装好两个必要的合约仓库。要注意的是,@uniswap/v3-periphery@1.4.1 是带了版本号的,这是因为在编写本文的时候,1.4.2版本缺少artifacts文件夹,相关issue如下。github-issue, 如果当你看到这篇文章时,这个issue已经被解决了,那么就不用加上末尾的版本号指定了。
部署合约其实只有一种方式,就是从bytecode进行部署,但是不同的工具会提供不同等级的封装。以至于封装到极致后,你只需要输入一个合约名称就可以部署。不过为了方便了解原理,我们就使用最为基础的部署方式进行部署。
我们先创建一个deploy文件。在deploy文件夹下创建一个名为00_deploy_univ3.ts的文件。
代码内容如下。
import { DeployFunction } from "hardhat-deploy/types";
const func: DeployFunction = async function () {
}
export default func;
这是一个deploy文件最基础的框架函数,我们首先要部署的是core中的factory合约。所以我们修改代码为。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments,ethers } = hre
const [deployer] = await ethers.getSigners()
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
}
export default func;
加了”一点点”细节后,我们的代码丰富了起来。这里先解释一下关键内容。
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
这段代码的内容是从uniswap提供的官方包中,引入bytecode和abi数据,这样我们就能直接在下面进行内容填充。
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
这段代码是部署V3Factory合约的代码。其中deploy是hardhat-deploy插件提供的函数,我们在第二个参数中指定了bytecode和abi——这两个必须都要有。
当然,我们还要修改tsconfig.json文件,添加 "resolveJsonModule": true的选项。修改后文件如下。
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"resolveJsonModule": true
},
}
接下来是SwapRouter合约,我们如法炮制,修改代码如下。当然你也可以尝试自己动手试试。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import {
abi as SWAP_ROUTER_ABI,
bytecode as SWAP_ROUTER_BYTECODE,
} from '@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { constants } from "ethers";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments, ethers } = hre
const [deployer] = await ethers.getSigners()
const factory = await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
await deployments.deploy("UniV3SwapRouter", {
from: deployer.address,
contract: {
abi: SWAP_ROUTER_ABI,
bytecode: SWAP_ROUTER_BYTECODE
},
args:[factory.address,constants.AddressZero]
// 上面是部署合约的参数,第一个参数为factory地址,第二个为WETH地址,这里为了图方便就直接用0地址啦😁
})
}
export default func;
那么我们的部署脚本到这里就编写完成了。通过命令yarn hardhat deploy 即可将代码部署到任何网络上。
不过,通过bytecode直接部署会有一些不好的地方,比如在出错的时候,你无法获得源码级别的错误追踪。并且,我们部署的也是一个残缺的版本,因为我们还缺少NonfungiblePositionManager,NonfungibleTokenPositionDescriptor,NFTDescriptor合约,不过,它们的部署方式都是一样的。你可以试着用上述的方法添加它们。就当是课后作业啦。
这一个章节只构建了通过bytecode部署uniswap的基础文件,但是我们的内容其实是不够一个实际的uniswap运行的。所以在下一章节,我们会使用另外一种方式部署uniswapv3,并且编写测试用例。等测试用例通过后,我们再用源码编译的方式对UniswapV3进行部署。
PS:我发现mirror不太适合写这种技术类文章,后续会切换到其他平台。
No activity yet