diff --git a/.changelog/v4.1.0-rc.4/bug-fixes/323-account-existence.md b/.changelog/v4.1.0-rc.4/bug-fixes/323-account-existence.md new file mode 100644 index 00000000..60665ce6 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/bug-fixes/323-account-existence.md @@ -0,0 +1 @@ +- Improve checks around account existence when registering a new forwarding account. ([#323](https://github.com/noble-assets/noble/pull/323)) diff --git a/.changelog/v4.1.0-rc.4/bug-fixes/328-channel-state.md b/.changelog/v4.1.0-rc.4/bug-fixes/328-channel-state.md new file mode 100644 index 00000000..a2688824 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/bug-fixes/328-channel-state.md @@ -0,0 +1 @@ +- Implement channel state checks registering and clearing forwarding accounts. ([#328](https://github.com/noble-assets/noble/pull/328)) diff --git a/.changelog/v4.1.0-rc.4/bug-fixes/350-packet-receiver.md b/.changelog/v4.1.0-rc.4/bug-fixes/350-packet-receiver.md new file mode 100644 index 00000000..cf760561 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/bug-fixes/350-packet-receiver.md @@ -0,0 +1 @@ +- Pass a packet onto the next middleware if we fail to decode the receiver. ([#350](https://github.com/noble-assets/noble/pull/350)) diff --git a/.changelog/v4.1.0-rc.4/dependencies/346-ftf.md b/.changelog/v4.1.0-rc.4/dependencies/346-ftf.md new file mode 100644 index 00000000..8b830381 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/dependencies/346-ftf.md @@ -0,0 +1 @@ +- Bump FiatTokenFactory to [`0a7385d`](https://github.com/circlefin/noble-fiattokenfactory/commit/0a7385d9a37744ced1e4d61eae10de2b117f482b) for various blocklist and paused check improvements. ([#346](https://github.com/noble-assets/noble/pull/346)) diff --git a/.changelog/v4.1.0-rc.4/dependencies/346-ibc.md b/.changelog/v4.1.0-rc.4/dependencies/346-ibc.md new file mode 100644 index 00000000..80dfb55e --- /dev/null +++ b/.changelog/v4.1.0-rc.4/dependencies/346-ibc.md @@ -0,0 +1 @@ +- Bump IBC to [`v4.6.0`](https://github.com/cosmos/ibc-go/releases/tag/v4.6.0) to resolve [ASA-2024-007](https://github.com/cosmos/ibc-go/security/advisories/GHSA-j496-crgh-34mx) security advisory. ([#346](https://github.com/noble-assets/noble/pull/346)) diff --git a/.changelog/v4.1.0-rc.4/dependencies/346-pfm.md b/.changelog/v4.1.0-rc.4/dependencies/346-pfm.md new file mode 100644 index 00000000..d6f0ffde --- /dev/null +++ b/.changelog/v4.1.0-rc.4/dependencies/346-pfm.md @@ -0,0 +1 @@ +- Bump PFM from Mandrake patch commit ([`455757b`](https://github.com/cosmos/ibc-apps/commit/455757bb5771c29cf2f83b59e37f6513e07c92be)) to release tag ([`v4.1.2`](https://github.com/cosmos/ibc-apps/releases/tag/middleware%2Fpacket-forward-middleware%2Fv4.1.2)). ([#346](https://github.com/noble-assets/noble/pull/346)) diff --git a/.changelog/v4.1.0-rc.4/dependencies/346-sdk.md b/.changelog/v4.1.0-rc.4/dependencies/346-sdk.md new file mode 100644 index 00000000..44de323b --- /dev/null +++ b/.changelog/v4.1.0-rc.4/dependencies/346-sdk.md @@ -0,0 +1 @@ +- Switch to Noble's Cosmos SDK fork ([`v0.45.16-noble`](https://github.com/noble-assets/cosmos-sdk/releases/tag/v0.45.16-noble)), allowing `DeliverTx` to be extended. ([#346](https://github.com/noble-assets/noble/pull/346)) diff --git a/.changelog/v4.1.0-rc.4/features/312-manual-clearing.md b/.changelog/v4.1.0-rc.4/features/312-manual-clearing.md new file mode 100644 index 00000000..84cee742 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/features/312-manual-clearing.md @@ -0,0 +1 @@ +- Allow forwarding accounts to be manually cleared by any user. ([#312](https://github.com/noble-assets/noble/pull/312)) diff --git a/.changelog/v4.1.0-rc.4/improvements/346-migrate-blockibc.md b/.changelog/v4.1.0-rc.4/improvements/346-migrate-blockibc.md new file mode 100644 index 00000000..ae307f14 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/improvements/346-migrate-blockibc.md @@ -0,0 +1 @@ +- Switch to migrated `x/blockibc` under [`circlefin/noble-fiattokenfactory`](https://github.com/circlefin/noble-fiattokenfactory). ([#346](https://github.com/noble-assets/noble/pull/346)) diff --git a/.changelog/v4.1.0-rc.4/summary.md b/.changelog/v4.1.0-rc.4/summary.md new file mode 100644 index 00000000..8ab73f66 --- /dev/null +++ b/.changelog/v4.1.0-rc.4/summary.md @@ -0,0 +1,3 @@ +*Apr 14, 2024* + +This is the fifth release candidate for a minor release to the v4 Argon line. diff --git a/CHANGELOG.md b/CHANGELOG.md index d0b65630..2d9fe5dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # CHANGELOG +## v4.1.0-rc.4 + +*Apr 14, 2024* + +This is the fifth release candidate for a minor release to the v4 Argon line. + +### BUG FIXES + +- Improve checks around account existence when registering a new forwarding account. ([#323](https://github.com/noble-assets/noble/pull/323)) +- Implement channel state checks registering and clearing forwarding accounts. ([#328](https://github.com/noble-assets/noble/pull/328)) +- Pass a packet onto the next middleware if we fail to decode the receiver. ([#350](https://github.com/noble-assets/noble/pull/350)) + +### DEPENDENCIES + +- Bump PFM from Mandrake patch commit ([`455757b`](https://github.com/cosmos/ibc-apps/commit/455757bb5771c29cf2f83b59e37f6513e07c92be)) to release tag ([`v4.1.2`](https://github.com/cosmos/ibc-apps/releases/tag/middleware%2Fpacket-forward-middleware%2Fv4.1.2)). ([#346](https://github.com/noble-assets/noble/pull/346)) +- Switch to Noble's Cosmos SDK fork ([`v0.45.16-noble`](https://github.com/noble-assets/cosmos-sdk/releases/tag/v0.45.16-noble)), allowing `DeliverTx` to be extended. ([#346](https://github.com/noble-assets/noble/pull/346)) +- Bump IBC to [`v4.6.0`](https://github.com/cosmos/ibc-go/releases/tag/v4.6.0) to resolve [ASA-2024-007](https://github.com/cosmos/ibc-go/security/advisories/GHSA-j496-crgh-34mx) security advisory. ([#346](https://github.com/noble-assets/noble/pull/346)) +- Bump FiatTokenFactory to [`0a7385d`](https://github.com/circlefin/noble-fiattokenfactory/commit/0a7385d9a37744ced1e4d61eae10de2b117f482b) for various blocklist and paused check improvements. ([#346](https://github.com/noble-assets/noble/pull/346)) + +### FEATURES + +- Allow forwarding accounts to be manually cleared by any user. ([#312](https://github.com/noble-assets/noble/pull/312)) + +### IMPROVEMENTS + +- Switch to migrated `x/blockibc` under [`circlefin/noble-fiattokenfactory`](https://github.com/circlefin/noble-fiattokenfactory). ([#346](https://github.com/noble-assets/noble/pull/346)) + ## v4.1.0-rc.3 *Mar 11, 2024* diff --git a/app/abci.go b/app/abci.go new file mode 100644 index 00000000..3183f313 --- /dev/null +++ b/app/abci.go @@ -0,0 +1,21 @@ +package app + +import ( + "github.com/cosmos/cosmos-sdk/types/errors" + abci "github.com/tendermint/tendermint/abci/types" +) + +func (app *App) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { + res := app.BaseApp.DeliverTx(req) + ctx := app.BaseApp.DeliverState.Context() + + for _, event := range res.Events { + err := app.FiatTokenFactoryKeeper.HandleDeliverTxEvent(ctx, event) + if err != nil { + app.SetDeliverState(ctx.BlockHeader()) + return errors.ResponseDeliverTxWithEvents(err, uint64(res.GasWanted), uint64(res.GasUsed), res.Events, app.Trace()) + } + } + + return res +} diff --git a/app/ante.go b/app/ante.go index 8f98e3c3..7eaffc56 100644 --- a/app/ante.go +++ b/app/ante.go @@ -3,6 +3,7 @@ package app import ( "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory" fiattokenfactorykeeper "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory/keeper" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/auth/ante" @@ -16,6 +17,7 @@ import ( type HandlerOptions struct { ante.HandlerOptions + cdc codec.Codec fiatTokenFactoryKeeper *fiattokenfactorykeeper.Keeper IBCKeeper *ibckeeper.Keeper GlobalFeeSubspace paramtypes.Subspace @@ -52,7 +54,7 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { ante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first ante.NewRejectExtensionOptionsDecorator(), fiattokenfactory.NewIsBlacklistedDecorator(options.fiatTokenFactoryKeeper), - fiattokenfactory.NewIsPausedDecorator(options.fiatTokenFactoryKeeper), + fiattokenfactory.NewIsPausedDecorator(options.cdc, options.fiatTokenFactoryKeeper), forwarding.NewAnteDecorator(options.ForwardingKeeper, options.AccountKeeper), ante.NewMempoolFeeDecorator(), ante.NewValidateBasicDecorator(), diff --git a/app/app.go b/app/app.go index 38dc3ae5..b91d07f5 100644 --- a/app/app.go +++ b/app/app.go @@ -87,16 +87,16 @@ import ( tmos "github.com/tendermint/tendermint/libs/os" dbm "github.com/tendermint/tm-db" + "github.com/circlefin/noble-fiattokenfactory/x/blockibc" fiattokenfactorymodule "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory" fiattokenfactorymodulekeeper "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory/keeper" fiattokenfactorymoduletypes "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - v4m1p0rc2 "github.com/noble-assets/noble/v4/app/upgrades/v4.1.0-rc.2" + "github.com/noble-assets/noble/v4/app/upgrades/fusion" "github.com/noble-assets/noble/v4/cmd" "github.com/noble-assets/noble/v4/docs" - "github.com/noble-assets/noble/v4/x/blockibc" "github.com/noble-assets/noble/v4/x/globalfee" tariff "github.com/noble-assets/noble/v4/x/tariff" tariffkeeper "github.com/noble-assets/noble/v4/x/tariff/keeper" @@ -502,7 +502,7 @@ func New( packetforwardkeeper.DefaultForwardTransferPacketTimeoutTimestamp, packetforwardkeeper.DefaultRefundTransferPacketTimeoutTimestamp, ) - transferStack = blockibc.NewIBCMiddleware(transferStack, app.TokenFactoryKeeper, app.FiatTokenFactoryKeeper) + transferStack = blockibc.NewIBCMiddleware(transferStack, app.FiatTokenFactoryKeeper) // Create static IBC router, add transfer route, then set and seal it ibcRouter := ibcporttypes.NewRouter() @@ -681,6 +681,7 @@ func New( SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), SigGasConsumer: ante.DefaultSigVerificationGasConsumer, }, + cdc: appCodec, fiatTokenFactoryKeeper: app.FiatTokenFactoryKeeper, IBCKeeper: app.IBCKeeper, @@ -876,10 +877,10 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino } func (app *App) setupUpgradeHandlers() { - // v4.1.0-rc.2 upgrade + // fusion upgrade app.UpgradeKeeper.SetUpgradeHandler( - v4m1p0rc2.UpgradeName, - v4m1p0rc2.CreateUpgradeHandler( + fusion.UpgradeName, + fusion.CreateUpgradeHandler( app.mm, app.configurator, ), @@ -896,8 +897,8 @@ func (app *App) setupUpgradeHandlers() { var storeLoader baseapp.StoreLoader switch upgradeInfo.Name { - case v4m1p0rc2.UpgradeName: - storeLoader = v4m1p0rc2.CreateStoreLoader(upgradeInfo.Height) + case fusion.UpgradeName: + storeLoader = fusion.CreateStoreLoader(upgradeInfo.Height) } if storeLoader != nil { diff --git a/app/upgrades/v4.1.0-rc.2/constants.go b/app/upgrades/fusion/constants.go similarity index 77% rename from app/upgrades/v4.1.0-rc.2/constants.go rename to app/upgrades/fusion/constants.go index 05e8e07b..5b281288 100644 --- a/app/upgrades/v4.1.0-rc.2/constants.go +++ b/app/upgrades/fusion/constants.go @@ -1,7 +1,7 @@ -package v4m1p0rc2 +package fusion // UpgradeName is the name of this specific software upgrade used on-chain. -const UpgradeName = "v4.1.0-rc.2" +const UpgradeName = "fusion" // TestnetChainID is the Chain ID of the Noble testnet (Grand). const TestnetChainID = "grand-1" diff --git a/app/upgrades/v4.1.0-rc.2/store.go b/app/upgrades/fusion/store.go similarity index 57% rename from app/upgrades/v4.1.0-rc.2/store.go rename to app/upgrades/fusion/store.go index 044ffd84..21928867 100644 --- a/app/upgrades/v4.1.0-rc.2/store.go +++ b/app/upgrades/fusion/store.go @@ -1,17 +1,13 @@ -package v4m1p0rc2 +package fusion import ( "github.com/cosmos/cosmos-sdk/baseapp" storetypes "github.com/cosmos/cosmos-sdk/store/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - forwardingtypes "github.com/noble-assets/noble/v4/x/forwarding/types" ) func CreateStoreLoader(upgradeHeight int64) baseapp.StoreLoader { - storeUpgrades := storetypes.StoreUpgrades{ - Added: []string{forwardingtypes.StoreKey}, - Deleted: []string{"stabletokenfactory"}, - } + storeUpgrades := storetypes.StoreUpgrades{} return upgradetypes.UpgradeStoreLoader(upgradeHeight, &storeUpgrades) } diff --git a/app/upgrades/v4.1.0-rc.2/upgrade.go b/app/upgrades/fusion/upgrade.go similarity index 96% rename from app/upgrades/v4.1.0-rc.2/upgrade.go rename to app/upgrades/fusion/upgrade.go index adcaa33a..c58ad3bc 100644 --- a/app/upgrades/v4.1.0-rc.2/upgrade.go +++ b/app/upgrades/fusion/upgrade.go @@ -1,4 +1,4 @@ -package v4m1p0rc2 +package fusion import ( "fmt" diff --git a/go.mod b/go.mod index 6344494a..9da0b4ad 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.21 require ( cosmossdk.io/errors v1.0.0 github.com/circlefin/noble-cctp v0.0.0-20231108011259-7c5206df02dc - github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9 + github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377 github.com/cosmos/cosmos-sdk v0.45.16 - github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2-0.20240228222021-455757bb5771 - github.com/cosmos/ibc-go/v4 v4.5.1 + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2 + github.com/cosmos/ibc-go/v4 v4.6.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.3 github.com/gorilla/mux v1.8.0 @@ -153,6 +153,9 @@ replace ( // use cosmos compatible ChainSafe/go-schnorrkel github.com/ChainSafe/go-schnorrkel => github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d + // use noble compatible cosmos/cosmos-sdk + github.com/cosmos/cosmos-sdk => github.com/noble-assets/cosmos-sdk v0.45.16-noble + // use macos sonoma compatible cosmos/ledger-cosmos-go github.com/cosmos/ledger-cosmos-go => github.com/cosmos/ledger-cosmos-go v0.12.4 diff --git a/go.sum b/go.sum index ada92f17..cfa1efe7 100644 --- a/go.sum +++ b/go.sum @@ -185,8 +185,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circlefin/noble-cctp v0.0.0-20231108011259-7c5206df02dc h1:vm2CZfO8sjxPFKzguuZl1FjHHdbgRUWvF3x2lw6NyEU= github.com/circlefin/noble-cctp v0.0.0-20231108011259-7c5206df02dc/go.mod h1:ssEHJqFI1f4a5sLtZ7qeYJ7/75LzDgzbBv4C9as3y3w= -github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9 h1:zos4B3act5oqjkWJ20iBOX0mHINcEQ6wdqtHdcmAiqE= -github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9/go.mod h1:pWbZhxq9IBFK9d24ZdmSKdG3LgFbp97r18IbF56QwnE= +github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377 h1:6oyw7h/UnsWBrNcH+Nv1VAeyKqjraM9TADsIMgBywjs= +github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377/go.mod h1:pWbZhxq9IBFK9d24ZdmSKdG3LgFbp97r18IbF56QwnE= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -235,8 +235,6 @@ github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32 h1:zlCp9n3uwQieEL github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.45.16 h1:5ba/Bh5/LE55IwHQuCU4fiG4eXeDKtSWzehXRpaKDcw= -github.com/cosmos/cosmos-sdk v0.45.16/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -244,10 +242,10 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2-0.20240228222021-455757bb5771 h1:f59vE1bhd2HvZJmDyxcGHXnk18H5BtL0GZtw0ED8gUA= -github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2-0.20240228222021-455757bb5771/go.mod h1:0g4hau4zO12tpvyiOcyEpcmcsXbBAN4WX+BhTO6xZVg= -github.com/cosmos/ibc-go/v4 v4.5.1 h1:+P73X7aIikGAXBUJ9vP9rEbvdSuekt3KGXmAWCSYets= -github.com/cosmos/ibc-go/v4 v4.5.1/go.mod h1:2EOi40Bx/j6rJrtP1ui8k8yUAMpGybmL1EjakYqYv5U= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2 h1:id4ozlsqpX6J19NVYQ5NhqyDzb48JT0VsceqArym1ks= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.1.2/go.mod h1:0g4hau4zO12tpvyiOcyEpcmcsXbBAN4WX+BhTO6xZVg= +github.com/cosmos/ibc-go/v4 v4.6.0 h1:G7kiD4Zf8Wrxc8BXWIKuFnzI0W4wpvRPrl5HwdfTIsA= +github.com/cosmos/ibc-go/v4 v4.6.0/go.mod h1:ksiZHUypws0NVP50E3ea0ivVFO/bfS8q8yLg8yZ2ATQ= github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -774,6 +772,8 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/noble-assets/cosmos-sdk v0.45.16-noble h1:c0SUrD02hNPvE3y9SHEhkOWOmTtdll1PYxZDf8K6YLw= +github.com/noble-assets/cosmos-sdk v0.45.16-noble/go.mod h1:bScuNwWAP0TZJpUf+SHXRU3xGoUPp+X9nAzfeIXts40= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= diff --git a/interchaintest/go.mod b/interchaintest/go.mod index e87608e1..ee735a4a 100644 --- a/interchaintest/go.mod +++ b/interchaintest/go.mod @@ -5,9 +5,9 @@ go 1.21 require ( cosmossdk.io/math v1.0.1 github.com/circlefin/noble-cctp v0.0.0-20231110151013-86f425e6fac9 - github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9 + github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377 github.com/cosmos/cosmos-sdk v0.45.16 - github.com/cosmos/ibc-go/v4 v4.5.1 + github.com/cosmos/ibc-go/v4 v4.6.0 github.com/ethereum/go-ethereum v1.12.2 github.com/gogo/protobuf v1.3.3 github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 diff --git a/interchaintest/go.sum b/interchaintest/go.sum index 792e191d..499cca0d 100644 --- a/interchaintest/go.sum +++ b/interchaintest/go.sum @@ -191,8 +191,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circlefin/noble-cctp v0.0.0-20231110151013-86f425e6fac9 h1:PvJ69AgxzoVX6UyHbCrWe6oDWRgEL3DQ3r7SGmmUoMY= github.com/circlefin/noble-cctp v0.0.0-20231110151013-86f425e6fac9/go.mod h1:ssEHJqFI1f4a5sLtZ7qeYJ7/75LzDgzbBv4C9as3y3w= -github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9 h1:zos4B3act5oqjkWJ20iBOX0mHINcEQ6wdqtHdcmAiqE= -github.com/circlefin/noble-fiattokenfactory v0.0.0-20240311150858-14edf83ee1c9/go.mod h1:pWbZhxq9IBFK9d24ZdmSKdG3LgFbp97r18IbF56QwnE= +github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377 h1:6oyw7h/UnsWBrNcH+Nv1VAeyKqjraM9TADsIMgBywjs= +github.com/circlefin/noble-fiattokenfactory v0.0.0-20240412141733-0a7385d9a377/go.mod h1:pWbZhxq9IBFK9d24ZdmSKdG3LgFbp97r18IbF56QwnE= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -253,8 +253,8 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= -github.com/cosmos/ibc-go/v4 v4.5.1 h1:+P73X7aIikGAXBUJ9vP9rEbvdSuekt3KGXmAWCSYets= -github.com/cosmos/ibc-go/v4 v4.5.1/go.mod h1:2EOi40Bx/j6rJrtP1ui8k8yUAMpGybmL1EjakYqYv5U= +github.com/cosmos/ibc-go/v4 v4.6.0 h1:G7kiD4Zf8Wrxc8BXWIKuFnzI0W4wpvRPrl5HwdfTIsA= +github.com/cosmos/ibc-go/v4 v4.6.0/go.mod h1:ksiZHUypws0NVP50E3ea0ivVFO/bfS8q8yLg8yZ2ATQ= github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= diff --git a/interchaintest/noble_test.go b/interchaintest/noble_test.go deleted file mode 100644 index 400e0050..00000000 --- a/interchaintest/noble_test.go +++ /dev/null @@ -1,290 +0,0 @@ -package interchaintest_test - -import ( - "context" - "encoding/json" - "testing" - - "github.com/noble-assets/noble/v4/x/tokenfactory/types" - "github.com/strangelove-ventures/interchaintest/v4" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v4/ibc" - "github.com/strangelove-ventures/interchaintest/v4/testreporter" - "github.com/stretchr/testify/require" - "go.uber.org/zap/zaptest" -) - -// run `make local-image`to rebuild updated binary before running test -func TestNobleChain(t *testing.T) { - if testing.Short() { - t.Skip() - } - - t.Parallel() - - ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - - client, network := interchaintest.DockerSetup(t) - - var gw genesisWrapper - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", 2, 1, false, false, true, true), - }) - - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: false, - })) - t.Cleanup(func() { - _ = ic.Close() - }) - - t.Run("tokenfactory", func(t *testing.T) { - t.Parallel() - nobleTokenfactory_e2e(t, ctx, "tokenfactory", denomMetadataFrienzies.Base, noble, gw.tfRoles, gw.extraWallets) - }) - - t.Run("fiat-tokenfactory", func(t *testing.T) { - t.Parallel() - nobleTokenfactory_e2e(t, ctx, "fiat-tokenfactory", denomMetadataUsdc.Base, noble, gw.fiatTfRoles, gw.extraWallets) - }) -} - -func nobleTokenfactory_e2e(t *testing.T, ctx context.Context, tokenfactoryModName, mintingDenom string, noble *cosmos.CosmosChain, roles NobleRoles, extraWallets ExtraWallets) { - nobleValidator := noble.Validators[0] - - _, err := nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-master-minter", roles.MasterMinter.FormattedAddress(), "-b", "block", - ) - require.Error(t, err, "succeeded to execute update master minter tx by invalid owner") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-owner", roles.Owner2.FormattedAddress(), "-b", "block", - ) - require.Error(t, err, "succeeded to execute update owner tx by invalid owner") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner.KeyName(), - tokenfactoryModName, "update-owner", roles.Owner2.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to execute update owner tx") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-master-minter", roles.MasterMinter.FormattedAddress(), "-b", "block", - ) - require.Error(t, err, "succeeded to execute update master minter tx by pending owner") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "accept-owner", "-b", "block", - ) - require.NoError(t, err, "failed to execute tx to accept ownership") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner.KeyName(), - tokenfactoryModName, "update-master-minter", roles.MasterMinter.FormattedAddress(), "-b", "block", - ) - require.Error(t, err, "succeeded to execute update master minter tx by prior owner") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-master-minter", roles.MasterMinter.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to execute update master minter tx") - - _, err = nobleValidator.ExecTx(ctx, roles.MasterMinter.KeyName(), - tokenfactoryModName, "configure-minter-controller", roles.MinterController.FormattedAddress(), roles.Minter.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to execute configure minter controller tx") - - _, err = nobleValidator.ExecTx(ctx, roles.MinterController.KeyName(), - tokenfactoryModName, "configure-minter", roles.Minter.FormattedAddress(), "1000"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute configure minter tx") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", extraWallets.User.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute mint to user tx") - - userBalance, err := noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - require.Equalf(t, int64(100), userBalance, "failed to mint %s to user", mintingDenom) - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-blacklister", roles.Blacklister.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to set blacklister") - - _, err = nobleValidator.ExecTx(ctx, roles.Blacklister.KeyName(), - tokenfactoryModName, "blacklist", extraWallets.User.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to blacklist user address") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", extraWallets.User.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.Error(t, err, "successfully executed mint to blacklisted user tx") - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - require.Equal(t, int64(100), userBalance, "user balance should not have incremented while blacklisted") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", extraWallets.User2.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute mint to user2 tx") - - err = nobleValidator.SendFunds(ctx, extraWallets.User2.KeyName(), ibc.WalletAmount{ - Address: extraWallets.User.FormattedAddress(), - Denom: mintingDenom, - Amount: 50, - }) - require.Error(t, err, "The tx to a blacklisted user should not have been successful") - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - require.Equal(t, int64(100), userBalance, "user balance should not have incremented while blacklisted") - - err = nobleValidator.SendFunds(ctx, extraWallets.User2.KeyName(), ibc.WalletAmount{ - Address: extraWallets.User.FormattedAddress(), - Denom: "token", - Amount: 100, - }) - require.NoError(t, err, "The tx should have been successfull as that is no the minting denom") - - _, err = nobleValidator.ExecTx(ctx, roles.Blacklister.KeyName(), - tokenfactoryModName, "unblacklist", extraWallets.User.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to unblacklist user address") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", extraWallets.User.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute mint to user tx") - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - require.Equal(t, int64(200), userBalance, "user balance should have increased now that they are no longer blacklisted") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", roles.Minter.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute mint to user tx") - - minterBalance, err := noble.GetBalance(ctx, roles.Minter.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get minter balance") - require.Equal(t, int64(100), minterBalance, "minter balance should have increased") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "burn", "10"+mintingDenom, "-b", "block", - ) - require.NoError(t, err, "failed to execute burn tx") - - minterBalance, err = noble.GetBalance(ctx, roles.Minter.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get minter balance") - require.Equal(t, int64(90), minterBalance, "minter balance should have decreased because tokens were burned") - - _, err = nobleValidator.ExecTx(ctx, roles.Owner2.KeyName(), - tokenfactoryModName, "update-pauser", roles.Pauser.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "failed to update pauser") - - // -- chain paused -- - - _, err = nobleValidator.ExecTx(ctx, roles.Pauser.KeyName(), - tokenfactoryModName, "pause", "-b", "block", - ) - require.NoError(t, err, "failed to pause mints") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "mint", extraWallets.User.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.Error(t, err, "successfully executed mint to user tx while chain is paused") - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - - require.Equal(t, int64(200), userBalance, "user balance should not have increased while chain is paused") - - _, err = nobleValidator.ExecTx(ctx, extraWallets.User.KeyName(), - "bank", "send", extraWallets.User.FormattedAddress(), extraWallets.Alice.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.Error(t, err, "transaction was successful while chain is paused") - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - - require.Equal(t, int64(200), userBalance, "user balance should not have changed while chain is paused") - - aliceBalance, err := noble.GetBalance(ctx, extraWallets.Alice.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get alice balance") - - require.Equal(t, int64(0), aliceBalance, "alice balance should not have increased while chain is paused") - - _, err = nobleValidator.ExecTx(ctx, roles.Minter.KeyName(), - tokenfactoryModName, "burn", "10"+mintingDenom, "-b", "block", - ) - require.Error(t, err, "successfully executed burn tx while chain is paused") - require.Equal(t, int64(90), minterBalance, "this burn should not have been successful because the chain is paused") - - _, err = nobleValidator.ExecTx(ctx, roles.MasterMinter.KeyName(), - tokenfactoryModName, "configure-minter-controller", roles.MinterController2.FormattedAddress(), extraWallets.User.FormattedAddress(), "-b", "block") - - require.NoError(t, err, "failed to execute configure minter controller tx") - - _, err = nobleValidator.ExecTx(ctx, roles.MinterController2.KeyName(), - tokenfactoryModName, "configure-minter", extraWallets.User.FormattedAddress(), "1000"+mintingDenom, "-b", "block") - require.NoError(t, err, "failed to execute configure minter tx") - - res, _, err := nobleValidator.ExecQuery(ctx, tokenfactoryModName, "show-minter-controller", roles.MinterController2.FormattedAddress(), "-o", "json") - require.NoError(t, err, "failed to query minter controller") - - var minterControllerType types.QueryGetMinterControllerResponse - json.Unmarshal(res, &minterControllerType) - - // minter controller should have been updated even while paused - minterController2Address := roles.MinterController2.FormattedAddress() - require.Equal(t, minterController2Address, minterControllerType.MinterController.Controller) - - // minter should have been updated even while paused - userAddress := extraWallets.User.FormattedAddress() - require.Equal(t, userAddress, minterControllerType.MinterController.Minter) - - _, err = nobleValidator.ExecTx(ctx, roles.MinterController2.KeyName(), - tokenfactoryModName, "remove-minter", extraWallets.User.FormattedAddress(), "-b", "block", - ) - require.NoError(t, err, "minters should be able to be removed while in paused state") - - _, err = nobleValidator.ExecTx(ctx, roles.Pauser.KeyName(), - tokenfactoryModName, "unpause", "-b", "block", - ) - require.NoError(t, err, "failed to unpause mints") - - // -- chain unpaused -- - - _, err = nobleValidator.ExecTx(ctx, extraWallets.User.KeyName(), - "bank", "send", extraWallets.User.FormattedAddress(), extraWallets.Alice.FormattedAddress(), "100"+mintingDenom, "-b", "block", - ) - require.NoErrorf(t, err, "failed to send tx bank from user (%s) to alice (%s)", extraWallets.User.FormattedAddress(), extraWallets.Alice.FormattedAddress()) - - userBalance, err = noble.GetBalance(ctx, extraWallets.User.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get user balance") - require.Equal(t, int64(100), userBalance, "user balance should not have changed while chain is paused") - - aliceBalance, err = noble.GetBalance(ctx, extraWallets.Alice.FormattedAddress(), mintingDenom) - require.NoError(t, err, "failed to get alice balance") - require.Equal(t, int64(100), aliceBalance, "alice balance should not have increased while chain is paused") -} diff --git a/interchaintest/upgrade_grand-1_test.go b/interchaintest/upgrade_grand-1_test.go index c9ccbdb6..79e72a33 100644 --- a/interchaintest/upgrade_grand-1_test.go +++ b/interchaintest/upgrade_grand-1_test.go @@ -111,9 +111,21 @@ func TestGrand1ChainUpgrade(t *testing.T) { }, }, { + // v4.1.0-rc.2 is a new release candidate that introduces a new + // forwarding module, among other changes. upgradeName: "v4.1.0-rc.2", image: ghcrImage("v4.1.0-rc.2"), }, + { + // v4.1.0-rc.3 is a patch release that upgraded two core dependencies. + // It is consensus breaking, and therefore is applied as an emergency upgrade. + emergency: true, + image: ghcrImage("v4.1.0-rc.3"), + }, + { + upgradeName: "fusion", + image: nobleImageInfo[0], + }, } testNobleChainUpgrade(t, "grand-1", genesis, denomMetadataUsdc, numValidators, numFullNodes, upgrades) diff --git a/interchaintest/upgrade_noble-1_test.go b/interchaintest/upgrade_noble-1_test.go index 09cfa03a..be548210 100644 --- a/interchaintest/upgrade_noble-1_test.go +++ b/interchaintest/upgrade_noble-1_test.go @@ -108,6 +108,12 @@ func TestNoble1ChainUpgrade(t *testing.T) { require.NoError(t, json.Unmarshal(raw, &res)) }, }, + { + // v4.0.3 is a patch release that upgraded two core dependencies. + // It is consensus breaking, and therefore is applied as an emergency upgrade. + emergency: true, + image: ghcrImage("v4.0.3"), + }, } testNobleChainUpgrade(t, "noble-1", genesis, denomMetadataFrienzies, numValidators, numFullNodes, upgrades) diff --git a/interchaintest/upgrade_test.go b/interchaintest/upgrade_test.go index 704b878f..186ec212 100644 --- a/interchaintest/upgrade_test.go +++ b/interchaintest/upgrade_test.go @@ -21,7 +21,7 @@ import ( ) const ( - ghcrRepo = "ghcr.io/strangelove-ventures/noble" + ghcrRepo = "ghcr.io/noble-assets/noble" containerUidGid = "1025:1025" haltHeightDelta = uint64(10) // will propose upgrade this many blocks in the future diff --git a/x/blockibc/blockibc.go b/x/blockibc/blockibc.go deleted file mode 100644 index b0f67ac1..00000000 --- a/x/blockibc/blockibc.go +++ /dev/null @@ -1,185 +0,0 @@ -package blockibc - -import ( - fiatKeeper "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory/keeper" - fiat_types "github.com/circlefin/noble-fiattokenfactory/x/fiattokenfactory/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v4/modules/core/05-port/types" - ibcexported "github.com/cosmos/ibc-go/v4/modules/core/exported" - "github.com/noble-assets/noble/v4/x/tokenfactory/keeper" - "github.com/noble-assets/noble/v4/x/tokenfactory/types" -) - -var _ porttypes.IBCModule = &IBCMiddleware{} - -// IBCMiddleware implements the tokenfactory keeper in order to check against blacklisted addresses. -type IBCMiddleware struct { - app porttypes.IBCModule - keeper *keeper.Keeper - fiatKeeper *fiatKeeper.Keeper -} - -// NewIBCMiddleware creates a new IBCMiddleware given the keeper and underlying application. -func NewIBCMiddleware(app porttypes.IBCModule, k *keeper.Keeper, ck *fiatKeeper.Keeper) IBCMiddleware { - return IBCMiddleware{ - app: app, - keeper: k, - fiatKeeper: ck, - } -} - -// OnChanOpenInit implements the IBCModule interface. -func (im IBCMiddleware) OnChanOpenInit( - ctx sdk.Context, - order channeltypes.Order, - connectionHops []string, - portID string, - channelID string, - channelCap *capabilitytypes.Capability, - counterparty channeltypes.Counterparty, - version string, -) (string, error) { - return im.app.OnChanOpenInit(ctx, order, connectionHops, portID, channelID, channelCap, counterparty, version) -} - -// OnChanOpenTry implements the IBCModule interface. -func (im IBCMiddleware) OnChanOpenTry( - ctx sdk.Context, - order channeltypes.Order, - connectionHops []string, - portID, channelID string, - chanCap *capabilitytypes.Capability, - counterparty channeltypes.Counterparty, - counterpartyVersion string, -) (version string, err error) { - return im.app.OnChanOpenTry(ctx, order, connectionHops, portID, channelID, chanCap, counterparty, counterpartyVersion) -} - -// OnChanOpenAck implements the IBCModule interface. -func (im IBCMiddleware) OnChanOpenAck( - ctx sdk.Context, - portID, channelID string, - counterpartyChannelID string, - counterpartyVersion string, -) error { - return im.app.OnChanOpenAck(ctx, portID, channelID, counterpartyChannelID, counterpartyVersion) -} - -// OnChanOpenConfirm implements the IBCModule interface. -func (im IBCMiddleware) OnChanOpenConfirm(ctx sdk.Context, portID, channelID string) error { - return im.app.OnChanOpenConfirm(ctx, portID, channelID) -} - -// OnChanCloseInit implements the IBCModule interface. -func (im IBCMiddleware) OnChanCloseInit(ctx sdk.Context, portID, channelID string) error { - return im.app.OnChanCloseInit(ctx, portID, channelID) -} - -// OnChanCloseConfirm implements the IBCModule interface. -func (im IBCMiddleware) OnChanCloseConfirm(ctx sdk.Context, portID, channelID string) error { - return im.app.OnChanCloseConfirm(ctx, portID, channelID) -} - -// OnRecvPacket intercepts the packet data and checks the sender and receiver address against -// the blacklisted addresses held in the tokenfactory keeper. If the address is found in the blacklist, an -// acknowledgment error is returned. -func (im IBCMiddleware) OnRecvPacket( - ctx sdk.Context, - packet channeltypes.Packet, - relayer sdk.AccAddress, -) ibcexported.Acknowledgement { - - var data transfertypes.FungibleTokenPacketData - var ackErr error - if err := types.ModuleCdc.UnmarshalJSON(packet.GetData(), &data); err != nil { - ackErr = sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "cannot unmarshal ICS-20 transfer packet data") - return channeltypes.NewErrorAcknowledgement(ackErr) - } - - denomTrace := transfertypes.ParseDenomTrace(data.Denom) - - tfMintingDenom := im.keeper.GetMintingDenom(ctx) - ctfMintingDenom := im.fiatKeeper.GetMintingDenom(ctx) - - switch { - // denom is not tokenfactory denom - case denomTrace.BaseDenom != tfMintingDenom.Denom && denomTrace.BaseDenom != ctfMintingDenom.Denom: - return im.app.OnRecvPacket(ctx, packet, relayer) - // denom is tokenfactory asset - case denomTrace.BaseDenom == tfMintingDenom.Denom: - if im.keeper.GetPaused(ctx).Paused { - return channeltypes.NewErrorAcknowledgement(types.ErrPaused) - } - - _, addressBz, err := bech32.DecodeAndConvert(data.Receiver) - if err != nil { - return channeltypes.NewErrorAcknowledgement(err) - } - - _, found := im.keeper.GetBlacklisted(ctx, addressBz) - if found { - ackErr = sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "receiver address is blacklisted") - return channeltypes.NewErrorAcknowledgement(ackErr) - } - - _, addressBz, err = bech32.DecodeAndConvert(data.Sender) - if err != nil { - return channeltypes.NewErrorAcknowledgement(err) - } - - _, found = im.keeper.GetBlacklisted(ctx, addressBz) - if found { - ackErr = sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "sender address is blacklisted") - return channeltypes.NewErrorAcknowledgement(ackErr) - } - // denom is fiat-tokenfactory asset - case denomTrace.BaseDenom == ctfMintingDenom.Denom: - if im.fiatKeeper.GetPaused(ctx).Paused { - return channeltypes.NewErrorAcknowledgement(fiat_types.ErrPaused) - } - - _, addressBz, err := bech32.DecodeAndConvert(data.Receiver) - if err != nil { - return channeltypes.NewErrorAcknowledgement(err) - } - - _, found := im.fiatKeeper.GetBlacklisted(ctx, addressBz) - if found { - ackErr = sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "receiver address is blacklisted") - return channeltypes.NewErrorAcknowledgement(ackErr) - } - - _, addressBz, err = bech32.DecodeAndConvert(data.Sender) - if err != nil { - return channeltypes.NewErrorAcknowledgement(err) - } - - _, found = im.fiatKeeper.GetBlacklisted(ctx, addressBz) - if found { - ackErr = sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "sender address is blacklisted") - return channeltypes.NewErrorAcknowledgement(ackErr) - } - } - return im.app.OnRecvPacket(ctx, packet, relayer) - -} - -// OnAcknowledgementPacket implements the IBCModule interface. -func (im IBCMiddleware) OnAcknowledgementPacket( - ctx sdk.Context, - packet channeltypes.Packet, - acknowledgement []byte, - relayer sdk.AccAddress, -) error { - return im.app.OnAcknowledgementPacket(ctx, packet, acknowledgement, relayer) -} - -// OnTimeoutPacket implements the IBCModule interface. -func (im IBCMiddleware) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress) error { - return im.app.OnTimeoutPacket(ctx, packet, relayer) -}