反应连接 Metamask 并将签名者传递给多个合同
React connecting Metamask and passing signer to multiple contracts
我正在尝试弄清楚如何在多个 js 文件之间共享签名者。我有一个文件 walletConnect.js,我可以在其中连接到 Metamask 并获取 ERC20 代币合约。这很好用。
async function connect(){
try{
const accounts = await ethereum.request({
method: "eth_requestAccounts",
});
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
// ERC20 token contract
const tokenContract = new ethers.Contract(
tokenAddress,
tokenAbi,
signer
);
} catch (e) {
console.log(e);
}
}
然后我有另一个文件stake.js,我将代币存入合约
async function stakeToken() {
try {
const stakingContract = new ethers.Contract(
contractAddress,
contractAbi,
signer
);
// approve contract
await tokenContract.approve(stakingContract.address, maxAmount);
// stake tokens
await stakingContract.stakeTokens(
tokenContract.address,
amount
);
} catch (e) {
console.log(e);
}
}
如果我将所有代码都放在一个文件中,一切正常。我使用 useState 钩子,一切都很好。但是,我将有多个质押合约,我想将它们保存在单独的 javascript 文件中。有多个文件时如何操作?
我创建了一个像这样的钩子contracts.js
import { ethers } from "ethers";
export const useContract = (address, abi) => {
try {
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(address, abi, signer);
return contract;
} catch (e) {
console.log(e);
return false;
}
};
现在我只需从任何脚本调用 useContract,它 returns 一个合同
const stakingContract = useContract(someAddress, someAbi);
这样我省去了很多冗余代码
我正在尝试弄清楚如何在多个 js 文件之间共享签名者。我有一个文件 walletConnect.js,我可以在其中连接到 Metamask 并获取 ERC20 代币合约。这很好用。
async function connect(){
try{
const accounts = await ethereum.request({
method: "eth_requestAccounts",
});
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
// ERC20 token contract
const tokenContract = new ethers.Contract(
tokenAddress,
tokenAbi,
signer
);
} catch (e) {
console.log(e);
}
}
然后我有另一个文件stake.js,我将代币存入合约
async function stakeToken() {
try {
const stakingContract = new ethers.Contract(
contractAddress,
contractAbi,
signer
);
// approve contract
await tokenContract.approve(stakingContract.address, maxAmount);
// stake tokens
await stakingContract.stakeTokens(
tokenContract.address,
amount
);
} catch (e) {
console.log(e);
}
}
如果我将所有代码都放在一个文件中,一切正常。我使用 useState 钩子,一切都很好。但是,我将有多个质押合约,我想将它们保存在单独的 javascript 文件中。有多个文件时如何操作?
我创建了一个像这样的钩子contracts.js
import { ethers } from "ethers";
export const useContract = (address, abi) => {
try {
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(address, abi, signer);
return contract;
} catch (e) {
console.log(e);
return false;
}
};
现在我只需从任何脚本调用 useContract,它 returns 一个合同
const stakingContract = useContract(someAddress, someAbi);
这样我省去了很多冗余代码