// managedNewContract negotiates an initial file contract with the specified // host, saves it, and returns it. func (c *Contractor) managedNewContract(host modules.HostDBEntry, numSectors uint64, endHeight types.BlockHeight) (modules.RenterContract, error) { // reject hosts that are too expensive if host.StoragePrice.Cmp(maxStoragePrice) > 0 { return modules.RenterContract{}, errTooExpensive } // cap host.MaxCollateral if host.MaxCollateral.Cmp(maxCollateral) > 0 { host.MaxCollateral = maxCollateral } // get an address to use for negotiation uc, err := c.wallet.NextAddress() if err != nil { return modules.RenterContract{}, err } // create contract params c.mu.RLock() params := proto.ContractParams{ Host: host, Filesize: numSectors * modules.SectorSize, StartHeight: c.blockHeight, EndHeight: endHeight, RefundAddress: uc.UnlockHash(), } c.mu.RUnlock() // create transaction builder txnBuilder := c.wallet.StartTransaction() contract, err := proto.FormContract(params, txnBuilder, c.tpool) if err != nil { txnBuilder.Drop() return modules.RenterContract{}, err } contractValue := contract.RenterFunds() c.log.Printf("Formed contract with %v for %v SC", host.NetAddress, contractValue.Div(types.SiacoinPrecision)) return contract, nil }