Merge pull request #60 from cosmwasm/remove-unneeded-sends
Remove unneeded sends
This commit is contained in:
@@ -40,7 +40,7 @@ func listCodesHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
|
||||
func queryCodeHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
codeID, err := strconv.ParseUint(mux.Vars(r)["codeId"], 10, 64)
|
||||
codeID, err := strconv.ParseUint(mux.Vars(r)["codeID"], 10, 64)
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
const (
|
||||
AttributeKeyContract = "contract_address"
|
||||
AttributeKeyCodeID = "code_id"
|
||||
AttributeSigner = "signer"
|
||||
)
|
||||
|
||||
// NewHandler returns a handler for "bank" type messages.
|
||||
@@ -51,12 +52,13 @@ func handleStoreCode(ctx sdk.Context, k Keeper, msg *MsgStoreCode) (*sdk.Result,
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// de-duplicate events sent in other parts of the sdk
|
||||
// https://github.com/confio/cosm-js/pull/40#discussion_r374811810
|
||||
ctx.EventManager().EmitEvent(
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
|
||||
sdk.NewAttribute(sdk.AttributeKeyAction, "store-code"),
|
||||
sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", codeID)),
|
||||
),
|
||||
)
|
||||
@@ -77,8 +79,7 @@ func handleInstantiate(ctx sdk.Context, k Keeper, msg *MsgInstantiateContract) (
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
|
||||
sdk.NewAttribute(sdk.AttributeKeyAction, "instantiate"),
|
||||
sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", msg.Code)),
|
||||
sdk.NewAttribute(AttributeKeyContract, contractAddr.String()),
|
||||
),
|
||||
@@ -100,8 +101,7 @@ func handleExecute(ctx sdk.Context, k Keeper, msg *MsgExecuteContract) (*sdk.Res
|
||||
sdk.NewEvent(
|
||||
sdk.EventTypeMessage,
|
||||
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
|
||||
sdk.NewAttribute(sdk.AttributeKeyAction, "execute"),
|
||||
sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeSigner, msg.Sender.String()),
|
||||
sdk.NewAttribute(AttributeKeyContract, msg.Contract.String()),
|
||||
),
|
||||
)
|
||||
|
||||
@@ -68,11 +68,11 @@ func (k Keeper) Create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte,
|
||||
return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error())
|
||||
}
|
||||
var codeHash []byte
|
||||
if isSimulationMode(ctx){
|
||||
if isSimulationMode(ctx) {
|
||||
// https://github.com/cosmwasm/wasmd/issues/42
|
||||
// any sha256 hash is good enough
|
||||
codeHash = make([]byte, 32)
|
||||
}else {
|
||||
} else {
|
||||
codeHash, err = k.wasmer.Create(wasmCode)
|
||||
if err != nil {
|
||||
// return 0, sdkerrors.Wrap(err, "cosmwasm create")
|
||||
@@ -103,11 +103,17 @@ func (k Keeper) Instantiate(ctx sdk.Context, codeID uint64, creator sdk.AccAddre
|
||||
}
|
||||
|
||||
// deposit initial contract funds
|
||||
sdkerr := k.bankKeeper.SendCoins(ctx, creator, contractAddress, deposit)
|
||||
if sdkerr != nil {
|
||||
return nil, sdkerr
|
||||
var contractAccount exported.Account
|
||||
if !deposit.IsZero() {
|
||||
sdkerr := k.bankKeeper.SendCoins(ctx, creator, contractAddress, deposit)
|
||||
if sdkerr != nil {
|
||||
return nil, sdkerr
|
||||
}
|
||||
contractAccount = k.accountKeeper.GetAccount(ctx, contractAddress)
|
||||
} else {
|
||||
contractAccount = k.accountKeeper.NewAccountWithAddress(ctx, contractAddress)
|
||||
k.accountKeeper.SetAccount(ctx, contractAccount)
|
||||
}
|
||||
contractAccount := k.accountKeeper.GetAccount(ctx, contractAddress)
|
||||
|
||||
// get contact info
|
||||
store := ctx.KVStore(k.storeKey)
|
||||
@@ -154,12 +160,16 @@ func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller
|
||||
if err != nil {
|
||||
return sdk.Result{}, err
|
||||
}
|
||||
|
||||
// add more funds
|
||||
sdkerr := k.bankKeeper.SendCoins(ctx, caller, contractAddress, coins)
|
||||
if sdkerr != nil {
|
||||
return sdk.Result{}, sdkerr
|
||||
if !coins.IsZero() {
|
||||
sdkerr := k.bankKeeper.SendCoins(ctx, caller, contractAddress, coins)
|
||||
if sdkerr != nil {
|
||||
return sdk.Result{}, sdkerr
|
||||
}
|
||||
}
|
||||
contractAccount := k.accountKeeper.GetAccount(ctx, contractAddress)
|
||||
|
||||
params := types.NewParams(ctx, caller, coins, contractAccount)
|
||||
|
||||
gas := gasForContract(ctx)
|
||||
@@ -316,11 +326,11 @@ func (k Keeper) dispatchMessage(ctx sdk.Context, contract exported.Account, msg
|
||||
if stderr != nil {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Contract.ContractAddr)
|
||||
}
|
||||
err := k.sendTokens(ctx, contractAddr, contractAddr.String(), targetAddr.String(), msg.Contract.Send)
|
||||
sentFunds, err := convertWasmCoinToSdkCoin(msg.Contract.Send)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = k.Execute(ctx, targetAddr, contractAddr, []byte(msg.Contract.Msg), nil)
|
||||
_, err = k.Execute(ctx, targetAddr, contractAddr, []byte(msg.Contract.Msg), sentFunds)
|
||||
return err // may be nil
|
||||
} else if msg.Opaque != nil {
|
||||
msg, err := ParseOpaqueMsg(k.cdc, msg.Opaque)
|
||||
@@ -354,17 +364,9 @@ func convertCosmosSendMsg(from string, to string, coins []wasmTypes.Coin) (bank.
|
||||
return bank.MsgSend{}, sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, to)
|
||||
}
|
||||
|
||||
var toSend sdk.Coins
|
||||
for _, coin := range coins {
|
||||
amount, ok := sdk.NewIntFromString(coin.Amount)
|
||||
if !ok {
|
||||
return bank.MsgSend{}, sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, coin.Amount+coin.Denom)
|
||||
}
|
||||
c := sdk.Coin{
|
||||
Denom: coin.Denom,
|
||||
Amount: amount,
|
||||
}
|
||||
toSend = append(toSend, c)
|
||||
toSend, err := convertWasmCoinToSdkCoin(coins)
|
||||
if err != nil {
|
||||
return bank.MsgSend{}, err
|
||||
}
|
||||
sendMsg := bank.MsgSend{
|
||||
FromAddress: fromAddr,
|
||||
@@ -374,6 +376,22 @@ func convertCosmosSendMsg(from string, to string, coins []wasmTypes.Coin) (bank.
|
||||
return sendMsg, nil
|
||||
}
|
||||
|
||||
func convertWasmCoinToSdkCoin(coins []wasmTypes.Coin) (sdk.Coins, error) {
|
||||
var toSend sdk.Coins
|
||||
for _, coin := range coins {
|
||||
amount, ok := sdk.NewIntFromString(coin.Amount)
|
||||
if !ok {
|
||||
return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, coin.Amount+coin.Denom)
|
||||
}
|
||||
c := sdk.Coin{
|
||||
Denom: coin.Denom,
|
||||
Amount: amount,
|
||||
}
|
||||
toSend = append(toSend, c)
|
||||
}
|
||||
return toSend, nil
|
||||
}
|
||||
|
||||
func (k Keeper) handleSdkMessage(ctx sdk.Context, contractAddr sdk.Address, msg sdk.Msg) error {
|
||||
// make sure this account can send it
|
||||
for _, acct := range msg.GetSigners() {
|
||||
|
||||
@@ -151,7 +151,7 @@ func TestInstantiate(t *testing.T) {
|
||||
require.Equal(t, "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", addr.String())
|
||||
|
||||
gasAfter := ctx.GasMeter().GasConsumed()
|
||||
require.Equal(t, uint64(37052), gasAfter-gasBefore)
|
||||
require.Equal(t, uint64(28426), gasAfter-gasBefore)
|
||||
}
|
||||
|
||||
func TestInstantiateWithNonExistingCodeID(t *testing.T) {
|
||||
@@ -249,7 +249,7 @@ func TestExecute(t *testing.T) {
|
||||
require.NotNil(t, contractAcct)
|
||||
assert.Equal(t, sdk.Coins(nil), contractAcct.GetCoins())
|
||||
|
||||
t.Logf("Duration: %v (81488 gas)\n", diff)
|
||||
t.Logf("Duration: %v (31728 gas)\n", diff)
|
||||
}
|
||||
|
||||
func TestExecuteWithNonExistingAddress(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user