func TestBranchOrderNonZero(t *testing.T) { maxBranch := 5 maxTail := 4 // Test branch reordering for branch no. > 0. We test all branch values // within [1, 5] in a slice of up to 9 (maxBranch-1 + branch-pivot + // maxTail) keys. Hopefully that covers all combinations and edge-cases. // We test the case where branch no. is 0 elsewhere. for branch := 1; branch <= maxBranch; branch++ { for j := 0; j <= maxTail; j++ { first := createTestPubKeys(t, branch-1, 0) pivot := createTestPubKeys(t, 1, branch) last := createTestPubKeys(t, j, branch+1) inKeys := append(append(first, pivot...), last...) wantKeys := append(append(pivot, first...), last...) resKeys, err := vp.TstBranchOrder(inKeys, vp.Branch(branch)) if err != nil { t.Fatalf("Error ordering keys: %v", err) } if len(resKeys) != len(inKeys) { t.Errorf("BranchOrder: wrong no. of keys. Got: %d, want %d", len(resKeys), len(inKeys)) } for idx := 0; idx < len(inKeys); idx++ { if resKeys[idx] != wantKeys[idx] { o, w, g := branchErrorFormat(inKeys, wantKeys, resKeys) t.Errorf("Branch: %d\nOrig: %v\nGot: %v\nWant: %v", branch, o, g, w) } } } } }
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: // }