
注册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
>100 subscribers
>100 subscribers
Share Dialog
Share Dialog


文接上回,我们已经部署了Uniswap的核心合约,接下来我们将部署完整版的UniswapV3。完整版的UniswapV3包含了以下合约:
UniswapV3Factory (Pool生成合约)
UniswapV3SwapRouter (包装类交易合约)
NonfungiblePositionManager (NFT管理合约)
NonfungibleTokenPositionDescriptor (NFT仓位描述合约)
NFTDescriptor (NFT描述合约)
WETH9 (WrapperETH)
我们上一章节已经部署完成了前两个合约,那么我们这一章节就需要开始部署后续合约。其实部署方法都是一样的。只不过有一点点需要注意的地方是,NonfungibleTokenPositionDescriptor需要进行Library链接,将NFTDescriptor部署后作为Library链接到NonfungibleTokenPositionDescriptor中。接下来我们会继续完善我们的部署脚本,将这些合约都部署出来。
我们继续完善我们的部署脚本,将上一章节中部署的合约和这一章节中需要部署的合约都部署出来。因为部署方式和上一章节中的部署方式一样,所以我们只需要在00_deploy_univ3.ts中添加一些代码即可。 不过我们还需要添加一个WETH9的合约。我们上一章节中,在填写WETH9的位置直接使用了0地址代替,现在可不行了。所以我们先打开网址https://github.com/gnosis/canonical-weth/blob/master/contracts/WETH9.sol,复制里面的代码,然后在contracts文件夹下新建一个WETH9.sol文件,将代码粘贴进去。然后我们运行一下yarn hardhat compile,将合约编译一下。可以不出所料的出现一个错误。

这是因为我们的编译器版本不对,因为WETH9的合约是用>=0.4.22 <0.6的版本进行编译,而我们默认的是^0.8.0的版本,所以我们需要修改编译器的版本。不过得益于Hardhat的强大功能,我们可以设定多个版本的编译器,这样我们就能在多个版本的编译器下编译我们的合约了。 我们打开hardhat.config.ts,在solidity的配置项中添加一个compilers的配置项,将其设置为一个数组,数组中包含我们需要的编译器版本。
const config: HardhatUserConfig = {
solidity: {
compilers: [
{
version: '0.8.0',
},
{
version: '0.4.22',
},
],
},
};
修改完成后,我们再次编译。

我们打开00_deploy_univ3.ts,在main函数中添加一些代码。
其实上面很多都是些重复的代码,我们需要关注两段内容。第一段是这个linkLibrary函数。
function linkLibrary(bytecode: string, libraries: {
[name: string]: string
} = {}): string {
let linkedBytecode = bytecode
for (const [name, address] of Object.entries(libraries)) {
const placeholder = `__\$${utils.solidityKeccak256(['string'], [name]).slice(2, 36)}\$__`
const formattedAddress = utils.getAddress(address).toLowerCase().replace('0x', '')
if (linkedBytecode.indexOf(placeholder) === -1) {
throw new Error(`Unable to find placeholder for library ${name}`)
}
while (linkedBytecode.indexOf(placeholder) !== -1) {
linkedBytecode = linkedBytecode.replace(placeholder, formattedAddress)
}
}
return linkedBytecode
}
他的作用是将文件中library的链接到Bytecode里面去,但是一般情况下,我们不会采用这种方式。因为从源码部署的时候,我们可以借助工具来简化这个过程。而library是一种极为有效的减少合约字节码的方式,在后续的文章中,我们会专门讲解这个问题。第二段是这个NFTDescriptorlibrary的部署。
const linkedBytecode = linkLibrary(NFTTokenPositionDescriptor_BYTECODE,
{
['contracts/libraries/NFTDescriptor.sol:NFTDescriptor']: NFTDescriptorlibrary.address
}
)
const positionDescriptor = await deployments.deploy('NFTPositionDescriptor', {
from: deployer.address,
contract: {
abi: NFTPositionDescriptor_ABI,
bytecode: linkedBytecode
},
args: [
WETH9.address,
// 'ETH' as a bytes32 string
'0x4554480000000000000000000000000000000000000000000000000000000000'
]
})
其实这里就是借助linkLibrary函数,将NFTDescriptor的地址链接到NFTTokenPositionDescriptor的Bytecode中。
到此,我们可以验证一下我们的部署脚本是否有问题。我们运行yarn hardhat deploy,如果一切顺利,我们可以看到如下的输出。
Nothing to compile
No need to generate any newer typings.
✨ Done in 1.45s.
简单来说就是没有什么特别的输出,如果这里出现了报错,那么就证明我们的部署脚本出现了问题。有人可能会有疑问,我这里什么参数都没有填,我这合约究竟部署到了什么地方去了?其实,如果我们直接执行deploy脚本,那么他会默认部署到一个本地的网络中。我们也可以通过yarn hardhat node来启动一个本地的网络。但是,因为我们没有启动一个本地网络,所以在deploy时会自动启动一个本地网络用于部署,当部署完成后又会自动的关闭这个网络。所以我们基本看不到任何反馈输入,不过,没有反馈其实就是最好的反馈了。
这一个章节我们把UniswapV3进行了完整部署,有了这个部署,我们就可以在后续的章节中进行一些测试了。当然,有能力的朋友也可以在这上面进行一些初步的合约开发工作。不过我并不是很推荐使用这种方式,因为用这种方式,当合约报错时,你是无法进行精确到行的Debug的。不过这个问题我们将在后面的章节进行解决。在下一章,我们将会部署一个Uniswap的前端进行测试。
文章首发于: ee.web3box.dev 作者:https://twitter.com/BoxMrChen 由SafeHouseDAO出品
文接上回,我们已经部署了Uniswap的核心合约,接下来我们将部署完整版的UniswapV3。完整版的UniswapV3包含了以下合约:
UniswapV3Factory (Pool生成合约)
UniswapV3SwapRouter (包装类交易合约)
NonfungiblePositionManager (NFT管理合约)
NonfungibleTokenPositionDescriptor (NFT仓位描述合约)
NFTDescriptor (NFT描述合约)
WETH9 (WrapperETH)
我们上一章节已经部署完成了前两个合约,那么我们这一章节就需要开始部署后续合约。其实部署方法都是一样的。只不过有一点点需要注意的地方是,NonfungibleTokenPositionDescriptor需要进行Library链接,将NFTDescriptor部署后作为Library链接到NonfungibleTokenPositionDescriptor中。接下来我们会继续完善我们的部署脚本,将这些合约都部署出来。
我们继续完善我们的部署脚本,将上一章节中部署的合约和这一章节中需要部署的合约都部署出来。因为部署方式和上一章节中的部署方式一样,所以我们只需要在00_deploy_univ3.ts中添加一些代码即可。 不过我们还需要添加一个WETH9的合约。我们上一章节中,在填写WETH9的位置直接使用了0地址代替,现在可不行了。所以我们先打开网址https://github.com/gnosis/canonical-weth/blob/master/contracts/WETH9.sol,复制里面的代码,然后在contracts文件夹下新建一个WETH9.sol文件,将代码粘贴进去。然后我们运行一下yarn hardhat compile,将合约编译一下。可以不出所料的出现一个错误。

这是因为我们的编译器版本不对,因为WETH9的合约是用>=0.4.22 <0.6的版本进行编译,而我们默认的是^0.8.0的版本,所以我们需要修改编译器的版本。不过得益于Hardhat的强大功能,我们可以设定多个版本的编译器,这样我们就能在多个版本的编译器下编译我们的合约了。 我们打开hardhat.config.ts,在solidity的配置项中添加一个compilers的配置项,将其设置为一个数组,数组中包含我们需要的编译器版本。
const config: HardhatUserConfig = {
solidity: {
compilers: [
{
version: '0.8.0',
},
{
version: '0.4.22',
},
],
},
};
修改完成后,我们再次编译。

我们打开00_deploy_univ3.ts,在main函数中添加一些代码。
其实上面很多都是些重复的代码,我们需要关注两段内容。第一段是这个linkLibrary函数。
function linkLibrary(bytecode: string, libraries: {
[name: string]: string
} = {}): string {
let linkedBytecode = bytecode
for (const [name, address] of Object.entries(libraries)) {
const placeholder = `__\$${utils.solidityKeccak256(['string'], [name]).slice(2, 36)}\$__`
const formattedAddress = utils.getAddress(address).toLowerCase().replace('0x', '')
if (linkedBytecode.indexOf(placeholder) === -1) {
throw new Error(`Unable to find placeholder for library ${name}`)
}
while (linkedBytecode.indexOf(placeholder) !== -1) {
linkedBytecode = linkedBytecode.replace(placeholder, formattedAddress)
}
}
return linkedBytecode
}
他的作用是将文件中library的链接到Bytecode里面去,但是一般情况下,我们不会采用这种方式。因为从源码部署的时候,我们可以借助工具来简化这个过程。而library是一种极为有效的减少合约字节码的方式,在后续的文章中,我们会专门讲解这个问题。第二段是这个NFTDescriptorlibrary的部署。
const linkedBytecode = linkLibrary(NFTTokenPositionDescriptor_BYTECODE,
{
['contracts/libraries/NFTDescriptor.sol:NFTDescriptor']: NFTDescriptorlibrary.address
}
)
const positionDescriptor = await deployments.deploy('NFTPositionDescriptor', {
from: deployer.address,
contract: {
abi: NFTPositionDescriptor_ABI,
bytecode: linkedBytecode
},
args: [
WETH9.address,
// 'ETH' as a bytes32 string
'0x4554480000000000000000000000000000000000000000000000000000000000'
]
})
其实这里就是借助linkLibrary函数,将NFTDescriptor的地址链接到NFTTokenPositionDescriptor的Bytecode中。
到此,我们可以验证一下我们的部署脚本是否有问题。我们运行yarn hardhat deploy,如果一切顺利,我们可以看到如下的输出。
Nothing to compile
No need to generate any newer typings.
✨ Done in 1.45s.
简单来说就是没有什么特别的输出,如果这里出现了报错,那么就证明我们的部署脚本出现了问题。有人可能会有疑问,我这里什么参数都没有填,我这合约究竟部署到了什么地方去了?其实,如果我们直接执行deploy脚本,那么他会默认部署到一个本地的网络中。我们也可以通过yarn hardhat node来启动一个本地的网络。但是,因为我们没有启动一个本地网络,所以在deploy时会自动启动一个本地网络用于部署,当部署完成后又会自动的关闭这个网络。所以我们基本看不到任何反馈输入,不过,没有反馈其实就是最好的反馈了。
这一个章节我们把UniswapV3进行了完整部署,有了这个部署,我们就可以在后续的章节中进行一些测试了。当然,有能力的朋友也可以在这上面进行一些初步的合约开发工作。不过我并不是很推荐使用这种方式,因为用这种方式,当合约报错时,你是无法进行精确到行的Debug的。不过这个问题我们将在后面的章节进行解决。在下一章,我们将会部署一个Uniswap的前端进行测试。
文章首发于: ee.web3box.dev 作者:https://twitter.com/BoxMrChen 由SafeHouseDAO出品
import { utils } from 'ethers'
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 {
abi as NFTDescriptor_ABI, bytecode as NFTDescriptor_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/libraries/NFTDescriptor.sol/NFTDescriptor.json'
import {
abi as NFTPositionManager_ABI, bytecode as NFTPositionManager_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json'
import {
abi as NFTPositionDescriptor_ABI, bytecode as NFTPositionDescriptor_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/NonfungibleTokenPositionDescriptor.sol/NonfungibleTokenPositionDescriptor.json'
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
},
})
const WETH9 = await deployments.deploy("WETH9", {
from: deployer.address
})
await deployments.deploy("UniV3SwapRouter", {
from: deployer.address,
contract: {
abi: SWAP_ROUTER_ABI,
bytecode: SWAP_ROUTER_BYTECODE
},
args: [factory.address, WETH9.address]
})
const NFTDescriptorlibrary = await deployments.deploy('NFTDescriptorLibrary', {
from: deployer.address,
contract: {
abi: NFTDescriptor_ABI,
bytecode: NFTDescriptor_BYTECODE
}
})
const linkedBytecode = linkLibrary(NFTPositionDescriptor_BYTECODE,
{
['contracts/libraries/NFTDescriptor.sol:NFTDescriptor']: NFTDescriptorlibrary.address
}
)
const positionDescriptor = await deployments.deploy('NFTPositionDescriptor', {
from: deployer.address,
contract: {
abi: NFTPositionDescriptor_ABI,
bytecode: linkedBytecode
},
args: [
WETH9.address,
// 'ETH' as a bytes32 string
'0x4554480000000000000000000000000000000000000000000000000000000000'
]
})
await deployments.deploy('NFTPositionManager', {
from: deployer.address,
contract: {
abi: NFTPositionManager_ABI,
bytecode: NFTPositionManager_BYTECODE
},
args: [factory.address, WETH9.address, positionDescriptor.address]
})
}
function linkLibrary(bytecode: string, libraries: {
[name: string]: string
} = {}): string {
let linkedBytecode = bytecode
for (const [name, address] of Object.entries(libraries)) {
const placeholder = `__\$${utils.solidityKeccak256(['string'], [name]).slice(2, 36)}\$__`
const formattedAddress = utils.getAddress(address).toLowerCase().replace('0x', '')
if (linkedBytecode.indexOf(placeholder) === -1) {
throw new Error(`Unable to find placeholder for library ${name}`)
}
while (linkedBytecode.indexOf(placeholder) !== -1) {
linkedBytecode = linkedBytecode.replace(placeholder, formattedAddress)
}
}
return linkedBytecode
}
export default func;
import { utils } from 'ethers'
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 {
abi as NFTDescriptor_ABI, bytecode as NFTDescriptor_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/libraries/NFTDescriptor.sol/NFTDescriptor.json'
import {
abi as NFTPositionManager_ABI, bytecode as NFTPositionManager_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json'
import {
abi as NFTPositionDescriptor_ABI, bytecode as NFTPositionDescriptor_BYTECODE
} from '@uniswap/v3-periphery/artifacts/contracts/NonfungibleTokenPositionDescriptor.sol/NonfungibleTokenPositionDescriptor.json'
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
},
})
const WETH9 = await deployments.deploy("WETH9", {
from: deployer.address
})
await deployments.deploy("UniV3SwapRouter", {
from: deployer.address,
contract: {
abi: SWAP_ROUTER_ABI,
bytecode: SWAP_ROUTER_BYTECODE
},
args: [factory.address, WETH9.address]
})
const NFTDescriptorlibrary = await deployments.deploy('NFTDescriptorLibrary', {
from: deployer.address,
contract: {
abi: NFTDescriptor_ABI,
bytecode: NFTDescriptor_BYTECODE
}
})
const linkedBytecode = linkLibrary(NFTPositionDescriptor_BYTECODE,
{
['contracts/libraries/NFTDescriptor.sol:NFTDescriptor']: NFTDescriptorlibrary.address
}
)
const positionDescriptor = await deployments.deploy('NFTPositionDescriptor', {
from: deployer.address,
contract: {
abi: NFTPositionDescriptor_ABI,
bytecode: linkedBytecode
},
args: [
WETH9.address,
// 'ETH' as a bytes32 string
'0x4554480000000000000000000000000000000000000000000000000000000000'
]
})
await deployments.deploy('NFTPositionManager', {
from: deployer.address,
contract: {
abi: NFTPositionManager_ABI,
bytecode: NFTPositionManager_BYTECODE
},
args: [factory.address, WETH9.address, positionDescriptor.address]
})
}
function linkLibrary(bytecode: string, libraries: {
[name: string]: string
} = {}): string {
let linkedBytecode = bytecode
for (const [name, address] of Object.entries(libraries)) {
const placeholder = `__\$${utils.solidityKeccak256(['string'], [name]).slice(2, 36)}\$__`
const formattedAddress = utils.getAddress(address).toLowerCase().replace('0x', '')
if (linkedBytecode.indexOf(placeholder) === -1) {
throw new Error(`Unable to find placeholder for library ${name}`)
}
while (linkedBytecode.indexOf(placeholder) !== -1) {
linkedBytecode = linkedBytecode.replace(placeholder, formattedAddress)
}
}
return linkedBytecode
}
export default func;
No activity yet