func TestDepositScriptAddressForHardenedPubKey(t *testing.T) { tearDown, _, pool := vp.TstCreatePool(t) defer tearDown() if err := pool.CreateSeries(1, 1, 2, vp.TstPubKeys[0:3]); err != nil { t.Fatalf("Cannot creates series") } // Ask for a DepositScriptAddress using an index for a hardened child, which should // fail as we use the extended public keys to derive childs. _, err := pool.DepositScriptAddress(1, 0, vp.Index(hdkeychain.HardenedKeyStart+1)) vp.TstCheckError(t, "", err, vp.ErrKeyChain) }
func TestDepositScriptAddress(t *testing.T) { tearDown, _, pool := vp.TstCreatePool(t) defer tearDown() tests := []struct { version uint32 series uint32 reqSigs uint32 pubKeys []string // map of branch:address (we only check the branch index at 0) addresses map[uint32]string }{ { version: 1, series: 1, reqSigs: 2, pubKeys: vp.TstPubKeys[0:3], addresses: map[uint32]string{ 0: "3Hb4xcebcKg4DiETJfwjh8sF4uDw9rqtVC", 1: "34eVkREKgvvGASZW7hkgE2uNc1yycntMK6", 2: "3Qt1EaKRD9g9FeL2DGkLLswhK1AKmmXFSe", 3: "3PbExiaztsSYgh6zeMswC49hLUwhTQ86XG", }, }, } for i, test := range tests { if err := pool.CreateSeries(test.version, test.series, test.reqSigs, test.pubKeys); err != nil { t.Fatalf("Cannot creates series %v", test.series) } for branch, expectedAddress := range test.addresses { addr, err := pool.DepositScriptAddress(test.series, vp.Branch(branch), vp.Index(0)) if err != nil { t.Fatalf("Failed to get DepositScriptAddress #%d: %v", i, err) } address := addr.EncodeAddress() if expectedAddress != address { t.Errorf("DepositScript #%d returned the wrong deposit script. Got %v, want %v", i, address, expectedAddress) } } } }
// This example demonstrates how to create a voting pool with one // series and get a deposit address for that series. func Example_depositAddress() { // Create the address manager and votingpool DB namespace. See the example // for the Create() function for more info on how this is done. mgr, vpNamespace, tearDownFunc, err := exampleCreateMgrAndDBNamespace() if err != nil { fmt.Println(err) return } defer tearDownFunc() // Create the voting pool. pool, err := votingpool.Create(vpNamespace, mgr, []byte{0x00}) if err != nil { fmt.Println(err) return } // Create a 2-of-3 series. seriesID := uint32(1) requiredSignatures := uint32(2) pubKeys := []string{ "xpub661MyMwAqRbcFDDrR5jY7LqsRioFDwg3cLjc7tML3RRcfYyhXqqgCH5SqMSQdpQ1Xh8EtVwcfm8psD8zXKPcRaCVSY4GCqbb3aMEs27GitE", "xpub661MyMwAqRbcGsxyD8hTmJFtpmwoZhy4NBBVxzvFU8tDXD2ME49A6JjQCYgbpSUpHGP1q4S2S1Pxv2EqTjwfERS5pc9Q2yeLkPFzSgRpjs9", "xpub661MyMwAqRbcEbc4uYVXvQQpH9L3YuZLZ1gxCmj59yAhNy33vXxbXadmRpx5YZEupNSqWRrR7PqU6duS2FiVCGEiugBEa5zuEAjsyLJjKCh", } err = pool.CreateSeries(votingpool.CurrentVersion, seriesID, requiredSignatures, pubKeys) if err != nil { fmt.Println(err) return } // Create a deposit address. addr, err := pool.DepositScriptAddress(seriesID, votingpool.Branch(0), votingpool.Index(1)) if err != nil { fmt.Println(err) return } fmt.Println("Generated deposit address:", addr.EncodeAddress()) // Output: // Generated deposit address: 3QTzpc9d3tTbNLJLB7xwt87nWM38boAhAw }
// This example demonstrates how to use the Pool.StartWithdrawal method. func Example_startWithdrawal() { // Create the address manager and votingpool DB namespace. See the example // for the Create() function for more info on how this is done. mgr, vpNamespace, tearDownFunc, err := exampleCreateMgrAndDBNamespace() if err != nil { fmt.Println(err) return } defer tearDownFunc() // Create a pool and a series. See the DepositAddress example for more info // on how this is done. pool, seriesID, err := exampleCreatePoolAndSeries(mgr, vpNamespace) if err != nil { fmt.Println(err) return } // Unlock the manager if err := mgr.Unlock(privPassphrase); err != nil { fmt.Println(err) return } defer mgr.Lock() addr, _ := btcutil.DecodeAddress("1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX", mgr.ChainParams()) pkScript, _ := txscript.PayToAddrScript(addr) requests := []votingpool.OutputRequest{ votingpool.OutputRequest{ PkScript: pkScript, Address: addr, Amount: 1e6, Server: "server-id", Transaction: 123}, } changeStart, err := pool.ChangeAddress(seriesID, votingpool.Index(0)) if err != nil { fmt.Println(err) return } // This is only needed because we have not used any deposit addresses from // the series, and we cannot create a WithdrawalAddress for an unused // branch/idx pair. if err = pool.EnsureUsedAddr(seriesID, votingpool.Branch(1), votingpool.Index(0)); err != nil { fmt.Println(err) return } startAddr, err := pool.WithdrawalAddress(seriesID, votingpool.Branch(1), votingpool.Index(0)) if err != nil { fmt.Println(err) return } lastSeriesID := seriesID dustThreshold := btcutil.Amount(1e4) currentBlock := int32(19432) roundID := uint32(0) txstore, tearDownFunc, err := exampleCreateTxStore() if err != nil { fmt.Println(err) return } _, err = pool.StartWithdrawal( roundID, requests, *startAddr, lastSeriesID, *changeStart, txstore, currentBlock, dustThreshold) if err != nil { fmt.Println(err) } // Output: // }