From ef0d3a2fa19c741533a878a32e0bc20062667046 Mon Sep 17 00:00:00 2001 From: Stephen Buttolph Date: Mon, 23 Oct 2023 17:51:58 -0400 Subject: [PATCH 1/2] Add TransformSubnetTx wallet example --- .../primary/examples/transform-subnet/main.go | 77 +++++++++++++++ .../primary/examples/x-chain-export/main.go | 95 +++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 wallet/subnet/primary/examples/transform-subnet/main.go create mode 100644 wallet/subnet/primary/examples/x-chain-export/main.go diff --git a/wallet/subnet/primary/examples/transform-subnet/main.go b/wallet/subnet/primary/examples/transform-subnet/main.go new file mode 100644 index 000000000000..4baa664f6ad5 --- /dev/null +++ b/wallet/subnet/primary/examples/transform-subnet/main.go @@ -0,0 +1,77 @@ +// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package main + +import ( + "context" + "log" + "time" + + "github.com/ava-labs/avalanchego/genesis" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/set" + "github.com/ava-labs/avalanchego/utils/units" + "github.com/ava-labs/avalanchego/vms/platformvm/reward" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" + "github.com/ava-labs/avalanchego/wallet/subnet/primary" +) + +func main() { + key := genesis.EWOQKey + uri := primary.FujiAPIURI + kc := secp256k1fx.NewKeychain(key) + subnetIDStr := "2TkAkG8Tn522nMsKDec3CTHfvaSb4kGrgs2Ho39VvmaLysjayE" + assetIDStr := "tWt78T4XYdCSfqXoyhf9WGgbjf9i4GzqTwB9stje2bd6G5kSC" + + ctx := context.Background() + + subnetID, err := ids.FromString(subnetIDStr) + if err != nil { + log.Fatalf("failed to parse subnet ID: %s\n", err) + } + + assetID, err := ids.FromString(assetIDStr) + if err != nil { + log.Fatalf("failed to parse asset ID: %s\n", err) + } + + // MakeWallet fetches the available UTXOs owned by [kc] on the network that + // [uri] is hosting. + walletSyncStartTime := time.Now() + wallet, err := primary.MakeWallet(ctx, &primary.WalletConfig{ + URI: uri, + AVAXKeychain: kc, + EthKeychain: kc, + PChainTxsToFetch: set.Of(subnetID), + }) + if err != nil { + log.Fatalf("failed to initialize wallet: %s\n", err) + } + log.Printf("synced wallet in %s\n", time.Since(walletSyncStartTime)) + + // Get the P-chain wallet + pWallet := wallet.P() + + transformSubnetStartTime := time.Now() + transformSubnetTx, err := pWallet.IssueTransformSubnetTx( + subnetID, + assetID, + 360*units.MegaAvax, + 720*units.MegaAvax, + .10*reward.PercentDenominator, + .12*reward.PercentDenominator, + 2*units.KiloAvax, + 3*units.MegaAvax, + 2*7*24*time.Hour, + 365*24*time.Hour, + .02*reward.PercentDenominator, + 25*units.Avax, + 5, + .8*reward.PercentDenominator, + ) + if err != nil { + log.Fatalf("failed to issue transform subnet transaction: %s\n", err) + } + log.Printf("issued transform subnet %s in %s\n", transformSubnetTx.ID(), time.Since(transformSubnetStartTime)) +} diff --git a/wallet/subnet/primary/examples/x-chain-export/main.go b/wallet/subnet/primary/examples/x-chain-export/main.go new file mode 100644 index 000000000000..cfe3e5be24ba --- /dev/null +++ b/wallet/subnet/primary/examples/x-chain-export/main.go @@ -0,0 +1,95 @@ +// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package main + +import ( + "context" + "log" + "time" + + "github.com/ava-labs/avalanchego/genesis" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/units" + "github.com/ava-labs/avalanchego/vms/components/avax" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" + "github.com/ava-labs/avalanchego/wallet/subnet/primary" +) + +func main() { + key := genesis.EWOQKey + uri := primary.FujiAPIURI + kc := secp256k1fx.NewKeychain(key) + assetIDStr := "tWt78T4XYdCSfqXoyhf9WGgbjf9i4GzqTwB9stje2bd6G5kSC" + addr := key.Address() + + ctx := context.Background() + + customAssetID, err := ids.FromString(assetIDStr) + if err != nil { + log.Fatalf("failed to parse assetID: %s\n", err) + } + + // MakeWallet fetches the available UTXOs owned by [kc] on the network that + // [uri] is hosting. + walletSyncStartTime := time.Now() + wallet, err := primary.MakeWallet(ctx, &primary.WalletConfig{ + URI: uri, + AVAXKeychain: kc, + EthKeychain: kc, + }) + if err != nil { + log.Fatalf("failed to initialize wallet: %s\n", err) + } + log.Printf("synced wallet in %s\n", time.Since(walletSyncStartTime)) + + xWallet := wallet.X() + pWallet := wallet.P() + + // Pull out useful constants to use when issuing transactions. + avaxAssetID := xWallet.AVAXAssetID() + xChainID := xWallet.BlockchainID() + owner := secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ + addr, + }, + } + + exportStartTime := time.Now() + exportTx, err := xWallet.IssueExportTx( + constants.PlatformChainID, + []*avax.TransferableOutput{ + { + Asset: avax.Asset{ + ID: avaxAssetID, + }, + Out: &secp256k1fx.TransferOutput{ + Amt: units.Avax, + OutputOwners: owner, + }, + }, + { + Asset: avax.Asset{ + ID: customAssetID, + }, + Out: &secp256k1fx.TransferOutput{ + Amt: 360 * units.MegaAvax, + OutputOwners: owner, + }, + }, + }, + ) + if err != nil { + log.Fatalf("failed to issue export transaction: %s\n", err) + } + log.Printf("issued export %s in %s\n", exportTx.ID(), time.Since(exportStartTime)) + + importStartTime := time.Now() + importTx, err := pWallet.IssueImportTx(xChainID, &owner) + if err != nil { + log.Fatalf("failed to issue import transaction: %s\n", err) + } + log.Printf("issued import %s in %s\n", importTx.ID(), time.Since(importStartTime)) +} From c512744a432ec843f4ab80c8e4a41644df773594 Mon Sep 17 00:00:00 2001 From: Stephen Buttolph Date: Mon, 23 Oct 2023 17:53:05 -0400 Subject: [PATCH 2/2] fuji -> local --- wallet/subnet/primary/examples/x-chain-export/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/subnet/primary/examples/x-chain-export/main.go b/wallet/subnet/primary/examples/x-chain-export/main.go index cfe3e5be24ba..0de2990564f0 100644 --- a/wallet/subnet/primary/examples/x-chain-export/main.go +++ b/wallet/subnet/primary/examples/x-chain-export/main.go @@ -19,7 +19,7 @@ import ( func main() { key := genesis.EWOQKey - uri := primary.FujiAPIURI + uri := primary.LocalAPIURI kc := secp256k1fx.NewKeychain(key) assetIDStr := "tWt78T4XYdCSfqXoyhf9WGgbjf9i4GzqTwB9stje2bd6G5kSC" addr := key.Address()