Hello I'm using the Counters library in my smart contract project! I have multiple contracts in my project but I'm running into a very weird issue when using the counters library and I do not know why this is happening and I can't find a way around it!!!
I'm declaring a variable as "CountersUpgradeable.Counter public ID" and this variable to be used and called from multiple contracts. The issue is when I use the "ID.increment()" functionality. The value of ID would live only inside this contract! so for example if I have contract A and Contract B. if I use "ID.increment()" in contract A it will become 1 if I use it again It will be 2. now if I go to contract B and and use "ID.increment()" ID now would only be 1. I do not understand why this is happening instead of ID becoming 3??? ID now has two values, the first is the value from contract A which is 2, and the second value is 1 which is from contract B! Thank you for talking the time to read my issue, I hope you have a solution or an idea of why this is happening!!
Did you create an instance in each contract or only one instance in Contract A which can also be called by Contract B? It sounds to me like there are two IDs.
thank you so much for your reply! so I declared ID in only one of the contracts as " CountersUpgradeable.Counter public ID". Then I used "using CountersUpgradeable for CountersUpgradeable.Counter;" in both contracts!
Please share the Solidity code. I agree with @maxareo it sounds like you deployed two different contracts. The variable would not be shared between them.
Thank you so much, Yes I'm deploying both contracts, but is there a way around this issue if I want to deploy multiple contracts and increment the same value?
Thank you so much for your response, I'm incrementing the same value. I have "ID" declared In contract C then Contract A and contract B inherit Contract C. From A and B I Increment The ID value!
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Counters.sol";
import "./C.sol";
contract A is C {
using Counters for Counters.Counter;
function incrementId() public {
ID.increment();
}
}
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Counters.sol";
import './C.sol';
contract B is C {
using Counters for Counters.Counter;
function incrementId() public {
ID.increment();
}
}
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Counters.sol";
contract C {
using Counters for Counters.Counter;
Counters.Counter public ID;
}
My js test file looks like
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("ABC", function () {
it("Should increment IDS ", async function () {
let A, a, B, b, C, c;
A = await ethers.getContractFactory("A");
a = await A.deploy();
B = await ethers.getContractFactory("B");
b = await B.deploy();
C = await ethers.getContractFactory("C");
c = await C.deploy();
a.incrementId()
a.incrementId()
b.incrementId()
console.log("contract A ID value: ", await a.ID())
console.log("contract B ID value: ", await b.ID())
console.log("contract C ID value: ", await c.ID())
});
});
my results are:
ABC
contract A ID value: BigNumber { value: "2" }
contract B ID value: BigNumber { value: "1" }
contract C ID value: BigNumber { value: "0" }
✓ Should increment IDS (1097ms)