Skip to content

Commit 644d5f4

Browse files
committed
Merge branch 'minh/tax2gas' of github-expertdicer:classic-terra/core into minh/tax2gas
2 parents 1327e9d + 56ea70b commit 644d5f4

File tree

5 files changed

+119
-83
lines changed

5 files changed

+119
-83
lines changed

tests/e2e/configurer/chain/commands.go

+20-24
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,19 @@ import (
2525

2626
func (n *NodeConfig) StoreWasmCode(wasmFile, from string) {
2727
n.LogActionF("storing wasm code from file %s", wasmFile)
28-
cmd := []string{"terrad", "tx", "wasm", "store", wasmFile, fmt.Sprintf("--from=%s", from)}
28+
cmd := []string{"terrad", "tx", "wasm", "store", wasmFile, fmt.Sprintf("--from=%s", from), "--fees=10uluna", "--gas=2000000"}
2929
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
3030
require.NoError(n.t, err)
3131
n.LogActionF("successfully stored")
3232
}
3333

34-
func (n *NodeConfig) InstantiateWasmContract(codeID, initMsg, amount, from string) {
34+
func (n *NodeConfig) InstantiateWasmContract(codeID, initMsg, amount, from string, gasLimit string, fees sdk.Coins) {
3535
n.LogActionF("instantiating wasm contract %s with %s", codeID, initMsg)
3636
cmd := []string{"terrad", "tx", "wasm", "instantiate", codeID, initMsg, fmt.Sprintf("--from=%s", from), "--no-admin", "--label=ratelimit"}
3737
if amount != "" {
3838
cmd = append(cmd, fmt.Sprintf("--amount=%s", amount))
3939
}
40+
cmd = append(cmd, "--gas", gasLimit, "--fees", fees.String())
4041
n.LogActionF(strings.Join(cmd, " "))
4142
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
4243

@@ -45,35 +46,28 @@ func (n *NodeConfig) InstantiateWasmContract(codeID, initMsg, amount, from strin
4546
n.LogActionF("successfully initialized")
4647
}
4748

48-
func (n *NodeConfig) Instantiate2WasmContract(codeID, initMsg, salt, amount, fee, gas, from string) {
49+
func (n *NodeConfig) Instantiate2WasmContract(codeID, initMsg, salt, amount, from string, gasLimit string, fees sdk.Coins) {
4950
n.LogActionF("instantiating wasm contract %s with %s", codeID, initMsg)
5051
encodedSalt := make([]byte, hex.EncodedLen(len([]byte(salt))))
5152
hex.Encode(encodedSalt, []byte(salt))
5253
cmd := []string{"terrad", "tx", "wasm", "instantiate2", codeID, initMsg, string(encodedSalt), fmt.Sprintf("--from=%s", from), "--no-admin", "--label=ratelimit"}
5354
if amount != "" {
5455
cmd = append(cmd, fmt.Sprintf("--amount=%s", amount))
5556
}
56-
if fee != "" {
57-
cmd = append(cmd, fmt.Sprintf("--fees=%s", fee))
58-
}
59-
if gas != "" {
60-
cmd = append(cmd, fmt.Sprintf("--gas=%s", gas))
61-
}
57+
cmd = append(cmd, "--gas", gasLimit, "--fees", fees.String())
6258
n.LogActionF(strings.Join(cmd, " "))
6359
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
6460
require.NoError(n.t, err)
6561
n.LogActionF("successfully initialized")
6662
}
6763

68-
func (n *NodeConfig) WasmExecute(contract, execMsg, amount, fee, from string) {
64+
func (n *NodeConfig) WasmExecute(contract, execMsg, amount, from string, gasLimit string, fees sdk.Coins) {
6965
n.LogActionF("executing %s on wasm contract %s from %s", execMsg, contract, from)
7066
cmd := []string{"terrad", "tx", "wasm", "execute", contract, execMsg, fmt.Sprintf("--from=%s", from)}
7167
if amount != "" {
7268
cmd = append(cmd, fmt.Sprintf("--amount=%s", amount))
7369
}
74-
if fee != "" {
75-
cmd = append(cmd, fmt.Sprintf("--fees=%s", fee))
76-
}
70+
cmd = append(cmd, "--gas", gasLimit, "--fees", fees.String())
7771
n.LogActionF(strings.Join(cmd, " "))
7872
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
7973
require.NoError(n.t, err)
@@ -124,6 +118,7 @@ func (n *NodeConfig) SubmitAddBurnTaxExemptionAddressProposal(addresses []string
124118
"add-burn-tax-exemption-address", strings.Join(addresses, ","),
125119
"--title=\"burn tax exemption address\"",
126120
"--description=\"\"burn tax exemption address",
121+
"--gas", "300000", "--gas-prices", "1uluna",
127122
fmt.Sprintf("--from=%s", walletName),
128123
}
129124

@@ -152,7 +147,7 @@ func (n *NodeConfig) FailIBCTransfer(from, recipient, amount string) {
152147
func (n *NodeConfig) SendIBCTransfer(from, recipient, amount, memo string) {
153148
n.LogActionF("IBC sending %s from %s to %s. memo: %s", amount, from, recipient, memo)
154149

155-
cmd := []string{"terrad", "tx", "ibc-transfer", "transfer", "transfer", "channel-0", recipient, amount, fmt.Sprintf("--from=%s", from), "--memo", memo}
150+
cmd := []string{"terrad", "tx", "ibc-transfer", "transfer", "transfer", "channel-0", recipient, amount, fmt.Sprintf("--from=%s", from), "--memo", memo, "--fees=10uluna"}
156151

157152
_, _, err := n.containerManager.ExecTxCmdWithSuccessString(n.t, n.chainID, n.Name, cmd, "\"code\":0")
158153
require.NoError(n.t, err)
@@ -171,15 +166,15 @@ func (n *NodeConfig) SubmitTextProposal(text string, initialDeposit sdk.Coin) {
171166
func (n *NodeConfig) DepositProposal(proposalNumber int) {
172167
n.LogActionF("depositing on proposal: %d", proposalNumber)
173168
deposit := sdk.NewCoin(initialization.TerraDenom, sdk.NewInt(20*assets.MicroUnit)).String()
174-
cmd := []string{"terrad", "tx", "gov", "deposit", fmt.Sprintf("%d", proposalNumber), deposit, "--from=val"}
169+
cmd := []string{"terrad", "tx", "gov", "deposit", fmt.Sprintf("%d", proposalNumber), deposit, "--from=val", "--gas", "300000", "--fees", "10000000uluna"}
175170
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
176171
require.NoError(n.t, err)
177172
n.LogActionF("successfully deposited on proposal %d", proposalNumber)
178173
}
179174

180175
func (n *NodeConfig) VoteYesProposal(from string, proposalNumber int) {
181176
n.LogActionF("voting yes on proposal: %d", proposalNumber)
182-
cmd := []string{"terrad", "tx", "gov", "vote", fmt.Sprintf("%d", proposalNumber), "yes", fmt.Sprintf("--from=%s", from)}
177+
cmd := []string{"terrad", "tx", "gov", "vote", fmt.Sprintf("%d", proposalNumber), "yes", fmt.Sprintf("--from=%s", from), "--gas", "300000", "--fees", "10000000uluna"}
183178
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
184179
require.NoError(n.t, err)
185180
n.LogActionF("successfully voted yes on proposal %d", proposalNumber)
@@ -216,44 +211,45 @@ func extractProposalIDFromResponse(response string) (int, error) {
216211
return proposalID, nil
217212
}
218213

219-
func (n *NodeConfig) BankSend(amount string, sendAddress string, receiveAddress string) {
220-
n.BankSendWithWallet(amount, sendAddress, receiveAddress, "val")
214+
func (n *NodeConfig) BankSend(amount string, sendAddress string, receiveAddress string, gasLimit string, fees sdk.Coins) {
215+
n.BankSendWithWallet(amount, sendAddress, receiveAddress, "val", gasLimit, fees)
221216
}
222217

223-
func (n *NodeConfig) BankSendWithWallet(amount string, sendAddress string, receiveAddress string, walletName string) {
218+
func (n *NodeConfig) BankSendWithWallet(amount string, sendAddress string, receiveAddress string, walletName string, gasLimit string, fees sdk.Coins) {
224219
n.LogActionF("bank sending %s from address %s to %s", amount, sendAddress, receiveAddress)
225220
cmd := []string{"terrad", "tx", "bank", "send", sendAddress, receiveAddress, amount, fmt.Sprintf("--from=%s", walletName)}
221+
cmd = append(cmd, "--fees", fees.String(), "--gas", gasLimit)
226222
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
227223
require.NoError(n.t, err)
228224
n.LogActionF("successfully sent bank sent %s from address %s to %s", amount, sendAddress, receiveAddress)
229225
}
230226

231-
func (n *NodeConfig) BankSendFeeGrantWithWallet(amount string, sendAddress string, receiveAddress string, feeGranter string, walletName string) {
227+
func (n *NodeConfig) BankSendFeeGrantWithWallet(amount string, sendAddress string, receiveAddress string, feeGranter string, walletName string, gasLimit string, fees sdk.Coins) {
232228
n.LogActionF("bank sending %s from address %s to %s", amount, sendAddress, receiveAddress)
233229
cmd := []string{"terrad", "tx", "bank", "send", sendAddress, receiveAddress, amount, fmt.Sprintf("--fee-granter=%s", feeGranter), fmt.Sprintf("--from=%s", walletName)}
230+
cmd = append(cmd, "--fees", fees.String(), "--gas", gasLimit)
234231
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
235232
require.NoError(n.t, err)
236233

237234
n.LogActionF("successfully sent bank sent %s from address %s to %s", amount, sendAddress, receiveAddress)
238235
}
239236

240-
func (n *NodeConfig) BankMultiSend(amount string, split bool, sendAddress string, receiveAddresses ...string) {
237+
func (n *NodeConfig) BankMultiSend(amount string, split bool, sendAddress string, gasLimit string, fees sdk.Coins, receiveAddresses ...string) {
241238
n.LogActionF("bank multisending from %s to %s", sendAddress, strings.Join(receiveAddresses, ","))
242239
cmd := []string{"terrad", "tx", "bank", "multi-send", sendAddress}
243240
cmd = append(cmd, receiveAddresses...)
244-
cmd = append(cmd, amount, "--from=val")
241+
cmd = append(cmd, amount, "--from=val", "--fees", fees.String(), "--gas", gasLimit)
245242
if split {
246243
cmd = append(cmd, "--split")
247244
}
248-
249245
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
250246
require.NoError(n.t, err)
251247
n.LogActionF("successfully multisent %s to %s", sendAddress, strings.Join(receiveAddresses, ","))
252248
}
253249

254250
func (n *NodeConfig) GrantAddress(granter, gratee string, spendLimit string, walletName string) {
255251
n.LogActionF("granting for address %s", gratee)
256-
cmd := []string{"terrad", "tx", "feegrant", "grant", granter, gratee, fmt.Sprintf("--from=%s", walletName), fmt.Sprintf("--spend-limit=%s", spendLimit)}
252+
cmd := []string{"terrad", "tx", "feegrant", "grant", granter, gratee, fmt.Sprintf("--from=%s", walletName), fmt.Sprintf("--spend-limit=%s", spendLimit), "--fees=10uluna"}
257253
_, _, err := n.containerManager.ExecTxCmd(n.t, n.chainID, n.Name, cmd)
258254
require.NoError(n.t, err)
259255
n.LogActionF("successfully granted for address %s", gratee)

tests/e2e/e2e_test.go

+68-46
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (s *IntegrationTestSuite) TestIBCWasmHooks() {
2828
nodeA.InstantiateWasmContract(
2929
strconv.Itoa(chainA.LatestCodeID),
3030
`{"count": "0"}`, "",
31-
initialization.ValidatorWalletName)
31+
initialization.ValidatorWalletName, "200000", sdk.NewCoins(sdk.NewCoin(initialization.TerraDenom, sdk.NewInt(10))))
3232

3333
contracts, err := nodeA.QueryContractsFromID(chainA.LatestCodeID)
3434
s.NoError(err)
@@ -104,6 +104,7 @@ func (s *IntegrationTestSuite) TestAddBurnTaxExemptionAddress() {
104104
s.Require().Contains(whitelistedAddresses, whitelistAddr2)
105105
}
106106

107+
// Each tx gas will cost 2 uluna (1 is for ante handler, 1 is for post handler)
107108
func (s *IntegrationTestSuite) TestFeeTax() {
108109
chain := s.configurer.GetChainConfig(0)
109110
node, err := chain.GetDefaultNode()
@@ -119,14 +120,16 @@ func (s *IntegrationTestSuite) TestFeeTax() {
119120
s.Require().NoError(err)
120121

121122
test1Addr := node.CreateWallet("test1")
123+
test2Addr := node.CreateWallet("test2")
122124

123125
// Test 1: banktypes.MsgSend
124126
// burn tax with bank send
125-
node.BankSend(transferCoin1.String(), validatorAddr, test1Addr)
126-
127127
subAmount := transferAmount1.Add(initialization.TaxRate.MulInt(transferAmount1).TruncateInt())
128128

129-
decremented := validatorBalance.Sub(sdk.NewCoin(initialization.TerraDenom, subAmount))
129+
gasLimit := transferCoin1.Amount.MulRaw(initialization.E10).String()
130+
node.BankSend(transferCoin1.String(), validatorAddr, test1Addr, gasLimit, sdk.NewCoins(transferCoin1))
131+
132+
decremented := validatorBalance.Sub(sdk.NewCoin(initialization.TerraDenom, subAmount.AddRaw(2)))
130133
newValidatorBalance, err := node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
131134
s.Require().NoError(err)
132135

@@ -136,46 +139,22 @@ func (s *IntegrationTestSuite) TestFeeTax() {
136139
s.Require().Equal(balanceTest1.Amount, transferAmount1)
137140
s.Require().Equal(newValidatorBalance, decremented)
138141

139-
// Test 2: try bank send with grant
140-
test2Addr := node.CreateWallet("test2")
141-
transferAmount2 := sdkmath.NewInt(10000000)
142-
transferCoin2 := sdk.NewCoin(initialization.TerraDenom, transferAmount2)
143-
144-
node.BankSend(transferCoin2.String(), validatorAddr, test2Addr)
145-
node.GrantAddress(test2Addr, test1Addr, transferCoin2.String(), "test2")
146-
142+
// Test 2: banktypes.MsgMultiSend
147143
validatorBalance, err = node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
148144
s.Require().NoError(err)
149145

150-
node.BankSendFeeGrantWithWallet(transferCoin2.String(), test1Addr, validatorAddr, test2Addr, "test1")
151-
152-
newValidatorBalance, err = node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
153-
s.Require().NoError(err)
154-
155-
balanceTest1, err = node.QuerySpecificBalance(test1Addr, initialization.TerraDenom)
156-
s.Require().NoError(err)
157-
158-
balanceTest2, err := node.QuerySpecificBalance(test2Addr, initialization.TerraDenom)
159-
s.Require().NoError(err)
160-
161-
s.Require().Equal(balanceTest1.Amount, transferAmount1.Sub(transferAmount2))
162-
s.Require().Equal(newValidatorBalance, validatorBalance.Add(transferCoin2))
163-
s.Require().Equal(balanceTest2.Amount, transferAmount2.Sub(initialization.TaxRate.MulInt(transferAmount2).TruncateInt()))
164-
165-
// Test 3: banktypes.MsgMultiSend
166-
validatorBalance, err = node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
167-
s.Require().NoError(err)
168-
169-
node.BankMultiSend(transferCoin1.String(), false, validatorAddr, test1Addr, test2Addr)
146+
totalTransferAmount := transferAmount1.Mul(sdk.NewInt(2))
147+
gasLimit = transferCoin1.Amount.MulRaw(initialization.E10).String()
148+
node.BankMultiSend(transferCoin1.String(), false, validatorAddr, gasLimit, sdk.NewCoins(transferCoin1), test1Addr, test2Addr)
170149

171150
newValidatorBalance, err = node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
172151
s.Require().NoError(err)
173152

174-
totalTransferAmount := transferAmount1.Mul(sdk.NewInt(2))
175153
subAmount = totalTransferAmount.Add(initialization.TaxRate.MulInt(totalTransferAmount).TruncateInt())
176-
s.Require().Equal(newValidatorBalance, validatorBalance.Sub(sdk.NewCoin(initialization.TerraDenom, subAmount)))
154+
s.Require().Equal(newValidatorBalance, validatorBalance.Sub(sdk.NewCoin(initialization.TerraDenom, subAmount.AddRaw(2))))
177155
}
178156

157+
// Each tx gas will cost 2 uluna (1 is for ante handler, 1 is for post handler)
179158
func (s *IntegrationTestSuite) TestFeeTaxWasm() {
180159
chain := s.configurer.GetChainConfig(0)
181160
node, err := chain.GetDefaultNode()
@@ -184,49 +163,92 @@ func (s *IntegrationTestSuite) TestFeeTaxWasm() {
184163
testAddr := node.CreateWallet("test")
185164
transferAmount := sdkmath.NewInt(100000000)
186165
transferCoin := sdk.NewCoin(initialization.TerraDenom, transferAmount)
187-
node.BankSend(fmt.Sprintf("%suluna", transferAmount.Mul(sdk.NewInt(4))), initialization.ValidatorWalletName, testAddr)
166+
167+
gasLimit := transferCoin.Amount.MulRaw(initialization.E10).String()
168+
node.BankSend(fmt.Sprintf("%suluna", transferAmount.Mul(sdk.NewInt(4))), initialization.ValidatorWalletName, testAddr, gasLimit, sdk.NewCoins(transferCoin))
188169
node.StoreWasmCode("counter.wasm", initialization.ValidatorWalletName)
189170
chain.LatestCodeID = int(node.QueryLatestWasmCodeID())
190171
// instantiate contract and transfer 100000000uluna
191172
node.InstantiateWasmContract(
192173
strconv.Itoa(chain.LatestCodeID),
193174
`{"count": "0"}`, transferCoin.String(),
194-
"test")
175+
"test", gasLimit, sdk.NewCoins(transferCoin))
195176

196177
contracts, err := node.QueryContractsFromID(chain.LatestCodeID)
197178
s.Require().NoError(err)
198179
s.Require().Len(contracts, 1, "Wrong number of contracts for the counter")
199180

200181
balance1, err := node.QuerySpecificBalance(testAddr, initialization.TerraDenom)
201182
s.Require().NoError(err)
202-
// 400000000 - 100000000 - 100000000 * TaxRate = 300000000 - 10000000 * TaxRate
183+
// 400000000 - 100000000 - 100000000 * TaxRate - 2 (gas) = 300000000 - 10000000 * TaxRate - 2 (gas)
203184
taxAmount := initialization.TaxRate.MulInt(transferAmount).TruncateInt()
204-
s.Require().Equal(balance1.Amount, transferAmount.Mul(sdk.NewInt(3)).Sub(taxAmount))
205-
206-
stabilityFee := sdk.NewDecWithPrec(2, 2).MulInt(transferAmount)
185+
s.Require().Equal(balance1.Amount, transferAmount.Mul(sdk.NewInt(3)).Sub(taxAmount).SubRaw(2))
207186

208187
node.Instantiate2WasmContract(
209188
strconv.Itoa(chain.LatestCodeID),
210189
`{"count": "0"}`, "salt",
211190
transferCoin.String(),
212-
fmt.Sprintf("%duluna", stabilityFee), "300000", "test")
191+
"test", gasLimit, sdk.NewCoins(transferCoin))
213192

214193
contracts, err = node.QueryContractsFromID(chain.LatestCodeID)
215194
s.Require().NoError(err)
216195
s.Require().Len(contracts, 2, "Wrong number of contracts for the counter")
217196

218197
balance2, err := node.QuerySpecificBalance(testAddr, initialization.TerraDenom)
219198
s.Require().NoError(err)
220-
// balance1 - 100000000 - 100000000 * TaxRate
199+
// balance1 - 100000000 - 100000000 * TaxRate - 2 (gas)
221200
taxAmount = initialization.TaxRate.MulInt(transferAmount).TruncateInt()
222-
s.Require().Equal(balance2.Amount, balance1.Amount.Sub(transferAmount).Sub(taxAmount))
201+
s.Require().Equal(balance2.Amount, balance1.Amount.Sub(transferAmount).Sub(taxAmount).SubRaw(2))
223202

224203
contractAddr := contracts[0]
225-
node.WasmExecute(contractAddr, `{"donate": {}}`, transferCoin.String(), fmt.Sprintf("%duluna", stabilityFee), "test")
204+
node.WasmExecute(contractAddr, `{"donate": {}}`, transferCoin.String(), "test", gasLimit, sdk.NewCoins(transferCoin))
226205

227206
balance3, err := node.QuerySpecificBalance(testAddr, initialization.TerraDenom)
228207
s.Require().NoError(err)
229-
// balance2 - 100000000 - 100000000 * TaxRate
208+
// balance2 - 100000000 - 100000000 * TaxRate - 2 (gas)
230209
taxAmount = initialization.TaxRate.MulInt(transferAmount).TruncateInt()
231-
s.Require().Equal(balance3.Amount, balance2.Amount.Sub(transferAmount).Sub(taxAmount))
210+
s.Require().Equal(balance3.Amount, balance2.Amount.Sub(transferAmount).Sub(taxAmount).SubRaw(2))
211+
}
212+
213+
func (s *IntegrationTestSuite) TestFeeTaxGrant() {
214+
chain := s.configurer.GetChainConfig(0)
215+
node, err := chain.GetDefaultNode()
216+
s.Require().NoError(err)
217+
218+
transferAmount := sdkmath.NewInt(100000000)
219+
transferCoin := sdk.NewCoin(initialization.TerraDenom, transferAmount)
220+
221+
validatorAddr := node.GetWallet(initialization.ValidatorWalletName)
222+
s.Require().NotEqual(validatorAddr, "")
223+
224+
test1Addr := node.CreateWallet("test1")
225+
test2Addr := node.CreateWallet("test2")
226+
227+
// Test 1: try bank send with grant
228+
gasLimit := transferCoin.Amount.MulRaw(initialization.E10).String()
229+
node.BankSend(transferCoin.String(), validatorAddr, test1Addr, gasLimit, sdk.NewCoins(transferCoin))
230+
node.BankSend(transferCoin.String(), validatorAddr, test1Addr, gasLimit, sdk.NewCoins(transferCoin))
231+
node.BankSend(transferCoin.String(), validatorAddr, test2Addr, gasLimit, sdk.NewCoins(transferCoin))
232+
node.GrantAddress(test2Addr, test1Addr, transferCoin.String(), "test2")
233+
234+
validatorBalance, err := node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
235+
s.Require().NoError(err)
236+
237+
node.BankSendFeeGrantWithWallet(transferCoin.String(), test1Addr, validatorAddr, test2Addr, "test1", gasLimit, sdk.NewCoins(transferCoin))
238+
239+
newValidatorBalance, err := node.QuerySpecificBalance(validatorAddr, initialization.TerraDenom)
240+
s.Require().NoError(err)
241+
242+
balanceTest1, err := node.QuerySpecificBalance(test1Addr, initialization.TerraDenom)
243+
s.Require().NoError(err)
244+
245+
balanceTest2, err := node.QuerySpecificBalance(test2Addr, initialization.TerraDenom)
246+
s.Require().NoError(err)
247+
248+
s.Require().Equal(balanceTest1, transferCoin)
249+
s.Require().Equal(newValidatorBalance, validatorBalance.Add(transferCoin))
250+
// addr2 lost 2uluna to pay for grant msg's gas, 100000000 * TaxRate + 2uluna to pay for bank send msg's tx fees,
251+
s.Require().Equal(balanceTest2.Amount, transferAmount.Sub(initialization.TaxRate.MulInt(transferAmount).TruncateInt()).SubRaw(4))
252+
253+
// Test 2: try bank send with grant but pay by multiple fees denom
232254
}

0 commit comments

Comments
 (0)