Skip to content

Commit ac13f0f

Browse files
authored
feat: support to thirdweb (#142)
* feat: support to thirdweb * fix: add error handling in vm execute * fix: rollback refunded gas * fix: use reward distribution account * chore: use upgrade fee supporter
1 parent 93e3855 commit ac13f0f

File tree

3 files changed

+118
-2
lines changed

3 files changed

+118
-2
lines changed

app/app.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import (
4646
"github.com/xpladev/xpla/app/openapiconsole"
4747
xplaappparams "github.com/xpladev/xpla/app/params"
4848
"github.com/xpladev/xpla/app/upgrades"
49-
v1_5 "github.com/xpladev/xpla/app/upgrades/v1_5"
49+
v1_6 "github.com/xpladev/xpla/app/upgrades/v1_6"
5050
"github.com/xpladev/xpla/docs"
5151

5252
"github.com/CosmWasm/wasmd/x/wasm"
@@ -58,7 +58,7 @@ var (
5858
DefaultNodeHome string
5959

6060
Upgrades = []upgrades.Upgrade{
61-
v1_5.Upgrade,
61+
v1_6.Upgrade,
6262
}
6363
)
6464

app/upgrades/v1_6/const.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package v1_6
2+
3+
import (
4+
store "github.com/cosmos/cosmos-sdk/store/types"
5+
6+
"github.com/xpladev/xpla/app/upgrades"
7+
)
8+
9+
const (
10+
UpgradeName = "v1_6"
11+
)
12+
13+
var Upgrade = upgrades.Upgrade{
14+
UpgradeName: UpgradeName,
15+
CreateUpgradeHandler: CreateUpgradeHandler,
16+
StoreUpgrades: store.StoreUpgrades{
17+
Added: []string{},
18+
Deleted: []string{},
19+
},
20+
}
21+
22+
const (
23+
// https://github.com/Arachnid/deterministic-deployment-proxy
24+
thirdwebProxy = "0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"
25+
26+
upgradeFeeSupporter = "xpla1xj3vn9a27u5q945e2xvwfdh3hv6zuy0qkx9d4l"
27+
)

app/upgrades/v1_6/upgrades.go

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package v1_6
2+
3+
import (
4+
"math/big"
5+
6+
"cosmossdk.io/errors"
7+
sdkmath "cosmossdk.io/math"
8+
"github.com/cosmos/cosmos-sdk/codec"
9+
sdk "github.com/cosmos/cosmos-sdk/types"
10+
"github.com/cosmos/cosmos-sdk/types/module"
11+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
12+
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
13+
"github.com/ethereum/go-ethereum/common/hexutil"
14+
ethtypes "github.com/ethereum/go-ethereum/core/types"
15+
16+
evmtypes "github.com/xpladev/ethermint/x/evm/types"
17+
"github.com/xpladev/xpla/app/keepers"
18+
)
19+
20+
func CreateUpgradeHandler(
21+
mm *module.Manager,
22+
configurator module.Configurator,
23+
keepers *keepers.AppKeepers,
24+
cdc codec.BinaryCodec,
25+
) upgradetypes.UpgradeHandler {
26+
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
27+
data, err := hexutil.Decode(thirdwebProxy)
28+
if err != nil {
29+
return nil, errors.Wrap(err, "failed to decode ethereum tx hex bytes")
30+
}
31+
32+
msg := &evmtypes.MsgEthereumTx{}
33+
if err := msg.UnmarshalBinary(data); err != nil {
34+
return nil, err
35+
}
36+
37+
if err := msg.ValidateBasic(); err != nil {
38+
return nil, err
39+
}
40+
41+
// fund fee collector by upgrade fee supporter
42+
upgradeFeeSupporterAccout, err := sdk.AccAddressFromBech32(upgradeFeeSupporter)
43+
if err != nil {
44+
return nil, err
45+
}
46+
evmDenom := keepers.EvmKeeper.GetParams(ctx).EvmDenom
47+
borrowedCoins := sdk.NewCoin(evmDenom, sdk.DefaultPowerReduction)
48+
err = keepers.BankKeeper.SendCoinsFromAccountToModule(ctx, upgradeFeeSupporterAccout, authtypes.FeeCollectorName, sdk.NewCoins(borrowedCoins))
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
// execute thiredweb proxy contract
54+
res, err := keepers.EvmKeeper.EthereumTx(ctx, msg)
55+
if err != nil {
56+
return nil, err
57+
}
58+
59+
if res.Failed() {
60+
return nil, errors.ErrPanic.Wrap(res.VmError)
61+
}
62+
63+
// Gas refunded rollback without use
64+
tx := msg.AsTransaction()
65+
66+
signer := ethtypes.NewLondonSigner(keepers.EvmKeeper.ChainID())
67+
from, err := signer.Sender(tx)
68+
if err != nil {
69+
return nil, err
70+
}
71+
72+
// sender -> rewardDistributeAccount
73+
refundedGas := msg.GetGas() - res.GasUsed
74+
refundAmount := new(big.Int).Mul(new(big.Int).SetUint64(refundedGas), tx.GasPrice())
75+
refundCoin := sdk.NewCoin(evmDenom, sdkmath.NewIntFromBigInt(refundAmount))
76+
err = keepers.BankKeeper.SendCoins(ctx, from.Bytes(), upgradeFeeSupporterAccout, sdk.NewCoins(refundCoin))
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
// feeCollector -> rewardDistributeAccount
82+
err = keepers.BankKeeper.SendCoinsFromModuleToAccount(ctx, authtypes.FeeCollectorName, upgradeFeeSupporterAccout, sdk.NewCoins(borrowedCoins.Sub(refundCoin)))
83+
if err != nil {
84+
return nil, err
85+
}
86+
87+
return mm.RunMigrations(ctx, configurator, fromVM)
88+
}
89+
}

0 commit comments

Comments
 (0)