I might be misunderstanding how deployment works but I have been trying to deploy my smart contract to Defender Testnet by following this guide https://docs.openzeppelin.com/defender/v2/tutorial/deploy. I have the correct API Keys but in my deploy script, I am trying to use a relayer to support meta transactions. Whenever I do deploy, it goes on the sepolia testnet but I can't see it on the Defender testnet.
Also for my code, I can't seem to add a wait function after deploying my smart contract as it always gives me this error
C:\Users\Jexarx\React\Final Year Project\backend\node_modules\ethers\src.ts\providers\provider.ts:1585
if ((await receipt.confirmations()) >= confirms) {
^
TypeError: receipt.confirmations is not a function
at DefenderRelayProvider.txListener (C:\Users\Jexarx\React\Final Year Project\backend\node_modules\ethers\src.ts\providers\provider.ts:1585:36)
at Timeout._onTimeout (C:\Users\Jexarx\React\Final Year Project\backend\node_modules\@ethersproject\providers\src.ts\base-provider.ts:2137:32)
at listOnTimeout (node:internal/timers:569:17)
at processTimers (node:internal/timers:512:7)
Details
When I run my code without the wait, it reaches the end and I can see it as a pending transaction on sepolia testnet and my relayer. Can I interact with the smart contract now that its on the sepolia testnet and I don't need it on Defender testnet?
Environment
I'm using Defender, Relayer and a Testnet
The code
require('dotenv').config();
const {
DefenderRelaySigner,
DefenderRelayProvider,
} = require('@openzeppelin/defender-relay-client/lib/ethers');
const { ethers } = require('hardhat');
const { writeFileSync } = require('fs');
require("@nomicfoundation/hardhat-ethers");
// tutorial from https://docs.openzeppelin.com/defender/v1/guide-metatx
async function main() {
const credentials = { apiKey: process.env.RELAYER_KEY, apiSecret: process.env.RELAYER_SECRET };
const initialSupply = 10000000;
const TRUSTED_FORWARDER = process.env.RELAYER_AUTO_ADDRESS;
const provider = new DefenderRelayProvider(credentials);
const relaySigner = new DefenderRelaySigner(credentials, provider, { speed: 'fast'});
const traceCreditFactory = await ethers.getContractFactory("TraceCredit", { signer: relaySigner});
// const traceCredit = await ethers.deployContract("TraceCredit", [initialSupply], { signer: relaySigner });
// await traceCredit.waitForDeployment();
// const traceCreditAddress = await traceCredit.getAddress();
const traceCredit = await traceCreditFactory.deploy(initialSupply);
const traceCreditAddress = await traceCredit.getAddress();
const nodeManagerFactory = await ethers.getContractFactory("NodeManager", { signer: relaySigner });
// const nodeManager = await nodeManagerFactory.deploy(traceCreditAddress, TRUSTED_FORWARDER);
// const nodeManagerAddress = await nodeManager.getAddress();
const nodeManager = await nodeManagerFactory.deploy(traceCreditAddress, TRUSTED_FORWARDER)
const nodeManagerAddress = await nodeManager.getAddress();
// check if thing is deployed first
writeFileSync('deploy.json', JSON.stringify({
nodeManager: nodeManagerAddress,
}, null, 2));
console.log('Contract deployed');
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
My hardhat config
import 'dotenv/config';
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-ethers";
import "@openzeppelin/hardhat-upgrades";
require("@nomicfoundation/hardhat-toolbox");
const config: HardhatUserConfig = {
solidity: {
compilers: [
{
version: "0.8.19",
},
{
version: "0.8.20",
settings: {},
},
],
},
defender: {
apiKey: process.env.TEST_ENV_API_KEY,
apiSecret: process.env.TEST_ENV_API_SECRET_KEY
},
networks: {
sepolia: {
url: "https://ethereum-sepolia-rpc.publicnode.com",
chainId: 11155111
}
}
};
export default config;
The command I use
npx hardhat run --network sepolia scripts/deploy.js
Again, if I am misunderstanding something and I have already deployed it successfully on the sepolia testnet and can interact with my smart contract now, please let me know.