Library
Assume ContractA
imports LibraryA
, when deploying ContractA
, LibraryA
is embedded into ContractA
if LibraryA
contains only internal
functions.
If LibraryA
contains at least one external
function, LibraryA
must be deployed first, and then linked when deploying ContractA
.
ref:
https://solidity-by-example.org/library/
https://docs.soliditylang.org/en/v0.7.6/using-the-compiler.html
Foundry
In Foundry tests, Foundry will automatically deploy libraries if they have external
functions, so you don't need to explicitly link them.
hardhat-deploy
Whenever the library is changed, hardhat-deploy will deploy a new implementation and upgrade the proxy:
import { DeployFunction } from "hardhat-deploy/dist/types"
import { QuoteVault } from "../typechain-types"
const func: DeployFunction = async function (hre) {
const { deployments, ethers } = hre
// deploy library
await deployments.deploy("PerpFacade", {
from: deployerAddress,
contract: "contracts/lib/PerpFacade.sol:PerpFacade",
})
const perpFacadeDeployment = await deployments.get("PerpFacade")
// deploy upgradeable contract
await deployments.deploy("QuoteVault", {
from: deployerAddress,
contract: "contracts/QuoteVault.sol:QuoteVault",
proxy: {
owner: multisigOwnerAddress, // ProxyAdmin.owner
proxyContract: "OpenZeppelinTransparentProxy",
viaAdminContract: "DefaultProxyAdmin",
execute: {
init: {
methodName: "initialize",
args: [
"Kantaban USDC-ETH QuoteVault",
"kUSDC-ETH",
usdcDecimals,
USDC,
WETH,
],
},
},
},
libraries: {
PerpFacade: perpFacadeDeployment.address,
},
})
const quoteVaultDeployment = await deployments.get("QuoteVault")
// must specify library address when instantiating the contract:
const quoteVaultFactory = await ethers.getContractFactory("contracts/QuoteVault.sol:QuoteVault", {
libraries: {
PerpFacade: perpFacadeDeployment.address,
},
})
const quoteVault = quoteVaultFactory.attach(quoteVaultDeployment.address) as unknown as QuoteVault
console.log(await quoteVault.decimals())
}
export default func
ref:
https://github.com/wighawag/hardhat-deploy#handling-contract-using-libraries