@keep-network/tbtc-v2 0.1.1-dev.7 → 0.1.1-dev.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.adoc +12 -0
- package/artifacts/Bank.json +752 -0
- package/artifacts/Bridge.json +2556 -0
- package/artifacts/DefaultProxyAdmin.json +259 -0
- package/artifacts/Deposit.json +117 -0
- package/artifacts/DepositSweep.json +77 -0
- package/artifacts/EcdsaDkgValidator.json +533 -0
- package/artifacts/EcdsaInactivity.json +156 -0
- package/artifacts/Fraud.json +164 -0
- package/artifacts/KeepRegistry.json +99 -0
- package/artifacts/KeepStake.json +286 -0
- package/artifacts/KeepToken.json +711 -0
- package/artifacts/KeepTokenStaking.json +483 -0
- package/artifacts/MovingFunds.json +249 -0
- package/artifacts/NuCypherStakingEscrow.json +256 -0
- package/artifacts/NuCypherToken.json +711 -0
- package/artifacts/RandomBeaconStub.json +141 -0
- package/artifacts/Redemption.json +162 -0
- package/artifacts/ReimbursementPool.json +509 -0
- package/artifacts/Relay.json +123 -0
- package/artifacts/SortitionPool.json +1005 -0
- package/artifacts/T.json +1148 -0
- package/artifacts/TBTC.json +27 -26
- package/artifacts/TBTCToken.json +27 -26
- package/artifacts/TokenStaking.json +2288 -0
- package/artifacts/TokenholderGovernor.json +1795 -0
- package/artifacts/TokenholderTimelock.json +1058 -0
- package/artifacts/VendingMachine.json +30 -29
- package/artifacts/VendingMachineKeep.json +400 -0
- package/artifacts/VendingMachineNuCypher.json +400 -0
- package/artifacts/WalletRegistry.json +2117 -0
- package/artifacts/WalletRegistry_Implementation.json +2824 -0
- package/artifacts/WalletRegistry_Proxy.json +259 -0
- package/artifacts/Wallets.json +186 -0
- package/artifacts/solcInputs/1635d55d57a0a2552952c0d22586ed23.json +56 -0
- package/artifacts/solcInputs/922f95457ca7980d018c851fb3308a7e.json +269 -0
- package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
- package/build/contracts/GovernanceUtils.sol/GovernanceUtils.json +2 -2
- package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
- package/build/contracts/bank/Bank.sol/Bank.json +20 -2
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
- package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
- package/build/contracts/bridge/Bridge.sol/Bridge.json +2546 -128
- package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +4 -0
- package/build/contracts/bridge/BridgeState.sol/BridgeState.json +220 -0
- package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +4 -0
- package/build/contracts/bridge/Deposit.sol/Deposit.json +72 -0
- package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +4 -0
- package/build/contracts/bridge/DepositSweep.sol/DepositSweep.json +30 -0
- package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +4 -0
- package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.json +10 -0
- package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +4 -0
- package/build/contracts/bridge/Fraud.sol/Fraud.json +86 -0
- package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +4 -0
- package/build/contracts/bridge/Heartbeat.sol/Heartbeat.json +10 -0
- package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +4 -0
- package/build/contracts/bridge/IRelay.sol/IRelay.json +37 -0
- package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +4 -0
- package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +138 -0
- package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +4 -0
- package/build/contracts/bridge/Redemption.sol/OutboundTx.json +10 -0
- package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +4 -0
- package/build/contracts/bridge/Redemption.sol/Redemption.json +92 -0
- package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
- package/build/contracts/bridge/VendingMachine.sol/VendingMachine.json +2 -2
- package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +4 -0
- package/build/contracts/bridge/Wallets.sol/Wallets.json +112 -0
- package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
- package/build/contracts/token/TBTC.sol/TBTC.json +2 -2
- package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +4 -0
- package/build/contracts/vault/DonationVault.sol/DonationVault.json +103 -0
- package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
- package/build/contracts/vault/IVault.sol/IVault.json +19 -1
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +36 -18
- package/contracts/GovernanceUtils.sol +1 -1
- package/contracts/bank/Bank.sol +34 -18
- package/contracts/bridge/BitcoinTx.sol +231 -9
- package/contracts/bridge/Bridge.sol +1592 -211
- package/contracts/bridge/BridgeState.sol +714 -0
- package/contracts/bridge/Deposit.sol +271 -0
- package/contracts/bridge/DepositSweep.sol +571 -0
- package/contracts/bridge/EcdsaLib.sol +45 -0
- package/contracts/bridge/Fraud.sol +604 -0
- package/contracts/bridge/Heartbeat.sol +112 -0
- package/contracts/bridge/IRelay.sol +28 -0
- package/contracts/bridge/MovingFunds.sol +1080 -0
- package/contracts/bridge/Redemption.sol +874 -0
- package/contracts/bridge/VendingMachine.sol +1 -1
- package/contracts/bridge/Wallets.sol +553 -0
- package/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler +1 -0
- package/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol +3 -0
- package/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +3 -0
- package/contracts/token/TBTC.sol +1 -1
- package/contracts/vault/DonationVault.sol +125 -0
- package/contracts/vault/IVault.sol +32 -10
- package/contracts/vault/TBTCVault.sol +20 -2
- package/deploy/00_resolve_relay.ts +28 -0
- package/deploy/00_resolve_wallet_registry.ts +83 -0
- package/deploy/04_deploy_bank.ts +27 -0
- package/deploy/05_deploy_bridge.ts +76 -0
- package/deploy/06_bank_update_bridge.ts +19 -0
- package/deploy/07_transfer_ownership.ts +15 -0
- package/deploy/08_transfer_governance.ts +20 -0
- package/deploy/09_transfer_proxy_admin_ownership.ts +23 -0
- package/deploy/10_deploy_proxy_admin_with_deputy.ts +33 -0
- package/export.json +16243 -475
- package/package.json +31 -24
- package/artifacts/solcInputs/25bea07ad744b8c97e466495ad2abf97.json +0 -128
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
// ██████████████ ▐████▌ ██████████████
|
|
4
|
+
// ██████████████ ▐████▌ ██████████████
|
|
5
|
+
// ▐████▌ ▐████▌
|
|
6
|
+
// ▐████▌ ▐████▌
|
|
7
|
+
// ██████████████ ▐████▌ ██████████████
|
|
8
|
+
// ██████████████ ▐████▌ ██████████████
|
|
9
|
+
// ▐████▌ ▐████▌
|
|
10
|
+
// ▐████▌ ▐████▌
|
|
11
|
+
// ▐████▌ ▐████▌
|
|
12
|
+
// ▐████▌ ▐████▌
|
|
13
|
+
// ▐████▌ ▐████▌
|
|
14
|
+
// ▐████▌ ▐████▌
|
|
15
|
+
|
|
16
|
+
pragma solidity ^0.8.9;
|
|
17
|
+
|
|
18
|
+
import "./IVault.sol";
|
|
19
|
+
import "../bank/Bank.sol";
|
|
20
|
+
|
|
21
|
+
/// @title BTC donation vault
|
|
22
|
+
/// @notice Vault that allows making BTC donations to the system. Upon deposit,
|
|
23
|
+
/// this vault does not increase depositors' balances and always
|
|
24
|
+
/// decreases its own balance in the same transaction. The vault also
|
|
25
|
+
/// allows making donations using existing Bank balances.
|
|
26
|
+
///
|
|
27
|
+
/// BEWARE: ALL BTC DEPOSITS TARGETING THIS VAULT ARE NOT REDEEMABLE
|
|
28
|
+
/// AND THERE IS NO WAY TO RESTORE THE DONATED BALANCE.
|
|
29
|
+
/// USE THIS VAULT ONLY WHEN YOU REALLY KNOW WHAT YOU ARE DOING!
|
|
30
|
+
contract DonationVault is IVault {
|
|
31
|
+
Bank public bank;
|
|
32
|
+
|
|
33
|
+
event DonationReceived(address donor, uint256 donatedAmount);
|
|
34
|
+
|
|
35
|
+
modifier onlyBank() {
|
|
36
|
+
require(msg.sender == address(bank), "Caller is not the Bank");
|
|
37
|
+
_;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
constructor(Bank _bank) {
|
|
41
|
+
require(
|
|
42
|
+
address(_bank) != address(0),
|
|
43
|
+
"Bank can not be the zero address"
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
bank = _bank;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// @notice Transfers the given `amount` of the Bank balance from the
|
|
50
|
+
/// caller to the Donation Vault and immediately decreases the
|
|
51
|
+
/// vault's balance in the Bank by the transferred `amount`.
|
|
52
|
+
/// @param amount Amount of the Bank balance to donate
|
|
53
|
+
/// @dev Requirements:
|
|
54
|
+
/// - The caller's balance in the Bank must be greater than or equal
|
|
55
|
+
/// to the `amount`.
|
|
56
|
+
/// - Donation Vault must have an allowance for caller's balance in
|
|
57
|
+
/// the Bank for at least `amount`.
|
|
58
|
+
function donate(uint256 amount) external {
|
|
59
|
+
address donor = msg.sender;
|
|
60
|
+
|
|
61
|
+
require(
|
|
62
|
+
bank.balanceOf(donor) >= amount,
|
|
63
|
+
"Amount exceeds balance in the bank"
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
emit DonationReceived(donor, amount);
|
|
67
|
+
|
|
68
|
+
bank.transferBalanceFrom(donor, address(this), amount);
|
|
69
|
+
bank.decreaseBalance(amount);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// @notice Transfers the given `amount` of the Bank balance from the
|
|
73
|
+
/// `owner` to the Donation Vault and immediately decreases the
|
|
74
|
+
/// vault's balance in the Bank by the transferred `amount`.
|
|
75
|
+
/// @param owner Address of the Bank balance owner who approved their
|
|
76
|
+
/// balance to be used by the vault
|
|
77
|
+
/// @param amount The amount of the Bank balance approved by the owner
|
|
78
|
+
/// to be used by the vault
|
|
79
|
+
/// @dev Requirements:
|
|
80
|
+
/// - Can only be called by the Bank via `approveBalanceAndCall`.
|
|
81
|
+
/// - The `owner` balance in the Bank must be greater than or equal
|
|
82
|
+
/// to the `amount`.
|
|
83
|
+
function receiveBalanceApproval(address owner, uint256 amount)
|
|
84
|
+
external
|
|
85
|
+
override
|
|
86
|
+
onlyBank
|
|
87
|
+
{
|
|
88
|
+
require(
|
|
89
|
+
bank.balanceOf(owner) >= amount,
|
|
90
|
+
"Amount exceeds balance in the bank"
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
emit DonationReceived(owner, amount);
|
|
94
|
+
|
|
95
|
+
bank.transferBalanceFrom(owner, address(this), amount);
|
|
96
|
+
bank.decreaseBalance(amount);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// @notice Ignores the deposited amounts and does not increase depositors'
|
|
100
|
+
/// individual balances. The vault decreases its own tBTC balance
|
|
101
|
+
/// in the Bank by the total deposited amount.
|
|
102
|
+
/// @param depositors Addresses of depositors whose deposits have been swept
|
|
103
|
+
/// @param depositedAmounts Amounts deposited by individual depositors and
|
|
104
|
+
/// swept
|
|
105
|
+
/// @dev Requirements:
|
|
106
|
+
/// - Can only be called by the Bank after the Bridge swept deposits
|
|
107
|
+
/// and Bank increased balance for the vault.
|
|
108
|
+
/// - The `depositors` array must not be empty.
|
|
109
|
+
/// - The `depositors` array length must be equal to the
|
|
110
|
+
/// `depositedAmounts` array length.
|
|
111
|
+
function receiveBalanceIncrease(
|
|
112
|
+
address[] calldata depositors,
|
|
113
|
+
uint256[] calldata depositedAmounts
|
|
114
|
+
) external override onlyBank {
|
|
115
|
+
require(depositors.length != 0, "No depositors specified");
|
|
116
|
+
|
|
117
|
+
uint256 totalAmount = 0;
|
|
118
|
+
for (uint256 i = 0; i < depositors.length; i++) {
|
|
119
|
+
totalAmount += depositedAmounts[i];
|
|
120
|
+
emit DonationReceived(depositors[i], depositedAmounts[i]);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
bank.decreaseBalance(totalAmount);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -13,25 +13,47 @@
|
|
|
13
13
|
// ▐████▌ ▐████▌
|
|
14
14
|
// ▐████▌ ▐████▌
|
|
15
15
|
|
|
16
|
-
pragma solidity 0.8.
|
|
16
|
+
pragma solidity ^0.8.9;
|
|
17
17
|
|
|
18
18
|
/// @title Bank Vault interface
|
|
19
19
|
/// @notice `IVault` is an interface for a smart contract consuming Bank
|
|
20
|
-
/// balances
|
|
21
|
-
/// after sweeping the deposit by the Bridge. This method allows the
|
|
22
|
-
/// depositor to route their deposit revealed to the Bridge to the
|
|
23
|
-
/// particular smart contract in the same transaction the deposit is
|
|
24
|
-
/// revealed. This way, the depositor does not have to execute
|
|
25
|
-
/// additional transaction after the deposit gets swept by the Bridge.
|
|
20
|
+
/// balances of other contracts or externally owned accounts (EOA).
|
|
26
21
|
interface IVault {
|
|
22
|
+
/// @notice Called by the Bank in `approveBalanceAndCall` function after
|
|
23
|
+
/// the balance `owner` approved `amount` of their balance in the
|
|
24
|
+
/// Bank for the vault. This way, the depositor can approve balance
|
|
25
|
+
/// and call the vault to use the approved balance in a single
|
|
26
|
+
/// transaction.
|
|
27
|
+
/// @param owner Address of the Bank balance owner who approved their
|
|
28
|
+
/// balance to be used by the vault
|
|
29
|
+
/// @param amount The amount of the Bank balance approved by the owner
|
|
30
|
+
/// to be used by the vault
|
|
31
|
+
// @dev The implementation must ensure this function can only be called
|
|
32
|
+
/// by the Bank. The Bank does _not_ guarantee that the `amount`
|
|
33
|
+
/// approved by the `owner` currently exists on their balance. That is,
|
|
34
|
+
/// the `owner` could approve more balance than they currently have.
|
|
35
|
+
/// This works the same as `Bank.approve` function. The vault must
|
|
36
|
+
/// ensure the actual balance is checked before performing any action
|
|
37
|
+
/// based on it.
|
|
38
|
+
function receiveBalanceApproval(address owner, uint256 amount) external;
|
|
39
|
+
|
|
27
40
|
/// @notice Called by the Bank in `increaseBalanceAndCall` function after
|
|
28
|
-
/// increasing the balance in the Bank for the vault.
|
|
41
|
+
/// increasing the balance in the Bank for the vault. It happens in
|
|
42
|
+
/// the same transaction in which deposits were swept by the Bridge.
|
|
43
|
+
/// This allows the depositor to route their deposit revealed to the
|
|
44
|
+
/// Bridge to the particular smart contract (vault) in the same
|
|
45
|
+
/// transaction in which the deposit is revealed. This way, the
|
|
46
|
+
/// depositor does not have to execute additional transaction after
|
|
47
|
+
/// the deposit gets swept by the Bridge to approve and transfer
|
|
48
|
+
/// their balance to the vault.
|
|
29
49
|
/// @param depositors Addresses of depositors whose deposits have been swept
|
|
30
50
|
/// @param depositedAmounts Amounts deposited by individual depositors and
|
|
31
51
|
/// swept
|
|
32
52
|
/// @dev The implementation must ensure this function can only be called
|
|
33
|
-
/// by the Bank.
|
|
34
|
-
function
|
|
53
|
+
/// by the Bank. The Bank guarantees that the vault's balance was
|
|
54
|
+
/// increased by the sum of all deposited amounts before this function
|
|
55
|
+
/// is called, in the same transaction.
|
|
56
|
+
function receiveBalanceIncrease(
|
|
35
57
|
address[] calldata depositors,
|
|
36
58
|
uint256[] calldata depositedAmounts
|
|
37
59
|
) external;
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// ▐████▌ ▐████▌
|
|
14
14
|
// ▐████▌ ▐████▌
|
|
15
15
|
|
|
16
|
-
pragma solidity 0.8.
|
|
16
|
+
pragma solidity ^0.8.9;
|
|
17
17
|
|
|
18
18
|
import "./IVault.sol";
|
|
19
19
|
import "../bank/Bank.sol";
|
|
@@ -70,13 +70,31 @@ contract TBTCVault is IVault {
|
|
|
70
70
|
bank.transferBalanceFrom(minter, address(this), amount);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
/// @notice Transfers the given `amount` of the Bank balance from the caller
|
|
74
|
+
/// to TBTC Vault and mints `amount` of TBTC to the caller.
|
|
75
|
+
/// @dev Can only be called by the Bank via `approveBalanceAndCall`.
|
|
76
|
+
/// @param owner The owner who approved their Bank balance
|
|
77
|
+
/// @param amount Amount of TBTC to mint
|
|
78
|
+
function receiveBalanceApproval(address owner, uint256 amount)
|
|
79
|
+
external
|
|
80
|
+
override
|
|
81
|
+
onlyBank
|
|
82
|
+
{
|
|
83
|
+
require(
|
|
84
|
+
bank.balanceOf(owner) >= amount,
|
|
85
|
+
"Amount exceeds balance in the bank"
|
|
86
|
+
);
|
|
87
|
+
_mint(owner, amount);
|
|
88
|
+
bank.transferBalanceFrom(owner, address(this), amount);
|
|
89
|
+
}
|
|
90
|
+
|
|
73
91
|
/// @notice Mints the same amount of TBTC as the deposited amount for each
|
|
74
92
|
/// depositor in the array. Can only be called by the Bank after the
|
|
75
93
|
/// Bridge swept deposits and Bank increased balance for the
|
|
76
94
|
/// vault.
|
|
77
95
|
/// @dev Fails if `depositors` array is empty. Expects the length of
|
|
78
96
|
/// `depositors` and `depositedAmounts` is the same.
|
|
79
|
-
function
|
|
97
|
+
function receiveBalanceIncrease(
|
|
80
98
|
address[] calldata depositors,
|
|
81
99
|
uint256[] calldata depositedAmounts
|
|
82
100
|
) external override onlyBank {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { getNamedAccounts, deployments, helpers } = hre
|
|
6
|
+
const { log } = deployments
|
|
7
|
+
const { deployer } = await getNamedAccounts()
|
|
8
|
+
|
|
9
|
+
const Relay = await deployments.getOrNull("Relay")
|
|
10
|
+
|
|
11
|
+
if (Relay && helpers.address.isValid(Relay.address)) {
|
|
12
|
+
log(`using external Relay at ${Relay.address}`)
|
|
13
|
+
} else if (hre.network.name !== "hardhat") {
|
|
14
|
+
throw new Error("deployed Relay contract not found")
|
|
15
|
+
} else {
|
|
16
|
+
log("deploying Relay stub")
|
|
17
|
+
|
|
18
|
+
await deployments.deploy("Relay", {
|
|
19
|
+
contract: "TestRelay",
|
|
20
|
+
from: deployer,
|
|
21
|
+
log: true,
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default func
|
|
27
|
+
|
|
28
|
+
func.tags = ["Relay"]
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
|
|
3
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
4
|
+
|
|
5
|
+
import deploySortitionPool from "@keep-network/ecdsa/export/deploy/01_deploy_sortition_pool"
|
|
6
|
+
import deployReimbursementPool from "@keep-network/ecdsa/export/deploy/02_deploy_reimbursement_pool"
|
|
7
|
+
import deployDkgValidator from "@keep-network/ecdsa/export/deploy/03_deploy_dkg_validator"
|
|
8
|
+
|
|
9
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
10
|
+
const { getNamedAccounts, deployments, helpers } = hre
|
|
11
|
+
const { log } = deployments
|
|
12
|
+
const { deployer } = await getNamedAccounts()
|
|
13
|
+
|
|
14
|
+
const WalletRegistry = await deployments.getOrNull("WalletRegistry")
|
|
15
|
+
|
|
16
|
+
if (WalletRegistry && helpers.address.isValid(WalletRegistry.address)) {
|
|
17
|
+
log(`using external WalletRegistry at ${WalletRegistry.address}`)
|
|
18
|
+
} else if (hre.network.name !== "hardhat") {
|
|
19
|
+
throw new Error("deployed WalletRegistry contract not found")
|
|
20
|
+
} else {
|
|
21
|
+
// FIXME: This is a workaround deployment. We expect that the `WalletRegistry`
|
|
22
|
+
// contract deployment will be imported from `@keep-network/ecdsa` deployment
|
|
23
|
+
// scripts. But due to some bug or incompatibility of the plugins we use
|
|
24
|
+
// the deployment fails. We need to investigate it further nad get working
|
|
25
|
+
// properly.
|
|
26
|
+
// https://github.com/keep-network/tbtc-v2/issues/267
|
|
27
|
+
log("deploying WalletRegistry")
|
|
28
|
+
|
|
29
|
+
await deploySortitionPool(hre)
|
|
30
|
+
await deployReimbursementPool(hre)
|
|
31
|
+
await deployDkgValidator(hre)
|
|
32
|
+
|
|
33
|
+
const SortitionPool = await deployments.get("SortitionPool")
|
|
34
|
+
const TokenStaking = await deployments.get("TokenStaking")
|
|
35
|
+
const ReimbursementPool = await deployments.get("ReimbursementPool")
|
|
36
|
+
const EcdsaDkgValidator = await deployments.get("EcdsaDkgValidator")
|
|
37
|
+
|
|
38
|
+
// TODO: RandomBeaconStub contract should be replaced by actual implementation of
|
|
39
|
+
// RandomBeacon contract, once @keep-network/random-beacon hardhat deployments
|
|
40
|
+
// scripts are implemented.
|
|
41
|
+
log("deploying RandomBeaconStub contract instead of RandomBeacon")
|
|
42
|
+
const RandomBeacon = await deployments.deploy("RandomBeaconStub", {
|
|
43
|
+
from: deployer,
|
|
44
|
+
log: true,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const EcdsaInactivity = await deployments.deploy("EcdsaInactivity", {
|
|
48
|
+
from: deployer,
|
|
49
|
+
log: true,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
// Use `deployments.deploy` instead of `helpers.upgrades.deployProxy` as
|
|
53
|
+
// to workaround problem with a hardhat-gas-reporter problem described in
|
|
54
|
+
// https://github.com/keep-network/keep-core/pull/2970.
|
|
55
|
+
await deployments.deploy("WalletRegistry", {
|
|
56
|
+
from: deployer,
|
|
57
|
+
args: [SortitionPool.address, TokenStaking.address],
|
|
58
|
+
libraries: {
|
|
59
|
+
EcdsaInactivity: EcdsaInactivity.address,
|
|
60
|
+
},
|
|
61
|
+
proxy: {
|
|
62
|
+
proxyContract: "TransparentUpgradeableProxy",
|
|
63
|
+
viaAdminContract: "DefaultProxyAdmin",
|
|
64
|
+
owner: deployer,
|
|
65
|
+
execute: {
|
|
66
|
+
init: {
|
|
67
|
+
methodName: "initialize",
|
|
68
|
+
args: [
|
|
69
|
+
EcdsaDkgValidator.address,
|
|
70
|
+
RandomBeacon.address,
|
|
71
|
+
ReimbursementPool.address,
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
log: true,
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default func
|
|
82
|
+
|
|
83
|
+
func.tags = ["WalletRegistry"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { deployments, getNamedAccounts } = hre
|
|
6
|
+
const { deploy } = deployments
|
|
7
|
+
const { deployer } = await getNamedAccounts()
|
|
8
|
+
|
|
9
|
+
const Bank = await deploy("Bank", {
|
|
10
|
+
contract:
|
|
11
|
+
deployments.getNetworkName() === "hardhat" ? "BankStub" : undefined,
|
|
12
|
+
from: deployer,
|
|
13
|
+
args: [],
|
|
14
|
+
log: true,
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
if (hre.network.tags.tenderly) {
|
|
18
|
+
await hre.tenderly.verify({
|
|
19
|
+
name: "Bank",
|
|
20
|
+
address: Bank.address,
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default func
|
|
26
|
+
|
|
27
|
+
func.tags = ["Bank"]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { ethers, helpers, deployments, getNamedAccounts } = hre
|
|
6
|
+
const { deploy } = deployments
|
|
7
|
+
const { deployer, treasury } = await getNamedAccounts()
|
|
8
|
+
|
|
9
|
+
const Bank = await deployments.get("Bank")
|
|
10
|
+
const Relay = await deployments.get("Relay")
|
|
11
|
+
|
|
12
|
+
// TODO: Test for mainnet deployment that when `WalletRegistry` is provided
|
|
13
|
+
// in `external/mainnet/` directory it gets resolved correctly, and the deployment
|
|
14
|
+
// script from `@keep-network/ecdsa` is not invoked once again.
|
|
15
|
+
const WalletRegistry = await deployments.get("WalletRegistry")
|
|
16
|
+
|
|
17
|
+
// For local tests use `1`.
|
|
18
|
+
const txProofDifficultyFactor =
|
|
19
|
+
deployments.getNetworkName() === "hardhat" ? 1 : 6
|
|
20
|
+
|
|
21
|
+
const Deposit = await deploy("Deposit", { from: deployer, log: true })
|
|
22
|
+
const DepositSweep = await deploy("DepositSweep", {
|
|
23
|
+
from: deployer,
|
|
24
|
+
log: true,
|
|
25
|
+
})
|
|
26
|
+
const Redemption = await deploy("Redemption", { from: deployer, log: true })
|
|
27
|
+
const Wallets = await deploy("Wallets", { from: deployer, log: true })
|
|
28
|
+
const Fraud = await deploy("Fraud", { from: deployer, log: true })
|
|
29
|
+
const MovingFunds = await deploy("MovingFunds", {
|
|
30
|
+
from: deployer,
|
|
31
|
+
log: true,
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
const bridge = await helpers.upgrades.deployProxy("Bridge", {
|
|
35
|
+
contractName:
|
|
36
|
+
deployments.getNetworkName() === "hardhat" ? "BridgeStub" : undefined,
|
|
37
|
+
initializerArgs: [
|
|
38
|
+
Bank.address,
|
|
39
|
+
Relay.address,
|
|
40
|
+
treasury,
|
|
41
|
+
WalletRegistry.address,
|
|
42
|
+
txProofDifficultyFactor,
|
|
43
|
+
],
|
|
44
|
+
factoryOpts: {
|
|
45
|
+
signer: await ethers.getSigner(deployer),
|
|
46
|
+
libraries: {
|
|
47
|
+
Deposit: Deposit.address,
|
|
48
|
+
DepositSweep: DepositSweep.address,
|
|
49
|
+
Redemption: Redemption.address,
|
|
50
|
+
Wallets: Wallets.address,
|
|
51
|
+
Fraud: Fraud.address,
|
|
52
|
+
MovingFunds: MovingFunds.address,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
proxyOpts: {
|
|
56
|
+
kind: "transparent",
|
|
57
|
+
// Allow external libraries linking. We need to ensure manually that the
|
|
58
|
+
// external libraries we link are upgrade safe, as the OpenZeppelin plugin
|
|
59
|
+
// doesn't perform such a validation yet.
|
|
60
|
+
// See: https://docs.openzeppelin.com/upgrades-plugins/1.x/faq#why-cant-i-use-external-libraries
|
|
61
|
+
unsafeAllow: ["external-library-linking"],
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
if (hre.network.tags.tenderly) {
|
|
66
|
+
await hre.tenderly.verify({
|
|
67
|
+
name: "Bridge",
|
|
68
|
+
address: bridge.address,
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export default func
|
|
74
|
+
|
|
75
|
+
func.tags = ["Bridge"]
|
|
76
|
+
func.dependencies = ["Bank", "Relay", "Treasury", "WalletRegistry"]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { getNamedAccounts, deployments } = hre
|
|
6
|
+
const { execute, log } = deployments
|
|
7
|
+
const { deployer } = await getNamedAccounts()
|
|
8
|
+
|
|
9
|
+
const Bridge = await deployments.get("Bridge")
|
|
10
|
+
|
|
11
|
+
log("updating Bridge in Bank")
|
|
12
|
+
|
|
13
|
+
await execute("Bank", { from: deployer }, "updateBridge", Bridge.address)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default func
|
|
17
|
+
|
|
18
|
+
func.tags = ["BankUpdateBridge"]
|
|
19
|
+
func.dependencies = ["Bank", "Bridge"]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { getNamedAccounts, helpers } = hre
|
|
6
|
+
const { deployer, governance } = await getNamedAccounts()
|
|
7
|
+
|
|
8
|
+
await helpers.ownable.transferOwnership("Bank", governance, deployer)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default func
|
|
12
|
+
|
|
13
|
+
func.tags = ["TransferOwnership"]
|
|
14
|
+
func.dependencies = ["Bank"]
|
|
15
|
+
func.runAtTheEnd = true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
|
|
5
|
+
const { getNamedAccounts, deployments } = hre
|
|
6
|
+
const { deployer, governance } = await getNamedAccounts()
|
|
7
|
+
|
|
8
|
+
await deployments.execute(
|
|
9
|
+
"Bridge",
|
|
10
|
+
{ from: deployer },
|
|
11
|
+
"transferGovernance",
|
|
12
|
+
governance
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default func
|
|
17
|
+
|
|
18
|
+
func.tags = ["TransferGovernance"]
|
|
19
|
+
func.dependencies = ["Bridge"]
|
|
20
|
+
func.runAtTheEnd = true
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import type { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
|
|
5
|
+
const { ethers, getNamedAccounts, upgrades, deployments } = hre
|
|
6
|
+
const { esdm } = await getNamedAccounts()
|
|
7
|
+
const { deployer } = await ethers.getNamedSigners()
|
|
8
|
+
|
|
9
|
+
// TODO: Once a DAO is established we want to switch to ProxyAdminWithDeputy and
|
|
10
|
+
// use the DAO as the proxy admin owner and ESDM as the deputy. Until then we
|
|
11
|
+
// use governance as the owner of ProxyAdmin contract.
|
|
12
|
+
const newProxyAdminOwner = esdm
|
|
13
|
+
|
|
14
|
+
deployments.log(`transferring ProxyAdmin ownership to ${newProxyAdminOwner}`)
|
|
15
|
+
|
|
16
|
+
const proxyAdmin = await upgrades.admin.getInstance()
|
|
17
|
+
await proxyAdmin.connect(deployer).transferOwnership(newProxyAdminOwner)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default func
|
|
21
|
+
|
|
22
|
+
func.tags = ["TransferProxyAdminOwnership"]
|
|
23
|
+
func.dependencies = ["Bridge"]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { HardhatRuntimeEnvironment } from "hardhat/types"
|
|
2
|
+
import type { DeployFunction } from "hardhat-deploy/types"
|
|
3
|
+
|
|
4
|
+
const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => {
|
|
5
|
+
const { ethers, getNamedAccounts, upgrades, deployments } = hre
|
|
6
|
+
const { deployer, dao, esdm } = await getNamedAccounts()
|
|
7
|
+
|
|
8
|
+
const BridgeProxyAdminWithDeputy = await deployments.deploy(
|
|
9
|
+
"BridgeProxyAdminWithDeputy",
|
|
10
|
+
{
|
|
11
|
+
contract: "ProxyAdminWithDeputy",
|
|
12
|
+
from: deployer,
|
|
13
|
+
args: [dao, esdm],
|
|
14
|
+
log: true,
|
|
15
|
+
}
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const Bridge = await deployments.get("Bridge")
|
|
19
|
+
|
|
20
|
+
const proxyAdmin = await upgrades.admin.getInstance()
|
|
21
|
+
|
|
22
|
+
await proxyAdmin
|
|
23
|
+
.connect(await ethers.getSigner(esdm))
|
|
24
|
+
.changeProxyAdmin(Bridge.address, BridgeProxyAdminWithDeputy.address)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default func
|
|
28
|
+
|
|
29
|
+
func.tags = ["BridgeProxyAdminWithDeputy"]
|
|
30
|
+
func.dependencies = ["Bridge"]
|
|
31
|
+
|
|
32
|
+
// TODO: For now we skip this script as DAO is not yet established.
|
|
33
|
+
func.skip = async () => true
|