mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 02:17:31 +00:00 
			
		
		
		
	Reset bep3 swaps for zero height (#1228)
* copy over swap height reset from v016 upgrade * remove unneeded old bep3 migrations * hook migration cmd into app * add bep3 migration integration test * update old docs
This commit is contained in:
		
							parent
							
								
									a33a7b1166
								
							
						
					
					
						commit
						fefcb48a80
					
				@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
	"github.com/kava-labs/kava/app"
 | 
						"github.com/kava-labs/kava/app"
 | 
				
			||||||
	"github.com/kava-labs/kava/app/params"
 | 
						"github.com/kava-labs/kava/app/params"
 | 
				
			||||||
	kavaclient "github.com/kava-labs/kava/client"
 | 
						kavaclient "github.com/kava-labs/kava/client"
 | 
				
			||||||
 | 
						"github.com/kava-labs/kava/migrate"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewRootCmd creates a new root command for the kava blockchain.
 | 
					// NewRootCmd creates a new root command for the kava blockchain.
 | 
				
			||||||
@ -79,8 +80,8 @@ func addSubCmds(rootCmd *cobra.Command, encodingConfig params.EncodingConfig, de
 | 
				
			|||||||
			genutilcli.InitCmd(app.ModuleBasics, defaultNodeHome),
 | 
								genutilcli.InitCmd(app.ModuleBasics, defaultNodeHome),
 | 
				
			||||||
		),
 | 
							),
 | 
				
			||||||
		genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, defaultNodeHome),
 | 
							genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, defaultNodeHome),
 | 
				
			||||||
		// migrate.MigrateGenesisCmd(),
 | 
							migrate.MigrateGenesisCmd(),
 | 
				
			||||||
		// migrate.AssertInvariantsCmd(encodingConfig),
 | 
							migrate.AssertInvariantsCmd(encodingConfig),
 | 
				
			||||||
		genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, defaultNodeHome),
 | 
							genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, defaultNodeHome),
 | 
				
			||||||
		genutilcli.ValidateGenesisCmd(app.ModuleBasics),
 | 
							genutilcli.ValidateGenesisCmd(app.ModuleBasics),
 | 
				
			||||||
		AddGenesisAccountCmd(defaultNodeHome),
 | 
							AddGenesisAccountCmd(defaultNodeHome),
 | 
				
			||||||
 | 
				
			|||||||
@ -96,9 +96,8 @@ func AssertInvariantsCmd(config params.EncodingConfig) *cobra.Command {
 | 
				
			|||||||
func validateGenDoc(importGenesisFile string) (*tmtypes.GenesisDoc, error) {
 | 
					func validateGenDoc(importGenesisFile string) (*tmtypes.GenesisDoc, error) {
 | 
				
			||||||
	genDoc, err := tmtypes.GenesisDocFromFile(importGenesisFile)
 | 
						genDoc, err := tmtypes.GenesisDocFromFile(importGenesisFile)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("%s. Make sure that"+
 | 
							return nil, fmt.Errorf(
 | 
				
			||||||
			" you have correctly migrated all Tendermint consensus params, please see the"+
 | 
								"%s. Make sure that you have correctly migrated all Tendermint consensus params.",
 | 
				
			||||||
			" chain migration guide at https://docs.cosmos.network/master/migrations/chain-upgrade-guide-040.html for more info",
 | 
					 | 
				
			||||||
			err.Error(),
 | 
								err.Error(),
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,10 +6,10 @@ migrated to the new structure of the newer versions.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
There are two types of migration:
 | 
					There are two types of migration:
 | 
				
			||||||
- **genesis migration** a script converts an exported genesis file from the old software to a new genesis file for the new software
 | 
					- **genesis migration** a script converts an exported genesis file from the old software to a new genesis file for the new software
 | 
				
			||||||
- **live upgrade** a handler in the upgrade module converts data in the database itself from the old version to the new
 | 
					- **in-place upgrade** a handler in the upgrade module converts data in the database itself from the old version to the new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Genesis migration starts a whole new blockchain (with new chain-id) for the new software version.
 | 
					Genesis migration starts a whole new blockchain (with new chain-id) for the new software version.
 | 
				
			||||||
Live upgrade keeps the blockchain (and chain-id) the same for the new software version.
 | 
					In-Place upgrade keeps the blockchain (and chain-id) the same for the new software version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We only support migrations between mainnet kava releases.
 | 
					We only support migrations between mainnet kava releases.
 | 
				
			||||||
We only support migrations from the previous mainnet kava version to the current. We don't support migrating between two old versions, use the old software version for this.
 | 
					We only support migrations from the previous mainnet kava version to the current. We don't support migrating between two old versions, use the old software version for this.
 | 
				
			||||||
@ -25,16 +25,5 @@ On each release we can delete the previous releases migration and old GenesisSta
 | 
				
			|||||||
eg kava-3 migrates `auth.GenesisState` from kava-2 to `auth.GenesisState` from kava-3,
 | 
					eg kava-3 migrates `auth.GenesisState` from kava-2 to `auth.GenesisState` from kava-3,
 | 
				
			||||||
but for kava-4 we don't need to keep around kava-2's `auth.GenesisState` type.
 | 
					but for kava-4 we don't need to keep around kava-2's `auth.GenesisState` type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This folder contains old types from several sdk modules because they needed custom migrations for kava-3.
 | 
					 | 
				
			||||||
The sdk version for kava-2 was a master commit 18de63.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Live Upgrade
 | 
					 | 
				
			||||||
The process is:
 | 
					 | 
				
			||||||
- submit upgrade proposal on old chain
 | 
					 | 
				
			||||||
- old chain halts
 | 
					 | 
				
			||||||
- people download new version and restart their validators
 | 
					 | 
				
			||||||
- on start the new upgrade handler runs
 | 
					 | 
				
			||||||
- use copypasted old keeper and types to read from db, convert to current types and write with current keeper
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
package migrate
 | 
					package migrate
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,8 @@ import (
 | 
				
			|||||||
	v016auction "github.com/kava-labs/kava/x/auction/legacy/v0_16"
 | 
						v016auction "github.com/kava-labs/kava/x/auction/legacy/v0_16"
 | 
				
			||||||
	v017auction "github.com/kava-labs/kava/x/auction/legacy/v0_17"
 | 
						v017auction "github.com/kava-labs/kava/x/auction/legacy/v0_17"
 | 
				
			||||||
	auctiontypes "github.com/kava-labs/kava/x/auction/types"
 | 
						auctiontypes "github.com/kava-labs/kava/x/auction/types"
 | 
				
			||||||
 | 
						v017bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_17"
 | 
				
			||||||
 | 
						bep3types "github.com/kava-labs/kava/x/bep3/types"
 | 
				
			||||||
	incentivetypes "github.com/kava-labs/kava/x/incentive/types"
 | 
						incentivetypes "github.com/kava-labs/kava/x/incentive/types"
 | 
				
			||||||
	savingstypes "github.com/kava-labs/kava/x/savings/types"
 | 
						savingstypes "github.com/kava-labs/kava/x/savings/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -88,4 +90,14 @@ func migrateAppState(appState genutiltypes.AppMap, clientCtx client.Context) {
 | 
				
			|||||||
	// x/savings
 | 
						// x/savings
 | 
				
			||||||
	savingsState := savingstypes.DefaultGenesisState()
 | 
						savingsState := savingstypes.DefaultGenesisState()
 | 
				
			||||||
	appState[savingstypes.ModuleName] = codec.MustMarshalJSON(&savingsState)
 | 
						appState[savingstypes.ModuleName] = codec.MustMarshalJSON(&savingsState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// x/bep3
 | 
				
			||||||
 | 
						if appState[bep3types.ModuleName] != nil {
 | 
				
			||||||
 | 
							var v16GenState bep3types.GenesisState
 | 
				
			||||||
 | 
							codec.MustUnmarshalJSON(appState[bep3types.ModuleName], &v16GenState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							migratedState := v017bep3.Migrate(v16GenState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							appState[bep3types.ModuleName] = codec.MustMarshalJSON(migratedState)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								migrate/v0_17/testdata/genesis-v16.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								migrate/v0_17/testdata/genesis-v16.json
									
									
									
									
										vendored
									
									
								
							@ -1145,7 +1145,7 @@
 | 
				
			|||||||
              "denom": "btcb"
 | 
					              "denom": "btcb"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          "closed_block": "1",
 | 
					          "closed_block": "838115",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
          "expire_height": "838627",
 | 
					          "expire_height": "838627",
 | 
				
			||||||
@ -1164,7 +1164,7 @@
 | 
				
			|||||||
              "denom": "bnb"
 | 
					              "denom": "bnb"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          "closed_block": "1",
 | 
					          "closed_block": "1712118",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
          "expire_height": "1736797",
 | 
					          "expire_height": "1736797",
 | 
				
			||||||
@ -1186,7 +1186,7 @@
 | 
				
			|||||||
          "closed_block": "787122",
 | 
					          "closed_block": "787122",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
          "expire_height": "1",
 | 
					          "expire_height": "811799",
 | 
				
			||||||
          "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
					          "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
				
			||||||
          "recipient": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
					          "recipient": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
				
			||||||
          "recipient_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
					          "recipient_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
				
			||||||
@ -1205,7 +1205,7 @@
 | 
				
			|||||||
          "closed_block": "787122",
 | 
					          "closed_block": "787122",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
          "expire_height": "1",
 | 
					          "expire_height": "811799",
 | 
				
			||||||
          "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
					          "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
				
			||||||
          "recipient": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
					          "recipient": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
				
			||||||
          "recipient_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
					          "recipient_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
				
			||||||
@ -1224,7 +1224,7 @@
 | 
				
			|||||||
          "closed_block": "0",
 | 
					          "closed_block": "0",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
          "expire_height": "24687",
 | 
					          "expire_height": "1730589",
 | 
				
			||||||
          "random_number_hash": "A74EA1AB58D312FDF1E872D18583CACCF294E639DDA4F303939E9ADCEC081D93",
 | 
					          "random_number_hash": "A74EA1AB58D312FDF1E872D18583CACCF294E639DDA4F303939E9ADCEC081D93",
 | 
				
			||||||
          "recipient": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
					          "recipient": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
				
			||||||
          "recipient_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
					          "recipient_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
				
			||||||
@ -1243,13 +1243,13 @@
 | 
				
			|||||||
          "closed_block": "0",
 | 
					          "closed_block": "0",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
          "expire_height": "1",
 | 
					          "expire_height": "1740000",
 | 
				
			||||||
          "random_number_hash": "39E9ADCEC081D93A74EA1A83CACCF294E639DDA4F3039B58D312FDF1E872D185",
 | 
					          "random_number_hash": "39E9ADCEC081D93A74EA1A83CACCF294E639DDA4F3039B58D312FDF1E872D185",
 | 
				
			||||||
          "recipient": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
					          "recipient": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
				
			||||||
          "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
					          "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
				
			||||||
          "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
					          "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
				
			||||||
          "sender_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
					          "sender_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
				
			||||||
          "status": "SWAP_STATUS_EXPIRED",
 | 
					          "status": "SWAP_STATUS_OPEN",
 | 
				
			||||||
          "timestamp": "1641934114"
 | 
					          "timestamp": "1641934114"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										42
									
								
								migrate/v0_17/testdata/genesis-v17.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								migrate/v0_17/testdata/genesis-v17.json
									
									
									
									
										vendored
									
									
								
							@ -465,7 +465,12 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      "atomic_swaps": [
 | 
					      "atomic_swaps": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "1999955998", "denom": "btcb" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "1999955998",
 | 
				
			||||||
 | 
					              "denom": "btcb"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "1",
 | 
					          "closed_block": "1",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
@ -479,7 +484,12 @@
 | 
				
			|||||||
          "timestamp": "1636034914"
 | 
					          "timestamp": "1636034914"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "19000000000", "denom": "bnb" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "19000000000",
 | 
				
			||||||
 | 
					              "denom": "bnb"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "1",
 | 
					          "closed_block": "1",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
@ -493,7 +503,12 @@
 | 
				
			|||||||
          "timestamp": "1641976566"
 | 
					          "timestamp": "1641976566"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "999595462080", "denom": "busd" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "999595462080",
 | 
				
			||||||
 | 
					              "denom": "busd"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "787122",
 | 
					          "closed_block": "787122",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
@ -507,7 +522,12 @@
 | 
				
			|||||||
          "timestamp": "1635694492"
 | 
					          "timestamp": "1635694492"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "999595462080", "denom": "busd" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "999595462080",
 | 
				
			||||||
 | 
					              "denom": "busd"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "787122",
 | 
					          "closed_block": "787122",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
@ -521,7 +541,12 @@
 | 
				
			|||||||
          "timestamp": "1635694492"
 | 
					          "timestamp": "1635694492"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "1000000", "denom": "btcb" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "1000000",
 | 
				
			||||||
 | 
					              "denom": "btcb"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "0",
 | 
					          "closed_block": "0",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
					          "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
@ -535,7 +560,12 @@
 | 
				
			|||||||
          "timestamp": "1641934114"
 | 
					          "timestamp": "1641934114"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "amount": [{ "amount": "1000000", "denom": "btcb" }],
 | 
					          "amount": [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              "amount": "1000000",
 | 
				
			||||||
 | 
					              "denom": "btcb"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
          "closed_block": "0",
 | 
					          "closed_block": "0",
 | 
				
			||||||
          "cross_chain": true,
 | 
					          "cross_chain": true,
 | 
				
			||||||
          "direction": "SWAP_DIRECTION_INCOMING",
 | 
					          "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,187 +0,0 @@
 | 
				
			|||||||
package v0_15
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
					 | 
				
			||||||
	tmbytes "github.com/tendermint/tendermint/libs/bytes"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	// ModuleName is the name of the module
 | 
					 | 
				
			||||||
	ModuleName = "bep3"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GenesisState - all bep3 state that must be provided at genesis
 | 
					 | 
				
			||||||
type GenesisState struct {
 | 
					 | 
				
			||||||
	Params            Params        `json:"params" yaml:"params"`
 | 
					 | 
				
			||||||
	AtomicSwaps       AtomicSwaps   `json:"atomic_swaps" yaml:"atomic_swaps"`
 | 
					 | 
				
			||||||
	Supplies          AssetSupplies `json:"supplies" yaml:"supplies"`
 | 
					 | 
				
			||||||
	PreviousBlockTime time.Time     `json:"previous_block_time" yaml:"previous_block_time"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Params governance parameters for bep3 module
 | 
					 | 
				
			||||||
type Params struct {
 | 
					 | 
				
			||||||
	AssetParams AssetParams `json:"asset_params" yaml:"asset_params"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AssetParams array of AssetParam
 | 
					 | 
				
			||||||
type AssetParams []AssetParam
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AssetParam parameters that must be specified for each bep3 asset
 | 
					 | 
				
			||||||
type AssetParam struct {
 | 
					 | 
				
			||||||
	Denom         string         `json:"denom" yaml:"denom"`                     // name of the asset
 | 
					 | 
				
			||||||
	CoinID        int            `json:"coin_id" yaml:"coin_id"`                 // SLIP-0044 registered coin type - see https://github.com/satoshilabs/slips/blob/master/slip-0044.md
 | 
					 | 
				
			||||||
	SupplyLimit   SupplyLimit    `json:"supply_limit" yaml:"supply_limit"`       // asset supply limit
 | 
					 | 
				
			||||||
	Active        bool           `json:"active" yaml:"active"`                   // denotes if asset is available or paused
 | 
					 | 
				
			||||||
	DeputyAddress sdk.AccAddress `json:"deputy_address" yaml:"deputy_address"`   // the address of the relayer process
 | 
					 | 
				
			||||||
	FixedFee      sdk.Int        `json:"fixed_fee" yaml:"fixed_fee"`             // the fixed fee charged by the relayer process for outgoing swaps
 | 
					 | 
				
			||||||
	MinSwapAmount sdk.Int        `json:"min_swap_amount" yaml:"min_swap_amount"` // Minimum swap amount
 | 
					 | 
				
			||||||
	MaxSwapAmount sdk.Int        `json:"max_swap_amount" yaml:"max_swap_amount"` // Maximum swap amount
 | 
					 | 
				
			||||||
	MinBlockLock  uint64         `json:"min_block_lock" yaml:"min_block_lock"`   // Minimum swap block lock
 | 
					 | 
				
			||||||
	MaxBlockLock  uint64         `json:"max_block_lock" yaml:"max_block_lock"`   // Maximum swap block lock
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SupplyLimit parameters that control the absolute and time-based limits for an assets's supply
 | 
					 | 
				
			||||||
type SupplyLimit struct {
 | 
					 | 
				
			||||||
	Limit          sdk.Int       `json:"limit" yaml:"limit"`                       // the absolute supply limit for an asset
 | 
					 | 
				
			||||||
	TimeLimited    bool          `json:"time_limited" yaml:"time_limited"`         // boolean for if the supply is also limited by time
 | 
					 | 
				
			||||||
	TimePeriod     time.Duration `json:"time_period" yaml:"time_period"`           // the duration for which the supply time limit applies
 | 
					 | 
				
			||||||
	TimeBasedLimit sdk.Int       `json:"time_based_limit" yaml:"time_based_limit"` // the supply limit for an asset for each time period
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AtomicSwaps is a slice of AtomicSwap
 | 
					 | 
				
			||||||
type AtomicSwaps []AtomicSwap
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AtomicSwap contains the information for an atomic swap
 | 
					 | 
				
			||||||
type AtomicSwap struct {
 | 
					 | 
				
			||||||
	Amount              sdk.Coins        `json:"amount"  yaml:"amount"`
 | 
					 | 
				
			||||||
	RandomNumberHash    tmbytes.HexBytes `json:"random_number_hash"  yaml:"random_number_hash"`
 | 
					 | 
				
			||||||
	ExpireHeight        uint64           `json:"expire_height"  yaml:"expire_height"`
 | 
					 | 
				
			||||||
	Timestamp           int64            `json:"timestamp"  yaml:"timestamp"`
 | 
					 | 
				
			||||||
	Sender              sdk.AccAddress   `json:"sender"  yaml:"sender"`
 | 
					 | 
				
			||||||
	Recipient           sdk.AccAddress   `json:"recipient"  yaml:"recipient"`
 | 
					 | 
				
			||||||
	SenderOtherChain    string           `json:"sender_other_chain"  yaml:"sender_other_chain"`
 | 
					 | 
				
			||||||
	RecipientOtherChain string           `json:"recipient_other_chain"  yaml:"recipient_other_chain"`
 | 
					 | 
				
			||||||
	ClosedBlock         int64            `json:"closed_block"  yaml:"closed_block"`
 | 
					 | 
				
			||||||
	Status              SwapStatus       `json:"status"  yaml:"status"`
 | 
					 | 
				
			||||||
	CrossChain          bool             `json:"cross_chain"  yaml:"cross_chain"`
 | 
					 | 
				
			||||||
	Direction           SwapDirection    `json:"direction"  yaml:"direction"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SwapStatus is the status of an AtomicSwap
 | 
					 | 
				
			||||||
type SwapStatus byte
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// swap statuses
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	NULL      SwapStatus = 0x00
 | 
					 | 
				
			||||||
	Open      SwapStatus = 0x01
 | 
					 | 
				
			||||||
	Completed SwapStatus = 0x02
 | 
					 | 
				
			||||||
	Expired   SwapStatus = 0x03
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// String returns the string representation of a SwapStatus
 | 
					 | 
				
			||||||
func (status SwapStatus) String() string {
 | 
					 | 
				
			||||||
	switch status {
 | 
					 | 
				
			||||||
	case Open:
 | 
					 | 
				
			||||||
		return "Open"
 | 
					 | 
				
			||||||
	case Completed:
 | 
					 | 
				
			||||||
		return "Completed"
 | 
					 | 
				
			||||||
	case Expired:
 | 
					 | 
				
			||||||
		return "Expired"
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return "NULL"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewSwapStatusFromString converts string to SwapStatus type
 | 
					 | 
				
			||||||
func NewSwapStatusFromString(str string) SwapStatus {
 | 
					 | 
				
			||||||
	switch str {
 | 
					 | 
				
			||||||
	case "Open", "open":
 | 
					 | 
				
			||||||
		return Open
 | 
					 | 
				
			||||||
	case "Completed", "completed":
 | 
					 | 
				
			||||||
		return Completed
 | 
					 | 
				
			||||||
	case "Expired", "expired":
 | 
					 | 
				
			||||||
		return Expired
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return NULL
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MarshalJSON marshals the SwapStatus
 | 
					 | 
				
			||||||
func (status SwapStatus) MarshalJSON() ([]byte, error) {
 | 
					 | 
				
			||||||
	return json.Marshal(status.String())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnmarshalJSON unmarshals the SwapStatus
 | 
					 | 
				
			||||||
func (status *SwapStatus) UnmarshalJSON(data []byte) error {
 | 
					 | 
				
			||||||
	var s string
 | 
					 | 
				
			||||||
	err := json.Unmarshal(data, &s)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*status = NewSwapStatusFromString(s)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SwapDirection is the direction of an AtomicSwap
 | 
					 | 
				
			||||||
type SwapDirection byte
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	INVALID  SwapDirection = 0x00
 | 
					 | 
				
			||||||
	Incoming SwapDirection = 0x01
 | 
					 | 
				
			||||||
	Outgoing SwapDirection = 0x02
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// String returns the string representation of a SwapDirection
 | 
					 | 
				
			||||||
func (direction SwapDirection) String() string {
 | 
					 | 
				
			||||||
	switch direction {
 | 
					 | 
				
			||||||
	case Incoming:
 | 
					 | 
				
			||||||
		return "Incoming"
 | 
					 | 
				
			||||||
	case Outgoing:
 | 
					 | 
				
			||||||
		return "Outgoing"
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return "INVALID"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewSwapDirectionFromString converts string to SwapDirection type
 | 
					 | 
				
			||||||
func NewSwapDirectionFromString(str string) SwapDirection {
 | 
					 | 
				
			||||||
	switch str {
 | 
					 | 
				
			||||||
	case "Incoming", "incoming", "inc", "I", "i":
 | 
					 | 
				
			||||||
		return Incoming
 | 
					 | 
				
			||||||
	case "Outgoing", "outgoing", "out", "O", "o":
 | 
					 | 
				
			||||||
		return Outgoing
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return INVALID
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MarshalJSON marshals the SwapDirection
 | 
					 | 
				
			||||||
func (direction SwapDirection) MarshalJSON() ([]byte, error) {
 | 
					 | 
				
			||||||
	return json.Marshal(direction.String())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnmarshalJSON unmarshals the SwapDirection
 | 
					 | 
				
			||||||
func (direction *SwapDirection) UnmarshalJSON(data []byte) error {
 | 
					 | 
				
			||||||
	var s string
 | 
					 | 
				
			||||||
	err := json.Unmarshal(data, &s)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*direction = NewSwapDirectionFromString(s)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AssetSupplies is a slice of AssetSupply
 | 
					 | 
				
			||||||
type AssetSupplies []AssetSupply
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// AssetSupply contains information about an asset's supply
 | 
					 | 
				
			||||||
type AssetSupply struct {
 | 
					 | 
				
			||||||
	IncomingSupply           sdk.Coin      `json:"incoming_supply"  yaml:"incoming_supply"`
 | 
					 | 
				
			||||||
	OutgoingSupply           sdk.Coin      `json:"outgoing_supply"  yaml:"outgoing_supply"`
 | 
					 | 
				
			||||||
	CurrentSupply            sdk.Coin      `json:"current_supply"  yaml:"current_supply"`
 | 
					 | 
				
			||||||
	TimeLimitedCurrentSupply sdk.Coin      `json:"time_limited_current_supply" yaml:"time_limited_current_supply"`
 | 
					 | 
				
			||||||
	TimeElapsed              time.Duration `json:"time_elapsed" yaml:"time_elapsed"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,142 +0,0 @@
 | 
				
			|||||||
package v0_16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	v015bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_15"
 | 
					 | 
				
			||||||
	v016bep3 "github.com/kava-labs/kava/x/bep3/types"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateAssetParam(param v015bep3.AssetParam) v016bep3.AssetParam {
 | 
					 | 
				
			||||||
	return v016bep3.AssetParam{
 | 
					 | 
				
			||||||
		Denom:  param.Denom,
 | 
					 | 
				
			||||||
		CoinID: int64(param.CoinID),
 | 
					 | 
				
			||||||
		SupplyLimit: v016bep3.SupplyLimit{
 | 
					 | 
				
			||||||
			Limit:          param.SupplyLimit.Limit,
 | 
					 | 
				
			||||||
			TimeLimited:    param.SupplyLimit.TimeLimited,
 | 
					 | 
				
			||||||
			TimePeriod:     param.SupplyLimit.TimePeriod,
 | 
					 | 
				
			||||||
			TimeBasedLimit: param.SupplyLimit.TimeBasedLimit,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		Active:        param.Active,
 | 
					 | 
				
			||||||
		DeputyAddress: param.DeputyAddress,
 | 
					 | 
				
			||||||
		FixedFee:      param.FixedFee,
 | 
					 | 
				
			||||||
		MinSwapAmount: param.MinSwapAmount,
 | 
					 | 
				
			||||||
		MaxSwapAmount: param.MaxSwapAmount,
 | 
					 | 
				
			||||||
		MinBlockLock:  param.MinBlockLock,
 | 
					 | 
				
			||||||
		MaxBlockLock:  param.MaxBlockLock,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateParams(v015params v015bep3.Params) v016bep3.Params {
 | 
					 | 
				
			||||||
	assetParams := make(v016bep3.AssetParams, len(v015params.AssetParams))
 | 
					 | 
				
			||||||
	for i, assetParam := range v015params.AssetParams {
 | 
					 | 
				
			||||||
		assetParams[i] = migrateAssetParam(assetParam)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v016bep3.Params{AssetParams: assetParams}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateSwapStatus(status v015bep3.SwapStatus) v016bep3.SwapStatus {
 | 
					 | 
				
			||||||
	switch status {
 | 
					 | 
				
			||||||
	case v015bep3.NULL:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_STATUS_UNSPECIFIED
 | 
					 | 
				
			||||||
	case v015bep3.Open:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_STATUS_OPEN
 | 
					 | 
				
			||||||
	case v015bep3.Completed:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_STATUS_COMPLETED
 | 
					 | 
				
			||||||
	case v015bep3.Expired:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_STATUS_EXPIRED
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		panic(fmt.Errorf("'%d' is not a valid swap status", status))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateSwapDirection(direction v015bep3.SwapDirection) v016bep3.SwapDirection {
 | 
					 | 
				
			||||||
	switch direction {
 | 
					 | 
				
			||||||
	case v015bep3.INVALID:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_DIRECTION_UNSPECIFIED
 | 
					 | 
				
			||||||
	case v015bep3.Incoming:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_DIRECTION_INCOMING
 | 
					 | 
				
			||||||
	case v015bep3.Outgoing:
 | 
					 | 
				
			||||||
		return v016bep3.SWAP_DIRECTION_OUTGOING
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		panic(fmt.Errorf("'%d' is not a valid swap direction", direction))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateAtomicSwaps(oldSwaps v015bep3.AtomicSwaps) v016bep3.AtomicSwaps {
 | 
					 | 
				
			||||||
	newSwaps := make(v016bep3.AtomicSwaps, len(oldSwaps))
 | 
					 | 
				
			||||||
	for i, oldSwap := range oldSwaps {
 | 
					 | 
				
			||||||
		swap := v016bep3.AtomicSwap{
 | 
					 | 
				
			||||||
			Amount:              oldSwap.Amount,
 | 
					 | 
				
			||||||
			RandomNumberHash:    oldSwap.RandomNumberHash,
 | 
					 | 
				
			||||||
			ExpireHeight:        oldSwap.ExpireHeight,
 | 
					 | 
				
			||||||
			Timestamp:           oldSwap.Timestamp,
 | 
					 | 
				
			||||||
			Sender:              oldSwap.Sender,
 | 
					 | 
				
			||||||
			Recipient:           oldSwap.Recipient,
 | 
					 | 
				
			||||||
			SenderOtherChain:    oldSwap.SenderOtherChain,
 | 
					 | 
				
			||||||
			RecipientOtherChain: oldSwap.RecipientOtherChain,
 | 
					 | 
				
			||||||
			ClosedBlock:         oldSwap.ClosedBlock,
 | 
					 | 
				
			||||||
			Status:              migrateSwapStatus(oldSwap.Status),
 | 
					 | 
				
			||||||
			CrossChain:          oldSwap.CrossChain,
 | 
					 | 
				
			||||||
			Direction:           migrateSwapDirection(oldSwap.Direction),
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		swap = resetSwapForZeroHeight(swap)
 | 
					 | 
				
			||||||
		newSwaps[i] = swap
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return newSwaps
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// resetSwapForZeroHeight updates swap expiry/close heights to work when the chain height is reset to zero.
 | 
					 | 
				
			||||||
func resetSwapForZeroHeight(swap v016bep3.AtomicSwap) v016bep3.AtomicSwap {
 | 
					 | 
				
			||||||
	switch status := swap.Status; status {
 | 
					 | 
				
			||||||
	case v016bep3.SWAP_STATUS_COMPLETED:
 | 
					 | 
				
			||||||
		// Reset closed block to one so completed swaps are not held in long term storage too long.
 | 
					 | 
				
			||||||
		swap.ClosedBlock = 1
 | 
					 | 
				
			||||||
	case v016bep3.SWAP_STATUS_OPEN:
 | 
					 | 
				
			||||||
		switch dir := swap.Direction; dir {
 | 
					 | 
				
			||||||
		case v016bep3.SWAP_DIRECTION_INCOMING:
 | 
					 | 
				
			||||||
			// Open incoming swaps can be expired safely. They haven't been claimed yet, so the outgoing swap on bnb will just timeout.
 | 
					 | 
				
			||||||
			// The chain downtime cannot be accurately predicted, so it's easier to expire than to recalculate a correct expire height.
 | 
					 | 
				
			||||||
			swap.ExpireHeight = 1
 | 
					 | 
				
			||||||
			swap.Status = v016bep3.SWAP_STATUS_EXPIRED
 | 
					 | 
				
			||||||
		case v016bep3.SWAP_DIRECTION_OUTGOING:
 | 
					 | 
				
			||||||
			// Open outgoing swaps should be extended to allow enough time to claim after the chain launches.
 | 
					 | 
				
			||||||
			// They cannot be expired as there could be an open/claimed bnb swap.
 | 
					 | 
				
			||||||
			swap.ExpireHeight = 1 + 24686 // default timeout used when sending swaps from kava
 | 
					 | 
				
			||||||
		case v016bep3.SWAP_DIRECTION_UNSPECIFIED:
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			panic(fmt.Sprintf("unknown bep3 swap direction '%s'", dir))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case v016bep3.SWAP_STATUS_EXPIRED:
 | 
					 | 
				
			||||||
		// Once a swap is marked expired the expire height is ignored. However reset to 1 to be sure.
 | 
					 | 
				
			||||||
		swap.ExpireHeight = 1
 | 
					 | 
				
			||||||
	case v016bep3.SWAP_STATUS_UNSPECIFIED:
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("unknown bep3 swap status '%s'", status))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return swap
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func migrateSupplies(oldSupplies v015bep3.AssetSupplies) v016bep3.AssetSupplies {
 | 
					 | 
				
			||||||
	newSupplies := make(v016bep3.AssetSupplies, len(oldSupplies))
 | 
					 | 
				
			||||||
	for i, supply := range oldSupplies {
 | 
					 | 
				
			||||||
		newSupplies[i] = v016bep3.AssetSupply{
 | 
					 | 
				
			||||||
			IncomingSupply:           supply.IncomingSupply,
 | 
					 | 
				
			||||||
			OutgoingSupply:           supply.OutgoingSupply,
 | 
					 | 
				
			||||||
			CurrentSupply:            supply.CurrentSupply,
 | 
					 | 
				
			||||||
			TimeLimitedCurrentSupply: supply.TimeLimitedCurrentSupply,
 | 
					 | 
				
			||||||
			TimeElapsed:              supply.TimeElapsed,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return newSupplies
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func Migrate(oldState v015bep3.GenesisState) *v016bep3.GenesisState {
 | 
					 | 
				
			||||||
	return &v016bep3.GenesisState{
 | 
					 | 
				
			||||||
		PreviousBlockTime: oldState.PreviousBlockTime,
 | 
					 | 
				
			||||||
		Params:            migrateParams(oldState.Params),
 | 
					 | 
				
			||||||
		AtomicSwaps:       migrateAtomicSwaps(oldState.AtomicSwaps),
 | 
					 | 
				
			||||||
		Supplies:          migrateSupplies(oldState.Supplies),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,275 +0,0 @@
 | 
				
			|||||||
package v0_16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
					 | 
				
			||||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/suite"
 | 
					 | 
				
			||||||
	"github.com/tendermint/tendermint/libs/bytes"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	app "github.com/kava-labs/kava/app"
 | 
					 | 
				
			||||||
	v015bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_15"
 | 
					 | 
				
			||||||
	v016bep3 "github.com/kava-labs/kava/x/bep3/types"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type migrateTestSuite struct {
 | 
					 | 
				
			||||||
	suite.Suite
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	addresses   []sdk.AccAddress
 | 
					 | 
				
			||||||
	v15genstate v015bep3.GenesisState
 | 
					 | 
				
			||||||
	cdc         codec.Codec
 | 
					 | 
				
			||||||
	legacyCdc   *codec.LegacyAmino
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *migrateTestSuite) SetupTest() {
 | 
					 | 
				
			||||||
	app.SetSDKConfig()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s.v15genstate = v015bep3.GenesisState{
 | 
					 | 
				
			||||||
		PreviousBlockTime: time.Date(2021, 4, 8, 15, 0, 0, 0, time.UTC),
 | 
					 | 
				
			||||||
		Params:            v015bep3.Params{},
 | 
					 | 
				
			||||||
		Supplies:          v015bep3.AssetSupplies{},
 | 
					 | 
				
			||||||
		AtomicSwaps:       v015bep3.AtomicSwaps{},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	config := app.MakeEncodingConfig()
 | 
					 | 
				
			||||||
	s.cdc = config.Marshaler
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	legacyCodec := codec.NewLegacyAmino()
 | 
					 | 
				
			||||||
	s.legacyCdc = legacyCodec
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_, accAddresses := app.GeneratePrivKeyAddressPairs(10)
 | 
					 | 
				
			||||||
	s.addresses = accAddresses
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *migrateTestSuite) TestMigrate_JSON() {
 | 
					 | 
				
			||||||
	// Migrate v15 bep3 to v16
 | 
					 | 
				
			||||||
	file := filepath.Join("testdata", "v15-bep3.json")
 | 
					 | 
				
			||||||
	data, err := ioutil.ReadFile(file)
 | 
					 | 
				
			||||||
	s.Require().NoError(err)
 | 
					 | 
				
			||||||
	err = s.legacyCdc.UnmarshalJSON(data, &s.v15genstate)
 | 
					 | 
				
			||||||
	s.Require().NoError(err)
 | 
					 | 
				
			||||||
	genstate := Migrate(s.v15genstate)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Compare expect v16 bep3 json with migrated json
 | 
					 | 
				
			||||||
	actual := s.cdc.MustMarshalJSON(genstate)
 | 
					 | 
				
			||||||
	file = filepath.Join("testdata", "v16-bep3.json")
 | 
					 | 
				
			||||||
	expected, err := ioutil.ReadFile(file)
 | 
					 | 
				
			||||||
	s.Require().NoError(err)
 | 
					 | 
				
			||||||
	s.Require().JSONEq(string(expected), string(actual))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *migrateTestSuite) TestMigrate_Swaps() {
 | 
					 | 
				
			||||||
	type oldSwap struct {
 | 
					 | 
				
			||||||
		ExpireHeight uint64
 | 
					 | 
				
			||||||
		CloseBlock   int64
 | 
					 | 
				
			||||||
		Status       v015bep3.SwapStatus
 | 
					 | 
				
			||||||
		Direction    v015bep3.SwapDirection
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	type newSwap struct {
 | 
					 | 
				
			||||||
		ExpireHeight uint64
 | 
					 | 
				
			||||||
		CloseBlock   int64
 | 
					 | 
				
			||||||
		Status       v016bep3.SwapStatus
 | 
					 | 
				
			||||||
		Direction    v016bep3.SwapDirection
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	testcases := []struct {
 | 
					 | 
				
			||||||
		name    string
 | 
					 | 
				
			||||||
		oldSwap oldSwap
 | 
					 | 
				
			||||||
		newSwap newSwap
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "invalid swap direction",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				Direction: v015bep3.INVALID,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				Direction: v016bep3.SWAP_DIRECTION_UNSPECIFIED,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "invalid swap status",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				Status: v015bep3.NULL,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				Status: v016bep3.SWAP_STATUS_UNSPECIFIED,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "incoming open swap",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				// expire and close not set in open swaps
 | 
					 | 
				
			||||||
				Status:    v015bep3.Open,
 | 
					 | 
				
			||||||
				Direction: v015bep3.Incoming,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 1,
 | 
					 | 
				
			||||||
				Status:       v016bep3.SWAP_STATUS_EXPIRED,
 | 
					 | 
				
			||||||
				Direction:    v016bep3.SWAP_DIRECTION_INCOMING,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "outgoing open swap",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				// expire and close not set in open swaps
 | 
					 | 
				
			||||||
				Status:    v015bep3.Open,
 | 
					 | 
				
			||||||
				Direction: v015bep3.Outgoing,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 24687,
 | 
					 | 
				
			||||||
				Status:       v016bep3.SWAP_STATUS_OPEN,
 | 
					 | 
				
			||||||
				Direction:    v016bep3.SWAP_DIRECTION_OUTGOING,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "completed swap",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 1000,
 | 
					 | 
				
			||||||
				CloseBlock:   900,
 | 
					 | 
				
			||||||
				Status:       v015bep3.Completed,
 | 
					 | 
				
			||||||
				Direction:    v015bep3.Incoming,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 1000,
 | 
					 | 
				
			||||||
				CloseBlock:   1,
 | 
					 | 
				
			||||||
				Status:       v016bep3.SWAP_STATUS_COMPLETED,
 | 
					 | 
				
			||||||
				Direction:    v016bep3.SWAP_DIRECTION_INCOMING,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "expired swap",
 | 
					 | 
				
			||||||
			oldSwap: oldSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 1000,
 | 
					 | 
				
			||||||
				CloseBlock:   900,
 | 
					 | 
				
			||||||
				Status:       v015bep3.Expired,
 | 
					 | 
				
			||||||
				Direction:    v015bep3.Incoming,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			newSwap: newSwap{
 | 
					 | 
				
			||||||
				ExpireHeight: 1,
 | 
					 | 
				
			||||||
				CloseBlock:   900,
 | 
					 | 
				
			||||||
				Status:       v016bep3.SWAP_STATUS_EXPIRED,
 | 
					 | 
				
			||||||
				Direction:    v016bep3.SWAP_DIRECTION_INCOMING,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, tc := range testcases {
 | 
					 | 
				
			||||||
		s.Run(tc.name, func() {
 | 
					 | 
				
			||||||
			oldSwaps := v015bep3.AtomicSwaps{
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					Amount:              sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(12))),
 | 
					 | 
				
			||||||
					RandomNumberHash:    bytes.HexBytes{},
 | 
					 | 
				
			||||||
					ExpireHeight:        tc.oldSwap.ExpireHeight,
 | 
					 | 
				
			||||||
					Timestamp:           1110,
 | 
					 | 
				
			||||||
					Sender:              s.addresses[0],
 | 
					 | 
				
			||||||
					Recipient:           s.addresses[1],
 | 
					 | 
				
			||||||
					RecipientOtherChain: s.addresses[0].String(),
 | 
					 | 
				
			||||||
					SenderOtherChain:    s.addresses[1].String(),
 | 
					 | 
				
			||||||
					ClosedBlock:         tc.oldSwap.CloseBlock,
 | 
					 | 
				
			||||||
					Status:              tc.oldSwap.Status,
 | 
					 | 
				
			||||||
					CrossChain:          true,
 | 
					 | 
				
			||||||
					Direction:           tc.oldSwap.Direction,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			expectedSwaps := v016bep3.AtomicSwaps{
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					Amount:              sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(12))),
 | 
					 | 
				
			||||||
					RandomNumberHash:    bytes.HexBytes{},
 | 
					 | 
				
			||||||
					ExpireHeight:        tc.newSwap.ExpireHeight,
 | 
					 | 
				
			||||||
					Timestamp:           1110,
 | 
					 | 
				
			||||||
					Sender:              s.addresses[0],
 | 
					 | 
				
			||||||
					Recipient:           s.addresses[1],
 | 
					 | 
				
			||||||
					RecipientOtherChain: s.addresses[0].String(),
 | 
					 | 
				
			||||||
					SenderOtherChain:    s.addresses[1].String(),
 | 
					 | 
				
			||||||
					ClosedBlock:         tc.newSwap.CloseBlock,
 | 
					 | 
				
			||||||
					Status:              tc.newSwap.Status,
 | 
					 | 
				
			||||||
					CrossChain:          true,
 | 
					 | 
				
			||||||
					Direction:           tc.newSwap.Direction,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			s.v15genstate.AtomicSwaps = oldSwaps
 | 
					 | 
				
			||||||
			genState := Migrate(s.v15genstate)
 | 
					 | 
				
			||||||
			s.Require().Len(genState.AtomicSwaps, 1)
 | 
					 | 
				
			||||||
			s.Equal(expectedSwaps, genState.AtomicSwaps)
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *migrateTestSuite) TestMigrate_Params() {
 | 
					 | 
				
			||||||
	params := v015bep3.AssetParams{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			Denom:  "bnb",
 | 
					 | 
				
			||||||
			CoinID: int(714),
 | 
					 | 
				
			||||||
			SupplyLimit: v015bep3.SupplyLimit{
 | 
					 | 
				
			||||||
				Limit:          sdk.NewInt(350000000000000),
 | 
					 | 
				
			||||||
				TimeLimited:    false,
 | 
					 | 
				
			||||||
				TimeBasedLimit: sdk.ZeroInt(),
 | 
					 | 
				
			||||||
				TimePeriod:     time.Hour,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			Active:        true,
 | 
					 | 
				
			||||||
			DeputyAddress: s.addresses[0],
 | 
					 | 
				
			||||||
			FixedFee:      sdk.NewInt(1000),
 | 
					 | 
				
			||||||
			MinSwapAmount: sdk.OneInt(),
 | 
					 | 
				
			||||||
			MaxSwapAmount: sdk.NewInt(1000000000000),
 | 
					 | 
				
			||||||
			MinBlockLock:  220,
 | 
					 | 
				
			||||||
			MaxBlockLock:  770,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	expectedParams := v016bep3.AssetParams{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			Denom:  "bnb",
 | 
					 | 
				
			||||||
			CoinID: int64(714),
 | 
					 | 
				
			||||||
			SupplyLimit: v016bep3.SupplyLimit{
 | 
					 | 
				
			||||||
				Limit:          sdk.NewInt(350000000000000),
 | 
					 | 
				
			||||||
				TimeLimited:    false,
 | 
					 | 
				
			||||||
				TimeBasedLimit: sdk.ZeroInt(),
 | 
					 | 
				
			||||||
				TimePeriod:     time.Hour,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			Active:        true,
 | 
					 | 
				
			||||||
			DeputyAddress: s.addresses[0],
 | 
					 | 
				
			||||||
			FixedFee:      sdk.NewInt(1000),
 | 
					 | 
				
			||||||
			MinSwapAmount: sdk.OneInt(),
 | 
					 | 
				
			||||||
			MaxSwapAmount: sdk.NewInt(1000000000000),
 | 
					 | 
				
			||||||
			MinBlockLock:  220,
 | 
					 | 
				
			||||||
			MaxBlockLock:  770,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s.v15genstate.Params = v015bep3.Params{AssetParams: params}
 | 
					 | 
				
			||||||
	genState := Migrate(s.v15genstate)
 | 
					 | 
				
			||||||
	s.Require().Len(genState.Params.AssetParams, 1)
 | 
					 | 
				
			||||||
	s.Require().Equal(v016bep3.Params{AssetParams: expectedParams}, genState.Params)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s *migrateTestSuite) TestMigrate_Supplies() {
 | 
					 | 
				
			||||||
	supplies := v015bep3.AssetSupplies{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			IncomingSupply:           sdk.NewInt64Coin("bnb", 1000),
 | 
					 | 
				
			||||||
			OutgoingSupply:           sdk.NewInt64Coin("bnb", 1001),
 | 
					 | 
				
			||||||
			CurrentSupply:            sdk.NewInt64Coin("bnb", 1002),
 | 
					 | 
				
			||||||
			TimeLimitedCurrentSupply: sdk.NewInt64Coin("bnb", 1003),
 | 
					 | 
				
			||||||
			TimeElapsed:              time.Hour,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	expectedSupplies := v016bep3.AssetSupplies{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			IncomingSupply:           sdk.NewInt64Coin("bnb", 1000),
 | 
					 | 
				
			||||||
			OutgoingSupply:           sdk.NewInt64Coin("bnb", 1001),
 | 
					 | 
				
			||||||
			CurrentSupply:            sdk.NewInt64Coin("bnb", 1002),
 | 
					 | 
				
			||||||
			TimeLimitedCurrentSupply: sdk.NewInt64Coin("bnb", 1003),
 | 
					 | 
				
			||||||
			TimeElapsed:              time.Hour,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s.v15genstate.Supplies = supplies
 | 
					 | 
				
			||||||
	genState := Migrate(s.v15genstate)
 | 
					 | 
				
			||||||
	s.Require().Len(genState.Supplies, 1)
 | 
					 | 
				
			||||||
	s.Require().Equal(expectedSupplies, genState.Supplies)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestMigrateTestSuite(t *testing.T) {
 | 
					 | 
				
			||||||
	suite.Run(t, new(migrateTestSuite))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										57
									
								
								x/bep3/legacy/v0_17/migrate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								x/bep3/legacy/v0_17/migrate.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					package v0_16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/kava-labs/kava/x/bep3/types"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// resetSwapForZeroHeight updates swap expiry/close heights to work when the chain height is reset to zero.
 | 
				
			||||||
 | 
					func resetSwapForZeroHeight(swap types.AtomicSwap) types.AtomicSwap {
 | 
				
			||||||
 | 
						switch status := swap.Status; status {
 | 
				
			||||||
 | 
						case types.SWAP_STATUS_COMPLETED:
 | 
				
			||||||
 | 
							// Reset closed block to one so completed swaps are not held in long term storage too long.
 | 
				
			||||||
 | 
							swap.ClosedBlock = 1
 | 
				
			||||||
 | 
						case types.SWAP_STATUS_OPEN:
 | 
				
			||||||
 | 
							switch dir := swap.Direction; dir {
 | 
				
			||||||
 | 
							case types.SWAP_DIRECTION_INCOMING:
 | 
				
			||||||
 | 
								// Open incoming swaps can be expired safely. They haven't been claimed yet, so the outgoing swap on bnb will just timeout.
 | 
				
			||||||
 | 
								// The chain downtime cannot be accurately predicted, so it's easier to expire than to recalculate a correct expire height.
 | 
				
			||||||
 | 
								swap.ExpireHeight = 1
 | 
				
			||||||
 | 
								swap.Status = types.SWAP_STATUS_EXPIRED
 | 
				
			||||||
 | 
							case types.SWAP_DIRECTION_OUTGOING:
 | 
				
			||||||
 | 
								// Open outgoing swaps should be extended to allow enough time to claim after the chain launches.
 | 
				
			||||||
 | 
								// They cannot be expired as there could be an open/claimed bnb swap.
 | 
				
			||||||
 | 
								swap.ExpireHeight = 1 + 24686 // default timeout used when sending swaps from kava
 | 
				
			||||||
 | 
							case types.SWAP_DIRECTION_UNSPECIFIED:
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								panic(fmt.Sprintf("unknown bep3 swap direction '%s'", dir))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						case types.SWAP_STATUS_EXPIRED:
 | 
				
			||||||
 | 
							// Once a swap is marked expired the expire height is ignored. However reset to 1 to be sure.
 | 
				
			||||||
 | 
							swap.ExpireHeight = 1
 | 
				
			||||||
 | 
						case types.SWAP_STATUS_UNSPECIFIED:
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic(fmt.Sprintf("unknown bep3 swap status '%s'", status))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return swap
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func resetSwapsForZeroHeight(oldSwaps types.AtomicSwaps) types.AtomicSwaps {
 | 
				
			||||||
 | 
						newSwaps := make(types.AtomicSwaps, len(oldSwaps))
 | 
				
			||||||
 | 
						for i, oldSwap := range oldSwaps {
 | 
				
			||||||
 | 
							swap := resetSwapForZeroHeight(oldSwap)
 | 
				
			||||||
 | 
							newSwaps[i] = swap
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return newSwaps
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Migrate(oldState types.GenesisState) *types.GenesisState {
 | 
				
			||||||
 | 
						return &types.GenesisState{
 | 
				
			||||||
 | 
							PreviousBlockTime: oldState.PreviousBlockTime,
 | 
				
			||||||
 | 
							Params:            oldState.Params,
 | 
				
			||||||
 | 
							AtomicSwaps:       resetSwapsForZeroHeight(oldState.AtomicSwaps),
 | 
				
			||||||
 | 
							Supplies:          oldState.Supplies,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										174
									
								
								x/bep3/legacy/v0_17/migrate_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								x/bep3/legacy/v0_17/migrate_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,174 @@
 | 
				
			|||||||
 | 
					package v0_16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/codec"
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/suite"
 | 
				
			||||||
 | 
						"github.com/tendermint/tendermint/libs/bytes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						app "github.com/kava-labs/kava/app"
 | 
				
			||||||
 | 
						"github.com/kava-labs/kava/x/bep3/types"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type migrateTestSuite struct {
 | 
				
			||||||
 | 
						suite.Suite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						addresses   []sdk.AccAddress
 | 
				
			||||||
 | 
						v16genstate types.GenesisState
 | 
				
			||||||
 | 
						cdc         codec.Codec
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *migrateTestSuite) SetupTest() {
 | 
				
			||||||
 | 
						app.SetSDKConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s.v16genstate = types.GenesisState{
 | 
				
			||||||
 | 
							PreviousBlockTime: time.Date(2021, 4, 8, 15, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
							Params:            types.Params{},
 | 
				
			||||||
 | 
							Supplies:          types.AssetSupplies{},
 | 
				
			||||||
 | 
							AtomicSwaps:       types.AtomicSwaps{},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := app.MakeEncodingConfig()
 | 
				
			||||||
 | 
						s.cdc = config.Marshaler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, accAddresses := app.GeneratePrivKeyAddressPairs(10)
 | 
				
			||||||
 | 
						s.addresses = accAddresses
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *migrateTestSuite) TestMigrate_JSON() {
 | 
				
			||||||
 | 
						// Migrate v16 bep3 to v17
 | 
				
			||||||
 | 
						file := filepath.Join("testdata", "v16-bep3.json")
 | 
				
			||||||
 | 
						data, err := ioutil.ReadFile(file)
 | 
				
			||||||
 | 
						s.Require().NoError(err)
 | 
				
			||||||
 | 
						err = s.cdc.UnmarshalJSON(data, &s.v16genstate)
 | 
				
			||||||
 | 
						s.Require().NoError(err)
 | 
				
			||||||
 | 
						genstate := Migrate(s.v16genstate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Compare expect v16 bep3 json with migrated json
 | 
				
			||||||
 | 
						actual := s.cdc.MustMarshalJSON(genstate)
 | 
				
			||||||
 | 
						file = filepath.Join("testdata", "v17-bep3.json")
 | 
				
			||||||
 | 
						expected, err := ioutil.ReadFile(file)
 | 
				
			||||||
 | 
						s.Require().NoError(err)
 | 
				
			||||||
 | 
						s.Require().JSONEq(string(expected), string(actual))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *migrateTestSuite) TestMigrate_Swaps() {
 | 
				
			||||||
 | 
						type swap struct {
 | 
				
			||||||
 | 
							ExpireHeight uint64
 | 
				
			||||||
 | 
							CloseBlock   int64
 | 
				
			||||||
 | 
							Status       types.SwapStatus
 | 
				
			||||||
 | 
							Direction    types.SwapDirection
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						testcases := []struct {
 | 
				
			||||||
 | 
							name    string
 | 
				
			||||||
 | 
							oldSwap swap
 | 
				
			||||||
 | 
							newSwap swap
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "incoming open swap",
 | 
				
			||||||
 | 
								oldSwap: swap{
 | 
				
			||||||
 | 
									// expire and close not set in open swaps
 | 
				
			||||||
 | 
									Status:    types.SWAP_STATUS_OPEN,
 | 
				
			||||||
 | 
									Direction: types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								newSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 1,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_EXPIRED,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "outgoing open swap",
 | 
				
			||||||
 | 
								oldSwap: swap{
 | 
				
			||||||
 | 
									// expire and close not set in open swaps
 | 
				
			||||||
 | 
									Status:    types.SWAP_STATUS_OPEN,
 | 
				
			||||||
 | 
									Direction: types.SWAP_DIRECTION_OUTGOING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								newSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 24687,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_OPEN,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_OUTGOING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "completed swap",
 | 
				
			||||||
 | 
								oldSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 1000,
 | 
				
			||||||
 | 
									CloseBlock:   900,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_COMPLETED,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								newSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 1000,
 | 
				
			||||||
 | 
									CloseBlock:   1,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_COMPLETED,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "expired swap",
 | 
				
			||||||
 | 
								oldSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 1000,
 | 
				
			||||||
 | 
									CloseBlock:   900,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_EXPIRED,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								newSwap: swap{
 | 
				
			||||||
 | 
									ExpireHeight: 1,
 | 
				
			||||||
 | 
									CloseBlock:   900,
 | 
				
			||||||
 | 
									Status:       types.SWAP_STATUS_EXPIRED,
 | 
				
			||||||
 | 
									Direction:    types.SWAP_DIRECTION_INCOMING,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tc := range testcases {
 | 
				
			||||||
 | 
							s.Run(tc.name, func() {
 | 
				
			||||||
 | 
								oldSwaps := types.AtomicSwaps{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Amount:              sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(12))),
 | 
				
			||||||
 | 
										RandomNumberHash:    bytes.HexBytes{},
 | 
				
			||||||
 | 
										ExpireHeight:        tc.oldSwap.ExpireHeight,
 | 
				
			||||||
 | 
										Timestamp:           1110,
 | 
				
			||||||
 | 
										Sender:              s.addresses[0],
 | 
				
			||||||
 | 
										Recipient:           s.addresses[1],
 | 
				
			||||||
 | 
										RecipientOtherChain: s.addresses[0].String(),
 | 
				
			||||||
 | 
										SenderOtherChain:    s.addresses[1].String(),
 | 
				
			||||||
 | 
										ClosedBlock:         tc.oldSwap.CloseBlock,
 | 
				
			||||||
 | 
										Status:              tc.oldSwap.Status,
 | 
				
			||||||
 | 
										CrossChain:          true,
 | 
				
			||||||
 | 
										Direction:           tc.oldSwap.Direction,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								expectedSwaps := types.AtomicSwaps{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Amount:              sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(12))),
 | 
				
			||||||
 | 
										RandomNumberHash:    bytes.HexBytes{},
 | 
				
			||||||
 | 
										ExpireHeight:        tc.newSwap.ExpireHeight,
 | 
				
			||||||
 | 
										Timestamp:           1110,
 | 
				
			||||||
 | 
										Sender:              s.addresses[0],
 | 
				
			||||||
 | 
										Recipient:           s.addresses[1],
 | 
				
			||||||
 | 
										RecipientOtherChain: s.addresses[0].String(),
 | 
				
			||||||
 | 
										SenderOtherChain:    s.addresses[1].String(),
 | 
				
			||||||
 | 
										ClosedBlock:         tc.newSwap.CloseBlock,
 | 
				
			||||||
 | 
										Status:              tc.newSwap.Status,
 | 
				
			||||||
 | 
										CrossChain:          true,
 | 
				
			||||||
 | 
										Direction:           tc.newSwap.Direction,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								s.v16genstate.AtomicSwaps = oldSwaps
 | 
				
			||||||
 | 
								genState := Migrate(s.v16genstate)
 | 
				
			||||||
 | 
								s.Require().Len(genState.AtomicSwaps, 1)
 | 
				
			||||||
 | 
								s.Equal(expectedSwaps, genState.AtomicSwaps)
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMigrateTestSuite(t *testing.T) {
 | 
				
			||||||
 | 
						suite.Run(t, new(migrateTestSuite))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -9,14 +9,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "838115",
 | 
					      "closed_block": "838115",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Incoming",
 | 
					      "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
      "expire_height": "838627",
 | 
					      "expire_height": "838627",
 | 
				
			||||||
      "random_number_hash": "6F1CF8F2E13A0C0F0A359F54E47E4E265D766B8E006D2F00BDF994ABDEF1E9E4",
 | 
					      "random_number_hash": "6F1CF8F2E13A0C0F0A359F54E47E4E265D766B8E006D2F00BDF994ABDEF1E9E4",
 | 
				
			||||||
      "recipient": "kava1fl2hs6y9vz986g5v52pdan9ga923n9mn5cxxkw",
 | 
					      "recipient": "kava1fl2hs6y9vz986g5v52pdan9ga923n9mn5cxxkw",
 | 
				
			||||||
      "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
					      "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
				
			||||||
      "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
					      "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
				
			||||||
      "sender_other_chain": "bnb19k9wuv2j7c7ck8tmc7kav0r0cnt3esmkrpf25x",
 | 
					      "sender_other_chain": "bnb19k9wuv2j7c7ck8tmc7kav0r0cnt3esmkrpf25x",
 | 
				
			||||||
      "status": "Completed",
 | 
					      "status": "SWAP_STATUS_COMPLETED",
 | 
				
			||||||
      "timestamp": "1636034914"
 | 
					      "timestamp": "1636034914"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -28,14 +28,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "1712118",
 | 
					      "closed_block": "1712118",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Outgoing",
 | 
					      "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
      "expire_height": "1736797",
 | 
					      "expire_height": "1736797",
 | 
				
			||||||
      "random_number_hash": "280EB832A37F2265CC82F3957CE603AAD57BAD7038B876A1F28953AFA29FA1C3",
 | 
					      "random_number_hash": "280EB832A37F2265CC82F3957CE603AAD57BAD7038B876A1F28953AFA29FA1C3",
 | 
				
			||||||
      "recipient": "kava1r4v2zdhdalfj2ydazallqvrus9fkphmglhn6u6",
 | 
					      "recipient": "kava1r4v2zdhdalfj2ydazallqvrus9fkphmglhn6u6",
 | 
				
			||||||
      "recipient_other_chain": "bnb18nsgj50zvc4uq93w4j0ltz5gaxhwv7aq4qnq0p",
 | 
					      "recipient_other_chain": "bnb18nsgj50zvc4uq93w4j0ltz5gaxhwv7aq4qnq0p",
 | 
				
			||||||
      "sender": "kava1zw6gg4ztvly7zf25pa33mclav3spvj3ympxxna",
 | 
					      "sender": "kava1zw6gg4ztvly7zf25pa33mclav3spvj3ympxxna",
 | 
				
			||||||
      "sender_other_chain": "bnb1jh7uv2rm6339yue8k4mj9406k3509kr4wt5nxn",
 | 
					      "sender_other_chain": "bnb1jh7uv2rm6339yue8k4mj9406k3509kr4wt5nxn",
 | 
				
			||||||
      "status": "Completed",
 | 
					      "status": "SWAP_STATUS_COMPLETED",
 | 
				
			||||||
      "timestamp": "1641976566"
 | 
					      "timestamp": "1641976566"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -47,14 +47,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "787122",
 | 
					      "closed_block": "787122",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Incoming",
 | 
					      "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
      "expire_height": "811799",
 | 
					      "expire_height": "811799",
 | 
				
			||||||
      "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
					      "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
				
			||||||
      "recipient": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
					      "recipient": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
				
			||||||
      "recipient_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
					      "recipient_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
				
			||||||
      "sender": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
					      "sender": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
				
			||||||
      "sender_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
					      "sender_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
				
			||||||
      "status": "Expired",
 | 
					      "status": "SWAP_STATUS_EXPIRED",
 | 
				
			||||||
      "timestamp": "1635694492"
 | 
					      "timestamp": "1635694492"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -66,14 +66,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "787122",
 | 
					      "closed_block": "787122",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Outgoing",
 | 
					      "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
      "expire_height": "811799",
 | 
					      "expire_height": "811799",
 | 
				
			||||||
      "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
					      "random_number_hash": "BFB7CC82DA0E0C8556AC37843F5AB136B9A7A066054368F5948944282B414D83",
 | 
				
			||||||
      "recipient": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
					      "recipient": "kava1hh4x3a4suu5zyaeauvmv7ypf7w9llwlfufjmuu",
 | 
				
			||||||
      "recipient_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
					      "recipient_other_chain": "bnb1vl3wn4x8kqajg2j9wxa5y5amgzdxchutkxr6at",
 | 
				
			||||||
      "sender": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
					      "sender": "kava1eufgf0w9d7hf5mgtek4zr2upkxag9stmzx6unl",
 | 
				
			||||||
      "sender_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
					      "sender_other_chain": "bnb10zq89008gmedc6rrwzdfukjk94swynd7dl97w8",
 | 
				
			||||||
      "status": "Expired",
 | 
					      "status": "SWAP_STATUS_EXPIRED",
 | 
				
			||||||
      "timestamp": "1635694492"
 | 
					      "timestamp": "1635694492"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -85,14 +85,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "0",
 | 
					      "closed_block": "0",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Outgoing",
 | 
					      "direction": "SWAP_DIRECTION_OUTGOING",
 | 
				
			||||||
      "expire_height": "1730589",
 | 
					      "expire_height": "1730589",
 | 
				
			||||||
      "random_number_hash": "A74EA1AB58D312FDF1E872D18583CACCF294E639DDA4F303939E9ADCEC081D93",
 | 
					      "random_number_hash": "A74EA1AB58D312FDF1E872D18583CACCF294E639DDA4F303939E9ADCEC081D93",
 | 
				
			||||||
      "recipient": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
					      "recipient": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
				
			||||||
      "recipient_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
					      "recipient_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
				
			||||||
      "sender": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
					      "sender": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
				
			||||||
      "sender_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
					      "sender_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
				
			||||||
      "status": "Open",
 | 
					      "status": "SWAP_STATUS_OPEN",
 | 
				
			||||||
      "timestamp": "1641934114"
 | 
					      "timestamp": "1641934114"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -104,14 +104,14 @@
 | 
				
			|||||||
      ],
 | 
					      ],
 | 
				
			||||||
      "closed_block": "0",
 | 
					      "closed_block": "0",
 | 
				
			||||||
      "cross_chain": true,
 | 
					      "cross_chain": true,
 | 
				
			||||||
      "direction": "Incoming",
 | 
					      "direction": "SWAP_DIRECTION_INCOMING",
 | 
				
			||||||
      "expire_height": "1740000",
 | 
					      "expire_height": "1740000",
 | 
				
			||||||
      "random_number_hash": "39E9ADCEC081D93A74EA1A83CACCF294E639DDA4F3039B58D312FDF1E872D185",
 | 
					      "random_number_hash": "39E9ADCEC081D93A74EA1A83CACCF294E639DDA4F3039B58D312FDF1E872D185",
 | 
				
			||||||
      "recipient": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
					      "recipient": "kava1d2u28azje7rhqyjtxc2ex8q0cxxpw7dfm7ltq5",
 | 
				
			||||||
      "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
					      "recipient_other_chain": "bnb1xz3xqf4p2ygrw9lhp5g5df4ep4nd20vsywnmpr",
 | 
				
			||||||
      "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
					      "sender": "kava14qsmvzprqvhwmgql9fr0u3zv9n2qla8zhnm5pc",
 | 
				
			||||||
      "sender_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
					      "sender_other_chain": "bnb1lhk5ndlgf5wz55t8k35cqj6h9l3m4l5ek2w7q6",
 | 
				
			||||||
      "status": "Open",
 | 
					      "status": "SWAP_STATUS_OPEN",
 | 
				
			||||||
      "timestamp": "1641934114"
 | 
					      "timestamp": "1641934114"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
@ -131,7 +131,7 @@
 | 
				
			|||||||
          "limit": "100000000000",
 | 
					          "limit": "100000000000",
 | 
				
			||||||
          "time_based_limit": "0",
 | 
					          "time_based_limit": "0",
 | 
				
			||||||
          "time_limited": false,
 | 
					          "time_limited": false,
 | 
				
			||||||
          "time_period": "0"
 | 
					          "time_period": "0s"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@ -148,7 +148,7 @@
 | 
				
			|||||||
          "limit": "2000000000000000",
 | 
					          "limit": "2000000000000000",
 | 
				
			||||||
          "time_based_limit": "0",
 | 
					          "time_based_limit": "0",
 | 
				
			||||||
          "time_limited": false,
 | 
					          "time_limited": false,
 | 
				
			||||||
          "time_period": "0"
 | 
					          "time_period": "0s"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@ -165,7 +165,7 @@
 | 
				
			|||||||
          "limit": "100000000000000",
 | 
					          "limit": "100000000000000",
 | 
				
			||||||
          "time_based_limit": "0",
 | 
					          "time_based_limit": "0",
 | 
				
			||||||
          "time_limited": false,
 | 
					          "time_limited": false,
 | 
				
			||||||
          "time_period": "0"
 | 
					          "time_period": "0s"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@ -182,7 +182,7 @@
 | 
				
			|||||||
          "limit": "2000000000000000",
 | 
					          "limit": "2000000000000000",
 | 
				
			||||||
          "time_based_limit": "0",
 | 
					          "time_based_limit": "0",
 | 
				
			||||||
          "time_limited": false,
 | 
					          "time_limited": false,
 | 
				
			||||||
          "time_period": "0"
 | 
					          "time_period": "0s"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
@ -202,7 +202,7 @@
 | 
				
			|||||||
        "amount": "0",
 | 
					        "amount": "0",
 | 
				
			||||||
        "denom": "bnb"
 | 
					        "denom": "bnb"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "time_elapsed": "0",
 | 
					      "time_elapsed": "0s",
 | 
				
			||||||
      "time_limited_current_supply": {
 | 
					      "time_limited_current_supply": {
 | 
				
			||||||
        "amount": "0",
 | 
					        "amount": "0",
 | 
				
			||||||
        "denom": "bnb"
 | 
					        "denom": "bnb"
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user