@keep-network/tbtc-v2 0.1.0 → 0.1.1-dev
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/.chainId +1 -1
- package/artifacts/Bank.json +807 -0
- package/artifacts/Bridge.json +2300 -0
- package/artifacts/Deposit.json +117 -0
- package/artifacts/DepositSweep.json +77 -0
- package/artifacts/EcdsaDkgValidator.json +532 -0
- package/artifacts/EcdsaInactivity.json +156 -0
- package/artifacts/EcdsaSortitionPool.json +1004 -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 +174 -0
- package/artifacts/ReimbursementPool.json +509 -0
- package/artifacts/Relay.json +123 -0
- package/artifacts/T.json +1148 -0
- package/artifacts/TBTC.json +36 -35
- package/artifacts/TBTCToken.json +738 -0
- package/artifacts/TBTCVault.json +691 -0
- package/artifacts/TokenStaking.json +2288 -0
- package/artifacts/TokenholderGovernor.json +1795 -0
- package/artifacts/TokenholderTimelock.json +1058 -0
- package/artifacts/VendingMachine.json +34 -33
- package/artifacts/VendingMachineKeep.json +400 -0
- package/artifacts/VendingMachineNuCypher.json +400 -0
- package/artifacts/WalletRegistry.json +1843 -0
- package/artifacts/WalletRegistryGovernance.json +2754 -0
- package/artifacts/Wallets.json +186 -0
- package/artifacts/solcInputs/5e62cff1ead0900b07facca4b559e818.json +314 -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 +4 -0
- package/build/contracts/bank/Bank.sol/Bank.json +542 -0
- package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +4 -0
- package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.json +34 -0
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +4 -0
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +10 -0
- package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +4 -0
- package/build/contracts/bridge/Bridge.sol/Bridge.json +2686 -0
- package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +4 -0
- package/build/contracts/bridge/BridgeState.sol/BridgeState.json +226 -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 +4 -4
- package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +4 -0
- package/build/contracts/vault/DonationVault.sol/DonationVault.json +108 -0
- package/build/contracts/vault/IVault.sol/IVault.dbg.json +4 -0
- package/build/contracts/vault/IVault.sol/IVault.json +52 -0
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +4 -0
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.json +449 -0
- package/contracts/GovernanceUtils.sol +4 -4
- package/contracts/bank/Bank.sol +436 -0
- package/contracts/bank/IReceiveBalanceApproval.sol +45 -0
- package/contracts/bridge/BitcoinTx.sol +326 -0
- package/contracts/bridge/Bridge.sol +1793 -0
- package/contracts/bridge/BridgeState.sol +739 -0
- package/contracts/bridge/Deposit.sol +269 -0
- package/contracts/bridge/DepositSweep.sol +574 -0
- package/contracts/bridge/EcdsaLib.sol +45 -0
- package/contracts/bridge/Fraud.sol +579 -0
- package/contracts/bridge/Heartbeat.sol +112 -0
- package/contracts/bridge/IRelay.sol +28 -0
- package/contracts/bridge/MovingFunds.sol +1077 -0
- package/contracts/bridge/Redemption.sol +1020 -0
- package/contracts/bridge/VendingMachine.sol +2 -2
- package/contracts/bridge/Wallets.sol +719 -0
- package/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler +1 -0
- package/contracts/hardhat-dependency-compiler/@keep-network/ecdsa/contracts/WalletRegistry.sol +3 -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 +44 -0
- package/contracts/vault/TBTCVault.sol +305 -0
- package/deploy/00_resolve_relay.ts +28 -0
- package/deploy/00_resolve_tbtc_v1_token.ts +1 -1
- package/deploy/01_deploy_tbtc_v2_token.ts +8 -1
- package/deploy/02_deploy_vending_machine.ts +7 -0
- package/deploy/{03_transfer_roles.ts → 03_transfer_vending_machine_roles.ts} +1 -1
- package/deploy/04_deploy_bank.ts +27 -0
- package/deploy/05_deploy_bridge.ts +80 -0
- package/deploy/06_deploy_tbtc_vault.ts +30 -0
- package/deploy/07_bank_update_bridge.ts +19 -0
- package/deploy/08_transfer_bank_ownership.ts +15 -0
- package/deploy/09_transfer_tbtc_vault_ownership.ts +15 -0
- package/deploy/10_transfer_bridge_governance.ts +20 -0
- package/deploy/11_initialize_wallet_owner.ts +18 -0
- package/deploy/11_transfer_proxy_admin_ownership.ts +30 -0
- package/deploy/12_deploy_proxy_admin_with_deputy.ts +33 -0
- package/export/deploy/00_resolve_relay.js +24 -0
- package/export/deploy/00_resolve_tbtc_v1_token.js +24 -0
- package/export/deploy/01_deploy_tbtc_v2_token.js +19 -0
- package/export/deploy/02_deploy_vending_machine.js +25 -0
- package/export/deploy/03_transfer_vending_machine_roles.js +19 -0
- package/export/deploy/04_deploy_bank.js +21 -0
- package/export/deploy/05_deploy_bridge.js +69 -0
- package/export/deploy/06_deploy_tbtc_vault.js +24 -0
- package/export/deploy/07_bank_update_bridge.js +13 -0
- package/export/deploy/08_transfer_bank_ownership.js +11 -0
- package/export/deploy/09_transfer_tbtc_vault_ownership.js +11 -0
- package/export/deploy/10_transfer_bridge_governance.js +11 -0
- package/export/deploy/11_initialize_wallet_owner.js +14 -0
- package/export/deploy/11_transfer_proxy_admin_ownership.js +23 -0
- package/export/deploy/12_deploy_proxy_admin_with_deputy.js +22 -0
- package/export/hardhat.config.js +169 -0
- package/export/test/bank/Bank.test.js +1012 -0
- package/export/test/bridge/Bridge.Deployment.test.js +76 -0
- package/export/test/bridge/Bridge.Deposit.test.js +1834 -0
- package/export/test/bridge/Bridge.Frauds.test.js +1349 -0
- package/export/test/bridge/Bridge.MovingFunds.test.js +2437 -0
- package/export/test/bridge/Bridge.Parameters.test.js +400 -0
- package/export/test/bridge/Bridge.Redemption.test.js +2523 -0
- package/export/test/bridge/Bridge.Vaults.test.js +74 -0
- package/export/test/bridge/Bridge.Wallets.test.js +1017 -0
- package/export/test/bridge/EcdsaLib.test.js +46 -0
- package/export/test/bridge/Heartbeat.test.js +77 -0
- package/export/test/bridge/VendingMachine.Upgrade.test.js +160 -0
- package/export/test/bridge/VendingMachine.test.js +762 -0
- package/export/test/data/deposit-sweep.js +655 -0
- package/export/test/data/ecdsa.js +18 -0
- package/export/test/data/fraud.js +158 -0
- package/export/test/data/moving-funds.js +815 -0
- package/export/test/data/redemption.js +1011 -0
- package/export/test/fixtures/bridge.js +54 -0
- package/export/test/fixtures/index.js +57 -0
- package/export/test/helpers/contract-test-helpers.js +18 -0
- package/export/test/integration/Slashing.test.js +279 -0
- package/export/test/integration/WalleCreation.test.js +66 -0
- package/export/test/integration/utils/ecdsa-wallet-registry.js +137 -0
- package/export/test/integration/utils/fixture.js +77 -0
- package/export/test/integration/utils/gas.js +36 -0
- package/export/test/integration/utils/random-beacon.js +26 -0
- package/export/test/integration/utils/staking.js +19 -0
- package/export/test/vault/DonationVault.test.js +202 -0
- package/export/test/vault/TBTCVault.Redemption.test.js +357 -0
- package/export/test/vault/TBTCVault.test.js +768 -0
- package/export/typechain/BTCUtils.js +2 -0
- package/export/typechain/Bank.js +2 -0
- package/export/typechain/BankStub.js +2 -0
- package/export/typechain/Bridge.js +2 -0
- package/export/typechain/BridgeState.js +2 -0
- package/export/typechain/BridgeStub.js +2 -0
- package/export/typechain/Deposit.js +2 -0
- package/export/typechain/DepositSweep.js +2 -0
- package/export/typechain/DonationVault.js +2 -0
- package/export/typechain/ERC165.js +2 -0
- package/export/typechain/ERC1967Proxy.js +2 -0
- package/export/typechain/ERC1967Upgrade.js +2 -0
- package/export/typechain/ERC20WithPermit.js +2 -0
- package/export/typechain/ERC721.js +2 -0
- package/export/typechain/EcdsaAuthorization.js +2 -0
- package/export/typechain/EcdsaDkg.js +2 -0
- package/export/typechain/EcdsaDkgValidator.js +2 -0
- package/export/typechain/EcdsaInactivity.js +2 -0
- package/export/typechain/Fraud.js +2 -0
- package/export/typechain/Governable.js +2 -0
- package/export/typechain/HeartbeatStub.js +2 -0
- package/export/typechain/IApplication.js +2 -0
- package/export/typechain/IApproveAndCall.js +2 -0
- package/export/typechain/IBeacon.js +2 -0
- package/export/typechain/IERC165.js +2 -0
- package/export/typechain/IERC1822Proxiable.js +2 -0
- package/export/typechain/IERC20.js +2 -0
- package/export/typechain/IERC20Metadata.js +2 -0
- package/export/typechain/IERC20WithPermit.js +2 -0
- package/export/typechain/IERC721.js +2 -0
- package/export/typechain/IERC721Metadata.js +2 -0
- package/export/typechain/IERC721Receiver.js +2 -0
- package/export/typechain/IRandomBeacon.js +2 -0
- package/export/typechain/IRandomBeaconConsumer.js +2 -0
- package/export/typechain/IReceiveApproval.js +2 -0
- package/export/typechain/IReceiveBalanceApproval.js +2 -0
- package/export/typechain/IRelay.js +2 -0
- package/export/typechain/IStaking.js +2 -0
- package/export/typechain/IVault.js +2 -0
- package/export/typechain/IWalletOwner.js +2 -0
- package/export/typechain/IWalletRegistry.js +2 -0
- package/export/typechain/Initializable.js +2 -0
- package/export/typechain/MisfundRecovery.js +2 -0
- package/export/typechain/MovingFunds.js +2 -0
- package/export/typechain/Ownable.js +2 -0
- package/export/typechain/Proxy.js +2 -0
- package/export/typechain/ProxyAdmin.js +2 -0
- package/export/typechain/ReceiveApprovalStub.js +2 -0
- package/export/typechain/Redemption.js +2 -0
- package/export/typechain/Reimbursable.js +2 -0
- package/export/typechain/ReimbursementPool.js +2 -0
- package/export/typechain/Rewards.js +2 -0
- package/export/typechain/SortitionPool.js +2 -0
- package/export/typechain/SortitionTree.js +2 -0
- package/export/typechain/TBTC.js +2 -0
- package/export/typechain/TBTCVault.js +2 -0
- package/export/typechain/TestERC20.js +2 -0
- package/export/typechain/TestERC721.js +2 -0
- package/export/typechain/TestEcdsaLib.js +2 -0
- package/export/typechain/TestRelay.js +2 -0
- package/export/typechain/TransparentUpgradeableProxy.js +2 -0
- package/export/typechain/VendingMachine.js +2 -0
- package/export/typechain/WalletRegistry.js +2 -0
- package/export/typechain/Wallets.js +2 -0
- package/export/typechain/common.js +2 -0
- package/export/typechain/factories/BTCUtils__factory.js +94 -0
- package/export/typechain/factories/BankStub__factory.js +586 -0
- package/export/typechain/factories/Bank__factory.js +573 -0
- package/export/typechain/factories/BridgeState__factory.js +257 -0
- package/export/typechain/factories/BridgeStub__factory.js +2912 -0
- package/export/typechain/factories/Bridge__factory.js +2526 -0
- package/export/typechain/factories/DepositSweep__factory.js +61 -0
- package/export/typechain/factories/Deposit__factory.js +103 -0
- package/export/typechain/factories/DonationVault__factory.js +139 -0
- package/export/typechain/factories/ERC165__factory.js +38 -0
- package/export/typechain/factories/ERC1967Proxy__factory.js +111 -0
- package/export/typechain/factories/ERC1967Upgrade__factory.js +64 -0
- package/export/typechain/factories/ERC20WithPermit__factory.js +524 -0
- package/export/typechain/factories/ERC721__factory.js +388 -0
- package/export/typechain/factories/EcdsaAuthorization__factory.js +211 -0
- package/export/typechain/factories/EcdsaDkgValidator__factory.js +441 -0
- package/export/typechain/factories/EcdsaDkg__factory.js +192 -0
- package/export/typechain/factories/EcdsaInactivity__factory.js +134 -0
- package/export/typechain/factories/Fraud__factory.js +117 -0
- package/export/typechain/factories/Governable__factory.js +64 -0
- package/export/typechain/factories/HeartbeatStub__factory.js +61 -0
- package/export/typechain/factories/IApplication__factory.js +152 -0
- package/export/typechain/factories/IApproveAndCall__factory.js +48 -0
- package/export/typechain/factories/IBeacon__factory.js +32 -0
- package/export/typechain/factories/IERC165__factory.js +38 -0
- package/export/typechain/factories/IERC1822Proxiable__factory.js +32 -0
- package/export/typechain/factories/IERC20Metadata__factory.js +241 -0
- package/export/typechain/factories/IERC20WithPermit__factory.js +389 -0
- package/export/typechain/factories/IERC20__factory.js +202 -0
- package/export/typechain/factories/IERC721Metadata__factory.js +349 -0
- package/export/typechain/factories/IERC721Receiver__factory.js +53 -0
- package/export/typechain/factories/IERC721__factory.js +304 -0
- package/export/typechain/factories/IRandomBeaconConsumer__factory.js +37 -0
- package/export/typechain/factories/IRandomBeacon__factory.js +32 -0
- package/export/typechain/factories/IReceiveApproval__factory.js +47 -0
- package/export/typechain/factories/IReceiveBalanceApproval__factory.js +42 -0
- package/export/typechain/factories/IRelay__factory.js +45 -0
- package/export/typechain/factories/IStaking__factory.js +722 -0
- package/export/typechain/factories/IVault__factory.js +60 -0
- package/export/typechain/factories/IWalletOwner__factory.js +65 -0
- package/export/typechain/factories/IWalletRegistry__factory.js +138 -0
- package/export/typechain/factories/Initializable__factory.js +32 -0
- package/export/typechain/factories/MisfundRecovery__factory.js +145 -0
- package/export/typechain/factories/MovingFunds__factory.js +169 -0
- package/export/typechain/factories/Ownable__factory.js +71 -0
- package/export/typechain/factories/ProxyAdmin__factory.js +191 -0
- package/export/typechain/factories/Proxy__factory.js +27 -0
- package/export/typechain/factories/ReceiveApprovalStub__factory.js +127 -0
- package/export/typechain/factories/Redemption__factory.js +123 -0
- package/export/typechain/factories/Reimbursable__factory.js +58 -0
- package/export/typechain/factories/ReimbursementPool__factory.js +350 -0
- package/export/typechain/factories/Rewards__factory.js +117 -0
- package/export/typechain/factories/SortitionPool__factory.js +610 -0
- package/export/typechain/factories/SortitionTree__factory.js +149 -0
- package/export/typechain/factories/TBTCVault__factory.js +480 -0
- package/export/typechain/factories/TBTC__factory.js +564 -0
- package/export/typechain/factories/TestERC20__factory.js +539 -0
- package/export/typechain/factories/TestERC721__factory.js +421 -0
- package/export/typechain/factories/TestEcdsaLib__factory.js +66 -0
- package/export/typechain/factories/TestRelay__factory.js +94 -0
- package/export/typechain/factories/TransparentUpgradeableProxy__factory.js +186 -0
- package/export/typechain/factories/VendingMachine__factory.js +549 -0
- package/export/typechain/factories/WalletRegistry__factory.js +1919 -0
- package/export/typechain/factories/Wallets__factory.js +143 -0
- package/export/typechain/index.js +132 -0
- package/export.json +15932 -503
- package/package.json +47 -26
- package/artifacts/solcInputs/7cc3eda3cb3ff2522d18b5e7b31ea228.json +0 -104
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-await-in-loop */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.fixture = void 0;
|
|
5
|
+
const smock_1 = require("@defi-wonderland/smock");
|
|
6
|
+
const hardhat_1 = require("hardhat");
|
|
7
|
+
const ecdsa_wallet_registry_1 = require("./ecdsa-wallet-registry");
|
|
8
|
+
const random_beacon_1 = require("./random-beacon");
|
|
9
|
+
const staking_1 = require("./staking");
|
|
10
|
+
const { to1e18 } = hardhat_1.helpers.number;
|
|
11
|
+
// Number of operators to register in the sortition pool
|
|
12
|
+
const numberOfOperators = 110;
|
|
13
|
+
const unnamedSignersOffset = 0;
|
|
14
|
+
const stakeAmount = to1e18(40000);
|
|
15
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
16
|
+
exports.fixture = hardhat_1.deployments.createFixture(async () => {
|
|
17
|
+
await hardhat_1.deployments.fixture();
|
|
18
|
+
const { deployer, governance } = await hardhat_1.helpers.signers.getNamedSigners();
|
|
19
|
+
const tbtc = await hardhat_1.helpers.contracts.getContract("TBTC");
|
|
20
|
+
const bridge = await hardhat_1.helpers.contracts.getContract("Bridge");
|
|
21
|
+
const tbtcVault = await hardhat_1.helpers.contracts.getContract("TBTCVault");
|
|
22
|
+
const walletRegistry = await hardhat_1.helpers.contracts.getContract("WalletRegistry");
|
|
23
|
+
const t = await hardhat_1.helpers.contracts.getContract("T");
|
|
24
|
+
const staking = await hardhat_1.helpers.contracts.getContract("TokenStaking");
|
|
25
|
+
// TODO: Vault registration and upgrade from VendingMachine should be a part
|
|
26
|
+
// of the deployment scripts.
|
|
27
|
+
await prepareVault(bridge, tbtcVault, await hardhat_1.helpers.contracts.getContract("VendingMachine"), governance, deployer, deployer);
|
|
28
|
+
// TODO: INTEGRATE WITH THE REAL BEACON
|
|
29
|
+
const randomBeacon = await (0, random_beacon_1.fakeRandomBeacon)(walletRegistry);
|
|
30
|
+
const sortitionPool = await hardhat_1.ethers.getContractAt("SortitionPool", await walletRegistry.sortitionPool());
|
|
31
|
+
const relay = await smock_1.smock.fake("TestRelay", {
|
|
32
|
+
address: await (await bridge.contractReferences()).relay,
|
|
33
|
+
});
|
|
34
|
+
const signers = (await hardhat_1.helpers.signers.getUnnamedSigners()).slice(unnamedSignersOffset);
|
|
35
|
+
// We use unique accounts for each staking role for each operator.
|
|
36
|
+
if (signers.length < numberOfOperators * 5) {
|
|
37
|
+
throw new Error("not enough unnamed signers; update hardhat network's configuration account count");
|
|
38
|
+
}
|
|
39
|
+
for (let i = 0; i < numberOfOperators; i++) {
|
|
40
|
+
const owner = signers[i];
|
|
41
|
+
const stakingProvider = signers[1 * numberOfOperators + i];
|
|
42
|
+
const operator = signers[2 * numberOfOperators + i];
|
|
43
|
+
const beneficiary = signers[3 * numberOfOperators + i];
|
|
44
|
+
const authorizer = signers[4 * numberOfOperators + i];
|
|
45
|
+
await (0, staking_1.stake)(t, staking, stakeAmount, owner, stakingProvider.address, beneficiary.address, authorizer.address);
|
|
46
|
+
await (0, staking_1.authorizeApplication)(staking, walletRegistry.address, authorizer, stakingProvider.address, stakeAmount);
|
|
47
|
+
await (0, ecdsa_wallet_registry_1.registerOperator)(walletRegistry, sortitionPool, stakingProvider, operator);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
deployer,
|
|
51
|
+
governance,
|
|
52
|
+
tbtc,
|
|
53
|
+
bridge,
|
|
54
|
+
tbtcVault,
|
|
55
|
+
walletRegistry,
|
|
56
|
+
staking,
|
|
57
|
+
randomBeacon,
|
|
58
|
+
relay,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
async function prepareVault(bridge, tbtcVault, vendingMachine, governance, vendingMachineUpgradeInitiator, vendingMachineOwner) {
|
|
62
|
+
// Deployment scripts deploy both `VendingMachine` and `TBTCVault` but they
|
|
63
|
+
// do not transfer the ownership of `TBTC` token to `TBTCVault`.
|
|
64
|
+
// We need to do it manually in tests covering `TBTCVault` behavior.
|
|
65
|
+
// Also, please note that `03_transfer_roles.ts` assigning `VendingMachine`
|
|
66
|
+
// upgrade initiator role to Keep Technical Wallet is skipped for Hardhat
|
|
67
|
+
// env deployment. That's why the upgrade initiator and `VendingMachine`
|
|
68
|
+
// owner is the deployer.
|
|
69
|
+
await vendingMachine
|
|
70
|
+
.connect(vendingMachineUpgradeInitiator)
|
|
71
|
+
.initiateVendingMachineUpgrade(tbtcVault.address);
|
|
72
|
+
await hardhat_1.helpers.time.increaseTime(await vendingMachine.GOVERNANCE_DELAY());
|
|
73
|
+
await vendingMachine
|
|
74
|
+
.connect(vendingMachineOwner)
|
|
75
|
+
.finalizeVendingMachineUpgrade();
|
|
76
|
+
await bridge.connect(governance).setVaultStatus(tbtcVault.address, true);
|
|
77
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.assertGasUsed = void 0;
|
|
27
|
+
const chai_1 = __importStar(require("chai"));
|
|
28
|
+
const hardhat_1 = require("hardhat");
|
|
29
|
+
const { BigNumber } = hardhat_1.ethers;
|
|
30
|
+
chai_1.default.use(hardhat_1.waffle.solidity);
|
|
31
|
+
// TODO: Move to @keep-network/hardhat-helpers
|
|
32
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
33
|
+
async function assertGasUsed(tx, expectedGasUsed, delta = 1000) {
|
|
34
|
+
(0, chai_1.expect)((await tx.wait()).gasUsed, "invalid gas used").to.be.closeTo(BigNumber.from(expectedGasUsed), delta);
|
|
35
|
+
}
|
|
36
|
+
exports.assertGasUsed = assertGasUsed;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.produceRelayEntry = exports.fakeRandomBeacon = void 0;
|
|
4
|
+
const hardhat_1 = require("hardhat");
|
|
5
|
+
const smock_1 = require("@defi-wonderland/smock");
|
|
6
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
7
|
+
async function fakeRandomBeacon(walletRegistry) {
|
|
8
|
+
const randomBeacon = await smock_1.smock.fake("IRandomBeacon", {
|
|
9
|
+
address: await walletRegistry.callStatic.randomBeacon(),
|
|
10
|
+
});
|
|
11
|
+
await (await hardhat_1.ethers.getSigners())[0].sendTransaction({
|
|
12
|
+
to: randomBeacon.address,
|
|
13
|
+
value: hardhat_1.ethers.utils.parseEther("1000"),
|
|
14
|
+
});
|
|
15
|
+
return randomBeacon;
|
|
16
|
+
}
|
|
17
|
+
exports.fakeRandomBeacon = fakeRandomBeacon;
|
|
18
|
+
async function produceRelayEntry(walletRegistry, randomBeacon) {
|
|
19
|
+
const relayEntry = hardhat_1.ethers.utils.randomBytes(32);
|
|
20
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
21
|
+
await walletRegistry
|
|
22
|
+
.connect(randomBeacon.wallet)
|
|
23
|
+
.__beaconCallback(relayEntry, 0);
|
|
24
|
+
return relayEntry;
|
|
25
|
+
}
|
|
26
|
+
exports.produceRelayEntry = produceRelayEntry;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authorizeApplication = exports.stake = void 0;
|
|
4
|
+
const hardhat_1 = require("hardhat");
|
|
5
|
+
async function stake(t, staking, stakeAmount, owner, stakingProvider, beneficiary, authorizer) {
|
|
6
|
+
const { deployer } = await hardhat_1.helpers.signers.getNamedSigners();
|
|
7
|
+
await t.connect(deployer).mint(await owner.getAddress(), stakeAmount);
|
|
8
|
+
await t.connect(owner).approve(staking.address, stakeAmount);
|
|
9
|
+
await staking
|
|
10
|
+
.connect(owner)
|
|
11
|
+
.stake(stakingProvider, beneficiary, authorizer, stakeAmount);
|
|
12
|
+
}
|
|
13
|
+
exports.stake = stake;
|
|
14
|
+
async function authorizeApplication(staking, application, authorizer, stakingProvider, stakeAmount) {
|
|
15
|
+
await staking
|
|
16
|
+
.connect(authorizer)
|
|
17
|
+
.increaseAuthorization(stakingProvider, application, stakeAmount);
|
|
18
|
+
}
|
|
19
|
+
exports.authorizeApplication = authorizeApplication;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const hardhat_1 = require("hardhat");
|
|
4
|
+
const chai_1 = require("chai");
|
|
5
|
+
const { createSnapshot, restoreSnapshot } = hardhat_1.helpers.snapshot;
|
|
6
|
+
const fixture = async () => {
|
|
7
|
+
const [deployer, bridge, account1, account2] = await hardhat_1.ethers.getSigners();
|
|
8
|
+
const Bank = await hardhat_1.ethers.getContractFactory("Bank");
|
|
9
|
+
const bank = await Bank.deploy();
|
|
10
|
+
await bank.deployed();
|
|
11
|
+
await bank.connect(deployer).updateBridge(bridge.address);
|
|
12
|
+
const DonationVault = await hardhat_1.ethers.getContractFactory("DonationVault");
|
|
13
|
+
const vault = await DonationVault.deploy(bank.address);
|
|
14
|
+
await vault.deployed();
|
|
15
|
+
return {
|
|
16
|
+
bridge,
|
|
17
|
+
account1,
|
|
18
|
+
account2,
|
|
19
|
+
bank,
|
|
20
|
+
vault,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
describe("DonationVault", () => {
|
|
24
|
+
let bridge;
|
|
25
|
+
let account1;
|
|
26
|
+
let account2;
|
|
27
|
+
let bank;
|
|
28
|
+
let vault;
|
|
29
|
+
before(async () => {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-extra-semi
|
|
31
|
+
;
|
|
32
|
+
({ bridge, account1, account2, bank, vault } = await hardhat_1.waffle.loadFixture(fixture));
|
|
33
|
+
});
|
|
34
|
+
describe("constructor", () => {
|
|
35
|
+
context("when called with a 0-address bank", () => {
|
|
36
|
+
it("should revert", async () => {
|
|
37
|
+
const DonationVault = await hardhat_1.ethers.getContractFactory("DonationVault");
|
|
38
|
+
await (0, chai_1.expect)(DonationVault.deploy(hardhat_1.ethers.constants.AddressZero)).to.be.revertedWith("Bank can not be the zero address");
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
context("when called with correct parameters", () => {
|
|
42
|
+
it("should set the Bank field", async () => {
|
|
43
|
+
(0, chai_1.expect)(await vault.bank()).to.equal(bank.address);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("donate", () => {
|
|
48
|
+
context("when caller has not enough balance in the bank", () => {
|
|
49
|
+
before(async () => {
|
|
50
|
+
await createSnapshot();
|
|
51
|
+
await bank.connect(bridge).increaseBalance(account1.address, 999);
|
|
52
|
+
});
|
|
53
|
+
after(async () => {
|
|
54
|
+
await restoreSnapshot();
|
|
55
|
+
});
|
|
56
|
+
it("should revert", async () => {
|
|
57
|
+
await (0, chai_1.expect)(vault.connect(account1).donate(1000)).to.be.revertedWith("Amount exceeds balance in the bank");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
context("when vault does not have enough allowance for caller's balance", () => {
|
|
61
|
+
before(async () => {
|
|
62
|
+
await createSnapshot();
|
|
63
|
+
await bank.connect(bridge).increaseBalance(account1.address, 1000);
|
|
64
|
+
await bank
|
|
65
|
+
.connect(account1)
|
|
66
|
+
.increaseBalanceAllowance(vault.address, 999);
|
|
67
|
+
});
|
|
68
|
+
after(async () => {
|
|
69
|
+
await restoreSnapshot();
|
|
70
|
+
});
|
|
71
|
+
it("should revert", async () => {
|
|
72
|
+
await (0, chai_1.expect)(vault.connect(account1).donate(1000)).to.be.revertedWith("Transfer amount exceeds allowance");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
context("when called with correct parameters", () => {
|
|
76
|
+
let tx;
|
|
77
|
+
before(async () => {
|
|
78
|
+
await createSnapshot();
|
|
79
|
+
await bank.connect(bridge).increaseBalance(account1.address, 1100);
|
|
80
|
+
await bank
|
|
81
|
+
.connect(account1)
|
|
82
|
+
.increaseBalanceAllowance(vault.address, 1100);
|
|
83
|
+
tx = await vault.connect(account1).donate(1000);
|
|
84
|
+
});
|
|
85
|
+
after(async () => {
|
|
86
|
+
await restoreSnapshot();
|
|
87
|
+
});
|
|
88
|
+
it("should decrease donor's balance", async () => {
|
|
89
|
+
(0, chai_1.expect)(await bank.balanceOf(account1.address)).to.be.equal(100);
|
|
90
|
+
});
|
|
91
|
+
it("should not increase vault's balance", async () => {
|
|
92
|
+
(0, chai_1.expect)(await bank.balanceOf(vault.address)).to.be.equal(0);
|
|
93
|
+
});
|
|
94
|
+
it("should emit BalanceDecreased event", async () => {
|
|
95
|
+
await (0, chai_1.expect)(tx)
|
|
96
|
+
.to.emit(bank, "BalanceDecreased")
|
|
97
|
+
.withArgs(vault.address, 1000);
|
|
98
|
+
});
|
|
99
|
+
it("should emit DonationReceived event", async () => {
|
|
100
|
+
await (0, chai_1.expect)(tx)
|
|
101
|
+
.to.emit(vault, "DonationReceived")
|
|
102
|
+
.withArgs(account1.address, 1000);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("receiveBalanceApproval", () => {
|
|
107
|
+
context("when called not by the bank", () => {
|
|
108
|
+
it("should revert", async () => {
|
|
109
|
+
await (0, chai_1.expect)(vault
|
|
110
|
+
.connect(bridge)
|
|
111
|
+
.receiveBalanceApproval(account1.address, 1000, [])).to.be.revertedWith("Caller is not the Bank");
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
context("when caller has not enough balance in the bank", () => {
|
|
115
|
+
before(async () => {
|
|
116
|
+
await createSnapshot();
|
|
117
|
+
await bank.connect(bridge).increaseBalance(account1.address, 999);
|
|
118
|
+
});
|
|
119
|
+
after(async () => {
|
|
120
|
+
await restoreSnapshot();
|
|
121
|
+
});
|
|
122
|
+
it("should revert", async () => {
|
|
123
|
+
await (0, chai_1.expect)(bank.connect(account1).approveBalanceAndCall(vault.address, 1000, [])).to.be.revertedWith("Amount exceeds balance in the bank");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
context("when called with correct parameters", () => {
|
|
127
|
+
let tx;
|
|
128
|
+
before(async () => {
|
|
129
|
+
await createSnapshot();
|
|
130
|
+
await bank.connect(bridge).increaseBalance(account1.address, 1100);
|
|
131
|
+
tx = await bank
|
|
132
|
+
.connect(account1)
|
|
133
|
+
.approveBalanceAndCall(vault.address, 1000, []);
|
|
134
|
+
});
|
|
135
|
+
after(async () => {
|
|
136
|
+
await restoreSnapshot();
|
|
137
|
+
});
|
|
138
|
+
it("should decrease donor's balance", async () => {
|
|
139
|
+
(0, chai_1.expect)(await bank.balanceOf(account1.address)).to.be.equal(100);
|
|
140
|
+
});
|
|
141
|
+
it("should not increase vault's balance", async () => {
|
|
142
|
+
(0, chai_1.expect)(await bank.balanceOf(vault.address)).to.be.equal(0);
|
|
143
|
+
});
|
|
144
|
+
it("should emit BalanceDecreased event", async () => {
|
|
145
|
+
await (0, chai_1.expect)(tx)
|
|
146
|
+
.to.emit(bank, "BalanceDecreased")
|
|
147
|
+
.withArgs(vault.address, 1000);
|
|
148
|
+
});
|
|
149
|
+
it("should emit DonationReceived event", async () => {
|
|
150
|
+
await (0, chai_1.expect)(tx)
|
|
151
|
+
.to.emit(vault, "DonationReceived")
|
|
152
|
+
.withArgs(account1.address, 1000);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("receiveBalanceIncrease", () => {
|
|
157
|
+
context("when called not by the bank", () => {
|
|
158
|
+
it("should revert", async () => {
|
|
159
|
+
await (0, chai_1.expect)(vault
|
|
160
|
+
.connect(bridge)
|
|
161
|
+
.receiveBalanceIncrease([account1.address], [1000])).to.be.revertedWith("Caller is not the Bank");
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
context("when called with no depositors", () => {
|
|
165
|
+
it("should revert", async () => {
|
|
166
|
+
await (0, chai_1.expect)(bank.connect(bridge).increaseBalanceAndCall(vault.address, [], [])).to.be.revertedWith("No depositors specified");
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
context("when called with correct parameters", () => {
|
|
170
|
+
let tx;
|
|
171
|
+
before(async () => {
|
|
172
|
+
await createSnapshot();
|
|
173
|
+
tx = await bank
|
|
174
|
+
.connect(bridge)
|
|
175
|
+
.increaseBalanceAndCall(vault.address, [account1.address, account2.address], [1000, 2000]);
|
|
176
|
+
});
|
|
177
|
+
after(async () => {
|
|
178
|
+
await restoreSnapshot();
|
|
179
|
+
});
|
|
180
|
+
it("should not increase depositors' balances", async () => {
|
|
181
|
+
(0, chai_1.expect)(await bank.balanceOf(account1.address)).to.be.equal(0);
|
|
182
|
+
(0, chai_1.expect)(await bank.balanceOf(account2.address)).to.be.equal(0);
|
|
183
|
+
});
|
|
184
|
+
it("should not increase vault's balance", async () => {
|
|
185
|
+
(0, chai_1.expect)(await bank.balanceOf(vault.address)).to.be.equal(0);
|
|
186
|
+
});
|
|
187
|
+
it("should emit BalanceDecreased event", async () => {
|
|
188
|
+
await (0, chai_1.expect)(tx)
|
|
189
|
+
.to.emit(bank, "BalanceDecreased")
|
|
190
|
+
.withArgs(vault.address, 3000);
|
|
191
|
+
});
|
|
192
|
+
it("should emit DonationReceived event", async () => {
|
|
193
|
+
await (0, chai_1.expect)(tx)
|
|
194
|
+
.to.emit(vault, "DonationReceived")
|
|
195
|
+
.withArgs(account1.address, 1000);
|
|
196
|
+
await (0, chai_1.expect)(tx)
|
|
197
|
+
.to.emit(vault, "DonationReceived")
|
|
198
|
+
.withArgs(account2.address, 2000);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
});
|