现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西
用ether.js而不是web3.js的原因是简单,爽
npm i web3modal
npm i ethers
//另外还需要安装对应wallet的包,自行搜索就行
// MM默认就有,无需显式加入
const providerOptions = {
walletconnect: {
package: walletconnectProvider,
options: {
infuraId: "",
},
},
};
//构建Web3Modal对象
const web3Modal = new Web3Modal({
//缓存provider
cacheProvider: true,
providerOptions,
});
//连接wallet
async function connect() {
try {
const web3ModalProvider = await web3Modal.connect();
provider = new ethers.providers.Web3Provider(web3ModalProvider);
//注册监听,比如disconnect,accountsChanged,chainChanged
registerEthListener(web3ModalProvider);
//主要是处理业务上的需求
updateCurrentStatus(await provider.listAccounts());
} catch (error) {
console.log(error);
}
}
//可以根据自己的需要些具体的内容
function registerEthListener(web3ModalProvider) {
web3ModalProvider
.on("disconnect", (error) => {
})
.on("accountsChanged", (accounts) => {
})
.on("chainChanged", (chainId) => {
});
}
//你需要的network信息
const networkInfo = {
localhardhat: {
//这里一定要16进制,不然报错
chainId: "0x539",
chainName: "LOCALHARDHAT",
nativeCurrency: {
name: "LOCALHARDHAT",
symbol: "LH",
decimals: 18,
},
rpcUrls: ["http://192.168.50.36:8545/"],
blockExplorerUrls: ["http://192.168.50.36:8545/"],
},
matic: {
chainId: "0x89",
chainName: "Ploygon",
nativeCurrency: {
name: "MATIC",
symbol: "MATIC",
decimals: 18,
},
rpcUrls: ["https://rpc-mainnet.maticvigil.com/"],
blockExplorerUrls: ["https://polygonscan.com/"],
},
};
//切换网络
//walletProvider是上面的web3ModalProvider,而不是ethers获取的provider
async function switchNetwork(network, walletProvider) {
try {
await walletProvider.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: networkInfo[network].chainId }],
});
} catch (error) {
console.log(error);
if ((error.code = 4902)) {
return await addNetwork(network, walletProvider);
}
throw error;
}
}
//添加网络
async function addNetwork(network, walletProvider) {
try {
return await walletProvider.request({
method: "wallet_addEthereumChain",
params: [networkInfo[network]],
});
} catch (error) {
console.log(error);
}
}
这里要引入一个number包用于计算
npm i big-number
//引入项目
import BigNumber from "bignumber.js";
//预估gas,并且调用合约
//functionName:你要调用的方法,如safeMint
//args:调用合约的参数,array类型,例如[arg1, arg2, arg3, {}],最后的{}不能少,函数中会将计算出来的gas要放里面,如果要传入eth,则最后的{}为{value:xxx}
async function executeContractMethosWithEstimatedGas(
functionName,
args
) {
//合约信息,provider是连接ethers时的
const contract=new ethers.Contract(contractAddress,contractAbi,provider);
const estimatedGas = new BigNumber(
ethersOf(
await contract.estimateGasfunctionName
.then((value) => {
const minimumGas = ethers.BigNumber.from("300000");
if (value.lt(minimumGas)) {
return minimumGas;
}
return values;
})
.catch((error) => {
//出错时给个固定值
return ethers.BigNumber.from("700000");
})
)
);
//将计算结果放入参数中
const argsForOverridden = args.pop();
args.gasLimit = parseEthers(estimatedGas.times(1.2).toString());
args.push(argsForOverridden);
return contract.connect(getSigner())functionName;
}
//以下是周边函数
function getSigner(){
if(!provider){
console.log("please connect awallet first");
return;
}
return provider.getSigner();
}
function parseUnits(amount,unit){
const bnAmount=new BigNumber(amount);
try {
return ethers.utils.parseUnits(bnAmount.toFixed(unit),unit);
} catch (error) {
return ethers.BigNumber.from(bnAmount.times(Math.pow(10,unit)).toFixed(0));
}
}
const ETHER_DECIMALS=18;
function parseEthers(amount){
return parseUnits(amount,ETHER_DECIMALS);
}
function ethersOf(amount){
return ethers.utils.formatEther(amount);
}
说明:一个写操作分为两步。1.提交执行,2.网络确认。类似uni页面操作后会有pending
//tx是上面executeContractMethosWithEstimatedGas会返回的结果
async function waitForTransaction(tx){
//2是网络确认数量,自定义
return await provider.waitForTransaction(tx.hash,2);
}
以上就是一些基础操作,还有个读合约,那个别的网站都有,就没贴了
签名:
现在网站会提供很多种钱包,web3modal可以提供统一的provider,不需要你操心太多东西
用ether.js而不是web3.js的原因是简单,爽
npm i web3modal
npm i ethers
//另外还需要安装对应wallet的包,自行搜索就行
// MM默认就有,无需显式加入
const providerOptions = {
walletconnect: {
package: walletconnectProvider,
options: {
infuraId: "",
},
},
};
//构建Web3Modal对象
const web3Modal = new Web3Modal({
//缓存provider
cacheProvider: true,
providerOptions,
});
//连接wallet
async function connect() {
try {
const web3ModalProvider = await web3Modal.connect();
provider = new ethers.providers.Web3Provider(web3ModalProvider);
//注册监听,比如disconnect,accountsChanged,chainChanged
registerEthListener(web3ModalProvider);
//主要是处理业务上的需求
updateCurrentStatus(await provider.listAccounts());
} catch (error) {
console.log(error);
}
}
//可以根据自己的需要些具体的内容
function registerEthListener(web3ModalProvider) {
web3ModalProvider
.on("disconnect", (error) => {
})
.on("accountsChanged", (accounts) => {
})
.on("chainChanged", (chainId) => {
});
}
//你需要的network信息
const networkInfo = {
localhardhat: {
//这里一定要16进制,不然报错
chainId: "0x539",
chainName: "LOCALHARDHAT",
nativeCurrency: {
name: "LOCALHARDHAT",
symbol: "LH",
decimals: 18,
},
rpcUrls: ["http://192.168.50.36:8545/"],
blockExplorerUrls: ["http://192.168.50.36:8545/"],
},
matic: {
chainId: "0x89",
chainName: "Ploygon",
nativeCurrency: {
name: "MATIC",
symbol: "MATIC",
decimals: 18,
},
rpcUrls: ["https://rpc-mainnet.maticvigil.com/"],
blockExplorerUrls: ["https://polygonscan.com/"],
},
};
//切换网络
//walletProvider是上面的web3ModalProvider,而不是ethers获取的provider
async function switchNetwork(network, walletProvider) {
try {
await walletProvider.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: networkInfo[network].chainId }],
});
} catch (error) {
console.log(error);
if ((error.code = 4902)) {
return await addNetwork(network, walletProvider);
}
throw error;
}
}
//添加网络
async function addNetwork(network, walletProvider) {
try {
return await walletProvider.request({
method: "wallet_addEthereumChain",
params: [networkInfo[network]],
});
} catch (error) {
console.log(error);
}
}
这里要引入一个number包用于计算
npm i big-number
//引入项目
import BigNumber from "bignumber.js";
//预估gas,并且调用合约
//functionName:你要调用的方法,如safeMint
//args:调用合约的参数,array类型,例如[arg1, arg2, arg3, {}],最后的{}不能少,函数中会将计算出来的gas要放里面,如果要传入eth,则最后的{}为{value:xxx}
async function executeContractMethosWithEstimatedGas(
functionName,
args
) {
//合约信息,provider是连接ethers时的
const contract=new ethers.Contract(contractAddress,contractAbi,provider);
const estimatedGas = new BigNumber(
ethersOf(
await contract.estimateGasfunctionName
.then((value) => {
const minimumGas = ethers.BigNumber.from("300000");
if (value.lt(minimumGas)) {
return minimumGas;
}
return values;
})
.catch((error) => {
//出错时给个固定值
return ethers.BigNumber.from("700000");
})
)
);
//将计算结果放入参数中
const argsForOverridden = args.pop();
args.gasLimit = parseEthers(estimatedGas.times(1.2).toString());
args.push(argsForOverridden);
return contract.connect(getSigner())functionName;
}
//以下是周边函数
function getSigner(){
if(!provider){
console.log("please connect awallet first");
return;
}
return provider.getSigner();
}
function parseUnits(amount,unit){
const bnAmount=new BigNumber(amount);
try {
return ethers.utils.parseUnits(bnAmount.toFixed(unit),unit);
} catch (error) {
return ethers.BigNumber.from(bnAmount.times(Math.pow(10,unit)).toFixed(0));
}
}
const ETHER_DECIMALS=18;
function parseEthers(amount){
return parseUnits(amount,ETHER_DECIMALS);
}
function ethersOf(amount){
return ethers.utils.formatEther(amount);
}
说明:一个写操作分为两步。1.提交执行,2.网络确认。类似uni页面操作后会有pending
//tx是上面executeContractMethosWithEstimatedGas会返回的结果
async function waitForTransaction(tx){
//2是网络确认数量,自定义
return await provider.waitForTransaction(tx.hash,2);
}
以上就是一些基础操作,还有个读合约,那个别的网站都有,就没贴了
签名:
ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
Go获取合约事件日志
func main() { client, err := ethclient.Dial("https://rinkeby-light.eth.linkpool.io/") if err != nil { log.Fatal(err) } //获取当前的最新区块 header, err := client.HeaderByNumber(context.Background(), nil) if err != nil { log.Fatal(err) } fmt.Println("最新区块", header.Number.String()) // 5671744 //开始查询日志,可以添加过滤条件,查询符合你想要的日志 query := ethereum.FilterQuery{ FromBlock: big.NewInt( 10570948), ToBlock: header.Number, Addresses: []common.Address{ common.HexToAddress("0x40490DF1cc631817D24BA324147c59821C8970BF"), ...
ETH源码学习(2)GetBalance
从这开始读,因为最简单。还能对重要的东西有所理解。如果是单节点debug,重启链之后余额会归零,所以最少要两个节点,同步区块就没这个问题了,具体原因还未知。 声明:eth版本:Geth/v1.10.7-unstable/darwin-arm64/go1.17.5,我对比了网上的一些文章,这块代码有改动,主要以下改变从BlockChain的snap中读account几乎放弃从trie中获取account,判断极为严苛,我想不到有什么情况能进入,应该是放弃了这层分析入口//命令 eth.getBalance('0x0d7dd6dbabee2ec9b325aa7aa8b42d75068e8597') //入口 func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { //获取statedb state, _, err := s.b.StateAndHea...
ETH源码学习(1)创建私有链
下载geth,创建genesis.json{ "config": { "chainId": 8888, //自行修改 "homesteadBlock": 0, "daoForkBlock": 0, "daoForkSupport": true, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "ethash": {} }, "nonce": "0x42", "timestamp": "0x0", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0xffffffff", "difficulty": "0x700000",//难度,越大挖矿越慢 "alloc": { "093f59f1d91017d30d8c2caa78feb5beb0d2cfaf...
Go获取合约事件日志
func main() { client, err := ethclient.Dial("https://rinkeby-light.eth.linkpool.io/") if err != nil { log.Fatal(err) } //获取当前的最新区块 header, err := client.HeaderByNumber(context.Background(), nil) if err != nil { log.Fatal(err) } fmt.Println("最新区块", header.Number.String()) // 5671744 //开始查询日志,可以添加过滤条件,查询符合你想要的日志 query := ethereum.FilterQuery{ FromBlock: big.NewInt( 10570948), ToBlock: header.Number, Addresses: []common.Address{ common.HexToAddress("0x40490DF1cc631817D24BA324147c59821C8970BF"), ...
Share Dialog
Share Dialog
Subscribe to point
Subscribe to point
<100 subscribers
<100 subscribers
No activity yet