Skip to content

Commit

Permalink
Basic implementation of Token Transfer
Browse files Browse the repository at this point in the history
  • Loading branch information
evgeniy-scherbina committed Mar 14, 2024
1 parent f1bda0b commit 193a26a
Show file tree
Hide file tree
Showing 15 changed files with 700 additions and 38 deletions.
4 changes: 3 additions & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -545,17 +545,19 @@ func NewApp(
)

evmBankKeeper := evmutilkeeper.NewEvmBankKeeper(app.evmutilKeeper, app.bankKeeper, app.accountKeeper)
evmutilWrapper := newEvmutilWrapper(app.evmutilKeeper)
app.evmKeeper = evmkeeper.NewKeeper(
appCodec, keys[evmtypes.StoreKey], tkeys[evmtypes.TransientKey],
govAuthorityAddr,
app.accountKeeper, evmBankKeeper, app.stakingKeeper, app.feeMarketKeeper, app.transferKeeper,
app.accountKeeper, evmBankKeeper, app.stakingKeeper, app.feeMarketKeeper, app.transferKeeper, evmutilWrapper,
nil, // precompiled contracts
geth.NewEVM,
options.EVMTrace,
evmSubspace,
)

app.evmutilKeeper.SetEvmKeeper(app.evmKeeper)
evmutilWrapper.SetEvmKeeper(app.evmKeeper)

app.auctionKeeper = auctionkeeper.NewKeeper(
appCodec,
Expand Down
44 changes: 44 additions & 0 deletions app/precompile_helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package app

import (
"context"

sdk "github.com/cosmos/cosmos-sdk/types"
evmutilkeeper "github.com/kava-labs/kava/x/evmutil/keeper"
"github.com/kava-labs/kava/x/evmutil/types"
)

type evmutilWrapper struct {
keeper evmutilkeeper.Keeper
}

func newEvmutilWrapper(keeper evmutilkeeper.Keeper) *evmutilWrapper {
return &evmutilWrapper{
keeper: keeper,
}
}

func (e evmutilWrapper) ConvertERC20ToCoin(
goCtx context.Context,
initiator string,
receiver string,
kavaERC20Address string,
amount sdk.Int,
) error {
msgServer := evmutilkeeper.NewMsgServerImpl(e.keeper)

_, err := msgServer.ConvertERC20ToCoin(
goCtx,
&types.MsgConvertERC20ToCoin{
Initiator: initiator,
Receiver: receiver,
KavaERC20Address: kavaERC20Address,
Amount: amount,
},
)
return err
}

func (e *evmutilWrapper) SetEvmKeeper(evmKeeper types.EvmKeeper) {
e.keeper.SetEvmKeeper(evmKeeper)
}
2 changes: 1 addition & 1 deletion contracts/contracts/example_ibc/ExampleIBC.abi
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"ibcTransferCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferKavaCall","outputs":[],"stateMutability":"payable","type":"function"}]
[{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"ibcTransferCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"kavaERC20Address","type":"string"}],"name":"tokenTransferCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferKavaCall","outputs":[],"stateMutability":"payable","type":"function"}]
2 changes: 1 addition & 1 deletion contracts/contracts/example_ibc/ExampleIBC.bin
Original file line number Diff line number Diff line change
@@ -1 +1 @@
60806040523461001f57610011610024565b61088d610030823961088d90f35b61002a565b60405190565b600080fdfe60806040526004361015610013575b61036b565b61001e60003561003d565b80631a3c0bc11461003857632c78f25e0361000e57610325565b6101b2565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b909182601f8301121561009c5781359167ffffffffffffffff831161009757602001926001830284011161009257565b61005d565b610058565b610053565b67ffffffffffffffff1690565b6100b7816100a1565b036100be57565b600080fd5b905035906100d0826100ae565b565b909160e0828403126101a757600082013567ffffffffffffffff81116101a257836100fe918401610062565b929093602082013567ffffffffffffffff811161019d5781610121918401610062565b929093604082013567ffffffffffffffff81116101985783610144918401610062565b92909361015481606084016100c3565b9261016282608085016100c3565b926101708360a083016100c3565b9260c082013567ffffffffffffffff81116101935761018f9201610062565b9091565b61004e565b61004e565b61004e565b61004e565b610049565b60000190565b6101d26101c03660046100d2565b99989098979197969296959395610680565b6101da610043565b806101e4816101ac565b0390f35b600080fd5b90565b6101f9816101ed565b0361020057565b600080fd5b90503590610212826101f0565b565b916101208383031261032057600083013567ffffffffffffffff811161031b5782610240918501610062565b929093602081013567ffffffffffffffff81116103165782610263918301610062565b929093604083013567ffffffffffffffff81116103115782610286918501610062565b9290936102968260608301610205565b92608082013567ffffffffffffffff811161030c57836102b7918401610062565b9290936102c78160a084016100c3565b926102d58260c085016100c3565b926102e38360e083016100c3565b9261010082013567ffffffffffffffff8111610307576103039201610062565b9091565b61004e565b61004e565b61004e565b61004e565b61004e565b610049565b3461036657610350610338366004610214565b9c9b909b9a919a9992999893989794979695966107c3565b610358610043565b80610362816101ac565b0390f35b6101e8565b600080fd5b60209181520190565b90826000939282370152565b601f801991011690565b91906103a9816103a2816103ae95610370565b8095610379565b610385565b0190565b6103bb906100a1565b9052565b969997929461042f9661040261043c9d9b97610425976103f38c61041b986104109860e0830192600081850391015261038f565b918c602081850391015261038f565b9189830360408b015261038f565b9860608701906103b2565b60808501906103b2565b60a08301906103b2565b60c081850391015261038f565b90565b634e487b7160e01b600052604160045260246000fd5b9061045f90610385565b810190811067ffffffffffffffff82111761047957604052565b61043f565b6002600360981b0190565b9061049c610495610043565b9283610455565b565b67ffffffffffffffff81116104bc576104b8602091610385565b0190565b61043f565b906104d36104ce8361049e565b610489565b918252565b606090565b3d6000146104fa576104ee3d6104c1565b903d6000602084013e5b565b6105026104d8565b906104f8565b90565b905090565b60207f743a200000000000000000000000000000000000000000000000000000000000917f63616c6c20746f20707265636f6d70696c65206661696c65642c206f7574707560008201520152565b61056a6023809261050b565b61057381610510565b0190565b5190565b60005b83811061058f575050906000910152565b80602091830151818501520161057e565b6105c56105bc926020926105b381610577565b9485809361050b565b9384910161057b565b0190565b906105d66105dc9261055e565b906105a0565b90565b906106076105eb610043565b80936105fb6020830191826105c9565b90810382520383610455565b565b6106286106316020936106369361061f81610577565b93848093610370565b9586910161057b565b610385565b0190565b6106509160208201916000818403910152610609565b90565b1561065b5750565b61067c90610667610043565b91829162461bcd60e51b83526004830161063a565b0390fd5b989490979399959199969296630119704160e61b99989a9790919293949596976106a8610043565b9b8c9b60208d019081526004019a6106bf9b6103bf565b6020820181038252036106d29082610455565b6106da61047e565b3491602081019051905a93600094938594f16106f46104dd565b6106fd90610508565b610706906105df565b61070f91610653565b565b61071a906101ed565b9052565b999c9a9561077b6107c09f9d99926107869261079e9861076d8f93986107b29f989a61075f6107a89f9b6107939d61012089019189830360008b015261038f565b91868303602088015261038f565b92604081850391015261038f565b9360608c0190610711565b89830360808b015261038f565b9860a08701906103b2565b60c08501906103b2565b60e08301906103b2565b61010081850391015261038f565b90565b9b97939c9894909a96929995919c631fa33e3760e01b9c9b9d9a909192939495969798999a6107f0610043565b9e8f9e8f6020019081526004019d6108079e61071e565b60208201810382520361081a9082610455565b61082261047e565b6020820191515a9260008094938194f161083a6104dd565b61084390610508565b61084c906105df565b61085591610653565b56fea26469706673582212206fab8762a40dc28d6cbe2bc1cd1d0315768c08761e077cc9399d34f339d1bcd964736f6c63430008170033
60806040523461001f57610011610024565b610977610030823961097790f35b61002a565b60405190565b600080fdfe60806040526004361015610013575b6103c1565b61001e60003561004d565b80631a3c0bc1146100485780632c78f25e14610043576370e5e03b0361000e5761037b565b610335565b6101c2565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b909182601f830112156100ac5781359167ffffffffffffffff83116100a75760200192600183028401116100a257565b61006d565b610068565b610063565b67ffffffffffffffff1690565b6100c7816100b1565b036100ce57565b600080fd5b905035906100e0826100be565b565b909160e0828403126101b757600082013567ffffffffffffffff81116101b2578361010e918401610072565b929093602082013567ffffffffffffffff81116101ad5781610131918401610072565b929093604082013567ffffffffffffffff81116101a85783610154918401610072565b92909361016481606084016100d3565b9261017282608085016100d3565b926101808360a083016100d3565b9260c082013567ffffffffffffffff81116101a35761019f9201610072565b9091565b61005e565b61005e565b61005e565b61005e565b610059565b60000190565b6101e26101d03660046100e2565b999890989791979692969593956106d6565b6101ea610053565b806101f4816101bc565b0390f35b600080fd5b90565b610209816101fd565b0361021057565b600080fd5b9050359061022282610200565b565b916101208383031261033057600083013567ffffffffffffffff811161032b5782610250918501610072565b929093602081013567ffffffffffffffff81116103265782610273918301610072565b929093604083013567ffffffffffffffff81116103215782610296918501610072565b9290936102a68260608301610215565b92608082013567ffffffffffffffff811161031c57836102c7918401610072565b9290936102d78160a084016100d3565b926102e58260c085016100d3565b926102f38360e083016100d3565b9261010082013567ffffffffffffffff8111610317576103139201610072565b9091565b61005e565b61005e565b61005e565b61005e565b61005e565b610059565b3461037657610360610348366004610224565b9c9b909b9a919a999299989398979497969596610819565b610368610053565b80610372816101bc565b0390f35b6101f8565b346103bc576103a661038e366004610224565b9c9b909b9a919a9992999893989794979695966108ad565b6103ae610053565b806103b8816101bc565b0390f35b6101f8565b600080fd5b60209181520190565b90826000939282370152565b601f801991011690565b91906103ff816103f881610404956103c6565b80956103cf565b6103db565b0190565b610411906100b1565b9052565b9699979294610485966104586104929d9b9761047b976104498c610471986104669860e083019260008185039101526103e5565b918c60208185039101526103e5565b9189830360408b01526103e5565b986060870190610408565b6080850190610408565b60a0830190610408565b60c08185039101526103e5565b90565b634e487b7160e01b600052604160045260246000fd5b906104b5906103db565b810190811067ffffffffffffffff8211176104cf57604052565b610495565b6002600360981b0190565b906104f26104eb610053565b92836104ab565b565b67ffffffffffffffff81116105125761050e6020916103db565b0190565b610495565b90610529610524836104f4565b6104df565b918252565b606090565b3d600014610550576105443d610517565b903d6000602084013e5b565b61055861052e565b9061054e565b90565b905090565b60207f743a200000000000000000000000000000000000000000000000000000000000917f63616c6c20746f20707265636f6d70696c65206661696c65642c206f7574707560008201520152565b6105c060238092610561565b6105c981610566565b0190565b5190565b60005b8381106105e5575050906000910152565b8060209183015181850152016105d4565b61061b61061292602092610609816105cd565b94858093610561565b938491016105d1565b0190565b9061062c610632926105b4565b906105f6565b90565b9061065d610641610053565b809361065160208301918261061f565b908103825203836104ab565b565b61067e61068760209361068c93610675816105cd565b938480936103c6565b958691016105d1565b6103db565b0190565b6106a6916020820191600081840391015261065f565b90565b156106b15750565b6106d2906106bd610053565b91829162461bcd60e51b835260048301610690565b0390fd5b989490979399959199969296630119704160e61b99989a9790919293949596976106fe610053565b9b8c9b60208d019081526004019a6107159b610415565b60208201810382520361072890826104ab565b6107306104d4565b3491602081019051905a93600094938594f161074a610533565b6107539061055e565b61075c90610635565b610765916106a9565b565b610770906101fd565b9052565b999c9a956107d16108169f9d99926107dc926107f4986107c38f93986108089f989a6107b56107fe9f9b6107e99d61012089019189830360008b01526103e5565b9186830360208801526103e5565b9260408185039101526103e5565b9360608c0190610767565b89830360808b01526103e5565b9860a0870190610408565b60c0850190610408565b60e0830190610408565b6101008185039101526103e5565b90565b9b97939c9894909a96929995919c631fa33e3760e01b9c9b9d9a909192939495969798999a610846610053565b9e8f9e8f6020019081526004019d61085d9e610774565b60208201810382520361087090826104ab565b6108786104d4565b6020820191515a9260008094938194f1610890610533565b6108999061055e565b6108a290610635565b6108ab916106a9565b565b9b97939c9894909a96929995919c638435e69760e01b9c9b9d9a909192939495969798999a6108da610053565b9e8f9e8f6020019081526004019d6108f19e610774565b60208201810382520361090490826104ab565b61090c6104d4565b6020820191515a9260008094938194f1610924610533565b61092d9061055e565b61093690610635565b61093f916106a9565b56fea26469706673582212208d20d617820b667241617ccdb62b4eb2623940fb525a7982d618db829d0b35d564736f6c63430008170033
42 changes: 42 additions & 0 deletions contracts/contracts/example_ibc/ExampleIBC.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,19 @@ interface IBC {
uint64 timeoutTimestamp,
string calldata memo
) external;

function tokenTransfer(
string calldata sourcePort,
string calldata sourceChannel,
string calldata denom,
uint256 amount,
string calldata receiver,
uint64 revisionNumber,
uint64 revisionHeight,
uint64 timeoutTimestamp,
// string calldata memo,
string calldata kavaERC20Address
) external;
}

contract ExampleIBC {
Expand Down Expand Up @@ -81,4 +94,33 @@ contract ExampleIBC {
(bool success, bytes memory output) = PRECOMPILED_IBC_CONTRACT_ADDRESS.call(input);
require(success, string.concat("call to precompile failed, output: ", string(output)));
}

function tokenTransferCall(
string calldata sourcePort,
string calldata sourceChannel,
string calldata denom,
uint256 amount,
string calldata receiver,
uint64 revisionNumber,
uint64 revisionHeight,
uint64 timeoutTimestamp,
// string calldata memo,
string calldata kavaERC20Address
) external {
bytes memory input = abi.encodeWithSelector(
IBC.tokenTransfer.selector,
sourcePort,
sourceChannel,
denom,
amount,
receiver,
revisionNumber,
revisionHeight,
timeoutTimestamp,
// memo,
kavaERC20Address
);
(bool success, bytes memory output) = PRECOMPILED_IBC_CONTRACT_ADDRESS.call(input);
require(success, string.concat("call to precompile failed, output: ", string(output)));
}
}
2 changes: 1 addition & 1 deletion contracts/contracts/example_ibc/IBC.abi
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"ibcTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferKava","outputs":[],"stateMutability":"nonpayable","type":"function"}]
[{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"ibcTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"denom","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"kavaERC20Address","type":"string"}],"name":"tokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourcePort","type":"string"},{"internalType":"string","name":"sourceChannel","type":"string"},{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"},{"internalType":"uint64","name":"timeoutTimestamp","type":"uint64"},{"internalType":"string","name":"memo","type":"string"}],"name":"transferKava","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Loading

0 comments on commit 193a26a

Please sign in to comment.