Documentation ¶
Index ¶
Examples ¶
Constants ¶
const ( MainnetAPIURI = "https://api.metalblockchain.org" TahoeAPIURI = "https://tahoe.metalblockchain.org" LocalAPIURI = "http://localhost:9650" )
Variables ¶
This section is empty.
Functions ¶
func AddAllUTXOs ¶
func AddAllUTXOs( ctx context.Context, utxos walletcommon.UTXOs, client UTXOClient, codec codec.Manager, sourceChainID ids.ID, destinationChainID ids.ID, addrs []ids.ShortID, ) error
AddAllUTXOs fetches all the UTXOs referenced by [addresses] that were sent from [sourceChainID] to [destinationChainID] from the [client]. It then uses codec to parse the returned UTXOs and it adds them into [utxos]. If [ctx] expires, then the returned error will be immediately reported.
Types ¶
type AVAXState ¶
type UTXOClient ¶
type Wallet ¶
Wallet provides chain wallets for the primary network.
Example ¶
ctx := context.Background() kc := secp256k1fx.NewKeychain(genesis.EWOQKey) // MakeWallet fetches the available UTXOs owned by [kc] on the network that // [LocalAPIURI] is hosting. walletSyncStartTime := time.Now() wallet, err := MakeWallet(ctx, &WalletConfig{ URI: LocalAPIURI, AVAXKeychain: kc, EthKeychain: kc, }) if err != nil { log.Fatalf("failed to initialize wallet with: %s\n", err) return } log.Printf("synced wallet in %s\n", time.Since(walletSyncStartTime)) // Get the P-chain and the X-chain wallets pWallet := wallet.P() xWallet := wallet.X() xBuilder := xWallet.Builder() xContext := xBuilder.Context() // Pull out useful constants to use when issuing transactions. xChainID := xContext.BlockchainID owner := &secp256k1fx.OutputOwners{ Threshold: 1, Addrs: []ids.ShortID{ genesis.EWOQKey.PublicKey().Address(), }, } // Create a custom asset to send to the P-chain. createAssetStartTime := time.Now() createAssetTx, err := xWallet.IssueCreateAssetTx( "RnM", "RNM", 9, map[uint32][]verify.State{ 0: { &secp256k1fx.TransferOutput{ Amt: 100 * units.MegaAvax, OutputOwners: *owner, }, }, }, ) if err != nil { log.Fatalf("failed to create new X-chain asset with: %s\n", err) return } createAssetTxID := createAssetTx.ID() log.Printf("created X-chain asset %s in %s\n", createAssetTxID, time.Since(createAssetStartTime)) // Send 100 MegaAvax to the P-chain. exportStartTime := time.Now() exportTx, err := xWallet.IssueExportTx( constants.PlatformChainID, []*avax.TransferableOutput{ { Asset: avax.Asset{ ID: createAssetTxID, }, Out: &secp256k1fx.TransferOutput{ Amt: 100 * units.MegaAvax, OutputOwners: *owner, }, }, }, ) if err != nil { log.Fatalf("failed to issue X->P export transaction with: %s\n", err) return } exportTxID := exportTx.ID() log.Printf("issued X->P export %s in %s\n", exportTxID, time.Since(exportStartTime)) // Import the 100 MegaAvax from the X-chain into the P-chain. importStartTime := time.Now() importTx, err := pWallet.IssueImportTx(xChainID, owner) if err != nil { log.Fatalf("failed to issue X->P import transaction with: %s\n", err) return } importTxID := importTx.ID() log.Printf("issued X->P import %s in %s\n", importTxID, time.Since(importStartTime)) createSubnetStartTime := time.Now() createSubnetTx, err := pWallet.IssueCreateSubnetTx(owner) if err != nil { log.Fatalf("failed to issue create subnet transaction with: %s\n", err) return } createSubnetTxID := createSubnetTx.ID() log.Printf("issued create subnet transaction %s in %s\n", createSubnetTxID, time.Since(createSubnetStartTime)) transformSubnetStartTime := time.Now() transformSubnetTx, err := pWallet.IssueTransformSubnetTx( createSubnetTxID, createAssetTxID, 50*units.MegaAvax, 100*units.MegaAvax, reward.PercentDenominator, reward.PercentDenominator, 1, 100*units.MegaAvax, time.Second, 365*24*time.Hour, 0, 1, 5, .80*reward.PercentDenominator, ) if err != nil { log.Fatalf("failed to issue transform subnet transaction with: %s\n", err) return } transformSubnetTxID := transformSubnetTx.ID() log.Printf("issued transform subnet transaction %s in %s\n", transformSubnetTxID, time.Since(transformSubnetStartTime)) addPermissionlessValidatorStartTime := time.Now() startTime := time.Now().Add(time.Minute) addSubnetValidatorTx, err := pWallet.IssueAddPermissionlessValidatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: genesis.LocalConfig.InitialStakers[0].NodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(5 * time.Second).Unix()), Wght: 25 * units.MegaAvax, }, Subnet: createSubnetTxID, }, &signer.Empty{}, createAssetTx.ID(), &secp256k1fx.OutputOwners{}, &secp256k1fx.OutputOwners{}, reward.PercentDenominator, ) if err != nil { log.Fatalf("failed to issue add subnet validator with: %s\n", err) return } addSubnetValidatorTxID := addSubnetValidatorTx.ID() log.Printf("issued add subnet validator transaction %s in %s\n", addSubnetValidatorTxID, time.Since(addPermissionlessValidatorStartTime)) addPermissionlessDelegatorStartTime := time.Now() addSubnetDelegatorTx, err := pWallet.IssueAddPermissionlessDelegatorTx( &txs.SubnetValidator{ Validator: txs.Validator{ NodeID: genesis.LocalConfig.InitialStakers[0].NodeID, Start: uint64(startTime.Unix()), End: uint64(startTime.Add(5 * time.Second).Unix()), Wght: 25 * units.MegaAvax, }, Subnet: createSubnetTxID, }, createAssetTxID, &secp256k1fx.OutputOwners{}, ) if err != nil { log.Fatalf("failed to issue add subnet delegator with: %s\n", err) return } addSubnetDelegatorTxID := addSubnetDelegatorTx.ID() log.Printf("issued add subnet validator delegator %s in %s\n", addSubnetDelegatorTxID, time.Since(addPermissionlessDelegatorStartTime))
Output:
func MakeWallet ¶
func MakeWallet(ctx context.Context, config *WalletConfig) (Wallet, error)
MakeWallet returns a wallet that supports issuing transactions to the chains living in the primary network.
On creation, the wallet attaches to the provided uri and fetches all UTXOs that reference any of the provided keys. If the UTXOs are modified through an external issuance process, such as another instance of the wallet, the UTXOs may become out of sync. The wallet will also fetch all requested P-chain transactions.
The wallet manages all state locally, and performs all tx signing locally.
type WalletConfig ¶
type WalletConfig struct { // Base URI to use for all node requests. URI string // required // Keys to use for signing all transactions. AVAXKeychain keychain.Keychain // required EthKeychain c.EthKeychain // required // Set of P-chain transactions that the wallet should know about to be able // to generate transactions. PChainTxs map[ids.ID]*txs.Tx // optional // Set of P-chain transactions that the wallet should fetch to be able to // generate transactions. PChainTxsToFetch set.Set[ids.ID] // optional }