Skip to content

Commit 0729b53

Browse files
authored
Add admin withdraw method (#46)
* Add withdraw * Add deploy implementation
1 parent 3fa2906 commit 0729b53

File tree

9 files changed

+696
-35
lines changed

9 files changed

+696
-35
lines changed

aurora/.openzeppelin/unknown-1313161555.json

Lines changed: 441 additions & 0 deletions
Large diffs are not rendered by default.

aurora/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,16 @@ Verify
2626
```
2727
yarn verify:testnet {contract_id}
2828
yarn verify:mainnet {contract_id}
29+
```
30+
31+
Upgrade
32+
```
33+
yarn upgrade:testnet
34+
yarn upgrade:mainnet
35+
```
36+
37+
Admin withdraw
38+
```
39+
yarn hardhat withdraw --environment testnet --network testnet_aurora --recipient <recipient> --amount <amount>
40+
yarn hardhat withdraw --environment mainnet --network testnet_aurora --recipient <recipient> --amount <amount>
2941
```

aurora/contracts/NearBridge.sol

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
66
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
77
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
88
import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
9+
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
910

1011
contract NearBridge is UUPSUpgradeable, PausableUpgradeable, OwnableUpgradeable {
1112
using AuroraSdk for NEAR;
@@ -15,6 +16,8 @@ contract NearBridge is UUPSUpgradeable, PausableUpgradeable, OwnableUpgradeable
1516
string private eNearAccountId;
1617

1718
uint64 constant MIGRATE_TO_ETHEREUM_GAS = 10_000_000_000_000;
19+
uint64 constant WITHDRAW_NEAR_GAS = 50_000_000_000_000;
20+
uint128 constant ONE_YOCTO = 1;
1821

1922
event InitBridgeToEthereum(address indexed sender, address indexed recipient, uint128 amount);
2023

@@ -58,6 +61,41 @@ contract NearBridge is UUPSUpgradeable, PausableUpgradeable, OwnableUpgradeable
5861
emit InitBridgeToEthereum(msg.sender, recipient, amount);
5962
}
6063

64+
function withdrawFromImplicitNearAccount(
65+
string calldata receiver,
66+
string calldata token,
67+
address recipient,
68+
uint128 amount
69+
) external onlyOwner {
70+
require(
71+
near.wNEAR.balanceOf(address(this)) >= ONE_YOCTO,
72+
"Not enough wNEAR balance"
73+
);
74+
75+
bytes memory args = bytes(
76+
string.concat(
77+
'{"receiver_id": "',
78+
receiver,
79+
'", "amount": "',
80+
Strings.toString(amount),
81+
'", "msg": "',
82+
Utils.bytesToHex(abi.encodePacked(recipient)),
83+
'"}'
84+
)
85+
);
86+
87+
PromiseCreateArgs memory callWithdraw = _callWithoutTransferWNear(
88+
near,
89+
token,
90+
"ft_transfer_call",
91+
args,
92+
ONE_YOCTO,
93+
WITHDRAW_NEAR_GAS
94+
);
95+
96+
callWithdraw.transact();
97+
}
98+
6199
function pause() external onlyOwner {
62100
_pause();
63101
}
@@ -67,4 +105,24 @@ contract NearBridge is UUPSUpgradeable, PausableUpgradeable, OwnableUpgradeable
67105
}
68106

69107
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
108+
109+
110+
function _callWithoutTransferWNear(
111+
NEAR storage _near,
112+
string memory targetAccountId,
113+
string memory method,
114+
bytes memory args,
115+
uint128 nearBalance,
116+
uint64 nearGas
117+
) internal view returns (PromiseCreateArgs memory) {
118+
require(_near.initialized, "Near isn't initialized");
119+
return
120+
PromiseCreateArgs(
121+
targetAccountId,
122+
method,
123+
args,
124+
nearBalance,
125+
nearGas
126+
);
127+
}
70128
}

aurora/hardhat.config.js

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ module.exports = {
4848
task("deploy", "Deploy bridge contract")
4949
.addParam("environment", "Config file name without extension")
5050
.setAction(async (taskArgs, hre) => {
51-
const { deploy } = require("./scripts/deploy.js");
51+
const { deploy } = require("./scripts/utils.js");
5252
const [signer] = await hre.ethers.getSigners();
5353
const config = require(`./scripts/aurora_${taskArgs.environment}.params.json`);
5454

@@ -60,3 +60,56 @@ task("deploy", "Deploy bridge contract")
6060
auroraUtilsAddress: config.utilsAddress,
6161
});
6262
});
63+
64+
task("deployImpl", "Deploy implementation bridge contract")
65+
.addParam("environment", "Config file name without extension")
66+
.setAction(async (taskArgs, hre) => {
67+
const { deployImplementation } = require("./scripts/utils.js");
68+
const config = require(`./scripts/aurora_${taskArgs.environment}.params.json`);
69+
70+
await hre.run("compile");
71+
await deployImplementation({
72+
wNearAddress: config.wNearAddress,
73+
eNearAccountId: config.eNearAccountId,
74+
auroraSdkAddress: config.auroraSdkAddress,
75+
auroraUtilsAddress: config.utilsAddress,
76+
});
77+
});
78+
79+
task("upgrade", "Upgrade bridge contract")
80+
.addParam("environment", "Config file name without extension")
81+
.setAction(async (taskArgs, hre) => {
82+
const { upgrade } = require("./scripts/utils.js");
83+
const [signer] = await hre.ethers.getSigners();
84+
const config = require(`./scripts/aurora_${taskArgs.environment}.params.json`);
85+
86+
await hre.run("compile");
87+
await upgrade({
88+
signer,
89+
proxyAddress: config.proxyAddress,
90+
auroraSdkAddress: config.auroraSdkAddress,
91+
auroraUtilsAddress: config.utilsAddress,
92+
});
93+
});
94+
95+
96+
task("withdraw", "Withdraw from implicit near account")
97+
.addParam("recipient", "Recipient address")
98+
.addParam("amount", "Amount to withdraw")
99+
.addParam("environment", "Config file name without extension")
100+
.setAction(async (taskArgs, hre) => {
101+
const { withdraw } = require("./scripts/utils.js");
102+
const [signer] = await hre.ethers.getSigners();
103+
const config = require(`./scripts/aurora_${taskArgs.environment}.params.json`);
104+
105+
await hre.run("compile");
106+
await withdraw({
107+
recipientAddress: taskArgs.recipient,
108+
amount: taskArgs.amount,
109+
signer,
110+
wNearAccountId: config.wNearAccountId,
111+
proxyAddress: config.proxyAddress,
112+
auroraSdkAddress: config.auroraSdkAddress,
113+
auroraUtilsAddress: config.utilsAddress,
114+
});
115+
});

aurora/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"build": "hardhat compile",
88
"deploy:testnet": "hardhat deploy --environment testnet --network testnet_aurora",
99
"deploy:mainnet": "hardhat deploy --environment mainnet --network mainnet_aurora",
10+
"upgrade:testnet": "hardhat upgrade --environment testnet --network testnet_aurora",
11+
"upgrade:mainnet": "hardhat upgrade --environment mainnet --network mainnet_aurora",
1012
"verify:testnet": "hardhat verify --network testnet_aurora",
1113
"verify:mainnet": "hardhat verify --network mainnet_aurora"
1214
},

aurora/scripts/aurora_mainnet.params.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@
22
"wNearAddress": "0xc42c30ac6cc15fac9bd938618bcaa1a1fae8501d",
33
"eNearAccountId": "e-near.near",
44
"auroraSdkAddress": "0xc9279246BC677a528a9A28b48Ea67EA898E526a4",
5-
"utilsAddress": "0xF59eFA6A6065674D639d8b5f1FDdADf7F8E5E8E2"
5+
"utilsAddress": "0xF59eFA6A6065674D639d8b5f1FDdADf7F8E5E8E2",
6+
"proxyAddress": "0x5D5a9D3fB8BD3959B0C9266f90e126427E83872d",
7+
"wNearAccountId": "wrap.near"
68
}

aurora/scripts/aurora_testnet.params.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@
22
"wNearAddress": "0x4861825E75ab14553E5aF711EbbE6873d369d146",
33
"eNearAccountId": "e-near.sepolia.testnet",
44
"auroraSdkAddress": "0x425cA8f218784ebE2df347E98c626094B63E7f30",
5-
"utilsAddress": "0xc129336a6995F3b70A7139585403B82098260172"
5+
"utilsAddress": "0xc129336a6995F3b70A7139585403B82098260172",
6+
"proxyAddress": "0x329242C003Df320166F5b198dCcb22b0CFF1d91B",
7+
"wNearAccountId": "wrap.testnet"
68
}

aurora/scripts/deploy.js

Lines changed: 0 additions & 32 deletions
This file was deleted.

aurora/scripts/utils.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
const { ethers, upgrades } = require("hardhat");
2+
3+
async function deploy({
4+
wNearAddress,
5+
eNearAccountId,
6+
auroraSdkAddress,
7+
auroraUtilsAddress,
8+
}) {
9+
const NearBridgeContract = await ethers.getContractFactory("NearBridge", {
10+
libraries: {
11+
AuroraSdk: auroraSdkAddress,
12+
Utils: auroraUtilsAddress,
13+
},
14+
});
15+
16+
let proxy = await upgrades.deployProxy(
17+
NearBridgeContract,
18+
[wNearAddress, eNearAccountId],
19+
{
20+
unsafeAllowLinkedLibraries: true,
21+
},
22+
);
23+
await proxy.waitForDeployment();
24+
25+
console.log("Bridge proxy deployed to: ", await proxy.getAddress());
26+
console.log(
27+
"Bridge impl deployed to: ",
28+
await upgrades.erc1967.getImplementationAddress(await proxy.getAddress()),
29+
);
30+
}
31+
32+
async function deployImplementation({
33+
wNearAddress,
34+
eNearAccountId,
35+
auroraSdkAddress,
36+
auroraUtilsAddress,
37+
}) {
38+
let NearBridgeContract = await ethers.getContractFactory("NearBridge", {
39+
libraries: {
40+
AuroraSdk: auroraSdkAddress,
41+
Utils: auroraUtilsAddress,
42+
},
43+
});
44+
45+
let impl = await upgrades.deployImplementation(
46+
NearBridgeContract,
47+
{
48+
unsafeAllowLinkedLibraries: true,
49+
},
50+
[wNearAddress, eNearAccountId],
51+
);
52+
53+
console.log(
54+
"Bridge impl deployed to: ",
55+
impl,
56+
);
57+
}
58+
59+
async function upgrade({
60+
signer,
61+
proxyAddress,
62+
auroraSdkAddress,
63+
auroraUtilsAddress,
64+
}) {
65+
const NearBridgeContract = (
66+
await ethers.getContractFactory("NearBridge", {
67+
libraries: {
68+
AuroraSdk: auroraSdkAddress,
69+
Utils: auroraUtilsAddress,
70+
},
71+
})
72+
).connect(signer);
73+
74+
console.log(
75+
"Current implementation address:",
76+
await upgrades.erc1967.getImplementationAddress(proxyAddress)
77+
);
78+
console.log("Upgrade NearBridge contract, proxy address", proxyAddress);
79+
const proxy = await upgrades.upgradeProxy(proxyAddress, NearBridgeContract, {
80+
unsafeAllowLinkedLibraries: true,
81+
gasLimit: 6000000,
82+
});
83+
await proxy.waitForDeployment();
84+
85+
console.log(
86+
"NearBridgeContract impl deployed to: ",
87+
await upgrades.erc1967.getImplementationAddress(await proxy.getAddress())
88+
);
89+
}
90+
91+
async function withdraw({
92+
recipientAddress,
93+
amount,
94+
signer,
95+
wNearAccountId,
96+
proxyAddress,
97+
auroraSdkAddress,
98+
auroraUtilsAddress,
99+
}) {
100+
const NearBridgeContract = (
101+
await ethers.getContractFactory("NearBridge", {
102+
libraries: {
103+
AuroraSdk: auroraSdkAddress,
104+
Utils: auroraUtilsAddress,
105+
},
106+
})
107+
)
108+
.attach(proxyAddress)
109+
.connect(signer);
110+
111+
let tx = await NearBridgeContract.withdrawFromImplicitNearAccount(
112+
"aurora",
113+
wNearAccountId,
114+
recipientAddress,
115+
amount
116+
);
117+
console.log(tx.hash);
118+
}
119+
120+
exports.deploy = deploy;
121+
exports.deployImplementation = deployImplementation;
122+
exports.upgrade = upgrade;
123+
exports.withdraw = withdraw;

0 commit comments

Comments
 (0)