mirror of https://github.com/certusone/wasmd.git
Update to handle multiple response types
This commit is contained in:
parent
741c414780
commit
ac95b583fc
|
@ -141,8 +141,8 @@ func (k Keeper) Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A
|
|||
}
|
||||
|
||||
// emit all events from this contract itself
|
||||
value := types.CosmosResult(*res, contractAddress)
|
||||
ctx.EventManager().EmitEvents(value.Events)
|
||||
events := types.ParseEvents(res.Log, contractAddress)
|
||||
ctx.EventManager().EmitEvents(events)
|
||||
|
||||
err = k.dispatchMessages(ctx, contractAddress, res.Messages)
|
||||
if err != nil {
|
||||
|
@ -158,17 +158,17 @@ func (k Keeper) Instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A
|
|||
}
|
||||
|
||||
// Execute executes the contract instance
|
||||
func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (sdk.Result, error) {
|
||||
func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) (*sdk.Result, error) {
|
||||
codeInfo, prefixStore, err := k.contractInstance(ctx, contractAddress)
|
||||
if err != nil {
|
||||
return sdk.Result{}, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// add more funds
|
||||
if !coins.IsZero() {
|
||||
sdkerr := k.bankKeeper.SendCoins(ctx, caller, contractAddress, coins)
|
||||
if sdkerr != nil {
|
||||
return sdk.Result{}, sdkerr
|
||||
return nil, sdkerr
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -184,20 +184,19 @@ func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller
|
|||
res, gasUsed, execErr := k.wasmer.Execute(codeInfo.CodeHash, params, msg, prefixStore, cosmwasmAPI, querier, ctx.GasMeter(), gas)
|
||||
consumeGas(ctx, gasUsed)
|
||||
if execErr != nil {
|
||||
return sdk.Result{}, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error())
|
||||
return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error())
|
||||
}
|
||||
|
||||
// emit all events from this contract itself
|
||||
value := types.CosmosResult(*res, contractAddress)
|
||||
ctx.EventManager().EmitEvents(value.Events)
|
||||
value.Events = nil
|
||||
events := types.ParseEvents(res.Log, contractAddress)
|
||||
ctx.EventManager().EmitEvents(events)
|
||||
|
||||
err = k.dispatchMessages(ctx, contractAddress, res.Messages)
|
||||
if err != nil {
|
||||
return sdk.Result{}, err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return value, nil
|
||||
return types.ResultFromData(res.Data), nil
|
||||
}
|
||||
|
||||
// Migrate allows to upgrade a contract to a new code with data migration.
|
||||
|
@ -235,10 +234,14 @@ func (k Keeper) Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller
|
|||
return nil, sdkerrors.Wrap(types.ErrMigrationFailed, err.Error())
|
||||
}
|
||||
|
||||
// emit all events from this contract migration itself
|
||||
value := types.CosmosResult(*res, contractAddress)
|
||||
ctx.EventManager().EmitEvents(value.Events)
|
||||
value.Events = nil
|
||||
// emit all events from this contract itself
|
||||
events := types.ParseEvents(res.Log, contractAddress)
|
||||
ctx.EventManager().EmitEvents(events)
|
||||
|
||||
err = k.dispatchMessages(ctx, contractAddress, res.Messages)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
contractInfo.UpdateCodeID(ctx, newCodeID)
|
||||
k.setContractInfo(ctx, contractAddress, contractInfo)
|
||||
|
@ -247,7 +250,7 @@ func (k Keeper) Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller
|
|||
return nil, sdkerrors.Wrap(err, "dispatch")
|
||||
}
|
||||
|
||||
return &value, nil
|
||||
return types.ResultFromData(res.Data), nil
|
||||
}
|
||||
|
||||
// UpdateContractAdmin sets the admin value on the ContractInfo. New admin can be nil to disable further migrations/ updates.
|
||||
|
|
|
@ -216,5 +216,5 @@ func handleExecute(ctx sdk.Context, k Keeper, msg *wasmTypes.MsgExecuteContract)
|
|||
}
|
||||
|
||||
res.Events = ctx.EventManager().Events()
|
||||
return &res, nil
|
||||
return res, nil
|
||||
}
|
||||
|
|
|
@ -144,24 +144,26 @@ func NewWasmCoins(cosmosCoins sdk.Coins) (wasmCoins []wasmTypes.Coin) {
|
|||
const CustomEventType = "wasm"
|
||||
const AttributeKeyContractAddr = "contract_address"
|
||||
|
||||
// CosmosResult converts from a Wasm Result type
|
||||
func CosmosResult(wasmResult wasmTypes.Result, contractAddr sdk.AccAddress) sdk.Result {
|
||||
var events []sdk.Event
|
||||
if len(wasmResult.Log) > 0 {
|
||||
// we always tag with the contract address issuing this event
|
||||
attrs := []sdk.Attribute{sdk.NewAttribute(AttributeKeyContractAddr, contractAddr.String())}
|
||||
for _, l := range wasmResult.Log {
|
||||
// and reserve the contract_address key for our use (not contract)
|
||||
if l.Key != AttributeKeyContractAddr {
|
||||
attr := sdk.NewAttribute(l.Key, l.Value)
|
||||
attrs = append(attrs, attr)
|
||||
}
|
||||
}
|
||||
events = []sdk.Event{sdk.NewEvent(CustomEventType, attrs...)}
|
||||
// ParseEvents converts wasm LogAttributes into an sdk.Events (with 0 or 1 elements)
|
||||
func ParseEvents(logs []wasmTypes.LogAttribute, contractAddr sdk.AccAddress) sdk.Events {
|
||||
if len(logs) == 0 {
|
||||
return nil
|
||||
}
|
||||
return sdk.Result{
|
||||
Data: []byte(wasmResult.Data),
|
||||
Events: events,
|
||||
// we always tag with the contract address issuing this event
|
||||
attrs := []sdk.Attribute{sdk.NewAttribute(AttributeKeyContractAddr, contractAddr.String())}
|
||||
for _, l := range logs {
|
||||
// and reserve the contract_address key for our use (not contract)
|
||||
if l.Key != AttributeKeyContractAddr {
|
||||
attr := sdk.NewAttribute(l.Key, l.Value)
|
||||
attrs = append(attrs, attr)
|
||||
}
|
||||
}
|
||||
return sdk.Events{sdk.NewEvent(CustomEventType, attrs...)}
|
||||
}
|
||||
|
||||
func ResultFromData(data string) *sdk.Result {
|
||||
return &sdk.Result{
|
||||
Data: []byte(data),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue