@gooddollar/goodprotocol 1.0.3-beta.2 → 1.0.4-beta.0
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/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
- package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
- package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
- package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
- package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
- package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.json +14 -2
- package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
- package/artifacts/contracts/governance/GovarnanceStaking.sol/GovernanceStaking.dbg.json +1 -1
- package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
- package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
- package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
- package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
- package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
- package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
- package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
- package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
- package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
- package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
- package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
- package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
- package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
- package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
- package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
- package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
- package/artifacts/contracts/unaudited-foundation/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
- package/artifacts/contracts/unaudited-foundation/InvitesV1.sol/InvitesV1.dbg.json +1 -1
- package/artifacts/contracts/unaudited-foundation/InvitesV1.sol/InvitesV1.json +2 -2
- package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
- package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
- package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
- package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
- package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
- package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
- package/contracts/governance/CompoundVotingMachine.sol +8 -2
- package/contracts/unaudited-foundation/InvitesV1.sol +29 -24
- package/hardhat.config.ts +6 -3
- package/package.json +2 -1
- package/releases/deployment.json +24 -24
- package/scripts/deployFullDAO.ts +239 -162
- package/scripts/keeper/fishInactive.ts +57 -0
- package/scripts/upgradeToV2/upgradeToV2.ts +58 -36
- package/test/governance/CompoundVotingMachine.delegate.test.ts +0 -4
- package/test/governance/CompoundVotingMachine.guardian.test.ts +2 -2
- package/test/helpers.ts +3 -10
- package/test/reserve/GoodReserveCDai.cap.test.ts +1 -1
- package/test/reserve/GoodReserveCDai.test.ts +11 -109
- package/test/utils/ProtocolUpgrade.test.ts +8 -0
- package/yarn.lock +14 -0
|
@@ -134,13 +134,12 @@ contract InvitesV1 is Initializable {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
function canCollectBountyFor(address _invitee) public view returns (bool) {
|
|
137
|
-
User
|
|
138
|
-
User
|
|
139
|
-
|
|
137
|
+
User storage user = users[_invitee];
|
|
138
|
+
User storage inviter = users[user.invitedBy];
|
|
139
|
+
uint256 daysToComplete = levels[inviter.level].daysToComplete;
|
|
140
140
|
bool isLevelExpired = levelExpirationEnabled == true &&
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
user.joinedAt.sub(inviter.levelStarted).div(1 days);
|
|
141
|
+
daysToComplete > 0 &&
|
|
142
|
+
daysToComplete < user.joinedAt.sub(inviter.levelStarted).div(1 days);
|
|
144
143
|
|
|
145
144
|
return
|
|
146
145
|
!user.bountyPaid &&
|
|
@@ -201,41 +200,44 @@ contract InvitesV1 is Initializable {
|
|
|
201
200
|
*/
|
|
202
201
|
function bountyFor(address _invitee) public isActive {
|
|
203
202
|
require(canCollectBountyFor(_invitee), "user not elligble for bounty yet");
|
|
203
|
+
return _bountyFor(_invitee);
|
|
204
|
+
}
|
|
204
205
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
206
|
+
function _bountyFor(address _invitee) internal {
|
|
207
|
+
address invitedBy = users[_invitee].invitedBy;
|
|
208
|
+
uint256 joinedAt = users[_invitee].joinedAt;
|
|
209
|
+
Level memory level = levels[users[invitedBy].level];
|
|
208
210
|
|
|
209
211
|
bool isLevelExpired = level.daysToComplete > 0 &&
|
|
210
|
-
|
|
212
|
+
joinedAt > users[invitedBy].levelStarted && //prevent overflow in subtraction
|
|
211
213
|
level.daysToComplete <
|
|
212
|
-
|
|
214
|
+
joinedAt.sub(users[invitedBy].levelStarted).div(1 days); //how long after level started did invitee join
|
|
213
215
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
216
|
+
users[_invitee].bountyPaid = true;
|
|
217
|
+
users[invitedBy].totalApprovedInvites += 1;
|
|
218
|
+
users[invitedBy].totalEarned += level.bounty;
|
|
217
219
|
stats.totalApprovedInvites += 1;
|
|
218
220
|
stats.totalBountiesPaid += level.bounty;
|
|
219
221
|
|
|
220
222
|
bool earnedLevel = false;
|
|
221
223
|
if (
|
|
222
224
|
level.toNext > 0 &&
|
|
223
|
-
|
|
225
|
+
users[invitedBy].totalApprovedInvites >= level.toNext &&
|
|
224
226
|
isLevelExpired == false
|
|
225
227
|
) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
+
users[invitedBy].level += 1;
|
|
229
|
+
users[invitedBy].levelStarted = block.timestamp;
|
|
228
230
|
earnedLevel = true;
|
|
229
231
|
}
|
|
230
232
|
|
|
231
|
-
goodDollar.transfer(
|
|
233
|
+
goodDollar.transfer(invitedBy, level.bounty);
|
|
232
234
|
goodDollar.transfer(_invitee, level.bounty.div(2)); //pay invitee half the bounty
|
|
233
235
|
|
|
234
236
|
emit InviterBounty(
|
|
235
|
-
|
|
237
|
+
invitedBy,
|
|
236
238
|
_invitee,
|
|
237
239
|
level.bounty,
|
|
238
|
-
|
|
240
|
+
users[invitedBy].level,
|
|
239
241
|
earnedLevel
|
|
240
242
|
);
|
|
241
243
|
}
|
|
@@ -247,10 +249,12 @@ contract InvitesV1 is Initializable {
|
|
|
247
249
|
User storage inviter = users[msg.sender];
|
|
248
250
|
|
|
249
251
|
for (uint256 i = 0; i < inviter.pending.length; i++) {
|
|
250
|
-
if (
|
|
251
|
-
|
|
252
|
+
if (gasleft() < 340000) return;
|
|
253
|
+
address pending = inviter.pending[i];
|
|
254
|
+
if (canCollectBountyFor(pending)) {
|
|
255
|
+
_bountyFor(pending);
|
|
252
256
|
}
|
|
253
|
-
if (users[
|
|
257
|
+
if (users[pending].bountyPaid) {
|
|
254
258
|
//if still elements in array move last item to current position
|
|
255
259
|
if (inviter.pending.length - 1 > i) {
|
|
256
260
|
inviter.pending[i] = inviter.pending[inviter.pending.length - 1];
|
|
@@ -292,8 +296,9 @@ contract InvitesV1 is Initializable {
|
|
|
292
296
|
* @dev
|
|
293
297
|
* 1.2.0 - final changes before release
|
|
294
298
|
* 1.3.0 - allow to set inviter later
|
|
299
|
+
* 1.4.0 - improve gas for bounty collection
|
|
295
300
|
*/
|
|
296
301
|
function version() public pure returns (string memory) {
|
|
297
|
-
return "1.
|
|
302
|
+
return "1.4.0";
|
|
298
303
|
}
|
|
299
304
|
}
|
package/hardhat.config.ts
CHANGED
|
@@ -103,7 +103,9 @@ const hhconfig: HardhatUserConfig = {
|
|
|
103
103
|
fuse: {
|
|
104
104
|
accounts: { mnemonic },
|
|
105
105
|
url: "https://rpc.fuse.io/",
|
|
106
|
-
chainId: 122
|
|
106
|
+
chainId: 122,
|
|
107
|
+
gas: 6000000,
|
|
108
|
+
gasPrice: 1000000000
|
|
107
109
|
},
|
|
108
110
|
fusespark: {
|
|
109
111
|
accounts: { mnemonic },
|
|
@@ -115,7 +117,8 @@ const hhconfig: HardhatUserConfig = {
|
|
|
115
117
|
"fuse-mainnet": {
|
|
116
118
|
accounts: { mnemonic },
|
|
117
119
|
url: "https://ropsten.infura.io/v3/" + infura_api,
|
|
118
|
-
|
|
120
|
+
gasPrice: 20000000000,
|
|
121
|
+
gas: 5000000,
|
|
119
122
|
chainId: 3
|
|
120
123
|
},
|
|
121
124
|
staging: {
|
|
@@ -141,7 +144,7 @@ const hhconfig: HardhatUserConfig = {
|
|
|
141
144
|
accounts: [deployerPrivateKey],
|
|
142
145
|
url: "https://mainnet.infura.io/v3/" + infura_api,
|
|
143
146
|
gas: 3000000,
|
|
144
|
-
gasPrice:
|
|
147
|
+
gasPrice: 50000000000,
|
|
145
148
|
chainId: 1
|
|
146
149
|
}
|
|
147
150
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddollar/goodprotocol",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4-beta.0",
|
|
4
4
|
"description": "GoodDollar Protocol",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "scripts/build.sh deploy",
|
|
@@ -60,6 +60,7 @@
|
|
|
60
60
|
"ethers-multicall": "^0.2.1",
|
|
61
61
|
"openzeppelin-solidity": "^4.3.2",
|
|
62
62
|
"patch-package": "latest",
|
|
63
|
+
"press-any-key": "^0.1.1",
|
|
63
64
|
"truffle-plugin-verify": "^0.5.11",
|
|
64
65
|
"truffle-source-verify": "^0.0.6"
|
|
65
66
|
},
|
package/releases/deployment.json
CHANGED
|
@@ -120,30 +120,30 @@
|
|
|
120
120
|
"UniswapV2SwapHelper": "0x7D7200b2b049BB3d91bCbdf95eC0EE6c2b5f8b7E"
|
|
121
121
|
},
|
|
122
122
|
"fuse": {
|
|
123
|
-
"NameService": "
|
|
124
|
-
"GReputation": "
|
|
125
|
-
"FirstClaimPool": "
|
|
126
|
-
"CompoundVotingMachine": "
|
|
127
|
-
"ClaimersDistribution": "
|
|
128
|
-
"GovernanceStaking": "
|
|
129
|
-
"UBIScheme": "
|
|
130
|
-
"ProtocolUpgradeFuse": "
|
|
131
|
-
"Identity": "
|
|
132
|
-
"GoodDollar": "
|
|
133
|
-
"Controller": "
|
|
134
|
-
"Avatar": "
|
|
135
|
-
"HomeBridge": "
|
|
136
|
-
"FuseFaucet": "
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
"
|
|
140
|
-
"UBI": "0xCC9B1382b0Ae9D80E81eCB1863DcE8685a044603",
|
|
141
|
-
"SignupBonus": "0xcdC704D3dEA0FcFD1Cae95dfdCB7883632E171b2",
|
|
142
|
-
"OneTimePayments": "0x94079dF920115c5296Cc06AE6D8F29E077906246",
|
|
143
|
-
"AdminWallet": "0xf61e08a98B446856eE3fbD6597D3698a1a138565",
|
|
123
|
+
"NameService": "0x27E3B64C671a25c191535743d63Bd06CB9B93E37",
|
|
124
|
+
"GReputation": "0xdFF4cE07253b2c3fa9dCEC8B918f91d150AC26a4",
|
|
125
|
+
"FirstClaimPool": "0x5E8732889f2d84c3D834223c38361B38D7D4B9bc",
|
|
126
|
+
"CompoundVotingMachine": "0xb9978C071f2F64016A2f8515BC03bd25684201aF",
|
|
127
|
+
"ClaimersDistribution": "0xEaDa76013C87C22843b907Ce0110ea55C8E7E2a0",
|
|
128
|
+
"GovernanceStaking": "0xe3E75Ee6895F8b30d8eC3260dAa20ec1aba6DA77",
|
|
129
|
+
"UBIScheme": "0x3bdeB796950301FfC9568fAF89B7370f8B217321",
|
|
130
|
+
"ProtocolUpgradeFuse": "0x4dB8602482576321F829baa593150393f7595439",
|
|
131
|
+
"Identity": "0x7ccF1011610138b484fCc921858e7971342d213c",
|
|
132
|
+
"GoodDollar": "0x79BeecC4b165Ccf547662cB4f7C0e83b3796E5b3",
|
|
133
|
+
"Controller": "0xb453024495525908E6cC1e3C115f4B6B30cc56b9",
|
|
134
|
+
"Avatar": "0x71ddE7b8362724bd65D88Fe29d42636a9F8f9064",
|
|
135
|
+
"HomeBridge": "0xb0aD96B62567Ebcb1660e2Af5755A11B42b3Ade5",
|
|
136
|
+
"FuseFaucet": "0x09Ad3430D146aa662eA8c20cBEBceBC0bbB3FB0a",
|
|
137
|
+
"Invites": "0x187fc9fB37DF0fbf75149913a97B17c968Fc90d0",
|
|
138
|
+
"OneTimePayments": "0x184C1F83b3eB75a2dac483D4a6b9FBD59Df961f8",
|
|
139
|
+
"AdminWallet": "0x14204288286823042263156146334B1a4d61227c",
|
|
144
140
|
"network": "fuse",
|
|
145
141
|
"networkId": 122,
|
|
146
|
-
"ProxyFactory": "
|
|
142
|
+
"ProxyFactory": "0x4136dfD47F47792fC820E2354e9F0ce8e9c586A6",
|
|
143
|
+
"BancorFormula": "0x88e111b2A42457655A34896E5B929a75E7B82F88",
|
|
144
|
+
"DAI": "0x0000000000000000000000000000000000000000",
|
|
145
|
+
"cDAI": "0x0000000000000000000000000000000000000000",
|
|
146
|
+
"COMP": "0x0000000000000000000000000000000000000000"
|
|
147
147
|
},
|
|
148
148
|
"fuse-mainnet": {
|
|
149
149
|
"NameService": "0x5e8bF25c75787e9fa17e2321266b0cbE95c830d0",
|
|
@@ -365,7 +365,7 @@
|
|
|
365
365
|
"ProxyFactory": "0x4659176E962763e7C8A4eF965ecfD0fdf9f52057",
|
|
366
366
|
"NameService": "0xe26867DDd22F9342d9F0D566D182f2c960683971",
|
|
367
367
|
"GReputation": "0x3A9299BE789ac3730e4E4c49d6d2Ad1b8BC34DFf",
|
|
368
|
-
"CompoundVotingMachine": "
|
|
368
|
+
"CompoundVotingMachine": "0xc2Ff55b896e3c42f9e1c2f7467C51b93F1C23dFD",
|
|
369
369
|
"ClaimersDistribution": "0xF34552F1583c0B981dbB09611128c3375b47182e",
|
|
370
370
|
"GovernanceStaking": "0xFAF457Fb4A978Be059506F6CD41f9B30fCa753b0",
|
|
371
371
|
"UBIScheme": "0x87d77A30a6819860eB8332D293810ed7b510035A",
|
|
@@ -390,7 +390,7 @@
|
|
|
390
390
|
"ProxyFactory": "0x4659176E962763e7C8A4eF965ecfD0fdf9f52057",
|
|
391
391
|
"NameService": "0xe26867DDd22F9342d9F0D566D182f2c960683971",
|
|
392
392
|
"GReputation": "0x3A9299BE789ac3730e4E4c49d6d2Ad1b8BC34DFf",
|
|
393
|
-
"CompoundVotingMachine": "
|
|
393
|
+
"CompoundVotingMachine": "0xc2Ff55b896e3c42f9e1c2f7467C51b93F1C23dFD",
|
|
394
394
|
"GoodMarketMaker": "0x30D37B05cF73Edd8c59ce8450F093f6C06dA9272",
|
|
395
395
|
"GoodReserveCDai": "0x6C35677206ae7FF1bf753877649cF57cC30D1c42",
|
|
396
396
|
"ExchangeHelper": "0x0a8c6bB832801454F6CC21761D0A293Caa003296",
|